From 13336674ebb4698b16651b838d1093cdb1cb1627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Sat, 28 Feb 2015 18:35:47 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@4 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- doc/doxygen_sqlite3.db | Bin 0 -> 1199104 bytes doc/events_handlers.odp | Bin 0 -> 12685 bytes doc/packet_detection.odp | Bin 0 -> 10411 bytes doc/piconnection.odg | Bin 0 -> 43841 bytes doc/piconnection_conf.odg | Bin 0 -> 42497 bytes doc/piconnection_filters.odg | Bin 0 -> 23614 bytes doc/piconnection_senders.odg | Bin 0 -> 26781 bytes doc/piconsole_layout.odp | Bin 0 -> 14349 bytes src/_unsused/pigeometry.h | 137 + src/_unsused/pivariable.cpp | 249 + src/_unsused/pivariable.cpp_ | 249 + src/_unsused/pivariable.h | 196 + src/_unsused/pivariable.h_ | 196 + src/code/picodeinfo.cpp | 42 + src/code/picodeinfo.h | 158 + src/code/picodeparser.cpp | 846 ++ src/code/picodeparser.h | 162 + src/containers/picontainers.cpp | 175 + src/containers/picontainers.h | 286 + src/containers/pideque.h | 480 ++ src/containers/pimap.h | 453 ++ src/containers/piqueue.h | 41 + src/containers/piset.h | 72 + src/containers/pistack.h | 41 + src/containers/pivector.h | 530 ++ src/core/pibitarray.h | 104 + src/core/pibytearray.cpp | 293 + src/core/pibytearray.h | 261 + src/core/pichar.h | 221 + src/core/picli.cpp | 101 + src/core/picli.h | 101 + src/core/picollection.cpp | 57 + src/core/picollection.h | 96 + src/core/picout.cpp | 348 + src/core/picout.h | 266 + src/core/piflags.h | 137 + src/core/piincludes.cpp | 235 + src/core/piincludes.h | 538 ++ src/core/piinit.cpp | 212 + src/core/piinit.h | 56 + src/core/piobject.cpp | 417 + src/core/piobject.h | 733 ++ src/core/pistatemachine.h | 334 + src/core/pistring.cpp | 775 ++ src/core/pistring.h | 916 +++ src/core/pitime.cpp | 404 + src/core/pitime.h | 328 + src/core/pivariant.cpp | 534 ++ src/core/pivariant.h | 461 ++ src/io/pibinarylog.cpp | 524 ++ src/io/pibinarylog.h | 333 + src/io/piconfig.cpp | 710 ++ src/io/piconfig.h | 525 ++ src/io/piconnection.cpp | 1195 +++ src/io/piconnection.h | 417 + src/io/pidatatransfer.cpp | 374 + src/io/pidatatransfer.h | 116 + src/io/pidiagnostics.cpp | 166 + src/io/pidiagnostics.h | 190 + src/io/pidir.cpp | 380 + src/io/pidir.h | 130 + src/io/piethernet.cpp | 989 +++ src/io/piethernet.h | 424 + src/io/pifile.cpp | 317 + src/io/pifile.h | 309 + src/io/pifiletransfer.cpp | 470 ++ src/io/pifiletransfer.h | 138 + src/io/piiodevice.cpp | 315 + src/io/piiodevice.h | 333 + src/io/piiostring.cpp | 106 + src/io/piiostring.h | 86 + src/io/pimultiprotocol.cpp | 21 + src/io/pimultiprotocol.h | 93 + src/io/pipacketextractor.cpp | 301 + src/io/pipacketextractor.h | 187 + src/io/pipeer.cpp | 632 ++ src/io/pipeer.h | 185 + src/io/piprotocol.cpp | 792 ++ src/io/piprotocol.h | 249 + src/io/piserial.cpp | 664 ++ src/io/piserial.h | 310 + src/io/piusb.cpp | 410 + src/io/piusb.h | 153 + src/math/picrc.h | 244 + src/math/pievaluator.cpp | 1254 +++ src/math/pievaluator.h | 227 + src/math/pifft.cpp | 936 +++ src/math/pifft.h | 77 + src/math/pimath.h | 30 + src/math/pimathbase.cpp | 468 ++ src/math/pimathbase.h | 189 + src/math/pimathmatrix.h | 504 ++ src/math/pimathsolver.cpp | 248 + src/math/pimathsolver.h | 94 + src/math/pimathvector.h | 229 + src/math/pistatistic.h | 89 + src/system/.piscreen.cpp.kate-swp | Bin 0 -> 74 bytes src/system/picodec.cpp | 41 + src/system/picodec.h | 51 + src/system/piconsole.cpp | 1064 +++ src/system/piconsole.h | 508 ++ src/system/pikbdlistener.cpp | 176 + src/system/pikbdlistener.h | 139 + src/system/pimonitor.cpp | 26 + src/system/pimonitor.h | 39 + src/system/piprocess.cpp | 199 + src/system/piprocess.h | 130 + src/system/piscreen.cpp | 208 + src/system/piscreen.h | 194 + src/system/pisignals.cpp | 111 + src/system/pisignals.h | 78 + src/system/pisysteminfo.cpp | 189 + src/system/pisysteminfo.h | 61 + src/system/pisystemmonitor.cpp | 203 + src/system/pisystemmonitor.h | 82 + src/system/pisystemtests.cpp | 41 + src/system/pisystemtests.h | 39 + src/thread/pimutex.cpp | 59 + src/thread/pimutex.h | 93 + src/thread/pithread.cpp | 339 + src/thread/pithread.h | 208 + src/thread/pitimer.cpp | 428 + src/thread/pitimer.h | 309 + utils/code_model_generator/CMakeLists.txt | 5 + utils/code_model_generator/Makefile | 209 + .../code_model_generator/cmake_install.cmake | 60 + utils/code_model_generator/main.cpp | 263 + utils/code_model_generator/main_test.cpp | 48 + utils/code_model_generator/pip_cmg | Bin 0 -> 92888 bytes utils/code_model_generator/pip_cmg.exe | Bin 0 -> 2244092 bytes utils/code_model_generator/test.cpp | 7084 +++++++++++++++++ utils/code_model_generator/test.h | 100 + utils/remote_console/CMakeLists.txt | 5 + utils/remote_console/Makefile | 209 + utils/remote_console/cmake_install.cmake | 60 + utils/remote_console/main.cpp | 64 + utils/remote_console/pip_remote_console | Bin 0 -> 26824 bytes utils/remote_console/pip_remote_console.exe | Bin 0 -> 1363466 bytes utils/system_daemon/CMakeLists.txt | 7 + utils/system_daemon/Makefile | 265 + utils/system_daemon/cmake_install.cmake | 47 + utils/system_daemon/daemon.cpp | 252 + utils/system_daemon/daemon.h | 93 + utils/system_daemon/file_manager.cpp | 182 + utils/system_daemon/file_manager.h | 33 + utils/system_daemon/main.cpp | 244 + utils/system_daemon/pisd.exe | Bin 0 -> 4896546 bytes utils/system_daemon/shared.h | 22 + utils/system_test/CMakeLists.txt | 5 + utils/system_test/Makefile | 209 + utils/system_test/cmake_install.cmake | 60 + utils/system_test/main.cpp | 106 + utils/system_test/pip_system_test | Bin 0 -> 18412 bytes utils/system_test/pip_system_test.exe | Bin 0 -> 1202681 bytes 154 files changed, 44021 insertions(+) create mode 100644 doc/doxygen_sqlite3.db create mode 100644 doc/events_handlers.odp create mode 100644 doc/packet_detection.odp create mode 100644 doc/piconnection.odg create mode 100644 doc/piconnection_conf.odg create mode 100644 doc/piconnection_filters.odg create mode 100644 doc/piconnection_senders.odg create mode 100644 doc/piconsole_layout.odp create mode 100755 src/_unsused/pigeometry.h create mode 100755 src/_unsused/pivariable.cpp create mode 100644 src/_unsused/pivariable.cpp_ create mode 100755 src/_unsused/pivariable.h create mode 100644 src/_unsused/pivariable.h_ create mode 100755 src/code/picodeinfo.cpp create mode 100755 src/code/picodeinfo.h create mode 100755 src/code/picodeparser.cpp create mode 100755 src/code/picodeparser.h create mode 100755 src/containers/picontainers.cpp create mode 100755 src/containers/picontainers.h create mode 100755 src/containers/pideque.h create mode 100644 src/containers/pimap.h create mode 100755 src/containers/piqueue.h create mode 100644 src/containers/piset.h create mode 100755 src/containers/pistack.h create mode 100755 src/containers/pivector.h create mode 100755 src/core/pibitarray.h create mode 100755 src/core/pibytearray.cpp create mode 100755 src/core/pibytearray.h create mode 100755 src/core/pichar.h create mode 100755 src/core/picli.cpp create mode 100755 src/core/picli.h create mode 100755 src/core/picollection.cpp create mode 100755 src/core/picollection.h create mode 100644 src/core/picout.cpp create mode 100644 src/core/picout.h create mode 100644 src/core/piflags.h create mode 100755 src/core/piincludes.cpp create mode 100755 src/core/piincludes.h create mode 100644 src/core/piinit.cpp create mode 100644 src/core/piinit.h create mode 100755 src/core/piobject.cpp create mode 100755 src/core/piobject.h create mode 100755 src/core/pistatemachine.h create mode 100755 src/core/pistring.cpp create mode 100755 src/core/pistring.h create mode 100755 src/core/pitime.cpp create mode 100755 src/core/pitime.h create mode 100755 src/core/pivariant.cpp create mode 100755 src/core/pivariant.h create mode 100644 src/io/pibinarylog.cpp create mode 100644 src/io/pibinarylog.h create mode 100755 src/io/piconfig.cpp create mode 100755 src/io/piconfig.h create mode 100755 src/io/piconnection.cpp create mode 100755 src/io/piconnection.h create mode 100644 src/io/pidatatransfer.cpp create mode 100644 src/io/pidatatransfer.h create mode 100755 src/io/pidiagnostics.cpp create mode 100755 src/io/pidiagnostics.h create mode 100755 src/io/pidir.cpp create mode 100755 src/io/pidir.h create mode 100755 src/io/piethernet.cpp create mode 100755 src/io/piethernet.h create mode 100755 src/io/pifile.cpp create mode 100755 src/io/pifile.h create mode 100644 src/io/pifiletransfer.cpp create mode 100644 src/io/pifiletransfer.h create mode 100755 src/io/piiodevice.cpp create mode 100755 src/io/piiodevice.h create mode 100644 src/io/piiostring.cpp create mode 100644 src/io/piiostring.h create mode 100755 src/io/pimultiprotocol.cpp create mode 100755 src/io/pimultiprotocol.h create mode 100755 src/io/pipacketextractor.cpp create mode 100755 src/io/pipacketextractor.h create mode 100755 src/io/pipeer.cpp create mode 100755 src/io/pipeer.h create mode 100755 src/io/piprotocol.cpp create mode 100755 src/io/piprotocol.h create mode 100755 src/io/piserial.cpp create mode 100755 src/io/piserial.h create mode 100755 src/io/piusb.cpp create mode 100755 src/io/piusb.h create mode 100755 src/math/picrc.h create mode 100755 src/math/pievaluator.cpp create mode 100755 src/math/pievaluator.h create mode 100644 src/math/pifft.cpp create mode 100644 src/math/pifft.h create mode 100644 src/math/pimath.h create mode 100644 src/math/pimathbase.cpp create mode 100644 src/math/pimathbase.h create mode 100644 src/math/pimathmatrix.h create mode 100644 src/math/pimathsolver.cpp create mode 100644 src/math/pimathsolver.h create mode 100644 src/math/pimathvector.h create mode 100644 src/math/pistatistic.h create mode 100644 src/system/.piscreen.cpp.kate-swp create mode 100755 src/system/picodec.cpp create mode 100755 src/system/picodec.h create mode 100755 src/system/piconsole.cpp create mode 100755 src/system/piconsole.h create mode 100755 src/system/pikbdlistener.cpp create mode 100755 src/system/pikbdlistener.h create mode 100755 src/system/pimonitor.cpp create mode 100755 src/system/pimonitor.h create mode 100755 src/system/piprocess.cpp create mode 100755 src/system/piprocess.h create mode 100644 src/system/piscreen.cpp create mode 100644 src/system/piscreen.h create mode 100755 src/system/pisignals.cpp create mode 100755 src/system/pisignals.h create mode 100644 src/system/pisysteminfo.cpp create mode 100644 src/system/pisysteminfo.h create mode 100755 src/system/pisystemmonitor.cpp create mode 100755 src/system/pisystemmonitor.h create mode 100755 src/system/pisystemtests.cpp create mode 100755 src/system/pisystemtests.h create mode 100755 src/thread/pimutex.cpp create mode 100755 src/thread/pimutex.h create mode 100755 src/thread/pithread.cpp create mode 100755 src/thread/pithread.h create mode 100755 src/thread/pitimer.cpp create mode 100755 src/thread/pitimer.h create mode 100755 utils/code_model_generator/CMakeLists.txt create mode 100644 utils/code_model_generator/Makefile create mode 100644 utils/code_model_generator/cmake_install.cmake create mode 100755 utils/code_model_generator/main.cpp create mode 100755 utils/code_model_generator/main_test.cpp create mode 100755 utils/code_model_generator/pip_cmg create mode 100644 utils/code_model_generator/pip_cmg.exe create mode 100755 utils/code_model_generator/test.cpp create mode 100755 utils/code_model_generator/test.h create mode 100755 utils/remote_console/CMakeLists.txt create mode 100644 utils/remote_console/Makefile create mode 100644 utils/remote_console/cmake_install.cmake create mode 100755 utils/remote_console/main.cpp create mode 100755 utils/remote_console/pip_remote_console create mode 100644 utils/remote_console/pip_remote_console.exe create mode 100755 utils/system_daemon/CMakeLists.txt create mode 100644 utils/system_daemon/Makefile create mode 100644 utils/system_daemon/cmake_install.cmake create mode 100644 utils/system_daemon/daemon.cpp create mode 100644 utils/system_daemon/daemon.h create mode 100644 utils/system_daemon/file_manager.cpp create mode 100644 utils/system_daemon/file_manager.h create mode 100755 utils/system_daemon/main.cpp create mode 100644 utils/system_daemon/pisd.exe create mode 100644 utils/system_daemon/shared.h create mode 100755 utils/system_test/CMakeLists.txt create mode 100644 utils/system_test/Makefile create mode 100644 utils/system_test/cmake_install.cmake create mode 100755 utils/system_test/main.cpp create mode 100755 utils/system_test/pip_system_test create mode 100644 utils/system_test/pip_system_test.exe diff --git a/doc/doxygen_sqlite3.db b/doc/doxygen_sqlite3.db new file mode 100644 index 0000000000000000000000000000000000000000..838dc510bef2d150538e1ea8488d4fb795d75964 GIT binary patch literal 1199104 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
^0{2F*_ zjTO6EtYhBDSi;UeMhHSI0UTLDY~yDN=#PCC#3U&q_Czb4#;-l4KeQeV<`Q#>J5nS9 zw1~DdXWZD;90Aj%+sw3Vn=?=rSS)Vv7z8AeB`T5xoCA>rv=BBi)lTet;^6)>qo>dA z+kbTL>C>$xY$&?9QZETirng61g4JY1HG`nlqb>J%ak(DVYutN|7`qJQXV;^CjXSnM zXwEpt!byO=4BQpFHKIVWsuiH*hyjuDbUut}(ZiR*Zfy@%CLEuEomYD$?|!OqTG18P zKcHoG%)teBym*hU(SRGv)z-+X82>T7J?MkX{sia4?;=Zp!!+_^MM9$>Q&$=m6(@1v zz=%CIEvn1BQ$V726{~ULZzUuXkb0zNSwijRKR@D8~;Va`cvy(^KqkCspB^) zKZP(VOumo>m))F0@V$QEV(TVCdNpwLrKk*#UBx0&E2sn)aw}6WgQVa>;dDGFuH>(3_wyHsW z(Wb&T23h3uRM)b)Rjk0{fwRR2iYvT*$Bhl{m`{y52)PLa30Mx1q-?Z;8Te_Go4Dv% zz@9-n$>By6&eff!O%H2Ye$jQ4*|~HAELH6oX0qT7{zZ7n%C%D*aL-SV%{tqIs-e|Z zU>Bx1r%n5;2^49(W5je!#u_&pA_1c`ze52&^rZ8)M4N*XtOPU@+YIqMa(3nIiPY0Q7` z70bor!dsdKdXHOP0o8MuB2k=09a4Jl440Nnb zx(4xl0S-bGSsV+)kVe|Fb&O{DFMg%TOrL%jUMW#DTbx)}bR$t36#x-+Nkegx%4V(a z^opg^I7Q*j0@4s`2MntYj9G}EO@|3hX8uaKSh@iF9zIA=)iDX9KnDiHc;RsBqywf` z3~)OJif9<}0=Bt;-iWs=p_U`ia%B_NZ+XRtKm-S5%8mmKLCfk8 zlpS(B2aN-vAY+U}v^_G35~vX0#;_CJrXR**GI1aUQJlI#Oz}8`63u81tVt$gewSB_ zaGy36AUv@hO{OW8!J8l%bMW|vr`3GFS1fC%GR$nyvMmJBewJA{Pux)-p7fS(aw4o~`&U6Yy7aA+@tD^1(0vU}(&A-qU zCE~k-s~6Gi(EJg+4A%gm49Ue3SfhYTcn?cO6It1}5=t^mq{B$6z&OZA2*(8O#Mb}q z6(i(!Sm*`mvnWOQ82DPHsVS~5;F&Dt|8u`_!3caN@KGXs+zOlt>2XgZV36wJHuwmDb?al(%#_;T?==s1Pw5rol%h!!dZr$w~C zEXt;M0gtgn=op2VWKfdu?U}dX7Zas(MBK&MkTC+o(a=!}F{z^-7c#ya^Gw9f;WPqJ zoAC-!5q7lD5ejjZ7p6i?M0Unz+K*H#hb_4kpubx#a`%f3gI;dHz0FaHXCR1$kNRV z5MAa86Un0L*r7udf*wt%rSiOu5@BW_v|fBi30<3~9YT*$C`M?+B(p^VojVXUPLdcf zGUVg*T)YHA2Pp&;5AX9>28t%|>F6HO<>62d^AVdU^x>fc6oNM>PO~$OqJN?l(5K=R zl_kg)arIF4h4xbjTrxc!2TEKMiL^!d z*RElfvPNkYRShR;JO~exYyuy(E83{p=6^Q9=OVd4b>Nv;YTj@ z7q}Fvz9iaBxzgvxKWA>JWY{m*_HNnt6aK&R4(;N8|eDxC+D)`3clhDJjJz8)wRO-q&=$`Cou$ zx_T&WdCv$J2GqCJZFOU6CcNSVf9zW!T~w*j?b+~s$K_A=R{j)TeN6tcR=%qvSfvT) zIR!;pdDMHNVW`8|)_i^{c!a;jdMkZk$Hys;~w9YL7n^^@0f`$t3(u0 z`F=iHu*E%~tm$a%X8szF?+U!by;xjbsrH~xwU@z-fo&7NM4{hhpMq*X!)6ZECY!7R zE^>>Ly3J90aSy2S*{W2$bhZ{Pt`⋙H|Dx?A4WvxNG+MRj%8nm$4H<36;Q1L9N6+ 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∾Q)xFd*yDfq_NUKxid5!st>82{V5hsDR%DJ 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≮GneG}EYVs0CMx2)@-y&v2?bM`m+MRVUdt*^( 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 z uUQ7B77645mYnv?jLi+>e%4WJYd<=6NMMek7!z+5K)NXpNm6{dAyd*QjL5_U=n zJToIVQgV|n83>DeeT=0e$|#J(6|>+F_=s*2-1y5WsS&Q2MuI~Gs5VxoNe~{03>3}c zZ^YumZkjUwQ0D(q;~{=83o`%T=y}w0#Ix4=h4o46^&o#8vR0cvGe2Seq4^y1pz)A- zjq#5ZeMbJQcO1Vg7qgUVd+5y2@Q|oF$44?l0XrRF4`ortfrQ|}OhG@;M&MD&*tH{s zb7h$Tk%|RC02EkDU@e#stka;YfM*r-yo(|5rif?MIx{>xmKr&W$H!3o6tAYy!4V;z zDy?99aY)Oc!qgvT=yRG7t`wHffY$4nP~TTwpQW)`r14IIe+UwF5QGY#-1!{3OKiC;A}u)RXDoQkp=ctB zOE~KoOFurvIJJYS1!NNgie9?xH`QA~xMQ0kE{|+pc!~?ZK^O!$5{|fbFzksy|AT6n z5Sd#r%b3jK5sN()>@b`ak=EH0aIU@%Qa`C*N+I#1C*VMuFNT26rEVx!8Ht4X4wz>s z`c_pm%|6WffbI&03#Nzz4WEw7<{cq^W5hE|Q9Vt7d}B?*&XM?w;IrYbi%yRB0+a+2 zLB_V;P0=Cs))cH6UL0VM&}Klo!Nvo_23yC>!$CISVMv=AlndxIRvA_i_BHf;G2q1l z0te21!HyOWi2~bPuipyrN`RqGya@O~;wnCWd0Cx2BNJ2*v85xq>3{9wZ}%xye#4dWZS zC{exyY>Ix!$O`FCG5p!PKqbQ-Et57Sfalj$(FD8zI&oSF)G_QJ2{eVsjBp2Ruo=+F zJy*&3|Cx&ay^eUpsfZZCsm+ru9iEMy9aI?rCy4jLU+?rqMBJW6RY1>Yg|}oYU?wxl<7rNbz0)hD6mun-!6H}o2eC9G zn3{0ZaeiWfBy_Eylx#Wym^4&1tR;j4z>E~mG!hKK+(x66>ZO#7(`I0Lz0*CE!X<$n zjFS&z2?i;g1}q-UT86I2k}ypjyD7z?1E3CCl0_fhEd#s&nmF(Vh!+w=`q?|}qg0k- zBQQx~RL0bV!+;p}DY$KdEPzJWJH4Dz905|C5Ljiwn}JDY$P1S#n^Q`V3woz-l6Mi8 zyBYJ_JKaSoKo#j?)Ik668Uzo<;V4Zk@f#>bKhSf`NpbZDMvsl1QG!4P zlte$mir(oCN)hf$qGPj-pkDz;kn{V8e5 zvjkQniaWi_k}8IQz0=oH3Qj_H47P0ooD=O8oj@E88n#WuFiA=+rBo}~Snu>Tlxig% zk@>&hcuP6{_q#oR=6QqX)z||57Tmy;XV`O}=dkBius=hdHJ&cdHJ&!>=hkzzan{zL1P)^A%cfMb}jPFW|A84Oz66ax5itDVT=m(1^(|7re<`6=_m=DW;4 zHD7PO3XIX;G9NJ~%~R$H^N_j6++qgIRY)JMHWwH_F}`Jd(fBO#i1!~dTx8MwZl8Bpq|^F zZ*B9=DyZkS8S`u2Sq1gn_LzB_cUD0?lf2zKtDv6SrsS@IdL}vOomEiJZIkBjdS?~X zbK8S*SD>D)wlmgN@2tXlZX36@cxM&XbK97;**mMSo=Nt5XBE~n$wb?%U_F~{V?dHC zsOPp3*o!|xiimVe-g@j5Tx8mN}xRZ=|XJbw>+BO>{X|~<7w{13}Qg`!wSY_XBJl-}N zQaA6~>zxg%o5!q3+iXDHymNEgtY4*$^2{cceN>+5Q#X%rbECR>#CWN9c7sYDHurdE z*Q@01R=90;ohrJUH?38vU6*@j*Qo5BR;X=uwYs^3H?2}PZ_P{|*GCqKJTC4XqGkoms=qkqq!^*iQg%+6=t{y#eR94!@Hey~&Q|HaFv zuBVSkML#0CJUq(SPQ!jMS+R`ZoE7Jwhkz>$TUgYGu5v}R&c7wU4OdL;Z1R<1P?eFP8LP}E?t61 zP~R%iE#bPJG$Q@O)`uIA-aq&3BIzPSZ%X>#wA^v3n{*zeyWNv**zkX2{Y?Yv19KPV zFG&9&;y4j60gDXNCyY|mMhxMn3t$hBb`=$WPf1JEK#=}H>w`t2D-}ecxrd5GH&wRC zIDbDDtZ+pbRN{~nh!E!nwwE|$sEm@~FuJ26>f%!(x}mb={nq>Ildb1J_+JCoZmtgkz4?MX#Ux++o#l z?zkmd&7DtMpRV5`x&FLSB)#R_`D9DZ&z(CiVU6dGTS9_k%fjGmJa;~6eX;@dk-0~U z)HhvjMSJ#f4qhBYgMhE2fr9Vk;7JrhIq)D4BTQJ)An7?SO${5~Ezx4R{kZk#=g`a>;7k>~4uxBj%&l zN9$9bn0s!K@}>huDF6GGhX8lLxOB~fa<_9D517BV{=P2pdj3Bl_@6H}|Jl6Vc;c6v z_|MeSIe-3g8dc(HAKkcTxpok)>tSygSFS=F1?(d-1P)WIof&i;ASt4c1DZP>#2sDC z9zgt_JTO@0NO55B*0b5{s6E!-->6K{Y@q5<@xj2|(s{mT@?36Feu1WW+1`yfnlu0> zz;Ozi5n&MfA?ZhR2SfpK9zSQ_D56dfkU12G6ZRP1B@lckzBb?n%hfi9LXq6cYyy?0 zGrn!be9O8rbSW3eU#3Uq%00&NW^BM-M&{>nN=AYKe5+p+eu&+ps6s*@q7qY{vuug? z5+~w@>wsjIL#dRrIDEwV{2*vO!>Qq^3&Pf%!--uW*m1GDHzkh}MLX}&L_4k^4SAOk zM1L0XdJ-8c;!}*m@cuv)9<&(<*wrPl=;q{mM*x2M+mtrmgLTAw`v(2_4pwaTnR zqIpZxJRc_aAM6luE09B@D-?+#mMjTEF(4X1lYmmkUqp^~cZ9}EfLo%)s{0StKNP2b z1=}L?zl{hWp8Gh(uQ7kmTyFeNE{)t3`9*pxuiV>>gb=JJ7w)Nq`(*Mb&u_8=K|eYh zG`&DbrwMP8RzP^Ly$GL>b3`%^Wl}rssmu`^x|oAbifRpx4Nvv=*U#3uR@36&rXc|YfugER z0PZH5E?ML0J#j>n<4JL`@9(e7aVXS&h9Fz$ldt1;SlY6zp3yUU{=dfXJlnbi#>GPO z<>or$H8kC?%U^Cm{#xCHU3?030}hEfSF8A>y>4=!!q0->ZN7`<+Yob6#W4c;a;a8vVhJwM{-~ zst>NWIZ%pT2O+!6d~_%1Ktyfq$NB{ylVs)h^i}b58;loT$S-l4IkAi-wi)lz7Q>Gr z5k%FB$_fZegwkoy-7y;E3?Y^!L5cW%ZU~0!=u%KzO8n2#8Lz=iDoH$WT5_hpIpCEa?Bt(|lX_SHtz_$01ui7etTR4!t5nLrnh zeghL30wIaXgI~c|Iqa7Ui3h_im{oFDjl=!gwc6r+#wQ2L;H>&`cjh}ZHSMwX(Pq?~ zgqlyZ)c$b58ml43y;)q{UAR2u#O$A_|6&h>uVjVw{idpIZqT_6}7F5=B+lsacCE zeBAhWO%=q?y$D*mF~6)x^5#|~f2^gFZ9XIyIfPX%XqH<$M$5;HkJS(?t?jgVU#=~G zU6J6XV|gWQ{87<53pY!21eBYILj+kB!vGNKnfy$*<^)%chmRT`Eu*b3w>aMpDI99S zS99YV)v_*n4`FV%&^!ueLIql&UT-RI*No>g&X#6*0Z)C6KL7u<;YnE^vNoA7HU7G^ ztNz-jSQwV;uHAI7-JL!)?J3nbP1k#(G) zmfCbpbxOA@mf#|>8o^T$sEYRGmgc+WN7r`f`bXF?9PVP6ufi&@4-n>$tx{ClV(!k7 zOeRyNmafw6mUKzczFbHCMopHxU$I%$-LG~*)@RU)!$L%0v4v;hP>3yHhPJ{$79>L$ z$Lt8W+BL0JyjwvO?=wC#I69h14|A;bou3%y7wi{b62TJE4I!>m6W2XZ?8~~u1t9KI zA`2Ha2G%QK?7^^^z&rpvB>0?EAm)#Rhv7$u?UCVUtG%;gsjtkcBJ)$mr(}W9k2-jQ z4*nPTKVIu@tU*6pjpOrl*MLXzE2y)qbi6^vZ&7?udZQ8_Fn;@qG>d665i_t%!?Y0~ zJa||?1~srYV0R`Wr9G>(v00Zz`?smpRkkOD!;%vVAY=yEngYfaE}!|gsGdDc4>)XAaj$JyszjM(@wrQY zJ{>7rZAx!M2Ifm%n959+@Ti$A(cH#-kFL(@Js4&7)-mgJd8&zeHtz_aJYR>vjsQT!7Tl}L@C8m5Tjj;c(A?;B*ZoqLtH!(64(qD_Ywsc-+VKv zEV4#}5BY}EdMA+uWhyf^G|6x)=Prtiv|e#)w-kN9xTgqI=#)KqT63j?JAFOF=^i!z zFE{QpJP%vnWCi$uxrvKs>@T-3zs|wQ&9$9qItmO%!5*y6{SnmtoSnr>1|wHu2XmY! zNGfMoj(n<4LkMfmB1AhV|7;GbKVH9ICI>mwP1U6+b zM+{9Nk1T$_g64V!Dv8=HM6G!$L}8m3!qOL8Nn8n{*wP7hdX|Vq$V@p%hn#N?kF_AG zqCg#@R%@bG?(b^ZQoC$IJqK|W5>X*mf)e-_N1zOL#Ud2L23&WZ9_0rH_1am{QuPW{ z61D46Zef0vCThu^wJnL-iSG$^({L}aEwEIK%K&<5!lqzOjrnXWF*OP)tfBid_9V!_ z_6^sB5B6!OII2i1pS=j|Fjd3LO zR1s2^QAxzWB`yCW{_kTR%X-NCqIuHz(k~kWICoXv3FEqcpDg{juGG^Vu=UEM$66zf z{3eDx2Ry_S_NuI{xG5zt1!me{imN+)2$9{yR3<%Cv-sD^FRLbBK#cFiXzkoOAA&$@ z#6%Vgcm^Uu!>rgOV3rC4%bCnhN>nVk)>=Z!?pG1;?EEIDs}u7f07eA2#$Yr8N_jLY zNRa^6!VabZH^EjvEqq?>=Zkl%KAyWe->1K>7p>;~5kW!C296d3uOaL&Fh$Mc8p$ab z-5?@|ND3tGA;H`ml5>)S!B;UA>lLV=DRL=yd48kQBD=aYO-Vi?IHXkhrpn_Ab;#1}Ow-RA9$_x>Z zJB}|&d|{GUkB9NFAW$|OYn&ht4g*p85NnZpw{%lBv|H8uUtql2@T9HJn}28CM)KF` zFSj}`5n(w;v=4MIr*-7qRC{(ZO@o8oPPSV-bMV?oirF9@x~$rG`Osr{TFOo=BcaJ4 zDP@%@uwDMaitgMwaCSoQFGca|gz|x@N~`cOeUIiP0xXpFZZ_13U6TpDr3O`Da_Gk$ zu)7>G2x1b%%qfOlV=9D4vxLhLKTW(1L?PguDoQD>Cva|8obF--eSYC%&&o^Obvbk; zjPXW1ET^suDIs|@r=xOUkIS=B^1GbDlmr7|iW`zo@0>q>3J9E)AbU7vTN zvqz52XZ2^-LvQZKWf21`m_=A%jzRul2LDd%8sZZoOB&L<9!rg^IJKKWqe2z5MN9Ml zKI_lTADH1^xB0&$FEL>m(yIsCo6dh`)gch+WE}>d1{N1>8;)OSB4YTb!ECdY(rzUQ zNbMoACb#Y?aOhBOTVA5Q%2eOgoTzaldH}OdyvtJzFF!#7ffvA?D~R(Jx)B^;Qo-o( zq?#Ubu&rTjs`Ba*bl?DcFafK4_a=P`>lP`aEOb6XTd6ni9~%MWe8N|piG8`vc?rud zE5$(b8Xz3m2SbK;5}qx1vnmfl+)8n|!h<|bL@(erh9~9K4JuHcRhRyK`x?_P57!}o zWnO}_Lq7am!dd9*?g}9zdRt4+BE%VDhfpK$E4yEJtt(&9qPN|4n7ArxAuH_(=>H`Y zJA}4x?`k@HHyhDCHV&v*i-0cymH^v2PEdHL(df7Y!;gi-^7f)Gq%@KH`^z)xw(*`l z?$%XBp_c#OYIt^8FE#(e^c%O9cB`k7%BAx+bJC}#8~3-bZ`LIuKS`paV?9HOjNA_i zbsF0(JgRVQ6PN>7T>(YcA|^*(Q?GMs3anA{=R#)Ejp5;LRaP{alFf=cA;Sk-NJ*CUp|)m3nqymu@cvF&9gS!;3 z%Ws`uGaojhcj3xzvrQs144{k0#EW)M;pdzLFNRi+1%@XFM4?*NlDi(hXcs8?o<3`JT)0OASbI3}jLrR899QZEO@ zP#UvG2n?wrg-S7Zb#U1$y$(#BvZvrNbpS2Bie%DPa4&;($Az*;ca`f$pHDuoUP+wh zvmsqsxSS!pP)IfSq4@k`QlG=QEs7 z-TjR~5JdWNf-|ZekCn^W^ql#>-0<|6?=yak(R$?{8unZ1GYo+Osnw1942y;1Xhm|k z(~FxjKnH+6;DiOP6{wxWG)`i=k_Fem9l0_&wa!c1CaNJ{d8TSwR4ns~UU8*q4Tf3H z=}q2?)`X)vS`SCjrl+!&ZujMOIs`kYe-fq>hZW(8rNLMTd=g!GukfLJaqiO?@W+`n}XNVjl0jUZ2=#Ej{pnBWT z{C}t6S#I59zQy>Uq2joxMIg5-?}RpmrEk2WF!woS881TNjEQw70viS(A5b2EaQm4p zfc^ob0gw^|o+%$MwY9EOpmJ*=I>Cz$Q>t=G_i^~Roi1XP!Vai0+X1Dyg^-%JF|CMT zxhhB#X_#9q)Iq($v=jUd&?*8^rD|wFE6RxK63uxIBX8sniw>ibdY=fa=%nG3V|BYo zb)Af2iF}uL0)|u1racm&ngsnqX$oKp;8W+bJ+hn_^Q;jW|iICq&W(hxsJK>?uUz&DG7mVyQ*sCuZ*62knF zyH)GPYmL|HF`6XqX`T7!c8fkY%h)}riQRmn`9#Bb#dsB>dyGTl%7Bb8zaWUBEW`y# z(5o;s%Mji-V^6r_Qyut~?LrOtP0CeO=vBt62IQrsx|~;rXUf7u*+kg;lOwTt8&%`Oa_SmkO3|XGdT{CU_=pMTU^h=YIsz%cpYlXmhfVQs>pr9ctQ`H z>JhRte}|^G>0!nh&X0rj4SXp!1jtY`Nc9PBh-)GcSU9))iDQpsx`Nmy%bTK9^6Rf} zj~kCSS>IG+i(pu_4-4D^Ci}RV<=48?%$g(Sg!vGtJk#b2K>&V<`3m#3VDLsjh(<(i5Bt$^JkW2d9ACgYpokBpS23K;Gh);`Ddqfn{~jt)4JD6 zf(JBaO@Sf&8`krQCir6O3F}qXA6Rd+-fH~?*g@|DS@?fhpRzt@{j2pQ>+9eO{mA-- z=Q7U~o~ywdzR}YI=1`v}?CJO1?Ah(P-E+uu7kETz&jX$_o^zh(V7KrBPadqImwA5A z^FKXr2AlY=Jn!;+!1K4Bk9j`h`6ti66WQ>ap6_{n@+(=@=KWIhW3wZGy?uNZd_nV5 zv*-E!^enL!%zvEY9p>leF5~y}bHFj1|1?JoI`g0B1fTDJ&k6A8zs&jg{nxpb{QleA zI)1+}2OOvQA9G=TzciQN_ses@zL{T{8{qdp=aAx>U!4Pp)BM`p0e-(ecZA<>%-zlJ zH|MbMGM}7F@%!z$Q~Z8sZj|5e&Q0+9y*Z)nCv(r?_osPGG|Zpn1%2=5d00jB7x`=X zy_5%y(=zg$7A-Tsf?q2SRhB0o;P&pC{{4UA^KW$x=hbn7v9;&RX^9)F9NuIsPx+V{8*0uR@e%td?{9c!*-K=E=XtS;_ zK%3Q3cox4m6t3pCt3Z%HYk5H^^c94{?t)O*QxFPQ7X19KDhNvA>Vir{sM>N-sM>n*CVsbF?B#d+MFK)vH(y-O?~aS~sddZ65WfQ#WBl&C zC=~9xC=~9#C=}j$Q79a|C=}jykv_HdUK9#%zbF*$yC@XiaZxDTe^Dqra8W2ccu^=k zbWtcg{30C2tRpXKi)tC$uhZ>QrVFt{xS2(XOvAcR26Ff?l>~={`A0BA=@j z(NV<*so|S#HBi~^GEbn*uHD2GM#Nytx2l&2H+qC z;1Z93u#Ij+LMJByg9fi0fgiYr%7Ug*t)%0mQo1^FH8eHetVVAz-q5s0@(SI#6;;aS z4?BY~*1oCXnO_Fu0CjpDhko3za1G?N0;oLBSm;Z_0N8@vCjjMetK(bs(KBsJB&eEEH-4a$(4MUe-s$=a`C%>q`Elx)Q z+%g-=+d75-^wN$r!V)o)W|UX*d_KiiS4?s#H@H(|#dqr&K>gIjre<{~w$$(Kf*+5a zPb4k+zaYomAO=cIbb-i44U*Lp`)Sp0e$)Kz#@nA(HP`0v($!oRTk3XW-D;xEHvXa| z?x(v%mD%w)M%txyt8D$O?Jz!K{KYYK?&*=vRKcwsbF9aD^T+fQ?mgTaYBuH`GokiR zSy2;$e~fPuvg3g9rwQo=0A3N_xOZ}@5_lQX_fl>>laz0V;Q^hdV(2O z4!Zv|esHL`3OOoVF?i~61pGYE;~OoP@QcLA*=OXFi1(!S)!U8F(KNUsQ3iA}<2%U{ zXuTNQ$WHyv{6At?e`4m0fB9uCfAws}EyILrYbjE37SUx#`Tv@MvY%ztZ^q$2R8g)#G&2 zur?8Cw0l0bh;jNs4vlC>u|#L5!Bq|EUQh(iSfPTH3j(nKYfNGWltS}4GIBudS{x3c zuH{HgX}47U)8z+^4_0ia<5~$LpF`4)dh{&#CduKGXUEUV8FK=Oy?EM8rY44y_-HAK zydL5u2OK?;Cq-W+uMm+K(`K&zJYyrd<4?V+2~apa&+1ZNKt6J8ZTb2$r z{}&+k$N%>WR@fXP`QPs^w=$p7vwUep3y&JjA!Li@4vdWmg+rJNB28qGa@i=t0t84Q z+7+5GmYmF3txKwNuVRVeUFMFWhTk;{z-TCi2dIeoGw4|{B63xbeYsomNj=%i2(3SK zyP))DL5Bj^9@KJN{sC_X;0^~fbjmCN#2$%cCeDu4tV7Pd3QA+fCyX!EQVNmUfI;mw z6GJRf_60T@#>=F`HfkQocb>D1FpOtJD84>#JA8nH4xyO?>kb;5$TA6=<* z2#rRk5U>>!%OpxPf)zxwNsQva3B<#1RS01VFvSUB6IT(_Q6vr4m8PlsJH~AD zxmC{p9^<3P1&pa1TEx!w7!b8y=uE5X8sN9^2E8oLt(8JcjA>Iun3+zZ_EfWX6O zfjG>d#S`*cb+)sC)@%=wsU@+cw&tZ~XYBwbw2o-3v%?c8pxMjB4r8Zs9AKA&*;7kB z>$%>#$0rCgn$PG-w(0J!0mZ+%v#iufu0MhCcPLt$ga40-&5<~byKF&mt18hhI8qHt z)ogyURo9?##LRVO?0IYRX}v)QQY)KLo_jRM0%81Z%a8D8 zR60a7KxC4{Op-`ED6mQ^S;Kmkis))?^_QlsRaHqTTO8?6v2KrT%AeGATYsWG({%M0 zM(`$3+CYmXKnPnbLRK(IvUpwkCF~2n(8K{N&iYmz>2mJ6oT{Z-%zauQlNlPdhsWGQ zf_qOh>s$S0XF`ZFZ>nmMA`unG0&LqRz$^6i=y&%hxfB=rr5p!RHam?yaq{daMLBu_ zuqqx?1B%rC{#`tOVV!gS4;$9k%~BdBZvaknOuuw(>b zm#8N|B*cN(EJzXY@)+;*Q3UDaxF{zG! z^^e+pINxRMvm;Z!VK8z7A!z%!vmAjnVUd8H{=6ZjBWl^_C9a#h4HP_cRk7kb= zi5h$W3?et^tGl!IJ+>tOfUft-V}cgdgg3;P)m&|dQZY0YetZi;07*wMi0~7u7ni_< zEE3VUD;_??LE5c#%^F``NUaO4!J_!Kxw@8xJb#Ln(K(LE*}Vi8Rg$Gt^}BN<#qWiY zqYT}#75DY9tZD~tjsFoh9y2^odj1uS`FlKXMUQ^b^BZW_@An+^+(OKsUe8jG$NDbv zflpfRxBk?6Ejs+ii1U*qI^Zqn`+KZwEX(|k`R~{UywCg-ECya|K877ZlBhnnm_f70 zyatfU?->8i8T5U|pBS$-Ud#uJe~V@wY(tHV^&VCO9`n+onKQ-fjp};by&mBDXNzXW z-0NE?|Kmk7qs43TxgK$^cX0iKMKh<1*Oce_f#S8!A9k;A=KA}KW=<8aDbMxE;-?m9y^Z{DFPgEduJ5n99&)d@QvS(BGxt?ppD14Q ze)8{iueVVCTZ?9nS6$!ZUT>!S*B8y)UA(3|*LM}Kb^bB;x}WQ>Et&LH^$@nmO!V$GQHMLh@2@r zG&A5nyvBTBt8dZFE$;Pdu9q*G*`bP4yH&wXBNRqMA3J)u)Ewy4`SB}i`Ak;;J=qVxI_i`>l^LFJ1=Ky6Gd;@oADJm)5)9PF z#;?$eMECi2 zjTDbhlTJkt)mFTY_qeiiMfmu{6}qkn+jT)Jv@lb=$)9)1wn=+|%XIr?J;UYRFFUoMfK)b&}ur@gyTeN5~?P8jjSNb3nCpTZg# z({EyTf)0}gq#FMZcxMS}$*Ft?-hk)agH9Q3{rwf0MNei<3}vMfK(@Y-1wv|&9JeRZ zKHR=&4(U-yx7Eu@&z5>eixuDLJ~8RU>}z;7-sQ5nW42Xs{Cqz=Y{IQD#9mSAlxbg99B$ z{BeP9-(R!ct*PGbWJi-z0ZZ6{!Tq<~wrk)BF6~N~qSde3XlwlZSeeXG&Hpx|-|#$w zxquSw_>h;{NRvS^tp0lbr_bVA5rN2`{Z1eFjs zs5EXWNHJrA5{T|A%jCimgTOiwyn^+?aqlg{Aux_AdZ{wEA`@aJ1@Zp8CZ=;hT7}`V z&>3H~BW8qY0s1yEnhDpOA~bXWkl0`bgkyhzKu=5)sW}TqqaJdyD#?hCT*`U#=QI_| z6Dw7d)M4G+al0DjB`afEw5$8aC;6^kXS@&)w zDc<<%OONKyYErNQ)(zrLq0+olq$G^^df8V%G>9jWID-l-@g^f#A{=6%LQroOj>Bg% zDbRfnUl>h}k5qi@viSP2lUv$47&LnSzufq?#Q*q-^&Io3<~c6@zxo5n6@_QZBBIpuM4sMGl5Wn7LrH#|KkW3R3LY{zE&fXG1BcqAQpQ&j$LjATb7+ zmh&P407@W{;{i02$wUGyDjP&Tu~@*%Jc9mwvLO+roLV9t$xEa_XjrR=5E2okaYDfF+w-_QXSW zBoY9w9lK$?>)7j&JOa=aA=V%E#4)V&CQ>`=b%S%e`s)vY`zKNRRQ2cab=W#KiYSl- z#8<(y3p24Kah`&*7T8!_vG&#fymPci%7*~yfmhFGePWnOqBRXy%j4a)s#G8;{ z_kO(VG5rEmDkSV~5t*#4rThDfIkkOo&cXkh5&ZAx;MEf|X8sE%f3C0K1p8xSSlx_M z-DkuHBn%5MlyKKUGzeH&%O4Qw*p#G!`os4tGgXEZQqdM=S!fY(Mm`hf76QLu za9P2N7x(%^GK-BSam{cS#`_$|#IkQzTqxkgvdrr9NFtG&Dp;ClU%kuN)9|Dxa;kt4 zkKsfu&ed^*Q)1qP!AOd*iNM4sfpAQRqk)RgS6m2$VmT>g!*Hv={P3z2gJmTXYvaOd zDBI4-(l)M7fLQb@&42Bn?NK9ENlMDchd%H+=l{PnJhxh}ApYkq#$Wyy%>SqU$y{5( z3Czdgqt(zk1Xh*bpOlR}fQ2uZGI-OlhhRb*2VaK0gGn~ugL&1&0}XIl!HLkvd9@WO z`#I@E0o1awKqTxl_-YB zeZY}saQ_9mK>$t?AbSl-H&Q*0yF9O&5EtN2LC`dnT&zKE;lqAW z1RC9Ib88CT;v&18IVnG>D2BH2C<}a&k@rAOMy)VIP50O#-MV=Y_qE z4^d85nJ%(y?!^ZO-4#q;BeSn016_S^bzd%Aa3cM21Z_$yTi9-iw2G%Po$hKz(A~2~v)H#F4VNpk-y$=u=;Legmp^?{=vcd8I?R7z!6<6=MIlz}RAV?y#oK z&zP5!ocCXDcj0QSP+gW=xY^iVE&?dMM8()JkSTn{W;6jTmjUE~Xd4KZQrLeIzbzd_ z^dx*XhV>&UL4AeEQ}BM{e=wI|0ym$jAr@=SNt^7Kv5N(14KXR>k>x70t~n zqh8RE?1mXqpD$m^tt&XO<(3jYNCYB!+Ax1g9iuEXGDiGC8)!o0u*?yv6a%ORMnCP3 za@gUJjZF+-QgsEeWhT*OgVRcY((;7J2bAf-e5|5(7Z&Ngw<)zKk#k)}{0zSI$VZ|a zd9fmiMu9B?HY6z;BMG65u~Nw>x{NHmbF{5=)#_v=2910zwNKMBy072_s$I6dNxQ>E z3>)!rz!nG=iw{^z5Sc`%01pd*wTKqrvcL-}GmNgNN-?9RGMjhT)}@(ow9Nl&Kw$Cw zrRNdP4$lJX@2m^f9_w23o96q?SD6o*d(0b*|HLxrMHG5^e;cl8GrCr9^m^T}4Hf*4 zl9vpf85(u~jn^)rbazE*SM^a{bp6$BMt4U8}R7ZN|pl_43uqkmqH7Z>49_5vyW1cA{ez&lO%Pf~#Wb&TTb9?-YtPYq z;}fw3)NX5aCpb;p->=nW2XMzJJ*drT`Y&rULK`b+*`-vT>m&jU9f^*vzyFpA0>_>z zJ*z*u+0$mM3?#hXA!nT2Vgt_YqzQFCbVPN#er!k&bQv;3Ny^169$wqz;X_C2Ke)$i zGXfh2OJ6O0sr=ie%9ei__2STwGu>qVFEwHYxET+4qSi00f3V(c<*fZyyZI&a&&}tV zx0{{D7mYsyVbe;+-3OR05AJ-uoL-O^bx=+uNNmDR&;buZ<*D$A9% zoh%W$U|$af*H`rO;R`4~M)!?lkUu_Ada>@_NH^WPvV1(dhG){fhn1IF<#6=683JE}N>_LjieK^ZySTo?+{~)|KWS6!X8@zucihyTfYl zH*$-%Ya4;uQyn^WIW&9|H8ha^!K8RYg;T)8MR3O^^a=Oz*d~aDW`!Fv#3F8y$?e$A z2oLUCbq+yGN*U=o*MX|*VAXYqW52wGAzXPP;oxC>)A(j?M?s>LgFx7^-xzIGsc#VM zFdo9l3HB9C(WJm@A38J%APov z;V~+gC?1qpY2XNo`eVLyHY4k+##d$j-+`yR=lhpidZyx8-b z;A=hT$$E}^4tREfz_rPGUD_&;!3crPekZ?b;Rdfa-U^(Z)B!`6M) zVe3|FE0)2ltsAW+*5zmwpEUo&{G9nw;tReFG_l_|pD^dJ5k3#zm~Gx^?lo^VBe;$& zH?K7p8ow~UYkbA{XRL+)hI7XsL!9BATX`8Kn{D5;hP`tuRPq~=>{ZFHTMu~WdYmM8 zyH)aQa@Xf1xw~8?zigfI&fTPvU$Rbm=enF^);o8jO8$qH@y>NR$+UOw29^AxmGaJY z=%h*VdX@ZwmGsUn(@D8|ol5?@Wqaq^o#YAc+_g^fUhmvemHam;dyPu|t0b4GY zd*`lpl03H9N%GiLD)~>=kaup8lf2J6ccqi0?6aICWv@`l&s)d6a|@m1J>EI5N`A_^ z%RASmlAo01r+3cdB#(LLES3CUa@TZ{`@D08lRWC3ebh-F z@yqt&)Evk3FE0Z?^V&XNOht53D`j*;6X{`;t8ABnQ2- zS(SXPb*pzaqmy*^Y+5B>BgvFX{+>LRRLNIM(pJe=S-ZWn_p9W~rRLcWNtAY z`PFX!m2c1W7jDptVtZ<3j73rSfQG!lcQJV&Rwamx;Cn zY_%PI+eRViPYZxGy1_t#P(UDVN>nQ1PNGb)#S8G6puI_hf7|$WuD!5K6Ww{xXt{?z z391aXROovE6GmGc%EoZ*j|PC1MV&zmohA(S?^vtW z{1(c}Oe98hY1Az-M14Tp66%=P0R#)kMpE%qOS*Ic-Rpv0Ud65oKeAN@(VDf*DF2r6 zEj|DL(C{1ukF(9Z+xWxE8TxB-g@wR!r-6?xO|+V7KLTep8b-@b=r;5z!1(~nOi-9q z!jG&q9wD%-a-NhK-?(G@i-juA4pZ}(U_UZ`gb4m7P4Uvh?JX((Az^lsxD5l*js7i? zhy_t3q+-Mkjz);ViG|`Rd(zRnH5!QhPLZcf?GKF~=2jNEoSAjJeR-?){eg`#9!UEP zksd@;E%0R+bV?NAFeX80--ai5jh>mpMj7mzCM{f6tW1N|sDj21j34B>3pW-ALQ6uw zZ>K{6TuNe*DB+d_HxV}9kKzDGK8Q_5lQMaLeQZ7uiiPGwS+@1B67!#iWA5k1&*4&foiR7mwY?SXKO-6y@w31a!Rm))NNjkM z9E+LYVT=w4{f(t|W@2g{be9)&_xLm8la-5oQ|fl@!{1f9RxeW!MCb<20>v8^L zn^lu>L3`8IAfX1qipTsLXBbeak|}=(1<%Ml+PYNisf_I(8$Xu$e>p)vJli?NcbKO+ zb9Xu`0Ol9#bXAsTLdJTr)poVVB{j06-ES9nXTc87Y3Wa)Fq>5 zhDSk3g1>gvO31DUQ#s-mH6VR}_tj{ehlJSbdXew4;%J~XwHLblTR=1>e z6}na8%VS1JT+RsML}qKkkBfH*cajvAI0^YaON2xaIxy%+<&QL=v$~wrpq9o}qLg0) zjhNweKe!PZX-v00OKYxUc;3DT=am49UMP~mxQwW1h&{pOk7rq0g6VY3PAVt1p($2; z`Clw15Qp2t6I*mE)*-g^gj3SzHh2}ep7uSLa#s~rYihfWEp0_D1}#aXQxedQ@aROS z4-hF_tTM4pC5Ttr@5f-Kf>yp<+v{#2GHWQ>eJOW!VU?z+_wL25DB6W^ID(-7tP_3} z5)K-t8UnDU!kI)k7)!)MqqcyVRS<_VQlvrz7VuS^dWy6yK?+kcwd}>?|w$h-ZZ<`v5)I6ai)V^)=VO4%%{6gmc)y6IZ z#QgJ~TR{Q;jP-KsertvKE%Tjd|Mnn{dpohE!5(k&w`J1;Ul@;Er^{{lPJf^)r4pUw7OiBbdy^)PzP_U{B@$c1Gq&g@6_AmEr{mJ zm3saC>Z*VJ0%O0oyaiO*il-;eiUz;(;X~Yuty^I1HOuRN233_NUlM1OK8mIj4HiW6 zt5sBiwF``0-i;+~QRQ>PW7+ZYhX%P0tyy5~F*lagvho?>G%LQelNswo z6p8e&qhaSctqfEB>)cGNl4dQhT-mc|p@%XEWTFUAKx6OJe0b9urHH*eWt&k zAGL>V>{(!J_pYz`qWebYL+<6??ghq>cTY`mT61!0h>+g(>D1Y7uKTinAN}KvHF}v_ z%ppO)!@Vi+>e~G`8%gi zb9*DV4MS1mBh%(Y{t&RKqgPKqKyLd|$rV0vV*LEo)58_FP(@!ieTrKv7nk0l&OWQo zEuKCpW!1~&@l;^(bhh%2fAMst;?4wR(v^4o*H5Rov$pI55P4|)Jj%oCr<1i=Qn^*< zR!rMutz2#x9ZuCWSrQ0OZNGB4X6=gU`zf|n)ls)Valv<%Z{B5(Tsb{NF;&Xw>+4%G zeIJ+YM3OKJc~6!i%cf6ouUp;IZ*tmfa@q8~b#iFB$?K<&J2{ITBHd>~*H7P5Crcg* zbxhw)R+swx6kiu00HH$uZ=b%4yv}7p8IjC5QsbEiXV*S`jQhQ1jVSy6s?*m_-^u+B zRbI&mR%JO1q_3SmDz8zMab7b5idFmck?OZA9L4VG!}9hn!&v6jL%m%*gwUoBaj|CY z_0xwav%Etn)9nLJf@XxerVmOMk1s7{xep&%vv%3^0m)ZHRzA9XdOtavR8AFB;9CXC zQf8ui`VLBLE~|J=xv6E-`zX^}HVAa%WG<|nzFnR!`*O|G>MN_J_o{O88Fv`5AZ;n~ zbq+O0mQCMA!LFt9Ew}IZ82@Sh{{@EUdDeeg4-o6;IwGX~7yRX}DEKuawRBI{5@C)T zYXaJh-vKi`i5D-NT{4^wr{M4W+yX@^$HQ;}VVqTe=tJGZUSr4#- z-(OX*Y-Bkil&UA35m(cyTL+#~*r+SevDs+c!MXyQ!GOWvD1+q(ko>_EwjU{!_L&q% zBA}1M{uF|FD6RUqa`WMKZ4++ZoV%{DL4SW)!f4fi{Yac>JB|;S<04B=z?~Cw4)H<; zs}oK*+4`SXcb{6r^!Gozu)auGtAi_ykoi%=5yYID?zH6yI1 zR}u-C{|k(F8=m9V+pX*H{(bjh*LsN zvz};8-%IT{3Qf=}0ysy9kX_>+i*5is4pyGHggVg;H4h3^^H-OvL*q-0m*%<(K~3Y* z!)sf1{Y&s^z;l~O37FRtZv}rKjIGi^v~5J+iwX$MSX%dc{x38AIFppeH9Uz(M}p}CV-o8WYD^@t0`>lXpW)fZ{9kLn z*!a0Y9JXibFV|Vvtec>FaOuW|yOuM~U&B6{wuu7;^lCZ_ zEKo50V1}2evubBwS!UxNdA0Fs48;JuU|WIMnq9<&v_ z)EPq~nX!{or!-SuOI3MpW3q@gnp;$eJ7f(kZAsQELEo|2DN(z^fQWrY1Sfq|-f=Ki zaM%xKi#oMhnu=MC33{dR%G}~YOcT_;t93iQ0yi^4j`{sIN+e7#@I1qI1mzNDi-_Q2 znW%iVQ7e`58k6)2;}yA0g{VVPruA<0G8@uu9f3R@lW60P@`Hxi*+0y1MX7S3XRlM1t<144yu6Gunz&SLgd zy}gCI^Vn0~XuL7EzOcpV^uw)N>kTkT*e3-QP&ii}i}wXE8^jCa9I-=b;m8ftspjwx$~V&?=arM9<@Ug zIiEf1?J#EmP=NQA%|=2Q(C`TB1k6;7P)U&>3hAIbvAbLBQ9A#r?@`2o)bsyw+5g{a zU1J_J9)AiG_E%LDW1-u0J1!gS9B#Gad=6ieNHWWr(;tABA{H>-;R&p}h~Fc}(0E$O zdmApF<+)XzU9_}O*t$xpycNlC$pWxq+_W2?Gd_n#cu>>MBDSy91nfOIO<6M$4+BDqTC%K4Sc1?uNpxx&rMx+PAi< zz=!NGaA4_Z7E_NH1{KIC0$5oB9m>I)nU{=Cp10l5w-v1g;;ECfriu?}BttYlWPF%Y z{~l*(9NW}Va`FLe5;8C&k*p1tw4Gs}AczU30Ks4qC^t;ZQX?5#YXM!mi8=?%vO?vJ zTibjeFh0Qkzq?3a%RS-!b`&hRcr2a`;>-rH94K><6rqthqa*_0WTw$mD*r&l`i=R$ zvO?tqR`z}^x$igLujl_?8J@k?>n$JnKY#VBn$*widvli;_B+iy(9Sqm*i2twS{&VD z4ACS4Q;fkf5gZ8!N|y`-z>dg<(n))0a(u##>Q*&Oi&?dDD55r6xqAwCXotp?$2xP1 zA*HDd@`rW^V^o4fhf^7bB38DZu5s3m#I^Z7OeKTSEtY#x3E%< zZSc95qC#_LerY8rQ@b@>&VFc`xyuUsimO4(`Su0m=I{nFS{1-h@UVnWU>sA`kYLpz zuRJ^2U^Q@aYFil{^H+1r3%5IT9A4j2{P0gKs;sA2{BxqhoQ@t2W{5UOx5v|2;x&a% z1AbZ5xzZ|i%%v)d$h4|3s;L+x?Z!VD|AtG&UQOcCtxG3c?OLD5EHuQC18ypfKm-x5 z#GVu|S{yBqoJ0lvT0UB}I4az0?mIhGQJY!O!>$%{s}yX!U47p8yv+a0jcdjJ_s`8s z=CJWe<62;&oH+Gek4B70Q&^u)Ye+)R#%!BoE6Y__v?keXAe$9nqlh2N`>3nk7tJG- zsTxh4(i(q-@S_{Qc*{|NgXrU!1xOQA=hnMtVYx7LDR)ibi0+4u9ZT1@S{ha$(6cjG zUUF^~|CRunyCCS2Y-)ba5HUOCDDLa*3r-G)1$V9~t#{2rYZA)~st&soX<19EdI>n~ zhl61=4FO8*x3L!s_yd@Ui9fUezY69ry<3keozt4CUb8nBEF98QEjzw3(PHf~yI@#@ zc>M+tEaJ2*C~7RFDL+u4L1g`K))*@dPv~t&E7_&bYlm>%VpWaU;K*-wnLR+R9n@4K zw{6*$OW0HC-jp3jB`P3ie&nN3>Ji}wu=#ipRgat$9r(qHnav<9WmZvGH8b1ICFYIT z{~mA}bg=Vas|NKDV+b>4xYvlE>5p%F7(gJz0Dv$BIK~FjL>C@QyQ8b>gV0u%Tfw?I zVTZL@MWglI^q5!c{r}B|XP5Ot^M_{Ic=I#6Pd}4y17qzT-L{LzcU7)S-l8R~W02fw zecuL{HWBkDLoEFg&Mg=Sq|$*90$@Bsz_qeRiyJ^OA;v7*e2vzl(gO@>$12#h*HI?F z)r*v6LB}N|)pt8%Vqbepy1xf3RDdCYSQ;3c!^AZnlzMUm%?c+3nLX33!!Et74w^r6e}Fl zBy~L8de@2LpqN=71Hl_ z@P8)^&w%x?`3L5+jEQG*#@2fmPMmHy>^|L#?eidPSoE|RzsPQ5vO5zvG77s1QJCoC zITKFFm~TRuo85x2VQV;dxNyQbVH`Aa&!Wki9CnBa1rv@271sfSm8>$^8<)j3E14t$tHkMWCC@O_y1P24^lgZ+Lm`s<`T%LZ~wUW)iCq|YVFurV1kF=G> z!RmOi9(T8@hp-_C`qM#xUI45{FNJ9l=2~b1BOnh>jU6_uQ5jI&Dm$>9%8+;vrOLIy{A<}jmx}GvrorE;;|b|_`y1l<1&G6 z4C5CTd{BE?s@+3^=7g(9nu@DaRtm0IwToiZ-Imf@1$Lng+G*SxhxXL`X&=K;5z-Oi z5b`v@8V@LFS|HoQgb+Y37D+)nYxO*6FDuoEc8WBneasrm-CIaHkV|)W=N7eU_)$9; z!hHwZJ2p}QBF7e%VlJ zFmgt$5vaR={?wh8(_RpdIn=;$U~+-2CQKH%pqT*YQ;BoH5)5_H=k=*8=C`Kqv~^m~ zfAD|yS}!rbZtfMdonOB{v_HeT4ZDxE<{8c*j6jKk)*k@`Rxp^O+2B`)2-qFTVptK6 z4o?oIaqSx}dZ^cqED1VPUZ}-3eaebBG1yrVtp2~5t(pMNrV7I#*QZn zHieiNCGnv@{NPzk`-=7nwQE~>kro7=wa(^N6;5gb+mCjyZ#7RQK+KMYGTAr|zzN*v z2muxco&s=M5LhtrLrcdIe{Fm{g;-3EC% zVDR9Ugy0D=4M-CZj2$W%$kw4rRiV+$t5e>URX9A5)S})V(rGVu-uJ}rM>30T>r6KG+2*bMZ0p(R z1x`C;4t7LZwekgQfdq`RZe(yL6iOPksZ)tk`;}2zuV$Tq zX1{ccABD${C6GkPEDmHy1mKVb zsVYhw4dP!F=`Ax$Y23aQwkZ|uTPEPIe!LSX$wwjk%>2oI1Rw`|z@ouKEQCr2xgbDg zL|qo^<6t@-O&0fnGKy3Xo09#A^$0KzJeRkaeA)xT$%s>9q>OV1+dUNV4e5QDP%{I=e%9BPzKAj#WQvO{252UYTVN#3fG%LL7J zkCWu?Zk4=F?(TAu+}){?*9Z**D!If0!u1v>nf1=?P|2$W!u4h+354r*m0Ts0c)Qedr0en*mPRPx)BT&*q;zvE2Nrp0Q@|_mh~o zx~-SA;-aU)p-#jJdq*5p!l@-N4Mwtw!JineVPu<0xKtP0umRs+Q%)QIRBy|j*0ePZ zsGbDN)m%(V>BaN#^0c#l+vwadjT|0nzY#=}=KUykHyhYB*0Rrg} zqYk6a;W4~lr@(V^kwofG?&@M|)G=z^_-Pevu~rJ$X+3E@nTr%8QY*A}+}*vS)$I5) zR8+8WA$;$$aG>yX7#(1J?g#fb60iwfrHODUZFJVGEQL^~MCt|sOhKL{Xetc}|1;}b z*dj}ab_m}z-rcg1Uuc7f7AFRwok89Js)G326Ish2=DduOGZ>s2KMH2n#1Z0#jGa6? zVo$WHL&FCus?*@4^+M}U@CcE>?o@z1pyix@0Vl0Mh~r8Kv7bPZg0ls%a==dEBa+Gx zJ-ayPUBX+eOPkzs^O{aCuwDSc68L?d1pg*}qp55ddlZ7MM}a2`VLAueVmN?9VkQ*u z7mu>*TtZq9Tr4*)f`8NcO_~3f0pH`f$10dFC-Lj}mz%g~Y6aHvTx7qozqv)Cc@;R7 zEcRGf(6mHP;MmFuE16D*`~Y=?uqJR@b8re_Pqj(nku4%B-ry6NDySHgs1y?(+2UmB zVrn;#@Pp3EGg!XzP`3JI8XVBw;_AK(s}l37OSv-_4PEQ5T&Q)e7hxF)COWR;sVHtx z0nCWl|NM9u;njw4(I0dvtY2we-BO*NQl+cvT>Y+j)_KvT+@692C1?J04R;+?OYK4> z`z;xG8HNg62u_f764y?&WB{G8Jz&Ni$)uT0h)g9gGTo}3(Nuy&oaPUdC95Ypu1w{IdD?=9|oddB!|U#Ewqm$Hu=Je@k?*$9ctk|CY}z z0*pwbCux;1GI?9}lqmBgBWDbWu8QMVzx9v)j~PYQJ21aV>4tX(?uEV7p?a3wnO z>{JHeu+gP6SJd2HH+tR7LU|Q{T!wm8YJ6fMlY&uLKI0`LR(wfWm@A3M|fvLf?VBEbUc z$Fm(X9Yl3WqGS4PZl8%t7d>}q}>EKN`~m+|3luJz}In= zcmFeIl6aI@P8>&Z97VQd#f!Y&eX(OZj^o%)Y{!Y6eNpZ**AlTMN0O5`D>q0g&_=p) z3k3=k0-;dKmJ)UXAqf!LQg~llxMrM0q4xzGc(UQ zGiQ6w@A>_RrVFcoIwvH3Yc=JXMz`VW9P1f>)cw_CE$iP={xv^*JbMI+uSev)75$fY zZ+YuW#vhi~RIFd^J>V56DOQRBofrx#K6Q&J>*P z@%!By%r^aAT`QgA_sJ|(baP(m3PauF_o`nzc$fNXEL$+D>NR@)_;LAEMaLzJo|8L? z=Z}w7om9QS1>>Wf)VyZ8+L$QGx*L(F6$zO>%_0Q$!H)5J-0bHX71={e#*fK+Q`a5p zJ<3j5{$F;h9pl69Z~7g}bMpTejSq3YM;TcLS}3cQj30G>@`~t}BBba4VZ*vaq|9GO z$|@YtjEm{gS-M+0_r8u5RYP&PkM=;g<_E#*WZ72%-z;Sqm;yVfT(eb|ishnl@My`S zYW%G1kLwPJn>HQ2O&0Tx+hj#3fsD%I!0SQcnjbt>>?xh8jbGTmsCphz$M_F0G0SEP z89AIL5a^J*iTMP34WMK2hr?|=0vBX83b%prDq~AVen1*|#$1eKr5ged3ECmYf;@x& zBb?7f;K@Qg0EAgC*Q${!W2;8qRkB=6QL%SNbyb$XApbi!FGElTa3bO=n5D2)$lh!| z7iDvv@SJ2W6G=1X@_wtQCc2e+^D+6Mv^pu_R=ObGE!=6C`q-+V+I3%;oPeEos(4pP z%%P0uW&mAg3E%{l9Llgi6#)xMFdy{qpiV&V#3&R|F#_~N{oN%4% z;(rfH{Ld@U<~qwbSblq_nJR89ouj|s4yR+;waxeL%^tMyh-V=ds*r;2h+R&H9h@)$ z(F*#+{@4gLBRj0BrBB`029c|qx9-Mg-D^6{9EK zxu+M(g`<+X9oB|A(BHa`m$BwL?_5moHoJ>^OKsZZRY#3o)N(USuz3M=SJ@Oa^A0d- z0`x+u4BPeWI>o{IWg`UXRki!7gZj&zsx0nA*~eD+K!aKUaNRoSME321;?@$o7IL~w zdDaG%XA$9&L`KAu61hhx5~B;iS{S|H|92oJ$W~#T6?1pf6<0Ol`Os?BPt=9}HYmX& zb5Su|n&+2bVNeOq2UE$;Ul#vFC<|p1d^HS-`6Nu`;6w=oj#brg)j=z7q-tT(!07YM z^Y!@OVOYCG$^3}%_slp9qj*i}JYABm`+CAbC0Uta#hD>ioxz7VIxv(B@r>|MUI`5a zJ(%W5rn<)I=y2Jgd5f_iSX15Gbeb#8mBs5z=j!4t8SM#dDl0N^dLH_4KCE<#cws_y ziEKoPF-_|R&cf=TG48mo6+Z?Dx$gZs%@yVfO0}T%Qe8^x0OA7V9M?c99EY-xNlh3% zl>%yNEI&fc5Xp6|P^DrJs(nGV&}y>O!jtRXuTzCd#!BtFRErKTVS3rTTkFNsLtJE1 zdiPOIA|y$YbY_X6NfN7+V9vpSpl22>jvhL5Bj{`cyJa9{tTexMyO#s8M*0n|ST?P| zrlyl@N`yl>qCTTIG7$e@RKOHjbuF}fKl2>zUT!Ye?f){v3X7xWQ>fZq*7~SljFvjw zFK{q;pkGgC02M8ChCs{1%u&&kgDjHmjy%{0sMyjCfK7EPUBYvlqMYhp)oHFb*B3XJ zF3@K8+!Ji}I;br}DK@&Yu_#DQLW0vW7A_J=aDw>4f>VtXZsmPdUon?~f1SCmm@K&} zyE7B4TkTD={^ zJ%MBVYTWthT#hgw_QX;!Iz^C7PUmxM>N2G!1SDJuF0S52sr&XfZK}M0@kFna)mUG% zomcnzPII-nnz7N<@oi;nT$O=dkTS4Um8WHgSrQO$oMp3`)N5mM*4nybuJy8ZXa_`k=@PZ(F{>+vJ($E zEJ~v&S)*PgwW4MCeJTc%ObpmzszUIx{1r)kw(=fgU0cfK@!8r~)^@w{ql{Md5U+Lb z)M-Y{NO4=qlkpr~(i8M{(2WLXz#J2(0qlHozLsTcFNX|v1hP5&8{P()mLQ#Dc~nEH zC`n*tbedr^T-;Jxth?idnT{PnFNTFR{T9#&Q2ilr2Z*PqBak9Q+3y2IN33HVpmE*$ zt41AD^B%;%KDN8=Jvz;h8NwsxihnN5EeUKP8<`rjBN>B?h^W>C$OI`*n#&YGw8{YW zM64bJx$e`w68JOYsxq`t`y0)Tvi+Zd3*Xu(?lgac#4qh%@v4$5xXG{{_!{8#0AmwL z)11-bg$p{AgbkeNai))#1-Rgr6f@QO1Ka{ClEOB zhNT!;63H}i(@+$nD4OzVl#t+qgn$S*S$%nnJ^Q@eI-||lad6s?KlKj?07}x z%CP_e8XS%xps?9=f(VWr&<`I7QwMom*NAdS<^)5od#_G5yy6tdRrYM9K#U!bv#g9J^zn9c z8T$Q;PP06l&CSJ4r5-(MQl3C((Nm<3TU@bSj*Y~&(QqUj~nKjRPlepSz< zJpM)18_f;g#wK%9aeK*C$)p(tE(Fqa3F#bP7Sn(D6^NT;qXQWeIsQ{1Jb~WVRR_yg z*NF0`6$tFBdwr*wHq#Ws)ue8v5Gk-exLhGFh^4bI7obTk8GjIY2JbI-MSMVF9h6^P zBg%ycg#6XLzSB&ZDLwu_XIOF6e}3C|?w4@*FWy{QrMGD|7TbCPeMZ+Z@=IBG`lbQ| z;Zey4C}Zu2$7Js;N9<)o)LKhx%!XGt#=JFnJ=dD|6?c_Z>So?M+5rft`Ksk|bh&fM zFq=)`7>plzqID8%xe>aXMfwMN*-+j=`0gkKgF|X-yOl;>b4djZaSltB%guchWrg2k z1-ALEnRpJma99#$G%VvLd=FTUwk&*^4*SUd{LIJbwNe%czdK>Mxg=$jBy#N0&3!>D;g91uPD27%Pq*J7p~Sok8TAFX=Rh<z-bI*gz0(VrOg6x#0 zFFQ8e{V1n|*mn!)Y(Q;@kts7Jo-G)iq*2rGcRN_Axr>(Ho1!(MZ|rKTZAX~@w!4cR+iZpe+U zoO4V5l=&%&w_y&&dloWPbdQ+0^L_Bm5WIqdH5m64fw}DGMRQ*9Za(eeHM(-n#e3F# zws=EHiu}C%O}wifUg&2j$DK{mL!hXNoMg&rbcs_BTjAodtGg9 zWB1PE9&dJ;S1t{~Yo!PNg!u^ywyyPpJ;OAN*bhjb2sZ-t777D(f{2180GQ+)U=d|u zZOwZH2q;*i%jRCNXUu1G`+v1z^@!cH|5yLK+rK-Q-%#@O=UVuVKFtWh^c|&l)culp zkXSH63yIPOUcOkIC8MhDTj$(FnqD^d>i)F(X}%*@w62u~@0DhxeVe*w0>ri==c<9>g*X2 z4~C0{AW2-Z8L!8l`{x*RrB}X|rIqNUvYma>Aj{iyY&3O zapZ`3F>5lW3;7sqm^m6*!ATRwisT0T91dGd;j~xTw=@eKsk?Bmm^t{X%(+hbFE%fx zM2R_+XbIHTi5N5gTnwnG!Y!;h~_4v>J-v*I2U;RtH z|F^s3YK<;=)OE@B_*+N#rOIj|sT|f&+~YDwTx22MHed`NMjeaJpr=<@C$aWp+^( zPtUZ4_i_oo7)ja&jF;6xJc~vr1bOUK03Az(iRUcnnZfCnWmX5)`g^$qcK`jQ)ExTc z&P)t$=p0eh;T#&adE`gYH0Mjpr@#b(X!3ioTTi1rUhj8n?dxfI{O>e7W&1zVc*KCm z{C4w2b2Z7I;a_oO$rbg40y-KLS>Fy`nl&%2G~^H{K(qxET1wCv_&4+6yi#Q!8_+Qy zdbY3AA1g0WGhSFr^@E8G@N>C{`bzV?LP?Q<-7xx>T$Rqn`+`LVc7gvz zTNL~ynz&3#voXjO(l{FO(2v4G5zWX7sbuu8HO>FMkx9Ew0km|LIa|?@IR`*Iuw5_< z1kDh>43r$|M!3fy?*e!gPUXD7yfJF59JK8k)~p)63+tI$@0?`yKj&02Q*xC&mkf5C zkdbb--7pr}d|Ga=gy5P5&Ll^@xrhMIs(2N^a{b}GH$bFCvB;SbgF(Lt9JM28mD`8woY-r zIG>j1Dtywf-Vs#6=P}VnGXMY)p@gXzV-sCKftrmJ;P*km+ojgm531K-yzm*F!$&pf zLm6T0)v(tRyH^&5+!<=E`R9rAilLG#_KEp{MDgclAW~%aCMyvdOssRzAUKf1u+7Uq ztn%F0ra78l+x4p0^aeJcE6xQBzg>F>v3Xxml`mjxLk9VTa1$ozA&>(h90UGw)W8vW z3P)3w)m)kOdi}ap?hj=;lCW01pth- zdrC9A{iaN6X17<#q-J*e4VhOnyZyR6tC`(S%Cnl;ZAPBe%x)!_)XZ+vGO3u|>?xU4 z%x?DMGO3u|>|cW$Zb~t`*}p22irLM6rA#VjH~SSbshHjDm&?l(vzt9GlZx5Rewj=v zW;gpWnN-Yfc2Oo3vzz@=nN-Yf_Cs*aO(|wKl6TruirLMEs@I-U%x?ArvOtR2%{~E9 z;?xRB@<#Hd_SB^+dB40vubbo!%T@9|d0CH29+#JOyU9oGsbwlT2JhX}Qk5K)cj$7H z+~E?H95UW)Pj#x~QSq=nb+Ma#$evoFl1HSG7pdgkGPzhKUm_oTp-K+QWQR%)$P5># z_$Ip0AR5nRlT|=H%J)R5B~io~x1>d3J$H-X)XmD%mfS^HuUrnLI}&?~uu} zRq}TEvf5PgHkq_l@>ZFgr;@kGsnY2{$dYKd|d7Vs}DtSOA z!Q1j$_KFAW#~*c*C+x=`QORp0ui(RO5?;ZFRPt(Zzy0`wD!GSZKK_78?v{B^xJmNf zuadiDhWk|VDoJp8uTJuY9zU**kF)jphZFd6*UGS(SHDIdZMG z^Snr0#PVg2?(DQknv)0V!YN)leftE3#0l%EFp} z+FCm=6cHE5+rFZ%#sj}CJ2o3Aw4^VzfK$LZgEss z5uRnWD)4jZrNL=WVJ{FD==T2+!@5zt1OCrJ<0Fk5=P%YT#kD0@0eEdDm{z?D=W8;b zg?pp`T?X9m#EYP%LKsFA{W?_koTHhcfy~%gW@xW7ba-q)eE{_*UUhN?Ov$@MS8+*c zzy4lYVS&FyiWf$l0wLlcsPhGaTkz>a>XCy;g)cmWBz1t5jSU%cM@7c*rP zf5xqxb(5>s3r$+!h`&4oqdNi90Nh}aNx`fSoIQke69j+oh@hVV8`eu8_yW1-z1;>~ z>FkUx5B%FCtH+H_(Ia}W*p>Qi#o}&u6QK;qVs-?#AQ;IQaCKy;QfzC(d<46$ zWVX6KlMk}k%`#VuyG1t^yE4D6SiB7U5W&I3ogj6H3J~OZadduZ{sf^oAtr{(;)8=j zK^D7N=4$aWu?&k{_1{)3Udr+x?Nme!2_~0p|9H7#4rHao#pj3=<_*X?-Z4BHWU-rN zt`;v9OJ(~%%UEYvw}{^t7n%j*4>)M>SL`gg`nyQN$fnx#oA1jcqY$(Z0G!Ih@RWsV zf`Jz(gk+ltqk-xMIyPvYItsFq(4grD-Y5Esi%YJ|?!rC6GH^tfBh-l)SS$>nj#+Lr zo#qQia}Z1b>j`l4RZ=k3Evh#3vaI{E^A26piX zYK^mf#9TJT79U|FNyK*ZY=#exUOO^2FkGPlQ)^yDj=6pnE5%ACD>t=1Sy_Rvp1sGM zRQky{1sU%S6%wJ}%wXWX0;g2wYH0Ab%NYV@0xQId;_{NKw%ZD^=A{`Z++d(1dLUVV zoCfpa2rx3IV&fgH)?9XIc;sm22)UUKRqN<4y)!F3oziGd-L2STkS2ws7tJlN*5CixIO&E%rP}JkMK=vgblS^3$x6?l7 zb5%@eBdcq|KwGqWy;#qD`VRN|yg_y5&33oMI)aQdu&zTFz(zdcps^VA6_Et7x?y5* z*eUQLYbv9q8yc;)wOVzwtP|^4>$y_FRB_TcMoE*cqA0;p zj7y%en&zNEbFa?S@<_B+tSzo8xr)F&w*-$wYuFM7`3&K|)TSgf6RvpZ*+8@+Ttp0Q z#t(1Q<~C~h)%JSpm1ZN;8nH&V|2G)cb>a#0`{r)r4L^&9-r_T;M^`YI*B(g!9%bt! z!k#;XQ0%KQ;|467rJslLJIaZ4$`{k93KMPgkv548t-hpFL`9S@)YS)eztE=5DZ-$X zjl_WKzzPGW5JYJbFbaH``8JrOg#U$B1%p;Ux7>AA#eaI^Lu1cnL`10BtZx0S)GWLq zbga;6;aP*RibYGB0Y9PG64+xy8^HVa=5DT<+BS4uhDDf~&G@DUE)YY|Zsu@NN{lrB zV>>>^HheCbWfB@iea-QSTdLII8r5tKm4nXKxMo8lgt@NVZz~_dMs{2akwS`B4@VB( zK?0mmkw?f5G%5is2|qTlioBtbxix$ZLFR50ivQzG|HnO2|L1k)KbqafJwLUEt#3^I zxXQju`d9P@;UumE$qH4t44%db4k9cLtyrAhz7%|%U{tb^vEw5{hlVS^^9C<*cEi2Y*ECzb&1ox*jQAB0qXc<A}5u~lpbP~(dE;@=NkSZ$^RF*KH(cq+okREV+l0F^b0 zUuaZ9@0v+?ALX4*3Q?73Rv7}8Rhz|TdMH=f7wwT$Cb5aZ%hmdAMX)H1ZZ*8oQg11lWc?2aELxD@ z=NR7YR4NiLxBeE5h73U$&NaIE;FT6>J^z1&VO=U7H@|LfGhXpiZvTyL&nns#0bZ3c z*6uKx@(dcUr(Y<9ah)PFEme_op(O4diMd5JEy;?n3bN+%KkJ$S40%vt{#4x{+*A27 z>oY&sy|B}Gz47|uijpe@jMWQ+tbQG%5jwi~7{ic^v4o~Ifz(IK3_JiJu=HtLUDfn! zO4x~}?eAE!qf$Z1w!L@a(e)c&1DamI^MqF_k}t4-hO`dkK_NES89ISn z7jm;&e$7(>FW)BXSxYsjR8>V+zXdSN#@9|27nNMa-*c~9WCR)cx0!qvDosQli6w-) z5Fjjj#I(C8Tm_EWoV4Jq5wcuovgkxue=Huj&lLue{e#UlD+v zas{8t0>e(BvmT&c=5mRCoD|L3RqtGs=?QGkPcYX>v4ISaeil}qbONW1`qvX2otjyesQ#rf;+CezWmroXz*@iE+m*9n0v3n(fROZ_2;}LU>Rn ziBF9ErZ^h&GO_}yb7IvcAH}GPG_IOT)jT)=k6e?x(|D8dCb)B52~T>uZ?=x!Rt~a=~BY?_>b%G18!YM)Y@@9WIAGau&k!-2;=7Tn-ZIQV&g1Q=(0qs4SyV9Pm)cIRM7{U0LXCP(c4*U}y{zN)0ry{KGf%#-A4LTj$ zTk2}xYP^*`%vJbgU<>TS-jd0~Ov9dXSknE5KqGWZ5G2WuvKjZ%m;x*=rCdHMi(Ae$V*5;$<@gLn=D47VLi~qPc14w)iwt zQIN-M--jjMQw~xf_y`7Uh&`!!xNHBMASgAr=rrDGyc7G4*6sgY!hVuDz|+tS!61Os zg0*J|BpTqVTuz4EH$zyyV$(PSPJl3Qi8tE8{HK{xFcpe4&gNY5o?=`C6-y_ZjaihGx#v zruH1|3S82^7pOeIJ~}C&uX)gC?B1dAzz2xbFym9G4BV&>FRA(XH*NCq8-D(3Z*$EB zoyL2O_ZGu5uCC#-qdkE(zb7Llfg#e1(_=wsj2KV?cu}5hXIN>YgrE5~cq4ki&@?MQ z15|UD#CweQ6t~Z~I)_wr;OynyKs9a!4{M(qF zzs_*cq`h?-?>62|KWnw#&%TSz-Z(=A@F>6^4qN?+0+YuaeJoyWmb+Qi&(_0%*1UGN zpLKKAF}#&=?p?;abo;;8u&xlVHUHI&8u!*|y+83&#q^A;mek{P$XDNVz4}2pw&vM0 z!>Il8xq23CyQhF{HyjdvzT=$EQ3W>#s`b>8CT!12Z^en zS@#Drxo9>C!jK?Uf|MjDhlHkwl3+hsazh7OZBRfVtSV4SmzecE`sxMHSF zH>`y>1=sTXi4iAwHUWtWyVC_ha1!Z zN!C2R3^m%olv;NIqwun!p@((V5?!`dZYX@1eXz__io_TNG-#>oqH$GGh7 zu0W^sv$U-Ull^!okq7~WOwcJZGeWP9NEF1k;=Xd2kHTo)J$m)yXK!r<@T~DH-Gi%Z z*h=^CNyu{ui2=)tiXoW3G%OTKWY+<`ktcl5hsM@{aMXNQ<*%~}eOP|O0Wb8E#wV$D zPuOi1?O*G2(>jkI)_Hb=Zq$ZuMwZG20PwNDtIpw?Yo!&Ykj z8Mc0j(_j~afrZ#4x&I6N6IfytlC316*53QC14(RH>n#B(Yp(7zo-v-G)?H;oj1R2! zj}!RAFcK$RiRBCxO{7nv00$~8hb#}kTm0C@w^ZvNH$JZ0|AmH?fdBJt##fCCWy>yJ zHRH-0(R2gHm`?-ANu>)+2_JICk)@0CCaFgu>Px}WOtZzPT ze41X`lP|oxD;+fFeSx4Gc4b&-#(`kuS!4owbC3Z-t)4F{k@t0seA7;^B;M<3r4%n1 zFHj0sypZ=1Sc>N}QH1_j+ryL=VNWtlGiGBI>l5f05;5V=wtS3BYo+kByYFKzrFhG$xhmBP<{nqSp(#&eX! z)hukKB%jJa0LI!0epWg43IPrPr9$L?Cd{r^u8>Q6?ZZb!wpJ29`)QWsQ^u!c`@a^4 zxAk4?U#zcKU$S1bp0R%4db{-o>!kH^>tSou8nEuP4qAJxZC2b`Yjs;4*4dUJzAOGk zd_{aod`^5qykGpTc$0XQ_*GF9_lhGTBW@IX#T6nY){Et0v6wGR^Lyqu%&(e%Vt&s2 zg!z8+9p)R&UpHTFK5UMdht1o~>&&an&4?+kFfTUGg)8NU#=jeXXZ)G*N5-dEa{r#5 zZP?SA>gB)0>+ESw_3~e0#-7$xFaIS<_OzyY`Jwm?ds+S8iqUTsfns+aGPcS=*ee2=_Sn(F0ygBuKcS=*ed`G;>p3+n=-;tMTs+aG`%QV%?cPPb_rh55~yu+wseff@j+K5Vi zTV8gLo8+=%Zj#G}-6WR{xk)ZNs*?XHrsqu^A!*v*S~G9zZk75bsh6nKf2^^m235v? z6I1rofJ%PDeC@oc!|L~c;rD_%`Oo6IRkd>FefA9a5?HlRBtUzmIv>tJG86 z=sHrueo9Qvn>yg1yw*KAF>h+We{!FDa(v#@UVW0%U87H$VSDOom3*JT>-ysio+*u+0F?95VKx}IXkp1?KJ=a9Q6?jeR~EVD+)O;F0g zy%@>@rDEQN%4AuxM;E{=URCJ=U}lZ(QCmf=t*<_3e7?AK#??0k9}+mb{4D!<63CCg z0{k5~6K^Q8b^{fhCG;=?n`b@N?PJZD$aeK^PHH2x}s?-QwE zx!PvID%By0{{#Rofi6xVO7oo++@Rs1G+${`IH={;xm@*X-u2yE1Nx-DGXCmb*i?o` zx*sgVQXlRf8}6<=?cMI-;(?hS?ebw6oC(?*`BUbtIXzeeO*zhEGCwYaBw z_9~n1Iqn>HHVlOKh`XC#rL3ZSW5aMYOS=~A7Aq*GcV-~AE9k+aCq~Ddqq1&BhI7v7 zsJu)2Rid|iVj!|Js77bqWFUT}7;SEQ|M8*GEa5BARar{rTFn(5PzUACo#$8v8<2n3ig zvt$S&Cje*c5E5WYC;%>LXKcV38FFTox$=C~Y7<5oYi5bQX7P;s1_PK<39Gz1Cw0bQE`P#;Pbbi1APWYq)6 zvo(*F!o;mUI+9I8HIw86L)rmK5kTNsxMm=6gV;Tu%#X5w96DV4=l3umiakhii8*tuMy9J2ihgRWv#Ssu}anpy4BbDcZ1b0n)jr~2Je-h!tl_B0n>_E zcL!!a*6&`>Pu+2m2wR8E=Fg}ebqBV#c!h2XazNO-(aN>*4EKtGYc^P!R`MSo&C1&^ zUT59WYW9KigYSJbGd93@mK(`2Kqstw0`Bc*cjTfbkjxF|ot(73FJcV_R8q}F z1FM5yN5v&Wqr*oW`J^>-GEZMNuyB)gqE++m&gPG>sB)NO%jc>1-?I$Iuzp4Sx!7gC z)3iDGN&gj>%}8-by1CwKJHl(3KGa>~s~Ns}+LW^yH8dBv9QZcGfdY~r#E*fL3ZmuHuxxulYEkpGS`OhYvqjzaf`Nh95DW~CN@AzdY>s8~;3D%>WwyqKnnM+`U1`8iZ-PK*Tn#CyccQ1aenM55KBp>6Coj9`VmbfsFs?AH&sY=I9oA~r|DP1E z6JzY(b({amZrxkWd(FM(YU4-7m*56FLe`qU)x&K@*J67;RefO3K{ffw9m$N2s(<>A z^$*JNn;B7W@5Z4vqj#|#C8|c|%#6_y4d!NLcF%WO?}#65Gx`?Wo84Py#+-eb+yD-O zI@dV;NA+*l?^}7K&FEZguk|j=-90;h?(XZBt+~6+Shm>SsPhdT9%7bUn^T{?cKPy` zv>A&R+pBb5XRJ1#Gq!K#>cPsIP_yn?+2mCGn*MbIZAQ;xJFM<@y>rZ=Xd^XwN8Hm} zwqAO;%~-P7?sIeJY9Btrdg{teD+?8+zD_zSYHp~U7gsM^=Ttn~`z~v;%I{ZtF1GGj zldq^Fa!XId?9B4)&W$T`6&4&AW)51LQ=Yr>;!Cp?I4c*Y zHg#{ltIgQB*xs({=74f1?DX6TwYOEjG8J&W4cmMA`rQ{MKges<3bf`Ly)3oNS4Zz` zGgd9O)9N|9?CuTi-Q`n@;Qj|Q}}_0r^RZN}Qg_LkXqnDs>N?q9t{wf{4r{1q>V4)Z18OB=HP z;;KJqCgJu{*L0`>s7WWk764foz4}xF)&tb`cC?-mrqoUFN7_-LI-ptl{Q(B|NCqhhb(9hz zQOR#YKn{^4d>9BnGj~hRdG^NodQ^Iq^zhfclHH zi1{qU;U!?pEDhaQ6jo<6b7EO(QnQhw{OfFEHf}6hGbwG%;vIp;tVb8s!K;=>kBR9t z3Iae|*}sDy1q?dF7WKop)u?9NpJtn}etmJ_Oj4V%;<`XH))AwbAifPXca(yqP7w6P zsG~}H@K6Hv@Q5;_;x)|vtZQ@3Hfr5E-TrSitli>cB5uB!dH$_GnFe26IwM6K`2?bO z7z?9K7yVmT!^$k9pHh?*@O(5!<>!&4OoR7y(sbBzO;g$SlkdK2?W&1j;=YDkIvgJtIm?YM| z6!~OGKjcsS)j8`FMu@H9Q^oUUq(m~+*t2ia&XOq2klWF~P zy9;kp%Dz#1o$HN-olX27+l_5Kw8T7WDfo+|NDYV)LhuM?lkTKUC{Ku++xXo7=stlK zr@tW*m-j_>$Qj$naW*2mj}NK!TE1H~%MJI=NL@GiQN@=4(xF{7-0j@9pTShhg+Nmv zX|!bQOqk)F=#DUP^iYo%)IH_5t*5*^+-?5qdtc+4D8#n?r;7K??9{W^6^A>D8)bjQ zM5uv-Z|g=V)0nYBLIkoLRUXDlBBa9%qkL2ZAVs5Y|FZL5XK0L}09T8iPS$+hx=X6e zEKS2_I;+3MdAhEmr_jFCb=}$F;UmN`jBtxFCyzQ-ZXh$#y(Z86RL^QhnatKsJ>^ry zR>tN7Gg3mC>V_xg(WueZ#HqQJK@n;29PVM_!iX`+!>Hv%QG;@l$UTJV?A&7HJ!fXU zUZtwQYVkSCLHuJBYU{dn#nm%XeVH=FhxN$U*ipN+FB4+$ixbHii}85VS)NGmuF z^C9qp*;@arwBIXVowqdGVJk0~)ql#9Tl@Od{-3$jFn5|u%_Cs)KVp7W%o7{L4dNm3 z1X!SNT8pi%mSg=IQ2~EGw^sejpL->=$S`{lpbb^O404LFTtt;8FBN%m5c)Ea&s)=O zHpu~)gCC!LXqbx8$RiRE;@mj<7wm;JA*#kOdcEh!B%7JhH4} z`L6o(&16tKDx88VNc2D`7b@f+GFGd2xOBlX z6vW+LHZ+L1QyBPSj%Y7*&6u)f*j@+$$xMi=+-xZr+!)#-c+|O18YM2G41r_kVp1f~ z_`EJbisAr_b5cNhAsc|vGr_8e03UdU=|czf&EU|I#J&#P?zrb!|50piP3P-SvWUpL z*`g>B5-KG7UL+pzJmHjp92Qv(#s$YR+-w;K+_dCoLi&*z04$D}n1Wmy#eh&;%y+Y~ z(o7PlgHJu5;O(+65GD4T+JLJkA2na}vgM#~&4cxe7pO6|3nGv}F`#aCO+=o&7mro2^1ib+u(c zn505E`DqmrQr!Y>4CXOFUoxq<6TMpB43p_a5VwLdO<`cd1t-HCj1WUf?PQ%N=l>TQ zR~gn{Sns!{tOu+^)&|QKUt=}!Ht|w%tB8pO@B)9zd_DUB2h24DxBQLqAyfj6aFPGl zJAS3OmItNd@R`ew4D3ms*FfZ1Hpd%b)|`l^d&hT>E1U=CnF}Ez%d2KWosY!BajANk z3^`GRe0s;PAQz)L2v7hmxh#GqczqpO8be+-2XQ`i*E_zQTv@m`<&Gd4V@#olZzBRX zUw}}TF9Qm(Snv4d7wCCCN&Ewv*1MJ7j%v>^g~1~C9~g{2+D<%h!s=1+jg zl0=8_RYiCMNQmVVnLJ-zh+Om+c}a%?84cf`6d9$<;eAEI5dUWLd?_2rMdQxUH4_Y* zW@{7PqCBgzINt%#V5&I3aD0PUTP~BDDE5x8msZfngb@Eh3^0uxfD_Lm2^LK;2ow?w z8N8)+w*NB$^;wTI|NkRUK+F6_EfY-4_qwy;UCWGB&1b{6((GBX z=aE$d@(kB0ThCz97zT)JrY(gNs*vuS*PjsUjTCoU?Ecv8&5ZSr%#Uw9_1MyxYxMlM zGuh!S66#HlAB%^LZI?^hKqnu9M*u2*q_rFdQoLJeD#^|?9wyM|guJ_&zPgXyw5j5x zzg*aM`Bi%gdUen}Sg~Fh9P0+8EWz;Z0z%HRo$d^)>Jdjm_eZ;zv&L|icMl#t>f{Ic zal_e_cgh@*h}09_<%Q!zO1RX&+P{o@`X`qc*rw#3-G@d_c+Ym1F2#*AQazoC=aP8S z8alkn*aoK}-DZ^FW|k}t%{`i+(V#^FkT4;6^dfp;y~eh_3^N|6324JkQnrU20>5x*;Q&U; zkuE4K-$b>=-kGw!eH$xZg1`K0;dS~iq_y{$mCu$R%-G-&_xrhT@W_$wtW#cecJC#R zTN%e@cDrk#jm=lVhOwm(ATMg@o_%pHB{59kM8e6M+fTjnyG+j;EwL4cBU2?_h{gtnCiP0_dH|Y}@2H6Kh zi-rH8amK`nrpb84qz|G)Zx?o7W+-#m8L9L|vGCM8v~_;-eiAkhIRzJkCmVZWmomy< z!Ou2Iya6g7=B0c<(E8v=C_u{!?t|$eWF7@}7aTle1T2i581vcM53u!onYXJWm&7;f z0ZE4AXe04CxL4s>lezgtZw^&tmrxL$U09ZQ!zsAr4$u|^YvCfXSY6U=&-YNr@)MGq zKamchf=~b##Vn)19FKW~0|q)ps9dhUf9G!b^cu_cZk1{!Yr5BU%UoB{^;BB#UFlh0 zc}e+-asjaa#3=>~smMtp|m)`#0}z8SZvlv~G^RXdFp0k+%}I9OLbz3RaCF1ePt zKX$J?s$3qviQ8_v37e$KdTTb_7&r~6GNbCCkxgrAZMyMB-Tv1b);;2bV!b(T{IRjV z{H@ibaOt};wmr8+t6NqXgXT4N@dR@@rsA=%^yh=)V2kO{q4U|C2^jxlKq|;)zobVY(9cc9H(F#PG z2NwbhO>}KoB&S$`Fo|dN0`xE$bL$JNbs4d?LsvED>eOsi&hB#7a{Cq-`ubDFvu0dP z+n$}Bx_@eOKao1`|3RkH49O5*<-i?EX9g`D4mBvqU>IhrG1TAh4D?sd3H>*_Y16FV zypID*9z4a4v8x)t?9m;8mOKE(JSvM}e6-;->hTFw!BgzJ=CUkBQ3%X9>S@wrso!$d zTl0E!*(Y8}ma1>F@rC8=6_!763J{Ge9KSZ+yRh+)DX3V>d<`4MA;l6IM=yr)5*IgK zPXdX<_$DN4X#V)oW804%J2IHV!#g~rdi9!f?l3BUk{zYnUhFf>G4oe+`+v}|9ufa0 zGBAM0jR$L5{ZH$Vcj)Toc7=^=ax1%9B&BL zIFc>ip^EI)8PC|WpReED7x1p`zHe}Bpj$#Wx|hp;mu~

}uzB-r+XbChg!&8OckT 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 literal 0 HcmV?d00001 diff --git a/doc/packet_detection.odp b/doc/packet_detection.odp new file mode 100644 index 0000000000000000000000000000000000000000..a80ffb1f0d9dff3e39603337245aa608e68c5b60 GIT binary patch literal 10411 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 CE6gYW literal 0 HcmV?d00001 diff --git a/doc/piconnection_conf.odg b/doc/piconnection_conf.odg new file mode 100644 index 0000000000000000000000000000000000000000..8428ed7c8ee9b60da2d347cdc6ac6b6b7bf7d9d5 GIT binary patch literal 42497 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 literal 0 HcmV?d00001 diff --git a/doc/piconnection_filters.odg b/doc/piconnection_filters.odg new file mode 100644 index 0000000000000000000000000000000000000000..57a5df56e9758b92b2112f79a01356bbbfdd1b8f GIT binary patch literal 23614 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 literal 0 HcmV?d00001 diff --git a/doc/piconnection_senders.odg b/doc/piconnection_senders.odg new file mode 100644 index 0000000000000000000000000000000000000000..5a1fee1b98fb995195fcb4c04e5901ad2f966a32 GIT binary patch literal 26781 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 literal 0 HcmV?d00001 diff --git a/doc/piconsole_layout.odp b/doc/piconsole_layout.odp new file mode 100644 index 0000000000000000000000000000000000000000..e94ce3e047ef8dbcc95b428e175a8dd74761daf3 GIT binary patch literal 14349 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 Ze@Te)Qefb}9z%HloW9q7D3)Kp{vThc_ErD@ literal 0 HcmV?d00001 diff --git a/src/_unsused/pigeometry.h b/src/_unsused/pigeometry.h new file mode 100755 index 00000000..dd8c25f6 --- /dev/null +++ b/src/_unsused/pigeometry.h @@ -0,0 +1,137 @@ +/* + PIP - Platform Independent Primitives + Geometry + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIGEOMETRY_H +#define PIGEOMETRY_H + +#include "pimath.h" + +template +class PIP_EXPORT PIPoint { +public: + Type x; + Type y; + + PIPoint() {x = y = 0;}; + PIPoint(Type x_, Type y_) {set(x_, y_);} + + PIPoint & set(Type x_, Type y_) {x = x_; y = y_; return *this;} + PIPoint & move(Type x_, Type y_) {x += x_; y += y_; return *this;} + PIPoint & move(const PIPoint & p) {x += p.x; y += p.y; return *this;} + double angleRad() const {return atan2(y, x);} + int angleDeg() const {return round(atan2(y, x) * 180. / M_PI);} + PIPoint toPolar(bool isDeg = false) const {return PIPoint(sqrt(x*x + y*y), isDeg ? angleDeg() : angleRad());} + static PIPoint fromPolar(const PIPoint & p) {return PIPoint(p.y * cos(p.x), p.y * sin(p.x));} + + PIPoint operator +(const PIPoint & p) {return PIPoint(x + p.x, y + p.y);} + PIPoint operator +(const Type & p) {return PIPoint(x + p, y + p);} + PIPoint operator -(const PIPoint & p) {return PIPoint(x - p.x, y - p.y);} + PIPoint operator -(const Type & p) {return PIPoint(x - p, y - p);} + PIPoint operator -() {return PIPoint(-x, -y);} + PIPoint operator *(const Type & d) {return PIPoint(x * d, y * d);} + PIPoint operator /(const Type & d) {return PIPoint(x / d, y / d);} + bool operator ==(const PIPoint & p) const {return (x == p.x && y == p.y);} + bool operator !=(const PIPoint & p) const {return (x != p.x || y != p.y);} + +}; + +template +std::ostream & operator <<(std::ostream & s, const PIPoint & v) {s << '{' << v.x << ", " << v.y << '}'; return s;} + +template +class PIP_EXPORT PIRect { +public: + Type x0; + Type y0; + Type x1; + Type y1; + + PIRect() {x0 = y0 = x1 = y1 = 0;}; + PIRect(Type x, Type y, Type w, Type h) {set(x, y, w, h);} + PIRect(const PIPoint & tl, const PIPoint & br) {set(tl.x, tl.y, br.x, br.y);} + PIRect(const PIPoint & p0, const PIPoint & p1, const PIPoint & p2) {set(piMin(p0.x, p1.x, p2.x), piMin(p0.y, p1.y, p2.y), + piMax(p0.x, p1.x, p2.x), piMax(p0.y, p1.y, p2.y));} + + PIRect & set(Type x, Type y, Type w, Type h) {x0 = x; y0 = y; x1 = x + w; y1 = y + h; return *this;} + bool pointIn(Type x, Type y) const {return (x <= x1 && x >= x0 && y <= y1 && y >= y0);} + bool pointIn(const PIPoint & p) const {return pointIn(p.x, p.y);} + bool isEmpty() const {return (x1 - x0 == 0 && y1 - y0 == 0);} + PIRect & translate(Type x, Type y) {x0 += x; x1 += x; y0 += y; y1 += y; return *this;} + PIRect & translate(const PIPoint & p) {x0 += p.x; x1 += p.x; y0 += p.y; y1 += p.y; return *this;} + PIRect translated(Type x, Type y) {PIRect r(*this); r.translate(x, y); return r;} + PIRect translated(const PIPoint & p) {PIRect r(*this); r.translate(p); return r;} + PIRect & scale(Type x, Type y) {setWidth(width() * x); setHeight(height() * y); return *this;} + PIRect & scale(const PIPoint & p) {setWidth(width() * p.x); setHeight(height() * p.y); return *this;} + PIRect scaled(Type x, Type y) {PIRect r(*this); r.scale(x, y); return r;} + PIRect scaled(const PIPoint & p) {PIRect r(*this); r.scale(p); return r;} + PIRect & normalize() {if (x0 > x1) piSwap(x0, x1); if (y0 > y1) piSwap(y0, y1); return *this;} + PIRect normalized() {PIRect r(*this); r.normalize(); return r;} + PIRect & unite(const PIRect & r) {x0 = piMin(x0, r.x0); y0 = piMin(y0, r.y0); x1 = piMax(x1, r.x1); y1 = piMax(y1, r.y1); return *this;} + PIRect united(const PIRect & rect) {PIRect r(*this); r.unite(rect); return r;} + PIRect & intersect(const PIRect & r) {x0 = piMax(x0, r.x0); y0 = piMax(y0, r.y0); x1 = piMin(x1, r.x1); y1 = piMin(y1, r.y1); if (x0 > x1 || y0 > y1) x0 = x1 = y0 = y1 = Type(0); return *this;} + PIRect intersected(const PIRect & rect) {PIRect r(*this); r.intersect(rect); return r;} + Type top() const {return y0;} + Type left() const {return x0;} + Type right() const {return x1;} + Type bottom() const {return y1;} + Type width() const {return x1 - x0;} + Type height() const {return y1 - y0;} + PIPoint topLeft() {return PIPoint(x0, y0);} + PIPoint topRigth() {return PIPoint(x1, y0);} + PIPoint bottomLeft() {return PIPoint(x0, y1);} + PIPoint bottomRight() {return PIPoint(x1, y1);} + void setTop(Type v) {y0 = v;} + void setLeft(Type v) {x0 = v;} + void setRigth(Type v) {x1 = v;} + void setBottom(Type v) {y1 = v;} + void setWidth(Type v) {x1 = x0 + v;} + void setHeight(Type v) {y1 = y0 + v;} + + PIRect operator -() {return PIRect(-x0, -y0, -width(), -height());} + void operator +=(Type x) {translate(x, x);} + void operator +=(const PIPoint & p) {translate(p);} + void operator -=(Type x) {translate(-x, -x);} + void operator -=(const PIPoint & p) {translate(-p);} + void operator *=(Type p) {x0 *= p; x1 *= p; y0 *= p; y1 *= p;} + void operator /=(Type p) {x0 /= p; x1 /= p; y0 /= p; y1 /= p;} + void operator |=(const PIRect & r) {unite(r);} + void operator &=(const PIRect & r) {intersect(r);} + PIRect operator +(const PIPoint & p) {return PIRect(*this).translated(p);} + PIRect operator -(const PIPoint & p) {return PIRect(*this).translated(-p);} + PIRect operator |(const PIRect & r) {return PIRect(*this).united(r);} + PIRect operator &(const PIRect & r) {return PIRect(*this).intersected(r);} + bool operator ==(const PIRect & r) const {return (x0 == r.x0 && y0 == r.y0 && x1 == r.x1 && y1 == r.y10);} + bool operator !=(const PIRect & r) const {return (x0 != r.x0 || y0 != r.y0 || x1 != r.x1 || y1 != r.y10);} + +}; + +template +std::ostream & operator <<(std::ostream & s, const PIRect & v) {s << '{' << v.x0 << ", " << v.y0 << "; " << v.x1 - v.x0 << ", " << v.y1 - v.y0 << '}'; return s;} + +typedef PIPoint PIPointi; +typedef PIPoint PIPointu; +typedef PIPoint PIPointf; +typedef PIPoint PIPointd; + +typedef PIRect PIRecti; +typedef PIRect PIRectu; +typedef PIRect PIRectf; +typedef PIRect PIRectd; + +#endif // PIGEOMETRY_H diff --git a/src/_unsused/pivariable.cpp b/src/_unsused/pivariable.cpp new file mode 100755 index 00000000..f39d806a --- /dev/null +++ b/src/_unsused/pivariable.cpp @@ -0,0 +1,249 @@ +/* + PIP - Platform Independent Primitives + Variable, Struct (simple serialization) + Copyright (C) 2013 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pivariable.h" + + +bool PIVariant::operator ==(const PIVariant & v) const { + if (type != v.type) return false; + switch (type) { + case PIVariant::Bool: return vBool == v.vBool; + case PIVariant::Char: return vChar == v.vChar; + case PIVariant::Short: return vShort == v.vShort; + case PIVariant::Int: return vInt == v.vInt; + case PIVariant::Long: return vLong == v.vLong; + case PIVariant::LLong: return vLLong == v.vLLong; + case PIVariant::UChar: return vUChar == v.vUChar; + case PIVariant::UShort: return vUShort == v.vUShort; + case PIVariant::UInt: return vUInt == v.vUInt; + case PIVariant::ULong: return vULong == v.vULong; + case PIVariant::ULLong: return vULLong == v.vULLong; + case PIVariant::Float: return vFloat == v.vFloat; + case PIVariant::Double: return vDouble == v.vDouble; + case PIVariant::LDouble: return vLDouble == v.vLDouble; + case PIVariant::String: return vString == v.vString; + case PIVariant::StringList: return vStringList == v.vStringList; + }; + return false; +} + + +void PIVariant::setValueOnly(const PIString & s) { + switch (type) { + case PIVariant::Bool: vBool = s.toBool(); break; + case PIVariant::Char: vChar = s.toChar(); break; + case PIVariant::Short: vShort = s.toShort(); break; + case PIVariant::Int: vInt = s.toInt(); break; + case PIVariant::Long: vLong = s.toLong(); break; + case PIVariant::LLong: vLLong = s.toLLong(); break; + case PIVariant::UChar: vUChar = s.toChar(); break; + case PIVariant::UShort: vUShort = s.toShort(); break; + case PIVariant::UInt: vUInt = s.toInt(); break; + case PIVariant::ULong: vULong = s.toLong(); break; + case PIVariant::ULLong: vULLong = s.toLLong(); break; + case PIVariant::Float: vFloat = s.toFloat(); break; + case PIVariant::Double: vDouble = s.toDouble(); break; + case PIVariant::LDouble: vLDouble = s.toLDouble(); break; + case PIVariant::String: vString = s; break; + case PIVariant::StringList: vStringList = s.split("%|%"); break; + }; +} + + +PIString PIVariant::stringValue() const { + switch (type) { + case PIVariant::Bool: return (vBool ? "true" : "false"); + case PIVariant::Char: return PIString::fromNumber(vChar); + case PIVariant::Short: return PIString::fromNumber(vShort); + case PIVariant::Int: return PIString::fromNumber(vInt); + case PIVariant::Long: return PIString::fromNumber(vLong); + case PIVariant::LLong: return PIString::fromNumber(static_cast(vLLong)); + case PIVariant::UChar: return PIString::fromNumber(vUChar); + case PIVariant::UShort: return PIString::fromNumber(vUShort); + case PIVariant::UInt: return PIString::fromNumber(vUInt); + case PIVariant::ULong: return PIString::fromNumber(static_cast(vULong)); + case PIVariant::ULLong: return PIString::fromNumber(static_cast(vULLong)); + case PIVariant::Float: return PIString::fromNumber(vFloat); + case PIVariant::Double: return PIString::fromNumber(vDouble); + case PIVariant::LDouble: return PIString::fromNumber(vLDouble); + case PIVariant::String: return vString; + case PIVariant::StringList: return vStringList.join("%|%"); + }; + return vString; +} + + +PIVariant PIVariant::readFromString(const PIString & s) { + int i = s.find(':'); + if (i < 0 || s.length() < 2) return PIVariant(s); + PIVariant ret; + ret.type = PIVariant::fromString(s.left(i)); + ret.setValueOnly(s.right(s.length() - i - 1)); + return ret; +} + + +PIVariant::Type PIVariant::fromString(const PIString & str) { + PIString s = str.trimmed().toLowerCase().replace(" ", ""); + if (s == "bool") return PIVariant::Bool; + if (s == "char" || s == "sbyte") return PIVariant::Char; + if (s == "short" || s == "short int" || s == "signed short" || s == "signed short int" || s == "sword") return PIVariant::Short; + if (s == "int" || s == "signed" || s == "signed int") return PIVariant::Int; + if (s == "long" || s == "long int" || s == "signed long" || s == "signed long int" || s == "sdword") return PIVariant::Long; + if (s == "llong" || s == "long long" || s == "long long int" || s == "signed long long" || s == "signed long long int" || s == "sqword") return PIVariant::LLong; + if (s == "uchar" || s == "byte") return PIVariant::UChar; + if (s == "ushort" || s == "unsigned short" || s == "unsigned short int" || s == "word") return PIVariant::UShort; + if (s == "uint" || s == "unsigned" || s == "unsigned int") return PIVariant::UInt; + if (s == "ulong" || s == "unsigned long" || s == "unsigned long int" || s == "dword") return PIVariant::ULong; + if (s == "ullong" || s == "unsigned long long" || s == "unsigned long long int" || s == "qword") return PIVariant::ULLong; + if (s == "float") return PIVariant::Float; + if (s == "double" || s == "real") return PIVariant::Double; + if (s == "ldouble" || s == "long double") return PIVariant::LDouble; + if (s == "pistring" || s == "string") return PIVariant::String; + if (s == "pistringlist" || s == "vector" || s == "vector" || s == "pivector" || s == "pivector") return PIVariant::StringList; + return PIVariant::Double; +} + + +PIString PIVariant::toString(const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return "bool"; + case PIVariant::Char: return "char"; + case PIVariant::Short: return "short"; + case PIVariant::Int: return "int"; + case PIVariant::Long: return "long"; + case PIVariant::LLong: return "llong"; + case PIVariant::UChar: return "uchar"; + case PIVariant::UShort: return "ushort"; + case PIVariant::UInt: return "uint"; + case PIVariant::ULong: return "ulong"; + case PIVariant::ULLong: return "ullong"; + case PIVariant::Float: return "float"; + case PIVariant::Double: return "double"; + case PIVariant::LDouble: return "ldouble"; + case PIVariant::String: return "string"; + case PIVariant::StringList: return "stringlist"; + } + return "double"; +} + + +uint PIVariant::variableSize(const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return sizeof(bool); + case PIVariant::Char: return sizeof(char); + case PIVariant::Short: return sizeof(short); + case PIVariant::Int: return sizeof(int); + case PIVariant::Long: return sizeof(long); + case PIVariant::LLong: return sizeof(llong); + case PIVariant::UChar: return sizeof(uchar); + case PIVariant::UShort: return sizeof(ushort); + case PIVariant::UInt: return sizeof(uint); + case PIVariant::ULong: return sizeof(ulong); + case PIVariant::ULLong: return sizeof(ullong); + case PIVariant::Float: return sizeof(float); + case PIVariant::Double: return sizeof(double); + case PIVariant::LDouble: return sizeof(ldouble); + default: break; + } + return 0; +} + + +double PIVariant::variableValue(const void * var_ptr, const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return (double)(*((bool * )var_ptr)); + case PIVariant::Char: return (double)(*((char * )var_ptr)); + case PIVariant::Short: return (double)(*((short * )var_ptr)); + case PIVariant::Int: return (double)(*((int * )var_ptr)); + case PIVariant::Long: return (double)(*((long * )var_ptr)); + case PIVariant::LLong: return (double)(*((llong * )var_ptr)); + case PIVariant::UChar: return (double)(*((uchar * )var_ptr)); + case PIVariant::UShort: return (double)(*((ushort * )var_ptr)); + case PIVariant::UInt: return (double)(*((uint * )var_ptr)); + case PIVariant::ULong: return (double)(*((ulong * )var_ptr)); + case PIVariant::ULLong: return (double)(*((ullong * )var_ptr)); + case PIVariant::Float: return (double)(*((float * )var_ptr)); + case PIVariant::Double: return (double)(*((double * )var_ptr)); + case PIVariant::LDouble: return (ldouble)(*((ldouble * )var_ptr)); + default: break; + } + return 0.; +} + + +void PIVariable::setVariable(const PIString & str) { + type_ = PIVariant::fromString(str); + size_ = PIVariant::variableSize(type_); +} + + +void PIVariable::writeVariable(void * dest) { + switch (type_) { + case PIVariant::Bool: *((bool * )((ullong)dest + offset)) = value_ > 0.; return; + case PIVariant::Char: *((char * )((ullong)dest + offset)) = char(value_); return; + case PIVariant::Short: *((short * )((ullong)dest + offset)) = short(value_); return; + case PIVariant::Int: *((int * )((ullong)dest + offset)) = int(value_); return; + case PIVariant::Long: *((long * )((ullong)dest + offset)) = long(value_); return; + case PIVariant::LLong: *((llong * )((ullong)dest + offset)) = llong(value_); return; + case PIVariant::UChar: *((uchar * )((ullong)dest + offset)) = uchar(value_); return; + case PIVariant::UShort: *((ushort * )((ullong)dest + offset)) = ushort(value_); return; + case PIVariant::UInt: *((uint * )((ullong)dest + offset)) = uint(value_); return; + case PIVariant::ULong: *((ulong * )((ullong)dest + offset)) = ulong(value_); return; + case PIVariant::ULLong: *((ullong * )((ullong)dest + offset)) = ullong(value_); return; + case PIVariant::Float: *((float * )((ullong)dest + offset)) = float(value_); return; + case PIVariant::Double: *((double * )((ullong)dest + offset)) = value_; return; + case PIVariant::LDouble: *((ldouble * )((ullong)dest + offset)) = ldouble(value_); return; + default: break; + } +} + + +void PIStruct::parseFile(const PIString & file) { + PIConfig conf(file, PIIODevice::ReadOnly); + PIVariable var; + PIString ts; + uint sz = 0; + vars.clear(); + for (int i = 0; i < conf.entriesCount(); ++i) { + var.setVariable(conf.getValue(i)); + var.setName(conf.getName(i)); + var.offset = sz; + sz += var.size(); + ts = conf.getComment(i); + if (ts.length() > 0) + var.setValue(ts.toDouble()); + else var.setValue(0.); + vars.push_back(var); + } + size_ = sz; +} + + +void PIStruct::readData(const void * data) { + for (uint i = 0; i < vars.size(); ++i) + vars[i].readVariable(data); +} + + +void PIStruct::writeData(void * data) { + for (uint i = 0; i < vars.size(); ++i) + vars[i].writeVariable(data); +} + diff --git a/src/_unsused/pivariable.cpp_ b/src/_unsused/pivariable.cpp_ new file mode 100644 index 00000000..f39d806a --- /dev/null +++ b/src/_unsused/pivariable.cpp_ @@ -0,0 +1,249 @@ +/* + PIP - Platform Independent Primitives + Variable, Struct (simple serialization) + Copyright (C) 2013 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pivariable.h" + + +bool PIVariant::operator ==(const PIVariant & v) const { + if (type != v.type) return false; + switch (type) { + case PIVariant::Bool: return vBool == v.vBool; + case PIVariant::Char: return vChar == v.vChar; + case PIVariant::Short: return vShort == v.vShort; + case PIVariant::Int: return vInt == v.vInt; + case PIVariant::Long: return vLong == v.vLong; + case PIVariant::LLong: return vLLong == v.vLLong; + case PIVariant::UChar: return vUChar == v.vUChar; + case PIVariant::UShort: return vUShort == v.vUShort; + case PIVariant::UInt: return vUInt == v.vUInt; + case PIVariant::ULong: return vULong == v.vULong; + case PIVariant::ULLong: return vULLong == v.vULLong; + case PIVariant::Float: return vFloat == v.vFloat; + case PIVariant::Double: return vDouble == v.vDouble; + case PIVariant::LDouble: return vLDouble == v.vLDouble; + case PIVariant::String: return vString == v.vString; + case PIVariant::StringList: return vStringList == v.vStringList; + }; + return false; +} + + +void PIVariant::setValueOnly(const PIString & s) { + switch (type) { + case PIVariant::Bool: vBool = s.toBool(); break; + case PIVariant::Char: vChar = s.toChar(); break; + case PIVariant::Short: vShort = s.toShort(); break; + case PIVariant::Int: vInt = s.toInt(); break; + case PIVariant::Long: vLong = s.toLong(); break; + case PIVariant::LLong: vLLong = s.toLLong(); break; + case PIVariant::UChar: vUChar = s.toChar(); break; + case PIVariant::UShort: vUShort = s.toShort(); break; + case PIVariant::UInt: vUInt = s.toInt(); break; + case PIVariant::ULong: vULong = s.toLong(); break; + case PIVariant::ULLong: vULLong = s.toLLong(); break; + case PIVariant::Float: vFloat = s.toFloat(); break; + case PIVariant::Double: vDouble = s.toDouble(); break; + case PIVariant::LDouble: vLDouble = s.toLDouble(); break; + case PIVariant::String: vString = s; break; + case PIVariant::StringList: vStringList = s.split("%|%"); break; + }; +} + + +PIString PIVariant::stringValue() const { + switch (type) { + case PIVariant::Bool: return (vBool ? "true" : "false"); + case PIVariant::Char: return PIString::fromNumber(vChar); + case PIVariant::Short: return PIString::fromNumber(vShort); + case PIVariant::Int: return PIString::fromNumber(vInt); + case PIVariant::Long: return PIString::fromNumber(vLong); + case PIVariant::LLong: return PIString::fromNumber(static_cast(vLLong)); + case PIVariant::UChar: return PIString::fromNumber(vUChar); + case PIVariant::UShort: return PIString::fromNumber(vUShort); + case PIVariant::UInt: return PIString::fromNumber(vUInt); + case PIVariant::ULong: return PIString::fromNumber(static_cast(vULong)); + case PIVariant::ULLong: return PIString::fromNumber(static_cast(vULLong)); + case PIVariant::Float: return PIString::fromNumber(vFloat); + case PIVariant::Double: return PIString::fromNumber(vDouble); + case PIVariant::LDouble: return PIString::fromNumber(vLDouble); + case PIVariant::String: return vString; + case PIVariant::StringList: return vStringList.join("%|%"); + }; + return vString; +} + + +PIVariant PIVariant::readFromString(const PIString & s) { + int i = s.find(':'); + if (i < 0 || s.length() < 2) return PIVariant(s); + PIVariant ret; + ret.type = PIVariant::fromString(s.left(i)); + ret.setValueOnly(s.right(s.length() - i - 1)); + return ret; +} + + +PIVariant::Type PIVariant::fromString(const PIString & str) { + PIString s = str.trimmed().toLowerCase().replace(" ", ""); + if (s == "bool") return PIVariant::Bool; + if (s == "char" || s == "sbyte") return PIVariant::Char; + if (s == "short" || s == "short int" || s == "signed short" || s == "signed short int" || s == "sword") return PIVariant::Short; + if (s == "int" || s == "signed" || s == "signed int") return PIVariant::Int; + if (s == "long" || s == "long int" || s == "signed long" || s == "signed long int" || s == "sdword") return PIVariant::Long; + if (s == "llong" || s == "long long" || s == "long long int" || s == "signed long long" || s == "signed long long int" || s == "sqword") return PIVariant::LLong; + if (s == "uchar" || s == "byte") return PIVariant::UChar; + if (s == "ushort" || s == "unsigned short" || s == "unsigned short int" || s == "word") return PIVariant::UShort; + if (s == "uint" || s == "unsigned" || s == "unsigned int") return PIVariant::UInt; + if (s == "ulong" || s == "unsigned long" || s == "unsigned long int" || s == "dword") return PIVariant::ULong; + if (s == "ullong" || s == "unsigned long long" || s == "unsigned long long int" || s == "qword") return PIVariant::ULLong; + if (s == "float") return PIVariant::Float; + if (s == "double" || s == "real") return PIVariant::Double; + if (s == "ldouble" || s == "long double") return PIVariant::LDouble; + if (s == "pistring" || s == "string") return PIVariant::String; + if (s == "pistringlist" || s == "vector" || s == "vector" || s == "pivector" || s == "pivector") return PIVariant::StringList; + return PIVariant::Double; +} + + +PIString PIVariant::toString(const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return "bool"; + case PIVariant::Char: return "char"; + case PIVariant::Short: return "short"; + case PIVariant::Int: return "int"; + case PIVariant::Long: return "long"; + case PIVariant::LLong: return "llong"; + case PIVariant::UChar: return "uchar"; + case PIVariant::UShort: return "ushort"; + case PIVariant::UInt: return "uint"; + case PIVariant::ULong: return "ulong"; + case PIVariant::ULLong: return "ullong"; + case PIVariant::Float: return "float"; + case PIVariant::Double: return "double"; + case PIVariant::LDouble: return "ldouble"; + case PIVariant::String: return "string"; + case PIVariant::StringList: return "stringlist"; + } + return "double"; +} + + +uint PIVariant::variableSize(const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return sizeof(bool); + case PIVariant::Char: return sizeof(char); + case PIVariant::Short: return sizeof(short); + case PIVariant::Int: return sizeof(int); + case PIVariant::Long: return sizeof(long); + case PIVariant::LLong: return sizeof(llong); + case PIVariant::UChar: return sizeof(uchar); + case PIVariant::UShort: return sizeof(ushort); + case PIVariant::UInt: return sizeof(uint); + case PIVariant::ULong: return sizeof(ulong); + case PIVariant::ULLong: return sizeof(ullong); + case PIVariant::Float: return sizeof(float); + case PIVariant::Double: return sizeof(double); + case PIVariant::LDouble: return sizeof(ldouble); + default: break; + } + return 0; +} + + +double PIVariant::variableValue(const void * var_ptr, const PIVariant::Type & var) { + switch (var) { + case PIVariant::Bool: return (double)(*((bool * )var_ptr)); + case PIVariant::Char: return (double)(*((char * )var_ptr)); + case PIVariant::Short: return (double)(*((short * )var_ptr)); + case PIVariant::Int: return (double)(*((int * )var_ptr)); + case PIVariant::Long: return (double)(*((long * )var_ptr)); + case PIVariant::LLong: return (double)(*((llong * )var_ptr)); + case PIVariant::UChar: return (double)(*((uchar * )var_ptr)); + case PIVariant::UShort: return (double)(*((ushort * )var_ptr)); + case PIVariant::UInt: return (double)(*((uint * )var_ptr)); + case PIVariant::ULong: return (double)(*((ulong * )var_ptr)); + case PIVariant::ULLong: return (double)(*((ullong * )var_ptr)); + case PIVariant::Float: return (double)(*((float * )var_ptr)); + case PIVariant::Double: return (double)(*((double * )var_ptr)); + case PIVariant::LDouble: return (ldouble)(*((ldouble * )var_ptr)); + default: break; + } + return 0.; +} + + +void PIVariable::setVariable(const PIString & str) { + type_ = PIVariant::fromString(str); + size_ = PIVariant::variableSize(type_); +} + + +void PIVariable::writeVariable(void * dest) { + switch (type_) { + case PIVariant::Bool: *((bool * )((ullong)dest + offset)) = value_ > 0.; return; + case PIVariant::Char: *((char * )((ullong)dest + offset)) = char(value_); return; + case PIVariant::Short: *((short * )((ullong)dest + offset)) = short(value_); return; + case PIVariant::Int: *((int * )((ullong)dest + offset)) = int(value_); return; + case PIVariant::Long: *((long * )((ullong)dest + offset)) = long(value_); return; + case PIVariant::LLong: *((llong * )((ullong)dest + offset)) = llong(value_); return; + case PIVariant::UChar: *((uchar * )((ullong)dest + offset)) = uchar(value_); return; + case PIVariant::UShort: *((ushort * )((ullong)dest + offset)) = ushort(value_); return; + case PIVariant::UInt: *((uint * )((ullong)dest + offset)) = uint(value_); return; + case PIVariant::ULong: *((ulong * )((ullong)dest + offset)) = ulong(value_); return; + case PIVariant::ULLong: *((ullong * )((ullong)dest + offset)) = ullong(value_); return; + case PIVariant::Float: *((float * )((ullong)dest + offset)) = float(value_); return; + case PIVariant::Double: *((double * )((ullong)dest + offset)) = value_; return; + case PIVariant::LDouble: *((ldouble * )((ullong)dest + offset)) = ldouble(value_); return; + default: break; + } +} + + +void PIStruct::parseFile(const PIString & file) { + PIConfig conf(file, PIIODevice::ReadOnly); + PIVariable var; + PIString ts; + uint sz = 0; + vars.clear(); + for (int i = 0; i < conf.entriesCount(); ++i) { + var.setVariable(conf.getValue(i)); + var.setName(conf.getName(i)); + var.offset = sz; + sz += var.size(); + ts = conf.getComment(i); + if (ts.length() > 0) + var.setValue(ts.toDouble()); + else var.setValue(0.); + vars.push_back(var); + } + size_ = sz; +} + + +void PIStruct::readData(const void * data) { + for (uint i = 0; i < vars.size(); ++i) + vars[i].readVariable(data); +} + + +void PIStruct::writeData(void * data) { + for (uint i = 0; i < vars.size(); ++i) + vars[i].writeVariable(data); +} + diff --git a/src/_unsused/pivariable.h b/src/_unsused/pivariable.h new file mode 100755 index 00000000..44ba5fd8 --- /dev/null +++ b/src/_unsused/pivariable.h @@ -0,0 +1,196 @@ +/* + PIP - Platform Independent Primitives + Variable, Struct (simple serialization) + Copyright (C) 2013 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIVARIABLE_H +#define PIVARIABLE_H + +#include "piconfig.h" + +class PIP_EXPORT PIVariant { + friend class PIVariable; +public: + enum Type {Bool, Char, Short, Int, Long, LLong, UChar, UShort, UInt, ULong, ULLong, Float, Double, LDouble, String, StringList}; + + PIVariant() {setValue(0.);} + PIVariant(const char * v) {setValue(v);} + PIVariant(const bool & v) {setValue(v);} + PIVariant(const char & v) {setValue(v);} + PIVariant(const short & v) {setValue(v);} + PIVariant(const int & v) {setValue(v);} + PIVariant(const long & v) {setValue(v);} + PIVariant(const llong & v) {setValue(v);} + PIVariant(const uchar & v) {setValue(v);} + PIVariant(const ushort & v) {setValue(v);} + PIVariant(const uint & v) {setValue(v);} + PIVariant(const ulong & v) {setValue(v);} + PIVariant(const ullong & v) {setValue(v);} + PIVariant(const float & v) {setValue(v);} + PIVariant(const double & v) {setValue(v);} + PIVariant(const ldouble & v) {setValue(v);} + PIVariant(const PIString & v) {setValue(v);} + PIVariant(const PIStringList & v) {setValue(v);} + + void setValue(const char * v) {setValue(PIString(v));} + void setValue(const bool & v) {type = PIVariant::Bool; vBool = v;} + void setValue(const char & v) {type = PIVariant::Char; vChar = v;} + void setValue(const short & v) {type = PIVariant::Short; vShort = v;} + void setValue(const int & v) {type = PIVariant::Int; vInt = v;} + void setValue(const long & v) {type = PIVariant::Long; vLong = v;} + void setValue(const llong & v) {type = PIVariant::LLong; vLLong = v;} + void setValue(const uchar & v) {type = PIVariant::UChar; vUChar = v;} + void setValue(const ushort & v) {type = PIVariant::UShort; vUShort = v;} + void setValue(const uint & v) {type = PIVariant::UInt; vUInt = v;} + void setValue(const ulong & v) {type = PIVariant::ULong; vULong = v;} + void setValue(const ullong & v) {type = PIVariant::ULLong; vULLong = v;} + void setValue(const float & v) {type = PIVariant::Float; vFloat = v;} + void setValue(const double & v) {type = PIVariant::Double; vDouble = v;} + void setValue(const ldouble & v) {type = PIVariant::LDouble; vLDouble = v;} + void setValue(const PIString & v) {type = PIVariant::String; vString = v;} + void setValue(const PIStringList & v) {type = PIVariant::StringList; vStringList = v;} + void setValueOnly(const PIString & v); + PIString typeName() const {return PIVariant::toString(type);} + double doubleValue() const {return PIVariant::variableValue(&vChar, type);} + PIString stringValue() const; + void typeFromString(const PIString & str) {type = PIVariant::fromString(str);} + PIString typeToString() const {return PIVariant::toString(type);} + uint size() {if (type != PIVariant::String && type != PIVariant::StringList) return PIVariant::variableSize(type); if (type == PIVariant::String) return vString.size(); else return vStringList.contentSize();} + PIString writeToString() const {return typeName() + ":" + stringValue();} + +#ifdef QNX + void operator =(const PIVariant & v) {type = v.type; vLDouble = v.vLDouble; vString = v.vString; vStringList = v.vStringList;} +#endif + void operator =(const char * v) {setValue(PIString(v));} + void operator =(const bool & v) {type = PIVariant::Bool; vBool = v;} + void operator =(const char & v) {type = PIVariant::Char; vChar = v;} + void operator =(const short & v) {type = PIVariant::Short; vShort = v;} + void operator =(const int & v) {type = PIVariant::Int; vInt = v;} + void operator =(const long & v) {type = PIVariant::Long; vLong = v;} + void operator =(const llong & v) {type = PIVariant::LLong; vLLong = v;} + void operator =(const uchar & v) {type = PIVariant::UChar; vUChar = v;} + void operator =(const ushort & v) {type = PIVariant::UShort; vUShort = v;} + void operator =(const uint & v) {type = PIVariant::UInt; vUInt = v;} + void operator =(const ulong & v) {type = PIVariant::ULong; vULong = v;} + void operator =(const ullong & v) {type = PIVariant::ULLong; vULLong = v;} + void operator =(const float & v) {type = PIVariant::Float; vFloat = v;} + void operator =(const double & v) {type = PIVariant::Double; vDouble = v;} + void operator =(const ldouble & v) {type = PIVariant::LDouble; vLDouble = v;} + void operator =(const PIString & v) {type = PIVariant::String; vString = v;} + void operator =(const PIStringList & v) {type = PIVariant::StringList; vStringList = v;} + + bool operator ==(const PIVariant & v) const; + bool operator !=(const PIVariant & v) const {return !(*this == v);} + + PIVariant::Type type; + union { + bool vBool; + char vChar; + short vShort; + int vInt; + long vLong; + llong vLLong; + uchar vUChar; + ushort vUShort; + uint vUInt; + ulong vULong; + ullong vULLong; + float vFloat; + double vDouble; + ldouble vLDouble; + }; + PIString vString; + PIStringList vStringList; + + static PIVariant readFromString(const PIString & s); + +private: + static PIVariant::Type fromString(const PIString & str); + static PIString toString(const PIVariant::Type & var); + static uint variableSize(const PIVariant::Type & var); + static double variableValue(const void * var_ptr, const PIVariant::Type & var); + +}; + +inline std::ostream & operator <<(std::ostream & s, const PIVariant & v) {s << v.typeName() << ": " << v.stringValue(); return s;} + +class PIP_EXPORT PIVariable { +public: + PIVariable() {;} + PIVariable(const PIString & str) {setVariable(str);} + ~PIVariable() {;} + + void setVariable(const PIString & str); + void writeVariable(void * dest); + void readVariable(const void * var_ptr) {value_ = PIVariant::variableValue((char * )((long)var_ptr + offset), type_);} + PIVariant::Type type() const {return type_;} + uint size() const {return size_;} + const PIString & name() {return name_;} + void setName(const PIString & str) {name_ = str;} + double value() const {return value_;} + void setValue(const double & val) {value_ = val;} + + int offset; + +private: + PIVariant::Type type_; + uint size_; + PIString name_; + double value_; + +}; + + +/* + * PIStruct is abstract structure, described by *.conf file with format of each line: + * " = # ". + * e.g. "pi = double #f 3.1418" + * + * You can write or read binary content of this struct + * by functions "writeData" and "readData", e.g. + * "char * data = new char[struct.size()]; + * struct.writeData(data);" + * + * Access to each variable in struct is looks like + * "double value = struct["pi"].value();" +*/ + +class PIP_EXPORT PIStruct { +public: + PIStruct() {;} + PIStruct(const PIString & str) {parseFile(str);} + + void parseFile(const PIString & file); + void readData(const void * data); + void writeData(void * data); + void clear() {vars.clear(); size_ = 0;} + uint count() const {return vars.size();} + uint size() const {return size_;} + const PIString & name() {return name_;} + void setName(const PIString & str) {name_ = str;} + PIVariable & operator[](const uint & index) {return vars[index];} + PIVariable & operator[](const PIString & name) {for (uint i = 0; i < vars.size(); ++i) if (vars[i].name() == name) return vars[i]; return def;} + +private: + uint size_; + PIString name_; + PIVariable def; + PIVector vars; + +}; + +#endif // PIVARIABLE_H diff --git a/src/_unsused/pivariable.h_ b/src/_unsused/pivariable.h_ new file mode 100644 index 00000000..44ba5fd8 --- /dev/null +++ b/src/_unsused/pivariable.h_ @@ -0,0 +1,196 @@ +/* + PIP - Platform Independent Primitives + Variable, Struct (simple serialization) + Copyright (C) 2013 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIVARIABLE_H +#define PIVARIABLE_H + +#include "piconfig.h" + +class PIP_EXPORT PIVariant { + friend class PIVariable; +public: + enum Type {Bool, Char, Short, Int, Long, LLong, UChar, UShort, UInt, ULong, ULLong, Float, Double, LDouble, String, StringList}; + + PIVariant() {setValue(0.);} + PIVariant(const char * v) {setValue(v);} + PIVariant(const bool & v) {setValue(v);} + PIVariant(const char & v) {setValue(v);} + PIVariant(const short & v) {setValue(v);} + PIVariant(const int & v) {setValue(v);} + PIVariant(const long & v) {setValue(v);} + PIVariant(const llong & v) {setValue(v);} + PIVariant(const uchar & v) {setValue(v);} + PIVariant(const ushort & v) {setValue(v);} + PIVariant(const uint & v) {setValue(v);} + PIVariant(const ulong & v) {setValue(v);} + PIVariant(const ullong & v) {setValue(v);} + PIVariant(const float & v) {setValue(v);} + PIVariant(const double & v) {setValue(v);} + PIVariant(const ldouble & v) {setValue(v);} + PIVariant(const PIString & v) {setValue(v);} + PIVariant(const PIStringList & v) {setValue(v);} + + void setValue(const char * v) {setValue(PIString(v));} + void setValue(const bool & v) {type = PIVariant::Bool; vBool = v;} + void setValue(const char & v) {type = PIVariant::Char; vChar = v;} + void setValue(const short & v) {type = PIVariant::Short; vShort = v;} + void setValue(const int & v) {type = PIVariant::Int; vInt = v;} + void setValue(const long & v) {type = PIVariant::Long; vLong = v;} + void setValue(const llong & v) {type = PIVariant::LLong; vLLong = v;} + void setValue(const uchar & v) {type = PIVariant::UChar; vUChar = v;} + void setValue(const ushort & v) {type = PIVariant::UShort; vUShort = v;} + void setValue(const uint & v) {type = PIVariant::UInt; vUInt = v;} + void setValue(const ulong & v) {type = PIVariant::ULong; vULong = v;} + void setValue(const ullong & v) {type = PIVariant::ULLong; vULLong = v;} + void setValue(const float & v) {type = PIVariant::Float; vFloat = v;} + void setValue(const double & v) {type = PIVariant::Double; vDouble = v;} + void setValue(const ldouble & v) {type = PIVariant::LDouble; vLDouble = v;} + void setValue(const PIString & v) {type = PIVariant::String; vString = v;} + void setValue(const PIStringList & v) {type = PIVariant::StringList; vStringList = v;} + void setValueOnly(const PIString & v); + PIString typeName() const {return PIVariant::toString(type);} + double doubleValue() const {return PIVariant::variableValue(&vChar, type);} + PIString stringValue() const; + void typeFromString(const PIString & str) {type = PIVariant::fromString(str);} + PIString typeToString() const {return PIVariant::toString(type);} + uint size() {if (type != PIVariant::String && type != PIVariant::StringList) return PIVariant::variableSize(type); if (type == PIVariant::String) return vString.size(); else return vStringList.contentSize();} + PIString writeToString() const {return typeName() + ":" + stringValue();} + +#ifdef QNX + void operator =(const PIVariant & v) {type = v.type; vLDouble = v.vLDouble; vString = v.vString; vStringList = v.vStringList;} +#endif + void operator =(const char * v) {setValue(PIString(v));} + void operator =(const bool & v) {type = PIVariant::Bool; vBool = v;} + void operator =(const char & v) {type = PIVariant::Char; vChar = v;} + void operator =(const short & v) {type = PIVariant::Short; vShort = v;} + void operator =(const int & v) {type = PIVariant::Int; vInt = v;} + void operator =(const long & v) {type = PIVariant::Long; vLong = v;} + void operator =(const llong & v) {type = PIVariant::LLong; vLLong = v;} + void operator =(const uchar & v) {type = PIVariant::UChar; vUChar = v;} + void operator =(const ushort & v) {type = PIVariant::UShort; vUShort = v;} + void operator =(const uint & v) {type = PIVariant::UInt; vUInt = v;} + void operator =(const ulong & v) {type = PIVariant::ULong; vULong = v;} + void operator =(const ullong & v) {type = PIVariant::ULLong; vULLong = v;} + void operator =(const float & v) {type = PIVariant::Float; vFloat = v;} + void operator =(const double & v) {type = PIVariant::Double; vDouble = v;} + void operator =(const ldouble & v) {type = PIVariant::LDouble; vLDouble = v;} + void operator =(const PIString & v) {type = PIVariant::String; vString = v;} + void operator =(const PIStringList & v) {type = PIVariant::StringList; vStringList = v;} + + bool operator ==(const PIVariant & v) const; + bool operator !=(const PIVariant & v) const {return !(*this == v);} + + PIVariant::Type type; + union { + bool vBool; + char vChar; + short vShort; + int vInt; + long vLong; + llong vLLong; + uchar vUChar; + ushort vUShort; + uint vUInt; + ulong vULong; + ullong vULLong; + float vFloat; + double vDouble; + ldouble vLDouble; + }; + PIString vString; + PIStringList vStringList; + + static PIVariant readFromString(const PIString & s); + +private: + static PIVariant::Type fromString(const PIString & str); + static PIString toString(const PIVariant::Type & var); + static uint variableSize(const PIVariant::Type & var); + static double variableValue(const void * var_ptr, const PIVariant::Type & var); + +}; + +inline std::ostream & operator <<(std::ostream & s, const PIVariant & v) {s << v.typeName() << ": " << v.stringValue(); return s;} + +class PIP_EXPORT PIVariable { +public: + PIVariable() {;} + PIVariable(const PIString & str) {setVariable(str);} + ~PIVariable() {;} + + void setVariable(const PIString & str); + void writeVariable(void * dest); + void readVariable(const void * var_ptr) {value_ = PIVariant::variableValue((char * )((long)var_ptr + offset), type_);} + PIVariant::Type type() const {return type_;} + uint size() const {return size_;} + const PIString & name() {return name_;} + void setName(const PIString & str) {name_ = str;} + double value() const {return value_;} + void setValue(const double & val) {value_ = val;} + + int offset; + +private: + PIVariant::Type type_; + uint size_; + PIString name_; + double value_; + +}; + + +/* + * PIStruct is abstract structure, described by *.conf file with format of each line: + * " = # ". + * e.g. "pi = double #f 3.1418" + * + * You can write or read binary content of this struct + * by functions "writeData" and "readData", e.g. + * "char * data = new char[struct.size()]; + * struct.writeData(data);" + * + * Access to each variable in struct is looks like + * "double value = struct["pi"].value();" +*/ + +class PIP_EXPORT PIStruct { +public: + PIStruct() {;} + PIStruct(const PIString & str) {parseFile(str);} + + void parseFile(const PIString & file); + void readData(const void * data); + void writeData(void * data); + void clear() {vars.clear(); size_ = 0;} + uint count() const {return vars.size();} + uint size() const {return size_;} + const PIString & name() {return name_;} + void setName(const PIString & str) {name_ = str;} + PIVariable & operator[](const uint & index) {return vars[index];} + PIVariable & operator[](const PIString & name) {for (uint i = 0; i < vars.size(); ++i) if (vars[i].name() == name) return vars[i]; return def;} + +private: + uint size_; + PIString name_; + PIVariable def; + PIVector vars; + +}; + +#endif // PIVARIABLE_H diff --git a/src/code/picodeinfo.cpp b/src/code/picodeinfo.cpp new file mode 100755 index 00000000..ef2801b3 --- /dev/null +++ b/src/code/picodeinfo.cpp @@ -0,0 +1,42 @@ +/* + PIP - Platform Independent Primitives + C++ code info structs + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picodeinfo.h" + + +PIString PICodeInfo::EnumInfo::memberName(int value_) const { + piForeachC (PICodeInfo::EnumeratorInfo & e, members) + if (e.value == value_) + return e.name; + return PIString(); +} + + +int PICodeInfo::EnumInfo::memberValue(const PIString & name_) const { + piForeachC (PICodeInfo::EnumeratorInfo & e, members) + if (e.name == name_) + return e.value; + return -1; +} + + +PIMap * PICodeInfo::classesInfo; +PIMap * PICodeInfo::enumsInfo; + +bool __PICodeInfoInitializer__::_inited_ = false; diff --git a/src/code/picodeinfo.h b/src/code/picodeinfo.h new file mode 100755 index 00000000..c6f45125 --- /dev/null +++ b/src/code/picodeinfo.h @@ -0,0 +1,158 @@ +/*! \file picodeinfo.h + * \brief C++ code info structs +*/ +/* + PIP - Platform Independent Primitives + C++ code info structs + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifndef PICODEINFO_H +#define PICODEINFO_H + +#include "pistring.h" + +namespace PICodeInfo { + +enum TypeFlag { + NoFlag, + Const = 0x01, + Static = 0x02, + Mutable = 0x04, + Volatile = 0x08, + Inline = 0x10, + Virtual = 0x20, + Extern = 0x40 +}; + +typedef PIFlags TypeFlags; + +struct TypeInfo { + TypeInfo(const PIString & n = PIString(), const PIString & t = PIString(), PICodeInfo::TypeFlags f = 0) {name = n; type = t; flags = f;} + PIString name; + PIString type; + PICodeInfo::TypeFlags flags; +}; + +struct FunctionInfo { + PIString name; + TypeInfo return_type; + PIVector arguments; +}; + +struct ClassInfo { + PIString name; + PIStringList parents; + PIVector variables; + PIVector functions; +}; + +struct EnumeratorInfo { + EnumeratorInfo(const PIString & n = PIString(), int v = 0) {name = n; value = v;} + PIString name; + int value; +}; + +struct EnumInfo { + PIString memberName(int value) const; + int memberValue(const PIString & name) const; + PIString name; + PIVector members; +}; + + +inline PICout operator <<(PICout s, const PICodeInfo::TypeInfo & v) { + if (v.flags[Inline]) s << "inline "; + if (v.flags[Virtual]) s << "virtual "; + if (v.flags[Mutable]) s << "mutable "; + if (v.flags[Volatile]) s << "volatile "; + if (v.flags[Static]) s << "static "; + if (v.flags[Const]) s << "const "; + s << v.type; + if (!v.name.isEmpty()) + s << " " << v.name; + return s; +} + +inline PICout operator <<(PICout s, const PICodeInfo::EnumeratorInfo & v) {s << v.name << " = " << v.value; return s;} + +inline PICout operator <<(PICout s, const PICodeInfo::ClassInfo & v) { + s.setControl(0, true); + s << "class " << v.name; + if (!v.parents.isEmpty()) { + s << ": "; + bool first = true; + piForeachC (PIString & i, v.parents) { + if (first) first = false; + else s << ", "; + s << i; + } + } + s << " {\n"; + piForeachC (FunctionInfo & i, v.functions) { + s << Tab << i.return_type << " " << i.name << "("; + bool fa = true; + piForeachC (TypeInfo & a, i.arguments) { + if (fa) fa = false; + else s << ", "; + s << a; + } + s << ");\n"; + } + if (!v.functions.isEmpty() && !v.variables.isEmpty()) + s << "\n"; + piForeachC (TypeInfo & i, v.variables) { + s << Tab << i << ";\n"; + } + s << "}\n"; + s.restoreControl(); + return s; +} + +inline PICout operator <<(PICout s, const PICodeInfo::EnumInfo & v) { + s.setControl(0, true); + s << "enum " << v.name << " {\n"; + piForeachC (EnumeratorInfo & i, v.members) { + bool f = true; + if (f) f = false; + else s << ", "; + s << Tab << i << "\n"; + } + s << "}\n"; + s.restoreControl(); + return s; +} + +extern PIMap * classesInfo; +extern PIMap * enumsInfo; + +} + +class __PICodeInfoInitializer__ { +public: + __PICodeInfoInitializer__() { + if (_inited_) return; + _inited_ = true; + PICodeInfo::classesInfo = new PIMap; + PICodeInfo::enumsInfo = new PIMap; + } + static bool _inited_; +}; + +static __PICodeInfoInitializer__ __picodeinfoinitializer__; + +#endif // PICODEINFO_H diff --git a/src/code/picodeparser.cpp b/src/code/picodeparser.cpp new file mode 100755 index 00000000..36722d2e --- /dev/null +++ b/src/code/picodeparser.cpp @@ -0,0 +1,846 @@ +/* + PIP - Platform Independent Primitives + C++ code parser + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picodeparser.h" + + + +PIString PICodeParser::Macro::expand(PIString args_, bool * ok) const { + PIStringList arg_vals; + while (!args_.isEmpty()) { + int ci = args_.find(","), bi = args_.find("("); + if (ci < 0) { + arg_vals << args_; + break; + } + PIString ca; + if (bi >= 0 && bi < ci) { + ca = args_.left(args_.takeLeft(bi)); + ci -= ca.size_s(); bi -= ca.size_s(); + ca += "(" + args_.takeRange("(", ")") + ")"; + } else { + ca = args_.takeLeft(ci); + } + arg_vals << ca; + args_.trim(); args_.takeLeft(1); args_.trim(); + } + if (args.size() != arg_vals.size()) { + piCout << ("Error: in expansion of macro \"" + name + "(" + args.join(", ") + ")\": expect") + << args.size() << "arguments but takes" << arg_vals.size() << "!"; + if (ok != 0) *ok = false; + return PIString(); + } + PIString ret = value; + for (int i = 0; i < args.size_s(); ++i) { + const PIString & an(args[i]), av(arg_vals[i]); + int ind(-1); + while ((ind = ret.find(an, ind + 1)) >= 0) { + PIChar ppc(0), pc(0), nc(0); + if (ind > 1) ppc = ret[ind - 2]; + if (ind > 0) pc = ret[ind - 1]; + if (ind + an.size_s() < ret.size_s()) nc = ret[ind + an.size_s()]; + if (ppc != '#' && pc == '#' && !_isCChar(nc)) { // to chars + ind--; + ret.replace(ind, an.size_s() + 1, "\"" + av + "\""); + ind -= an.size_s() - av.size_s() - 1; + continue; + } + if (_isCChar(pc) || _isCChar(nc)) continue; + ret.replace(ind, an.size_s(), av); + ind -= an.size_s() - av.size_s(); + } + } + ret.replaceAll("##", ""); + if (ok != 0) *ok = true; + return ret; +} + + + +PICodeParser::PICodeParser() { + macros_iter = 32; + with_includes = true; + clear(); + includes << ""; +} + + +void PICodeParser::parseFile(const PIString & file, bool follow_includes) { + clear(); + parseFileInternal(file, follow_includes); + /*piCout << "\n\nDefines:"; + piForeachC (Define & m, defines) + piCout << "define" << m.first << m.second; + piCout << "\n\nMacros:"; + piForeachC (Macro & m, macros) + piCout << "Macro:" << m.name << m.args << m.value; + piCout << "\n\nClasses:"; + piForeachC (Entity * c, entities) + piCout << "class" << c->name << c->parents; + piCout << "\n\nEnums:"; + piForeachC (Enum & c, enums) + piCout << "enum" << c.name << c.members; + piCout << "\n\nTypedefs:"; + piForeachC (Typedef & c, typedefs) + piCout << "typedef" << c;*/ +} + + +void PICodeParser::parseFiles(const PIStringList & files, bool follow_includes) { + clear(); + piForeachC (PIString & f, files) + parseFileInternal(f, follow_includes); + /*piCout << "\n\nDefines:"; + piForeachC (Define & m, defines) + piCout << "define" << m.first << m.second; + piCout << "\n\nMacros:"; + piForeachC (Macro & m, macros) + piCout << "Macro:" << m.name << m.args << m.value; + piCout << "\n\nClasses:"; + piForeachC (Entity * c, entities) + piCout << "class" << c->name << c->parents; + piCout << "\n\nEnums:"; + piForeachC (Enum & c, enums) + piCout << "enum" << c.name << c.members; + piCout << "\n\nTypedefs:"; + piForeachC (Typedef & c, typedefs) + piCout << "typedef" << c;*/ +} + + +bool PICodeParser::isEnum(const PIString & name) { + piForeachC (Enum & e, enums) + if (e.name == name) + return true; + return false; +} + + +bool PICodeParser::parseFileInternal(const PIString & file, bool follow_includes) { + if (proc_files[file]) return true; + with_includes = follow_includes; + cur_file = file; + PIFile f(file, PIIODevice::ReadOnly); + int ii = 0; + while (!f.isOpened() && ii < (includes.size_s() - 1)) { + f.setPath(includes[++ii] + "/" + file); + //piCout << "try" << f.path(); + f.open(PIIODevice::ReadOnly); + } + if (!f.isOpened()) { + //piCout << ("Error: can`t open file \"" + file + "\"!"); + return false; + } + //piCout << "add" << file; + proc_files << f.path(); + PIString fc = f.readAll(); + piCout << "parsing" << f.path() << "..."; + bool is_main = isMainFile(fc); + if (is_main) main_file = f.path(); + bool ret = parseFileContent(fc, is_main); + piCout << "parsing" << f.path() << "done"; + return ret; +} + + +void PICodeParser::clear() { + piForeach (Entity * i, entities) delete i; + defines.clear(); + macros.clear(); + enums.clear(); + typedefs.clear(); + entities.clear(); + proc_files.clear(); + cur_namespace.clear(); + main_file.clear(); + evaluator.clearCustomVariables(); + defines << Define("PICODE", "") << custom_defines; +} + + +bool PICodeParser::parseFileContent(PIString & fc, bool main) { + bool mlc = false, cc = false; + int mls = 0, ole = -1, /*ccs = 0,*/ end = 0; + char c = 0, pc = 0; + PIString pfc, line, ccmn, tmp; + PIMap cchars; + + /// Remove comments, join multiline "*" and replace "*" to $n (cchars) + fc.replaceAll("\r\n", "\n"); + fc.replaceAll("\r", "\n"); + for (int i = 0; i < fc.size_s() - 1; ++i) { + if (i > 0) pc = c; + c = fc[i].toAscii(); + if (c == '"' && !mlc && pc != '\'') { + if (i > 0) if (fc[i - 1] == '\\') continue; + cc = !cc; + /*if (cc) ccs = i; + if (!cc) { + ccmn = "$" + PIString::fromNumber(cchars.size()); + cchars[ccmn] = fc.mid(ccs, i - ccs + 1); + fc.replace(ccs, i - ccs + 1, ccmn); + i = ccs - 1 + ccmn.size_s(); + }*/ + continue; + } + if (i > 0) + if (c == '\\' && fc[i - 1].toAscii() != '\\') { + fc.cutMid(i, 2); + --i; + continue; + } + if (cc) continue; + if (fc.mid(i, 2) == "/*") {mlc = true; mls = i; ++i; continue;} + if (fc.mid(i, 2) == "*/" && mlc) {mlc = false; fc.cutMid(mls, i - mls + 2); i = mls - 1; continue;} + if (fc.mid(i, 2) == "//" && !mlc) {ole = fc.find('\n', i); fc.cutMid(i, ole < 0 ? -1 : ole - i); --i; continue;} + } + //piCout << fc; + pfc = procMacros(fc); + + if (main) return true; + + bool replaced = true; + int replaced_cnt = 0; + while (replaced) { + //piCout << "MACRO iter" << replaced_cnt; + if (replaced_cnt >= macros_iter) { + piCout << "Error: recursive macros detected!"; + break;//return false; + } + replaced_cnt++; + replaced = false; + piForeachC (Define & d, defines) { + int ind(-1); + while ((ind = pfc.find(d.first, ind + 1)) >= 0) { + PIChar pc(0), nc(0); + if (ind > 0) pc = pfc[ind - 1]; + if (ind + d.first.size_s() < pfc.size_s()) nc = pfc[ind + d.first.size_s()]; + if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue; + pfc.replace(ind, d.first.size_s(), d.second); + ind -= d.first.size_s() - d.second.size_s(); + replaced = true; + } + } + piForeachC (Macro & m, macros) { + int ind(-1); + while ((ind = pfc.find(m.name, ind + 1)) >= 0) { + PIChar pc(0), nc(0); + if (ind > 0) pc = pfc[ind - 1]; + if (ind + m.name.size_s() < pfc.size_s()) nc = pfc[ind + m.name.size_s()]; + if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue; + PIString ret, range; bool ok(false); + range = pfc.mid(ind + m.name.size_s()).takeRange("(", ")"); + ret = m.expand(range, &ok); + if (!ok) return false; + int rlen = pfc.find(range, ind + m.name.size_s()) + range.size_s() + 1 - ind; + pfc.replace(ind, rlen, ret); + ind -= rlen - ret.size_s(); + replaced = true; + } + } + } + + //piCout << NewLine << "file" << cur_file << pfc; + int pl = -1; + while (!pfc.isEmpty()) { + pfc.trim(); + int nl = pfc.size_s(); + if (pl == nl) break; + pl = nl; + if (pfc.left(9) == "namespace") { + pfc.cutLeft(pfc.find("{") + 1); + continue; + } + if (pfc.left(8) == "template") { + pfc.cutLeft(8); + pfc.takeRange("<", ">"); + bool def = !isDeclaration(pfc, 0, &end); + pfc.cutLeft(end); + if (def) pfc.takeRange("{", "}"); + else pfc.takeSymbol(); + continue; + } + if (pfc.left(5) == "class" || pfc.left(6) == "struct") { + int dind = pfc.find("{", 0), find = pfc.find(";", 0); + if (dind < 0 && find < 0) {pfc.cutLeft(6); continue;} + if (dind < 0 || find < dind) {pfc.cutLeft(6); continue;} + ccmn = pfc.left(dind) + "{\n" + pfc.mid(dind).takeRange('{', '}') + "\n}\n"; + pfc.remove(0, ccmn.size()); + parseClass(ccmn); + continue; + } + if (pfc.left(4) == "enum") { + pfc.cutLeft(4); + tmp = pfc.takeCWord(); + parseEnum(cur_namespace + tmp, pfc.takeRange("{", "}")); + pfc.takeSymbol(); + continue; + } + if (pfc.left(7) == "typedef") { + pfc.cutLeft(7); + typedefs << parseTypedef(pfc.takeLeft(pfc.find(";"))); + if (typedefs.back().first.isEmpty()) typedefs.pop_back(); + else root_.typedefs << typedefs.back(); + pfc.takeSymbol(); + continue; + } + int sci = pfc.find(";", 0), obi = pfc.find("{", 0); + if (sci < 0 && obi < 0) { + pfc.takeLeft(1); + continue; + } + PIString str; + if (sci < obi) { + str = pfc.takeLeft(sci + 1); + } else { + str = pfc.takeLeft(obi); + pfc.cutLeft(pfc.takeRange("{", "}")); + } + parseMember(&root_, str); + } + + return true; +} + + +PICodeParser::Entity * PICodeParser::parseClassDeclaration(const PIString & fc) { + PIString cd = fc.trimmed().removeAll('\n').replaceAll("\t", " ").replaceAll(" ", " "), pn; + //piCout << "found class <****\n" << cd << "\n****>"; + int ind = cd.find(":"); + PIVector parents; + if (ind > 0) { + PIStringList pl = cd.takeMid(ind + 1).trim().split(","); + cd.cutRight(1); + Entity * pe = 0; + piForeachC (PIString & p, pl) { + if (p.contains(" ")) pn = p.mid(p.find(" ") + 1); + else pn = p; + pe = findEntityByName(pn); + if (pe == 0) ;//{piCout << "Error: can`t find" << pn;} + else parents << pe; + } + } + bool is_class = cd.left(5) == "class"; + cur_def_vis = (is_class ? Private : Public); + PIString cn = cd.mid(6).trim(); + if (cn.isEmpty()) return 0; + Entity * e = new Entity(); + e->name = cur_namespace + cn; + e->type = (is_class ? "class" : "struct"); + e->parents = parents; + e->file = cur_file; + entities << e; + return e; +} + + +PIString PICodeParser::parseClass(PIString & fc) { + Visibility prev_vis = cur_def_vis; + int dind = fc.find("{"), find = fc.find(";"), end = 0; + if (dind < 0 && find < 0) return PIString(); + if (dind < 0 || find < dind) return fc.left(find); + Entity * ce = parseClassDeclaration(fc.takeLeft(dind)); + fc.trim().cutLeft(1).cutRight(1).trim(); + //piCout << "found class <****\n" << fc << "\n****>"; + if (!ce) return PIString(); + int ps = -1; + bool def = false; + PIString prev_namespace = cur_namespace, stmp; + cur_namespace = ce->name + "::"; + //piCout << "parse class" << ce->name << "namespace" << cur_namespace; + //piCout << "\nparse class" << ce->name << "namespace" << cur_namespace; + while (!fc.isEmpty()) { + PIString cw = fc.takeCWord(), tmp; + //piCout << "\ntaked word" << cw; + if (cw == "public") {cur_def_vis = Public; fc.cutLeft(1); continue;} + if (cw == "protected") {cur_def_vis = Protected; fc.cutLeft(1); continue;} + if (cw == "private") {cur_def_vis = Private; fc.cutLeft(1); continue;} + if (cw == "class") {if (isDeclaration(fc, 0, &end)) {fc.cutLeft(end); fc.takeSymbol(); continue;} tmp = fc.takeLeft(fc.find("{")); stmp = fc.takeRange("{", "}"); fc.takeSymbol(); stmp = "class " + tmp + "{" + stmp + "}"; parseClass(stmp); continue;} + if (cw == "struct") {if (isDeclaration(fc, 0, &end)) {fc.cutLeft(end); fc.takeSymbol(); continue;} tmp = fc.takeLeft(fc.find("{")); stmp = fc.takeRange("{", "}"); fc.takeSymbol(); stmp = "struct " + tmp + "{" + stmp + "}"; parseClass(stmp); continue;} + if (cw == "enum") {tmp = fc.takeCWord(); parseEnum(cur_namespace + tmp, fc.takeRange("{", "}")); fc.takeSymbol(); continue;} + if (cw == "friend") {fc.cutLeft(fc.find(";") + 1); continue;} + if (cw == "typedef") {ce->typedefs << parseTypedef(fc.takeLeft(fc.find(";"))); typedefs << ce->typedefs.back(); typedefs.back().first.insert(0, cur_namespace); if (ce->typedefs.back().first.isEmpty()) ce->typedefs.pop_back(); fc.takeSymbol(); continue;} + if (cw == "template") { + fc.takeRange("<", ">"); + def = !isDeclaration(fc, 0, &end); + fc.cutLeft(end); + if (def) fc.takeRange("{", "}"); + else fc.takeSymbol(); + continue; + } + def = !isDeclaration(fc, 0, &end); + tmp = (cw + fc.takeLeft(end)).trim(); + if (!tmp.isEmpty()) + parseMember(ce, tmp); + if (def) fc.takeRange("{", "}"); + else fc.takeSymbol(); + if (ps == fc.size_s()) {/*cur_namespace = prev_namespace;*/ fc.cutLeft(1);/*return false*/;} + ps = fc.size_s(); + } + cur_def_vis = prev_vis; + cur_namespace = prev_namespace; + return ce->name; +} + + +bool PICodeParser::parseEnum(const PIString & name, PIString fc) { + //piCout << "enum" << name << fc; + Enum e(name); + PIStringList vl(fc.split(",")); + PIString vn; + int cv = -1, ind = 0; + piForeachC (PIString & v, vl) { + vn = v; ind = v.find("="); + if (ind > 0) {cv = v.right(v.size_s() - ind - 1).toInt(); vn = v.left(ind);} + if (ind < 0) ++cv; + e.members << Enumerator(vn.trim(), cv); + } + enums << e; + return true; +} + + +PICodeParser::Typedef PICodeParser::parseTypedef(PIString fc) { + //piCout << "parse typedef" << fc; + Typedef td; + fc.replaceAll("\t", " "); + + if (fc.contains("(")) { + int start = fc.find("("), end = fc.find(")"); + td.first = fc.takeMid(start + 1, end - start - 1).trim(); + if (td.first.left(1) == "*") {td.first.cutLeft(1).trim(); fc.insert(start + 1, "*");} + td.second = fc.trim(); + } else { + td.first = fc.takeMid(fc.findLast(" ")).trim(); + td.second = fc.trim(); + } + //piCout << "found typedef" << td; + return td; +} + + +bool PICodeParser::parseMember(Entity * parent, PIString & fc) { + if (fc.trim().isEmpty()) return true; + if (fc.find("operator") >= 0) return true; + tmp_temp.clear(); + //piCout << "parse member" << fc; + int ts = fc.find("<"), te = 0; + PIString ctemp, crepl; + while (ts >= 0) { + ctemp = fc.mid(ts).takeRange("<", ">"); + if (ctemp.isEmpty()) {te = ts + 1; ts = fc.find("<", te); continue;} + crepl = "$" + PIString::fromNumber(tmp_temp.size_s()).expandLeftTo(3, "0"); + fc.replace(ts, ctemp.size_s() + 2, crepl); + tmp_temp[crepl] = "<" + ctemp + ">"; + ts = fc.find("<", te); + } + fc.replaceAll("\n", " ").replaceAll("\t", " ").replaceAll(" ", " ").replaceAll(", ", ","); + PIStringList tl, al; + Member me; + //piCout << fc; + if (fc.contains("(")) { + fc.cutRight(fc.size_s() - fc.findLast(")") - 1); + te = fc.find("("); + //piCout << fc; + for (ts = te - 1; ts >= 0; --ts) + if (!_isCChar(fc[ts]) && !(fc[ts].isDigit())) break; + //piCout << "takeMid" << ts + 1 << te - ts - 1; + me.name = fc.takeMid(ts + 1, te - ts - 1); + if (me.name == parent->name) return true; + me.arguments_full = fc.takeMid(ts + 2).cutRight(1).split(","); + me.type = fc.cutRight(1).trim(); + me.visibility = cur_def_vis; + if (me.type.find("inline ") >= 0) { + me.attributes |= Inline; + me.type.removeAll("inline "); + } + if (me.type.find("static ") >= 0) { + me.attributes |= Static; + me.type.removeAll("static "); + } + if (me.type.find("virtual ") >= 0) { + me.attributes |= Virtual; + me.type.removeAll("virtual "); + } + normalizeEntityNamespace(me.type); + int i = 0; + //piCout << me.arguments_full; + piForeach (PIString & a, me.arguments_full) + if ((i = a.find("=")) > 0) + a.cutRight(a.size_s() - i).trim(); + for (int j = 0; j < me.arguments_full.size_s(); ++j) + if (me.arguments_full[j] == "void") { + me.arguments_full.remove(j); + --j; + } + me.arguments_type = me.arguments_full; + piForeach (PIString & a, me.arguments_type) { + crepl.clear(); + if (a.contains("[")) + crepl = a.takeMid(a.find("["), a.findLast("]") - a.find("[") + 1); + for (ts = a.size_s() - 1; ts >= 0; --ts) + if (!_isCChar(a[ts]) && !(a[ts].isDigit())) break; + a.cutRight(a.size_s() - ts - 1); + normalizeEntityNamespace(a); + a += crepl; + a.trim(); + } + restoreTmpTemp(&me); + //piCout << "func" << me.type << me.name << me.arguments_full << me.arguments_type; + parent->functions << me; + } else { + if (fc.endsWith(";")) fc.cutRight(1); + if (fc.startsWith("using") || !(fc.contains(' ') || fc.contains('\t') || fc.contains('\n'))) return true; + tl = fc.split(","); + //piCout << "\tmember" << fc; + if (tl.isEmpty()) return true; + bool vn = true; + ctemp = tl.front(); + for (ts = ctemp.size_s() - 1; ts > 0; --ts) { + if (vn) {if (!_isCChar(ctemp[ts]) && !ctemp[ts].isDigit() && ctemp[ts] != '[' && ctemp[ts] != ']') vn = false;} + else {if (_isCChar(ctemp[ts]) || ctemp[ts].isDigit()) break;} + } + me.type = ctemp.takeLeft(ts + 1); + me.visibility = cur_def_vis; + restoreTmpTemp(&me); + PIString type = " " + me.type; + if (type.find(" const ") >= 0) { + me.attributes |= Const; + type.replaceAll(" const ", " "); + } + if (type.find(" static ") >= 0) { + me.attributes |= Static; + type.replaceAll(" static ", " "); + } + if (type.find(" mutable ") >= 0) { + me.attributes |= Mutable; + type.replaceAll(" mutable ", " "); + } + if (type.find(" volatile ") >= 0) { + me.attributes |= Volatile; + type.replaceAll(" volatile ", " "); + } + if (type.find(" extern ") >= 0) { + me.attributes |= Extern; + type.replaceAll(" extern ", " "); + } + type.trim(); + normalizeEntityNamespace(type); + tl[0] = ctemp.trim(); + piForeachC (PIString & v, tl) { + crepl.clear(); + me.name = v.trimmed(); + me.type = type; + if (me.name.isEmpty()) continue; + if (me.name.contains("[")) + crepl = me.name.takeMid(me.name.find("["), me.name.findLast("]") - me.name.find("[") + 1); + while (!me.name.isEmpty()) { + if (me.name.front() == "*" || me.name.front() == "&") { + me.type += me.name.takeLeft(1); + me.name.trim(); + } else break; + } + me.is_type_ptr = (me.type.right(1) == "]" || me.type.right(1) == "*"); + me.type += crepl; + //piCout << "var" << me.type << me.name << me.is_const << me.is_static; + parent->members << me; + } + } + //piCout << "parse member" << fc; + return true; +} + + +void PICodeParser::normalizeEntityNamespace(PIString & n) { + PIString suff, pref; + for (int i = n.size_s() - 1; i > 0; --i) + if (_isCChar(n[i]) || n[i].isDigit()) { + suff = n.right(n.size_s() - i - 1); + n.cutRight(suff.size_s()); + break; + } + n.push_front(" "); + if (n.find(" static ") >= 0) {n.replaceAll(" static ", ""); pref += "static ";} + if (n.find(" const ") >= 0) {n.replaceAll(" const ", ""); pref += "const ";} + if (n.find(" mutable ") >= 0) {n.replaceAll(" mutable ", ""); pref += "mutable ";} + if (n.find(" volatile ") >= 0) {n.replaceAll(" volatile ", ""); pref += "volatile ";} + n.trim(); + int f = 0; + piForeachC (Entity * e, entities) { + if (e->name == n) { + n = (pref + n + suff).trim(); + return; + } + if ((f = e->name.find(n)) >= 0) + if (e->name.mid(f - 1, 1) == ":") + if (e->name.find(cur_namespace) >= 0) { + n = pref + e->name + suff; + return; + } + } + piForeachC (Enum & e, enums) + if ((f = e.name.find(n)) >= 0) + if (e.name.mid(f - 1, 1) == ":") + if (e.name.find(cur_namespace) >= 0) { + //piCout << "change" << n << "to" << e.name + suff; + n = pref + e.name + suff; + return; + } + piForeachC (Typedef & e, typedefs) + if ((f = e.first.find(n)) >= 0) + if (e.first.mid(f - 1, 1) == ":") + if (e.first.find(cur_namespace) >= 0) { + //piCout << "change" << n << "to" << e.name + suff; + n = pref + e.first + suff; + return; + } + n = (pref + n + suff).trim(); +} + + +void PICodeParser::restoreTmpTemp(Member * e) { + int i = 0; + piForeach (PIString & a, e->arguments_full) { + while ((i = a.find("$")) >= 0) + a.replace(i, 4, tmp_temp[a.mid(i, 4)]); + } + piForeach (PIString & a, e->arguments_type) { + while ((i = a.find("$")) >= 0) + a.replace(i, 4, tmp_temp[a.mid(i, 4)]); + } + while ((i = e->type.find("$")) >= 0) + e->type.replace(i, 4, tmp_temp[e->type.mid(i, 4)]); +} + + +bool PICodeParser::macroCondition(const PIString & mif, PIString mifcond) { + //piCout << "macroCondition" << mif << mifcond; + if (mif == "ifdef") return isDefineExists(mifcond); + if (mif == "ifndef") return !isDefineExists(mifcond); + if (mif == "if" || mif == "elif") { + mifcond.removeAll(" ").removeAll("\t"); + return procMacrosCond(mifcond) > 0.; + } + return false; +} + + +double PICodeParser::procMacrosCond(PIString fc) { + bool neg = false, first = true, br = false; + double ret = 0., brv = 0.; + int oper = 0, ps = -1; + char cc, nc; + PIString ce; + fc.removeAll("defined"); + //piCout << "procMacrosCond" << fc; + while (!fc.isEmpty()) { + cc = fc[0].toAscii(); + nc = (fc.size() > 1 ? fc[1].toAscii() : 0); + if (cc == '!') {neg = true; fc.pop_front(); continue;} + if (cc == '(') {br = true; brv = procMacrosCond(fc.takeRange('(', ')'));} + if (cc == '&' && nc == '&') {fc.remove(0, 2); oper = 1; continue;} + if (cc == '|' && nc == '|') {fc.remove(0, 2); oper = 2; continue;} + if (!br) { + ce = fc.takeCWord(); + if (ce.isEmpty()) ce = fc.takeNumber(); + } + if (first) { + first = false; + ret = br ? brv : defineValue(ce); + if (neg) ret = -ret; + } else { + //piCout << "oper" << oper << "with" << ce; + if (!br) brv = defineValue(ce); + switch (oper) { + case 1: ret = ret && (neg ? -brv : brv); break; + case 2: ret = ret || (neg ? -brv : brv); break; + } + } + if (ps == fc.size_s()) fc.cutLeft(1); + ps = fc.size_s(); + br = neg = false; + } + //piCout << "return" << ret; + return ret; +} + + +bool PICodeParser::isDefineExists(const PIString & dn) { + piForeachC (Define & d, defines) { + if (d.first == dn) + return true; + } + return false; +} + + +double PICodeParser::defineValue(const PIString & dn) { + piForeachC (Define & d, defines) { + if (d.first == dn) + return d.second.isEmpty() ? 1. : d.second.toDouble(); + } + return dn.toDouble(); +} + + +PICodeParser::Entity * PICodeParser::findEntityByName(const PIString & en) { + piForeach (Entity * e, entities) + if (e->name == en) + return e; + return 0; +} + + +bool PICodeParser::isDeclaration(const PIString & fc, int start, int * end) { + int dind = fc.find("{", start), find = fc.find(";", start); + //piCout << "isDeclaration" << dind << find; + if (dind < 0 && find < 0) {if (end) *end = -1; return true;} + if (dind < 0 || find < dind) {if (end) *end = find; return true;} + if (end) *end = dind; + return false; +} + + +bool PICodeParser::isMainFile(const PIString & fc) { + int si = 0; + while (si >= 0) { + int csi = fc.find(" main", si); + if (csi < 0) csi = fc.find("\tmain", si); + if (csi < 0) csi = fc.find("\nmain", si); + if (csi < 0) return false; + si = csi; + int fi = fc.find("(", si + 5); + if (fi < 0) return false; + if (fi - si < 10) { + PIString ms(fc.mid(si, fi - si + 1)); + ms.removeAll(" ").removeAll("\t").removeAll("\n"); + if (ms == "main(") return true; + } + si += 5; + } + return false; +} + + +PIString PICodeParser::procMacros(PIString fc) { + if (fc.isEmpty()) return PIString(); + int ifcnt = 0; + bool grab = false, skip = false, cond_ok = false; + PIString pfc, nfc, line, mif, mifcond; + //piCout << "procMacros\n<******" << fc << "\n******>"; + fc += "\n"; + while (!fc.isEmpty()) { + line = fc.takeLine().trimmed(); + if (line.left(1) == "#") { + mifcond = line.mid(1); + mif = mifcond.takeCWord(); + //piCout << "mif mifcond" << mif << mifcond << ifcnt; + if (skip || grab) { + if (mif.left(2) == "if") ifcnt++; + if (mif.left(5) == "endif") { + if (ifcnt > 0) ifcnt--; + else { + //piCout << "main endif" << skip << grab; + if (grab) pfc << procMacros(nfc); + skip = grab = false; + continue; + } + } + if (mif.left(4) == "elif" && ifcnt == 0) { + //piCout << "main elif" << skip << grab << cond_ok; + if (cond_ok) { + if (grab) { + pfc << procMacros(nfc); + skip = true; grab = false; + } + continue; + } + if (skip) { + //piCout << "check elif" << skip << grab << cond_ok; + if (!macroCondition(mif, mifcond.trimmed())) continue; + //piCout << "check elif ok"; + skip = false; grab = cond_ok = true; + continue; + } + continue; + } + if (mif.left(4) == "else" && ifcnt == 0) { + //piCout << "main else" << skip << grab; + if (grab) pfc << procMacros(nfc); + if (skip && !cond_ok) {skip = false; grab = true;} + else {skip = true; grab = false;} + continue; + } + if (grab) nfc << line << "\n"; + continue; + } + if (mif.left(2) == "if") { + //piCout << "main if"; + skip = grab = cond_ok = false; + if (macroCondition(mif, mifcond.trimmed())) grab = cond_ok = true; + else skip = true; + ifcnt = 0; + nfc.clear(); + } else { + if (!parseDirective(line.cutLeft(1).trim())) + ;//return false; /// WARNING + } + } else { + if (grab) nfc << line << "\n"; + else if (!skip) pfc << line << "\n"; + } + } + return pfc; +} + + +bool PICodeParser::parseDirective(PIString d) { + if (d.isEmpty()) return true; + PIString dname = d.takeCWord(); + //piCout << "parseDirective" << d; + if (dname == "include") { + d.replaceAll("<", "\"").replaceAll(">", "\""); + PIString cf = cur_file, ifc = d.takeRange("\"", "\""); + if (with_includes) { + bool ret = parseFileInternal(ifc, with_includes); + cur_file = cf; + return ret; + } + } + if (dname == "define") { + PIString mname = d.takeCWord(); + if (d.left(1) == "(") { // macro + PIStringList args = d.takeRange("(", ")").split(",").trim(); + macros << Macro(mname, d.trim(), args); + } else { // define + d.trim(); + //if (mname == d) d.clear(); + defines << Define(mname, d); + evaluator.setVariable(mname, complexd_1); + } + return true; + } + if (dname == "undef") { + PIString mname = d.takeCWord(); + for (int i = 0; i < defines.size_s(); ++i) + if (defines[i].first == mname) {defines.remove(i); --i;} + return true; + } + return true; +} diff --git a/src/code/picodeparser.h b/src/code/picodeparser.h new file mode 100755 index 00000000..133361ca --- /dev/null +++ b/src/code/picodeparser.h @@ -0,0 +1,162 @@ +/*! \file picodeparser.h + * \brief C++ code parser +*/ +/* + PIP - Platform Independent Primitives + C++ code parser + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifndef PICODEPARSER_H +#define PICODEPARSER_H + +#include "pifile.h" +#include "pievaluator.h" + +inline bool _isCChar(const PIChar & c) {return (c.isAlpha() || (c.toAscii() == '_'));} +inline bool _isCChar(const PIString & c) {if (c.isEmpty()) return false; return _isCChar(c[0]);} + +class PIP_EXPORT PICodeParser { +public: + PICodeParser(); + + enum PIP_EXPORT Visibility {Global, Public, Protected, Private}; + enum PIP_EXPORT Attribute { + NoAttributes = 0x0, + Const = 0x01, + Static = 0x02, + Mutable = 0x04, + Volatile = 0x08, + Inline = 0x10, + Virtual = 0x20, + Extern = 0x40 + }; + + typedef PIFlags Attributes; + typedef PIPair Define; + typedef PIPair Typedef; + typedef PIPair Enumerator; + + struct PIP_EXPORT Macro { + Macro(const PIString & n = PIString(), const PIString & v = PIString(), const PIStringList & a = PIStringList()) { + name = n; + value = v; + args = a; + } + PIString expand(PIString args_, bool * ok = 0) const; + PIString name; + PIString value; + PIStringList args; + }; + + struct PIP_EXPORT Member { + Member() { + visibility = Global; + size = 0; + is_type_ptr = false; + attributes = NoAttributes; + } + PIString type; + PIString name; + PIStringList arguments_full; + PIStringList arguments_type; + Visibility visibility; + Attributes attributes; + bool is_type_ptr; + int size; + }; + + struct PIP_EXPORT Entity { + Entity() { + visibility = Global; + size = 0; + } + PIString type; + PIString name; + PIString file; + Visibility visibility; + int size; + PIVector parents; + //PIVector children; + PIVector functions; + PIVector members; + PIVector typedefs; + }; + + struct PIP_EXPORT Enum { + Enum(const PIString & n = PIString()) { + name = n; + } + PIString name; + PIVector members; + }; + + void parseFile(const PIString & file, bool follow_includes = true); + void parseFiles(const PIStringList & files, bool follow_includes = true); + + void includeDirectory(const PIString & dir) {includes << dir;} + void addDefine(const PIString & def_name, const PIString & def_value) {custom_defines << Define(def_name, def_value);} + bool isEnum(const PIString & name); + Entity * findEntityByName(const PIString & en); + PIStringList parsedFiles() const {return PIStringList(proc_files.toVector());} + PIString mainFile() const {return main_file;} + const PICodeParser::Entity * global() const {return &root_;} + + int macrosSubstitutionMaxIterations() const {return macros_iter;} + void setMacrosSubstitutionMaxIterations(int value) {macros_iter = value;} + + PIVector defines, custom_defines; + PIVector macros; + PIVector enums; + PIVector typedefs; + PIVector entities; + +private: + void clear(); + bool parseFileInternal(const PIString & file, bool follow_includes); + bool parseFileContent(PIString & fc, bool main); + bool parseDirective(PIString d); + Entity * parseClassDeclaration(const PIString & fc); + PIString parseClass(PIString & fc); + bool parseEnum(const PIString & name, PIString fc); + Typedef parseTypedef(PIString fc); + bool parseMember(Entity * parent, PIString & fc); + void restoreTmpTemp(Member * e); + bool macroCondition(const PIString & mif, PIString mifcond); + bool isDefineExists(const PIString & dn); + double defineValue(const PIString & dn); + PIString procMacros(PIString fc); + double procMacrosCond(PIString fc); + bool isDeclaration(const PIString & fc, int start, int * end); + bool isMainFile(const PIString & fc); + void normalizeEntityNamespace(PIString & n); + + int macros_iter; + bool with_includes; + PIEvaluator evaluator; + //PIVector tree; + PISet proc_files; + PIString cur_file, main_file; + PIStringList includes; + Entity root_; + Visibility cur_def_vis; + PIString cur_namespace; + PIMap tmp_temp; + +}; + +#endif // PICODEPARSER_H diff --git a/src/containers/picontainers.cpp b/src/containers/picontainers.cpp new file mode 100755 index 00000000..0c4dd3a0 --- /dev/null +++ b/src/containers/picontainers.cpp @@ -0,0 +1,175 @@ +/* + PIP - Platform Independent Primitives + Generic containers + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// * This class based on std::vector, expanding his functionality + +/** \class PIVector + * \brief Dynamic array of any type + * \details This class used to store dynamic array of any + * type of data. In memory data stored linear. You can insert + * item in any place of remove some items from any place. + * For quick add elements this is stream operator <<. + + * \fn PIVector::PIVector(); + * Contructs an empty vector + + * \fn PIVector::PIVector(ullong size, const Type & value = Type()); + * \brief Contructs vector with size "size" filled elements "value" + * \details Example: \snippet picontainers.cpp PIVector::PIVector + + * \fn const Type & PIVector::at(ullong index) const; + * \brief Read-only access to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::at_c + * \sa \a operator[] + + * \fn Type & PIVector::at(ullong index); + * \brief Full access to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::at + * \sa \a operator[] + + * \fn const Type * PIVector::data(ullong index = 0) const; + * \brief Read-only pointer to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::data_c + + * \fn Type * PIVector::data(ullong index = 0); + * \brief Pointer to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::data + + * \fn ullong PIVector::size() const; + * \brief Elements count + + * \fn int PIVector::size_s() const; + * \brief Elements count + + * \fn bool PIVector::isEmpty() const; + * \brief Return \c "true" if vector is empty, i.e. size = 0 + + * \fn bool PIVector::has(const Type & t) const; + + * \fn bool PIVector::contains(const Type & v) const; + * \brief Return \c "true" if vector has at least one element equal "t" + + * \fn int PIVector::etries(const Type & t) const; + * \brief Return how many times element "t" appears in vector + + * \fn static int PIVector::compare_func(const Type * t0, const Type * t1); + * \brief Standard compare function for type "Type". Return 0 if t0 = t1, -1 if t0 < t1 and 1 if t0 > t1. + + * \fn void PIVector::resize(ullong size, const Type & new_type = Type()); + * \brief Resize vector to size "size" + * \details Elements removed from end of vector if new size < old size, or added new elements = "new_type" if new size > old size.\n + * Example: \snippet picontainers.cpp PIVector::resize + * \sa \a size(), \a clear() + + * \fn PIVector & PIVector::enlarge(ullong size); + * \brief Increase vector size with "size" elements + + * \fn void PIVector::clear(); + * \brief Clear vector. Equivalent to call "resize(0)" + + * \fn PIVector & PIVector::sort(CompareFunc compare = compare_func); + * \brief Sort vector using quick sort algorithm and standard compare function + * \details Example: \snippet picontainers.cpp PIVector::sort_0 + * With custom compare function: \snippet picontainers.cpp PIVector::sort_1 + + * \fn PIVector & PIVector::fill(const Type & t); + * \brief Fill vector with elements "t" leave size is unchanged and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::fill + + * \fn Type & PIVector::back(); + * \brief Last element of the vector + + * \fn const Type & PIVector::back() const; + * \brief Last element of the vector + + * \fn Type & PIVector::front(); + * \brief First element of the vector + + * \fn const Type & PIVector::front() const; + * \brief First element of the vector + + * \fn PIVector & PIVector::push_back(const Type & t); + * \brief Add new element "t" at the end of vector and return reference to vector + + * \fn PIVector & PIVector::push_front(const Type & t); + * \brief Add new element "t" at the beginning of vector and return reference to vector + + * \fn PIVector & PIVector::pop_back(); + * \brief Remove one element from the end of vector and return reference to vector + + * \fn PIVector & PIVector::pop_front(); + * \brief Remove one element from the beginning of vector and return reference to vector + + * \fn Type PIVector::take_back(); + * \brief Remove one element from the end of vector and return it + + * \fn Type PIVector::take_front(); + * \brief Remove one element from the beginning of vector and return it + + * \fn PIVector & PIVector::remove(uint index); + * \brief Remove one element by index "index" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::remove_0 + * \sa \a removeOne(), \a removeAll() + + * \fn PIVector & PIVector::remove(uint index, uint count); + * \brief Remove "count" elements by first index "index" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::remove_1 + * \sa \a removeOne(), \a removeAll() + + * \fn PIVector & PIVector::removeOne(const Type & v); + * \brief Remove no more than one element equal "v" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::removeOne + * \sa \a remove(), \a removeAll() + + * \fn PIVector & PIVector::removeAll(const Type & v); + * \brief Remove all elements equal "v" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::removeAll + * \sa \a remove(), \a removeOne() + + * \fn PIVector & PIVector::insert(uint pos, const Type & t); + * \brief Insert element "t" after index "pos" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::insert_0 + + * \fn PIVector & PIVector::insert(uint pos, const PIVector & t); + * \brief Insert other vector "t" after index "pos" and return reference to vector + * \details Example: \snippet picontainers.cpp PIVector::insert_1 + + * \fn Type & PIVector::operator [](uint index); + * \brief Full access to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::() + * \sa \a at() + + * \fn const Type & PIVector::operator [](uint index) const; + * \brief Read-only access to element by index "index" + * \details Example: \snippet picontainers.cpp PIVector::()_c + * \sa \a at() + + * \fn PIVector & PIVector::operator <<(const Type & t); + * \brief Add new element "t" at the end of vector and return reference to vector + + * \fn PIVector & PIVector::operator <<(const PIVector & t); + * \brief Add vector "t" at the end of vector and return reference to vector + + * \fn bool PIVector::operator ==(const PIVector & t); + * \brief Compare with vector "t" + + * \fn bool PIVector::operator !=(const PIVector & t); + * \brief Compare with vector "t" + + * */ diff --git a/src/containers/picontainers.h b/src/containers/picontainers.h new file mode 100755 index 00000000..6be2bf61 --- /dev/null +++ b/src/containers/picontainers.h @@ -0,0 +1,286 @@ +/*! \file picontainers.h + * \brief Generic containers + * + * This file declare all containers and useful macros + * to use them +*/ +/* + PIP - Platform Independent Primitives + Generic containers + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICONTAINERS_H +#define PICONTAINERS_H + +#include "picout.h" + +template +class PIP_EXPORT PIPair { +public: + PIPair() {first = Type0(); second = Type1();} + PIPair(const Type0 & value0, const Type1 & value1) {first = value0; second = value1;} + Type0 first; + Type1 second; +}; +template +inline bool operator <(const PIPair & value0, const PIPair & value1) {return value0.first < value1.first;} +template +inline bool operator ==(const PIPair & value0, const PIPair & value1) {return (value0.first == value1.first) && (value0.second == value1.second);} +template +inline bool operator !=(const PIPair & value0, const PIPair & value1) {return (value0.first != value1.first) || (value0.second != value1.second);} +template +inline std::ostream & operator <<(std::ostream & s, const PIPair & v) {s << "(" << v.first << ", " << v.second << ")"; return s;} +template +inline PICout operator <<(PICout s, const PIPair & v) {s.space(); s.setControl(0, true); s << "(" << v.first << ", " << v.second << ")"; s.restoreControl(); return s;} + +#include "pivector.h" +#include "pistack.h" +#include "piqueue.h" +#include "pideque.h" +#include "pimap.h" +#include "piset.h" + +#ifdef DOXYGEN + +/*!\brief Macro for iterate any container + * \details Use this macros instead of standard "for" + * to get read/write access to each element of container. + * Pass direction is direct \n + * Example: \snippet picontainers.cpp foreach + */ +# define piForeach(i,c) + +/*!\brief Macro for iterate any container only for read + * \details Use this macros instead of standard "for" + * to get read access to each element of container. + * Pass direction is direct \n + * Example: \snippet picontainers.cpp foreachC + */ +# define piForeachC(i,c) + +/*!\brief Macro for iterate any container with reverse direction + * \details Use this macros instead of standard "for" + * to get read/write access to each element of container. + * Pass direction is reverse \n + * Example: \snippet picontainers.cpp foreachR + */ +# define piForeachR(i,c) + +/*!\brief Macro for iterate any container only for read with reverse direction + * \details Use this macros instead of standard "for" + * to get read access to each element of container. + * Pass direction is reverse \n + * Example: \snippet picontainers.cpp foreachCR + */ +# define piForeachCR(i,c) + +/*!\brief Macro for break from any piForeach* loop + * \details \warning C++ ordinary "break" doesn`t work inside piForeach* + * loops! Always use "piBreak" instead! + */ +# define piBreak + +#else + +# define piBreak {_for._end = true; break;} + +# define piForTimes(c) for(int _i##c = 0; _i##c < c; ++_i##c) + +#ifdef CC_GCC + +template +class _PIForeach { +public: + _PIForeach(Type & t): _t(t), _break(false), _end(false) {_it = _t.begin();} + typename Type::value_type _var; + typename Type::iterator _it; + Type & _t; + bool _break, _end; + inline bool isEnd() {return _it == _t.end();} + inline void operator ++() {if (_end) _it = _t.end(); else _it++; _break = false;} +}; + +template +class _PIForeachR { +public: + _PIForeachR(Type & t): _t(t), _break(false), _end(false) {_rit = _t.rbegin();} + typename Type::value_type _var; + typename Type::reverse_iterator _rit; + Type & _t; + bool _break, _end; + inline bool isEnd() {return _rit == _t.rend();} + inline void operator ++() {if (_end) _rit = _t.rend(); else _rit++; _break = false;} +}; + +template +class _PIForeachC { +public: + _PIForeachC(const Type & t): _t(t), _break(false), _end(false) {_it = _t.begin();} + typename Type::value_type _var; + typename Type::const_iterator _it; + const Type & _t; + bool _break, _end; + inline bool isEnd() {return _it == _t.end();} + inline void operator ++() {if (_end) _it = _t.end(); else _it++; _break = false;} +}; + +template +class _PIForeachCR { +public: + _PIForeachCR(const Type & t): _t(t), _break(false), _end(false) {_rit = _t.rbegin();} + typename Type::value_type _var; + typename Type::const_reverse_iterator _rit; + const Type & _t; + bool _break, _end; + inline bool isEnd() {return _rit == _t.rend();} + inline void operator ++() {if (_end) _rit = _t.rend(); else _rit++; _break = false;} +}; + +#define piForeach(i,c) for(_PIForeach _for(c); !_for.isEnd(); ++_for) \ + for(i(*_for._it); !_for._break; _for._break = true) +#define piForeachR(i,c) for(_PIForeachR _for(c); !_for.isEnd(); ++_for) \ + for(i(*_for._rit); !_for._break; _for._break = true) +#define piForeachA(i,c) for(_PIForeach _for(c); !_for.isEnd(); ++_for) \ + for(typeof(_for._var) & i(*_for._it); !_for._break; _for._break = true) +#define piForeachAR(i,c) for(_PIForeachR _for(c); !_for.isEnd(); ++_for) \ + for(typeof(_for._var) & i(*_for._rit); !_for._break; _for._break = true) +#define piForeachC(i,c) for(_PIForeachC _for(c); !_for.isEnd(); ++_for) \ + for(const i(*_for._it); !_for._break; _for._break = true) +#define piForeachCR(i,c) for(_PIForeachCR _for(c); !_for.isEnd(); ++_for) \ + for(const i(*_for._rit); !_for._break; _for._break = true) +#define piForeachCA(i,c) for(_PIForeachC _for(c); !_for.isEnd(); ++_for) \ + for(const typeof(_for._var) & i(*_for._it); !_for._break; _for._break = true) +#define piForeachCAR(i,c) for(_PIForeachCR _for(c); !_for.isEnd(); ++_for) \ + for(const typeof(_for._var) & i(*_for._rit); !_for._break; _for._break = true) + +#define piForeachRA piForeachAR +#define piForeachAC piForeachCA +#define piForeachCRA piForeachCAR +#define piForeachARC piForeachCAR +#define piForeachACR piForeachCAR +#define piForeachRCA piForeachCAR +#define piForeachRAC piForeachCAR + +#else + +struct _PIForeachBase {mutable bool _break, _end;}; + +template +class _PIForeach: public _PIForeachBase { +public: + _PIForeach(Type & t, bool i = false): _break(false), _end(false), _t(t), _inv(i) {if (_inv) _rit = _t.rbegin(); else _it = _t.begin();} + mutable typename Type::value_type _var; + mutable typename Type::iterator _it; + mutable typename Type::reverse_iterator _rit; + Type & _t; + bool _inv; + bool isEnd() {if (_inv) return _rit == _t.rend(); else return _it == _t.end();} + void operator ++() {if (_inv) {if (_end) _rit = _t.rend(); else _rit++;} else {if (_end) _it = _t.end(); else _it++;} _break = false;} +}; + +template +class _PIForeachC: public _PIForeachBase { +public: + _PIForeachC(const Type & t, bool i = false): _break(false), _end(false), _t(t), _inv(i) {if (_inv) _rit = _t.rbegin(); else _it = _t.begin();} + mutable typename Type::value_type _var; + mutable typename Type::const_iterator _it; + mutable typename Type::const_reverse_iterator _rit; + const Type & _t; + bool _inv; + bool isEnd() {if (_inv) return _rit == _t.rend(); else return _it == _t.end();} + void operator ++() {if (_inv) {if (_end) _rit = _t.rend(); else _rit++;} else {if (_end) _it = _t.end(); else _it++;} _break = false;} +}; + +template inline _PIForeach _PIForeachNew(T & t, bool i = false) {return _PIForeach(t, i);} +template inline _PIForeach * _PIForeachCast(_PIForeachBase & c, T & ) {return static_cast<_PIForeach * >(&c);} + +template inline _PIForeachC _PIForeachNewC(const T & t, bool i = false) {return _PIForeachC(t, i);} +template inline _PIForeachC * _PIForeachCastC(_PIForeachBase & c, const T & ) {return static_cast<_PIForeachC * >(&c);} + +#define piForeach(i,c) for(_PIForeachBase & _for = _PIForeachNew(c); !_PIForeachCast(_for, c)->isEnd(); ++(*_PIForeachCast(_for, c))) \ + for(i = *(_PIForeachCast(_for, c)->_it); !_for._break; _for._break = true) +#define piForeachR(i,c) for(_PIForeachBase & _for = _PIForeachNew(c, true); !_PIForeachCast(_for, c)->isEnd(); ++(*_PIForeachCast(_for, c))) \ + for(i = *(_PIForeachCast(_for, c)->_rit); !_for._break; _for._break = true) +#define piForeachC(i,c) for(_PIForeachBase & _for = _PIForeachNewC(c); !_PIForeachCastC(_for, c)->isEnd(); ++(*_PIForeachCastC(_for, c))) \ + for(const i = *(_PIForeachCastC(_for, c)->_it); !_for._break; _for._break = true) +#define piForeachCR(i,c) for(_PIForeachBase & _for = _PIForeachNewC(c, false); !_PIForeachCastC(_for, c)->isEnd(); ++(*_PIForeachCastC(_for, c))) \ + for(const i = *(_PIForeachCastC(_for, c)->_rit); !_for._break; _for._break = true) + +#endif + +#define piForeachRC piForeachCR + +#endif // DOXYGEN + +template > +class PIP_EXPORT PIList: public list { + typedef PIList _CList; + typedef list _stlc; +public: + PIList() {piMonitor.containers++;} + PIList(const Type & value) {piMonitor.containers++; _stlc::resize(1, value);} + PIList(const Type & v0, const Type & v1) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1);} + PIList(const Type & v0, const Type & v1, const Type & v2) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1); _stlc::push_back(v2);} + PIList(const Type & v0, const Type & v1, const Type & v2, const Type & v3) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1); _stlc::push_back(v2); _stlc::push_back(v3);} + PIList(uint size, const Type & value = Type()) {piMonitor.containers++; _stlc::resize(size, value);} + ~PIList() {piMonitor.containers--;} + Type & operator [](uint index) {return (*this)[index];} + Type & operator [](uint index) const {return (*this)[index];} + const Type * data(uint index = 0) const {return &(*this)[index];} + Type * data(uint index = 0) {return &(*this)[index];} + int size_s() const {return static_cast(_stlc::size());} + bool isEmpty() const {return _stlc::empty();} + bool has(const Type & t) const {for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) return true; return false;} + int etries(const Type & t) const {int ec = 0; for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) ++ec; return ec;} + _CList & fill(const Type & t) {_stlc::assign(_stlc::size(), t); return *this;} + _CList & remove(uint index) {_stlc::erase(_stlc::begin() + index); return *this;} + _CList & remove(uint index, uint count) {_stlc::erase(_stlc::begin() + index, _stlc::begin() + index + count); return *this;} + _CList & insert(uint pos, const Type & t) {_stlc::insert(_stlc::begin() + pos, t); return *this;} + _CList & operator <<(const Type & t) {_stlc::push_back(t); return *this;} + PIVector toVector() const {PIVector v; for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) v << *i; return v;} +}; + + +#ifndef PIP_CONTAINERS_STL + +# define __PICONTAINERS_SIMPLE_TYPE__(T) \ +__PIDEQUE_SIMPLE_TYPE__(T)\ +__PIVECTOR_SIMPLE_TYPE__(T) + +__PICONTAINERS_SIMPLE_TYPE__(bool) +__PICONTAINERS_SIMPLE_TYPE__(char) +__PICONTAINERS_SIMPLE_TYPE__(uchar) +__PICONTAINERS_SIMPLE_TYPE__(short) +__PICONTAINERS_SIMPLE_TYPE__(ushort) +__PICONTAINERS_SIMPLE_TYPE__(int) +__PICONTAINERS_SIMPLE_TYPE__(uint) +__PICONTAINERS_SIMPLE_TYPE__(long) +__PICONTAINERS_SIMPLE_TYPE__(ulong) +__PICONTAINERS_SIMPLE_TYPE__(llong) +__PICONTAINERS_SIMPLE_TYPE__(ullong) +__PICONTAINERS_SIMPLE_TYPE__(float) +__PICONTAINERS_SIMPLE_TYPE__(double) +__PICONTAINERS_SIMPLE_TYPE__(ldouble) +__PICONTAINERS_SIMPLE_TYPE__(complexi) +__PICONTAINERS_SIMPLE_TYPE__(complexf) +__PICONTAINERS_SIMPLE_TYPE__(complexd) +__PICONTAINERS_SIMPLE_TYPE__(complexld) + +#endif + + +#endif // PICONTAINERS_H diff --git a/src/containers/pideque.h b/src/containers/pideque.h new file mode 100755 index 00000000..c92e112c --- /dev/null +++ b/src/containers/pideque.h @@ -0,0 +1,480 @@ +/*! \file pideque.h + * \brief Dynamic array of any type + * + * This file declares PIDeque +*/ +/* + PIP - Platform Independent Primitives + Dynamic array of any type + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIDEQUE_H +#define PIDEQUE_H + +#include "piincludes.h" + + +#if !defined(PIP_CONTAINERS_STL) || defined(DOXYGEN) + + +template +class PIDeque { +public: + PIDeque(): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { + //printf("new vector 1 %p (%s) ... !{\n", this, typeid(T).name()); + //printf("(s=%d, d=%p) }!\n", int(pid_size), pid_data); + } + PIDeque(const PIDeque & other): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { + //printf("new vector 2 %p (%s) ... !{\n", this, typeid(T).name()); + alloc(other.pid_size, true); + newT(pid_data + pid_start, other.pid_data + other.pid_start, pid_size); + //printf("(s=%d, d=%p) }!\n", int(pid_size), pid_data); + } + PIDeque(const T * data, size_t size): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { + //printf("new vector 2 %p (%s) ... !{\n", this, typeid(T).name()); + alloc(size, true); + newT(pid_data + pid_start, data, pid_size); + //printf("(s=%d, d=%p) }!\n", int(pid_size), pid_data); + } + PIDeque(size_t pid_size, const T & f = T()): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { + //printf("new vector 3 %p (%s) ... !{\n", this, typeid(T).name()); + resize(pid_size, f); + //printf("(s=%d, d=%p) }!\n", int(pid_size), pid_data); + } + ~PIDeque() { + //printf("delete deque %p (%s) (s=%d, rs=%d, st=%d, d=%p) ... ~{\n", this, typeid(T).name(), int(pid_size), int(pid_rsize), int(pid_start), pid_data); + deleteT(pid_data + pid_start, pid_size); + dealloc(); + //deleteRaw(pid_tdata); + _reset(); + //printf("}~\n"); + } + + PIDeque & operator =(const PIDeque & other) { + if (this == &other) return *this; + deleteT(pid_data + pid_start, pid_size); + alloc(other.pid_size, true); + newT(pid_data + pid_start, other.pid_data + other.pid_start, pid_size); + return *this; + } + + typedef T value_type; + + class iterator { + friend class PIDeque; + private: + iterator(PIDeque * v, size_t p): parent(v), pos(p) {} + PIDeque * parent; + size_t pos; + public: + iterator(): parent(0) {} + T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const iterator & it) const {return (pos == it.pos);} + bool operator !=(const iterator & it) const {return (pos != it.pos);} + }; + + class const_iterator { + friend class PIDeque; + private: + const_iterator(const PIDeque * v, size_t p): parent(v), pos(p) {} + const PIDeque * parent; + size_t pos; + public: + const_iterator(): parent(0) {} + //T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const const_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_iterator & it) const {return (pos != it.pos);} + }; + + class reverse_iterator { + friend class PIDeque; + private: + reverse_iterator(PIDeque * v, size_t p): parent(v), pos(p) {} + PIDeque * parent; + size_t pos; + public: + reverse_iterator(): parent(0) {} + T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} + }; + + class const_reverse_iterator { + friend class PIDeque; + private: + const_reverse_iterator(const PIDeque * v, size_t p): parent(v), pos(p) {} + const PIDeque * parent; + size_t pos; + public: + const_reverse_iterator(): parent(0) {} + //T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} + }; + + iterator begin() {return iterator(this, 0);} + iterator end() {return iterator(this, pid_size);} + const_iterator begin() const {return const_iterator(this, 0);} + const_iterator end() const {return const_iterator(this, pid_size);} + reverse_iterator rbegin() {return reverse_iterator(this, pid_size - 1);} + reverse_iterator rend() {return reverse_iterator(this, -1);} + const_reverse_iterator rbegin() const {return const_reverse_iterator(this, pid_size - 1);} + const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} + + size_t size() const {return pid_size;} + ssize_t size_s() const {return pid_size;} + size_t length() const {return pid_size;} + size_t capacity() const {return pid_rsize;} + bool isEmpty() const {return (pid_size == 0);} + + T & operator [](size_t index) {return pid_data[pid_start + index];} + T & at(size_t index) {return pid_data[pid_start + index];} + const T & operator [](size_t index) const {return pid_data[pid_start + index];} + const T & at(size_t index) const {return pid_data[pid_start + index];} + T & back() {return pid_data[pid_start + pid_size - 1];} + const T & back() const {return pid_data[pid_start + pid_size - 1];} + T & front() {return pid_data[pid_start];} + const T & front() const {return pid_data[pid_start];} + bool operator ==(const PIDeque & t) const {if (pid_size != t.pid_size) return false; for (size_t i = 0; i < pid_size; ++i) if (t[i] != (*this)[i]) return false; return true;} + bool operator !=(const PIDeque & t) const {if (pid_size != t.pid_size) return true; for (size_t i = 0; i < pid_size; ++i) if (t[i] != (*this)[i]) return true; return false;} + bool contains(const T & v) const {for (size_t i = pid_start; i < pid_start + pid_size; ++i) if (v == pid_data[i]) return true; return false;} + int etries(const T & v) const {int ec = 0; for (size_t i = pid_start; i < pid_start + pid_size; ++i) if (v == pid_data[i]) ++ec; return ec;} + + T * data(size_t index = 0) {return &(pid_data[pid_start + index]);} + const T * data(size_t index = 0) const {return &(pid_data[pid_start + index]);} + PIDeque & clear() {resize(0); return *this;} + PIDeque & fill(const T & f = T()) { + //if (sizeof(T) == 1) memset(pid_data, f, pid_size); + deleteT(pid_data + pid_start, pid_size); + //zeroRaw(pid_data, pid_size); + for (size_t i = pid_start; i < pid_start + pid_size; ++i) + elementNew(pid_data + i, f); + return *this; + } + PIDeque & assign(const T & f = T()) {return fill(f);} + PIDeque & assign(size_t new_size, const T & f) {resize(new_size); return fill(f);} + PIDeque & resize(size_t new_size, const T & f = T()) { + if (new_size < pid_size) { + deleteT(&(pid_data[new_size + pid_start]), pid_size - new_size); + pid_size = new_size; + } + if (new_size > pid_size) { + size_t os = pid_size; + alloc(new_size, true); + //if (sizeof(T) == 1) memset(&(pid_data[os]), f, ds); + //zeroRaw(&(pid_data[os]), new_size - os); + for (size_t i = os + pid_start; i < new_size + pid_start; ++i) elementNew(pid_data + i, f); + } + return *this; + } + PIDeque & reserve(size_t new_size) {if (new_size <= pid_rsize) return *this; size_t os = pid_size; alloc(new_size, true); pid_size = os; return *this;} + + PIDeque & insert(size_t index, const T & v = T()) { + bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false); + //piCout << "insert" << dir << index << pid_size << pid_rsize << pid_start << "!<"; + if (dir) { + alloc(pid_size + 1, true); + if (index < pid_size - 1) { + size_t os = pid_size - index - 1; + memmove(&(pid_data[index + pid_start + 1]), &(pid_data[index + pid_start]), os * sizeof(T)); + } + } else { + pid_start--; + alloc(pid_size + 1, false); + //piCout << "insert front" << pid_size << pid_rsize << pid_start << "!<"; + if (index > 0) + memmove(&(pid_data[pid_start]), &(pid_data[pid_start + 1]), index * sizeof(T)); + } + //piCout << "insert" << pid_start << index << (pid_start + ssize_t(index)) << pid_size << ">!"; + elementNew(pid_data + pid_start + index, v); + return *this; + } + PIDeque & insert(size_t index, const PIDeque & other) { + if (other.isEmpty()) return *this; + bool dir = pid_rsize <= 2 ? true : (index >= pid_rsize / 2 ? true : false); + //piCout << "insert" << dir << index << pid_size << pid_rsize << pid_start << "!<"; + if (dir) { + ssize_t os = pid_size - index; + alloc(pid_size + other.pid_size, true); + if (os > 0) + memmove(&(pid_data[index + pid_start + other.pid_size]), &(pid_data[index + pid_start]), os * sizeof(T)); + } else { + pid_start -= other.pid_size; + alloc(pid_size + other.pid_size, false); + //piCout << "insert front" << pid_size << pid_rsize << pid_start << "!<"; + if (index > 0) + memmove(&(pid_data[pid_start]), &(pid_data[pid_start + other.pid_size]), index * sizeof(T)); + } + //piCout << "insert" << pid_start << index << (pid_start + ssize_t(index)) << pid_size << ">!"; + newT(pid_data + pid_start + index, other.pid_data + other.pid_start, other.pid_size); + return *this; + } + + PIDeque & remove(size_t index, size_t count = 1) { + if (count == 0) return *this; + if (index + count >= pid_size) { + resize(index); + return *this; + } + size_t os = pid_size - index - count; + deleteT(&(pid_data[index + pid_start]), count); + if (os <= index) { + //if (true) { + if (os > 0) memmove(&(pid_data[index + pid_start]), &(pid_data[index + pid_start + count]), os * sizeof(T)); + } else { + if (index > 0) memmove(&(pid_data[pid_start + count]), &(pid_data[pid_start]), index * sizeof(T)); + pid_start += count; + } + pid_size -= count; + return *this; + } + + void swap(PIDeque & other) { + piSwap(pid_data, other.pid_data); + piSwap(pid_size, other.pid_size); + piSwap(pid_rsize, other.pid_rsize); + piSwap(pid_start, other.pid_start); + } + + typedef int (*CompareFunc)(const T * , const T * ); + static int compare_func(const T * t0, const T * t1) {return (*t0) < (*t1) ? -1 : ((*t0) == (*t1) ? 0 : 1);} + PIDeque & sort(CompareFunc compare = compare_func) {qsort(pid_data + pid_start, pid_size, sizeof(T), (int(*)(const void * , const void * ))compare); return *this;} + + PIDeque & enlarge(llong pid_size) {llong ns = size_s() + pid_size; if (ns <= 0) clear(); else resize(size_t(ns)); return *this;} + + PIDeque & removeOne(const T & v) {for (size_t i = 0; i < pid_size; ++i) if (pid_data[i + pid_start] == v) {remove(i); return *this;} return *this;} + PIDeque & removeAll(const T & v) {for (llong i = 0; i < pid_size; ++i) if (pid_data[i + pid_start] == v) {remove(i); --i;} return *this;} + + PIDeque & push_back(const T & v) {alloc(pid_size + 1, true); elementNew(pid_data + pid_start + pid_size - 1, v); return *this;} + PIDeque & append(const T & v) {return push_back(v);} + PIDeque & operator <<(const T & v) {return push_back(v);} + PIDeque & operator <<(const PIDeque & t) { + size_t ps = pid_size; + alloc(pid_size + t.pid_size, true); + newT(pid_data + ps + pid_start, t.pid_data + t.pid_start, t.pid_size); + return *this; + } + + PIDeque & push_front(const T & v) {insert(0, v); return *this;} + PIDeque & prepend(const T & v) {return push_front(v);} + + PIDeque & pop_back() {if (pid_size == 0) return *this; resize(pid_size - 1); return *this;} + PIDeque & pop_front() {if (pid_size == 0) return *this; remove(0); return *this;} + + T take_back() {T t(back()); pop_back(); return t;} + T take_front() {T t(front()); pop_front(); return t;} + + template + PIDeque toType() const {PIDeque ret(pid_size); for (uint i = 0; i < pid_size; ++i) ret[i] = ST(pid_data[i + pid_start]); return ret;} + +private: + void _reset() {pid_size = pid_rsize = pid_start = 0; pid_data = 0;} + /*void * qmemmove(void * dst, void * src, size_t size) { + if (piAbs(ssize_t(dst) - ssize_t(src)) >= size) + memcpy(dst, src, size); + else { + char * tb = new char[size]; + memcpy(tb, src, size); + memcpy(dst, tb, size); + delete tb; + } + return dst; + }*/ + inline size_t asize(ssize_t s) { + if (s <= 0) return 0; + if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) + return pid_rsize + pid_rsize; + size_t t = 0, s_ = size_t(s) - 1; + while (s_ >> t) ++t; + return (1 << t); + } + inline void newT(T * dst, const T * src, size_t s) { + for (size_t i = 0; i < s; ++i) + elementNew(dst + i, src[i]); + } + inline T * newRaw(size_t s) { + //cout << std::dec << " ![("< (new 0x" << (llong)ret << ") ok]!" << endl; + return (T*)ret; + } + /*void reallocRawTemp(size_t s) { + if (pid_tdata == 0) pid_tdata = (T*)(malloc(s * sizeof(T))); + else pid_tdata = (T*)(realloc(pid_tdata, s * sizeof(T))); + }*/ + inline void deleteT(T * d, size_t sz) { + //cout << " ~[("< ok]~" << endl; + } + inline void deleteRaw(T *& d) { + //cout << " ~[("< ok]~" << endl; + } + void zeroRaw(T * d, size_t s) { + //cout << " ~[("< ok]~" << endl; + } + inline void elementNew(T * to, const T & from) {new(to)T(from);} + inline void elementDelete(T & from) {from.~T();} + void dealloc() {deleteRaw(pid_data);} + inline void checkMove(bool direction) { + if (pid_size >= 4 && pid_size < pid_rsize / 4) { + /*if (direction) { + if (pid_start >= 4 && pid_start > pid_size + pid_size && pid_start > pid_rsize / 2) { + piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; + piCout << (int)this << "move from" << pid_start << "to" << pid_size << "," << (int)pid_data << pid_rsize << pid_size; + memmove(pid_data + pid_size, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = pid_size; + } + } else { + if (ssize_t(pid_start) < ssize_t(pid_rsize) - pid_size - pid_size && ssize_t(pid_start) < ssize_t(pid_rsize / 2) - pid_size) { + piCout << (int)this << "checkMove" << direction << pid_start << (int)pid_data << pid_rsize << pid_size; + piCout << (int)this << "move from" << pid_start << "to" << (ssize_t(pid_rsize) - pid_size) << "," << (int)pid_data << pid_rsize << pid_size; + memmove(pid_data + ssize_t(pid_rsize) - pid_size - pid_size, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = ssize_t(pid_rsize) - pid_size - pid_size; + } + }*/ + if (pid_start < pid_size + pid_size || pid_start > pid_rsize - pid_size - pid_size) { + size_t ns = (pid_rsize - pid_size) / 2; + if (pid_start != ns) { + memmove(pid_data + ns, pid_data + pid_start, pid_size * sizeof(T)); + pid_start = ns; + } + } + } + } + inline void alloc(size_t new_size, bool direction) { // direction == true -> alloc forward + if (direction) { + if (pid_start + new_size <= pid_rsize) { + pid_size = new_size; + checkMove(direction); + return; + } + pid_size = new_size; + size_t as = asize(pid_start + new_size); + if (as != pid_rsize) { + pid_data = (T*)(realloc(pid_data, as*sizeof(T))); + pid_rsize = as; + } + } else { + size_t as = asize(piMax(new_size, pid_rsize) - pid_start); + //piCout << "alloc" << new_size << pid_size << pid_rsize << as << pid_start; + if (pid_start >= 0 && as <= pid_rsize) { + pid_size = new_size; + checkMove(direction); + return; + } + size_t os = pid_size; + pid_size = new_size; + if (as > pid_rsize) { + //piCout << "alloc new size" << as; + //cout << std::hex << " ![("< 0 && pid_data != 0) { + memcpy(td + pid_start + ns, pid_data + ost, os * sizeof(T)); + deleteRaw(pid_data); + } + pid_data = td; + pid_rsize = as; + } + } + //checkMove(direction); + //piCout << "alloc new start" << pid_start; + } + + T * pid_data; + volatile size_t pid_size, pid_rsize; + volatile size_t pid_start; +}; + +#define __PIDEQUE_SIMPLE_TYPE__(T) \ + template<> inline void PIDeque::newT(T * dst, const T * src, size_t s) {memcpy(dst, src, s * sizeof(T));} \ + template<> inline void PIDeque::deleteT(T * d, size_t sz) {;} \ + template<> inline void PIDeque::elementNew(T * to, const T & from) {(*to) = from;} \ + template<> inline void PIDeque::elementDelete(T & from) {;} + +#else + + +template > +class PIP_EXPORT PIDeque: public deque { + typedef PIDeque _CDeque; + typedef deque _stlc; +public: + PIDeque() {piMonitor.containers++;} + PIDeque(const Type & value) {piMonitor.containers++; _stlc::resize(1, value);} + PIDeque(const Type & v0, const Type & v1) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1);} + PIDeque(const Type & v0, const Type & v1, const Type & v2) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1); _stlc::push_back(v2);} + PIDeque(const Type & v0, const Type & v1, const Type & v2, const Type & v3) {piMonitor.containers++; _stlc::push_back(v0); _stlc::push_back(v1); _stlc::push_back(v2); _stlc::push_back(v3);} + ~PIDeque() {piMonitor.containers--;} + int size_s() const {return static_cast(_stlc::size());} + bool isEmpty() const {return _stlc::empty();} + bool has(const Type & t) const {for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) return true; return false;} + int etries(const Type & t) const {int ec = 0; for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) ++ec; return ec;} + _CDeque & operator <<(const Type & t) {_CDeque::push_back(t); return *this;} + PIDeque toVector() {PIDeque v; for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) v << *i; return v;} +}; + + +#define __PIDEQUE_SIMPLE_FUNCTIONS__(T) + + +#endif + + +template +inline std::ostream & operator <<(std::ostream & s, const PIDeque & v) {s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; return s;} + +template +inline PICout operator <<(PICout s, const PIDeque & v) {s.space(); s.setControl(0, true); s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} + + +#endif // PIDEQUE_H diff --git a/src/containers/pimap.h b/src/containers/pimap.h new file mode 100644 index 00000000..c3c0a739 --- /dev/null +++ b/src/containers/pimap.h @@ -0,0 +1,453 @@ +/*! \file pimap.h + * \brief Associative array with custom types of key and value + * + * This file declares PIMap +*/ +/* + PIP - Platform Independent Primitives + Dynamic array of any type + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMAP_H +#define PIMAP_H + +#include "pivector.h" +#include "pideque.h" + + +#if !defined(PIP_CONTAINERS_STL) || defined(DOXYGEN) + +template +void piQuickSort(T * a, ssize_t N) { + if (N < 1) return; + ssize_t i = 0, j = N; + T & p(a[N >> 1]); + do { + while (a[i] < p) i++; + while (a[j] > p) j--; + if (i <= j) { + if (i != j) { + //piCout << "swap" << i << j << a[i] << a[j]; + piSwapBinary(a[i], a[j]); + } + i++; j--; + } + } while (i <= j); + if (j > 0) piQuickSort(a, j); + if (N > i) piQuickSort(a + i, N - i); +} + +template +class PIMap { +public: + PIMap() {;} + PIMap(const PIMap & other) {*this = other;} + ~PIMap() {;} + + PIMap & operator =(const PIMap & other) { + if (this == &other) return *this; + clear(); + pim_content = other.pim_content; + pim_index = other.pim_index; + return *this; + } + + typedef T mapped_type; + typedef Key key_type; + typedef PIPair value_type; + + class iterator { + friend class PIMap; + private: + iterator(const PIMap * v, ssize_t p): parent(v), pos(p) {} + const PIMap * parent; + ssize_t pos; + public: + iterator(): parent(0) {} + const Key & key() const {return const_cast * >(parent)->_key(pos);} + T & value() const {return const_cast * >(parent)->_value(pos);} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const iterator & it) const {return (pos == it.pos);} + bool operator !=(const iterator & it) const {return (pos != it.pos);} + }; + + class reverse_iterator { + friend class PIMap; + private: + reverse_iterator(const PIMap * v, ssize_t p): parent(v), pos(p) {} + const PIMap * parent; + ssize_t pos; + public: + reverse_iterator(): parent(0) {} + const Key & key() const {return const_cast * >(parent)->_key(pos);} + T & value() const {return const_cast * >(parent)->_value(pos);} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} + }; + + class const_iterator { + friend class PIMap; + private: + const_iterator(const PIMap * v, ssize_t p): parent(v), pos(p) {} + const PIMap * parent; + ssize_t pos; + public: + const_iterator(): parent(0) {} + const PIMap::value_type operator *() const {return parent->_pair(pos);} + const PIMap::value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const const_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_iterator & it) const {return (pos != it.pos);} + mutable value_type cval; + }; + + class const_reverse_iterator { + friend class PIMap; + private: + const_reverse_iterator(const PIMap * v, ssize_t p): parent(v), pos(p) {} + const PIMap * parent; + ssize_t pos; + public: + const_reverse_iterator(): parent(0) {} + const PIMap::value_type operator *() const {return parent->_pair(pos);} + const PIMap::value_type* operator ->() const {cval = parent->_pair(pos); return &cval;} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} + mutable value_type cval; + }; + + iterator begin() {return iterator(this, 0);} + iterator end() {return iterator(this, size());} + const_iterator begin() const {return const_iterator(this, 0);} + const_iterator end() const {return const_iterator(this, size());} + reverse_iterator rbegin() {return reverse_iterator(this, size() - 1);} + reverse_iterator rend() {return reverse_iterator(this, -1);} + const_reverse_iterator rbegin() const {return const_reverse_iterator(this, size() - 1);} + const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} + + size_t size() const {return pim_content.size();} + int size_s() const {return pim_content.size_s();} + size_t length() const {return pim_content.size();} + bool isEmpty() const {return (pim_content.size() == 0);} + + T & operator [](const Key & key) { + bool f(false); + ssize_t i = _find(key, f); + if (f) return pim_content[pim_index[i].index]; + pim_content.push_back(T()); + pim_index.insert(i, MapIndex(key, pim_content.size() - 1)); + return pim_content.back(); + } + const T operator [](const Key & key) const {bool f(false); ssize_t i = _find(key, f); if (f) return pim_content[pim_index[i].index]; return T();} + T & at(const Key & key) {return (*this)[key];} + const T at(const Key & key) const {return (*this)[key];} + + PIMap & operator <<(const PIMap & other) { + if (other.isEmpty()) return *this; + if (other.size() == 1) {insert(other.pim_index[0].key, other.pim_content[0]); return *this;} + if (other.size() == 2) {insert(other.pim_index[0].key, other.pim_content[0]); insert(other.pim_index[1].key, other.pim_content[1]); return *this;} + pim_content << other.pim_content; + size_t si = pim_index.size(); + for (int i = 0; i < other.pim_index.size_s(); ++i) + pim_index << MapIndex(other.pim_index[i].key, other.pim_index[i].index + si); + _sort(); + return *this; + } + + bool operator ==(const PIMap & t) const {return (pim_content == t.pim_content && pim_index == t.pim_index);} + bool operator !=(const PIMap & t) const {return (pim_content != t.pim_content || pim_index != t.pim_index);} + bool contains(const Key & key) const {bool f(false); _find(key, f); return f;} + //int etries(const T & v) const {int ec = 0; for (size_t i = 0; i < pim_size; ++i) if (v == pim_data[i]) ++ec; return ec;} + + PIMap & reserve(size_t new_size) {pim_content.reserve(new_size); pim_index.reserve(new_size); return *this;} + + //PIMap & removeAll(const T & v) {for (llong i = 0; i < pim_size; ++i) if (pim_data[i] == v) {remove(i); --i;} return *this;} + PIMap & removeOne(const Key & key) {bool f(false); ssize_t i = _find(key, f); if (f) _remove(i); return *this;} + PIMap & remove(const Key & key) {return removeOne(key);} + PIMap & erase(const Key & key) {return removeOne(key);} + PIMap & clear() {pim_content.clear(); pim_index.clear(); return *this;} + + void swap(PIMap & other) { + piSwapBinary >(pim_content, other.pim_content); + piSwapBinary >(pim_index, other.pim_index); + } + + PIMap & insert(const Key & key, const T & value) { + //MapIndex * i = _find(key); + bool f(false); + ssize_t i = _find(key, f); + //piCout << "insert key=" << key << "found=" << f << "index=" << i << "value=" << value; + if (f) { + pim_content[pim_index[i].index] = value; + } else { + pim_content.push_back(value); + pim_index.insert(i, MapIndex(key, pim_content.size() - 1)); + //_sort(); + } + return *this; + } + //const T value(const Key & key, const T & default_ = T()) const {MapIndex * i = _find(key); if (i == 0) return default_; return pim_content[i->index];} + const T value(const Key & key, const T & default_ = T()) const {bool f(false); ssize_t i = _find(key, f); if (!f) return default_; return pim_content[pim_index[i].index];} + PIVector values() const {return pim_content;} + Key key(const T & value_, const Key & default_ = Key()) const {for (int i = 0; i < pim_index.size_s(); ++i) if (pim_content[pim_index[i].index] == value_) return pim_index[i].key; return default_;} + PIVector keys() const { + PIVector ret; + for (int i = 0; i < pim_index.size_s(); ++i) + ret << pim_index[i].key; + return ret; + } + + void dump() { + piCout << "PIMap" << size() << "entries" << NewLine << "content:"; + for (size_t i = 0; i < pim_content.size(); ++i) + piCout << Tab << i << ":" << pim_content[i]; + piCout << "index:"; + for (size_t i = 0; i < pim_index.size(); ++i) + piCout << Tab << i << ":" << pim_index[i].key << "->" << pim_index[i].index; + } + +protected: + struct MapIndex { + MapIndex(Key k = Key(), size_t i = 0): key(k), index(i) {;} + Key key; + size_t index; + bool operator ==(const MapIndex & s) const {return key == s.key;} + bool operator !=(const MapIndex & s) const {return key != s.key;} + bool operator <(const MapIndex & s) const {return key < s.key;} + bool operator >(const MapIndex & s) const {return key > s.key;} + }; + + ssize_t binarySearch(ssize_t first, ssize_t last, const Key & key, bool & found) const { + ssize_t mid; + while (first <= last) { + mid = (first + last) / 2; + if (key > pim_index[mid].key) first = mid + 1; + else if (key < pim_index[mid].key) last = mid - 1; + else {found = true; return mid;} + } + found = false; + return first; + } + void _sort() {piQuickSort(pim_index.data(), pim_index.size_s() - 1);} + ssize_t _find(const Key & k, bool & found) const { + /*for (size_t i = 0; i < pim_index.size(); ++i) + if (pim_index[i].key == k) { + return (MapIndex * )&(pim_index[i]); + } + return 0;*/ + //piCout << "find for" << k << pim_index.size_s(); + if (pim_index.isEmpty()) { + found = false; + return 0; + } + //piCout << k << ret << found; + return binarySearch(0, pim_index.size_s() - 1, k, found); + } + void _remove(ssize_t index) { + //if (index >= pim_index.size()) return; + size_t ci = pim_index[index].index, bi = pim_index.size() - 1; + pim_index.remove(index); + for (size_t i = 0; i < pim_index.size(); ++i) + if (pim_index[i].index == bi) { + pim_index[i].index = ci; + break; + } + piSwapBinary(pim_content[ci], pim_content.back()); + pim_content.resize(pim_index.size()); + } + const value_type _pair(ssize_t index) const { + if (index < 0 || index >= pim_index.size_s()) + return value_type(); + //piCout << "_pair" << index << pim_index[index].index; + return value_type(pim_index[index].key, pim_content[pim_index[index].index]); + } + Key & _key(ssize_t index) {return pim_index[index].key;} + T & _value(ssize_t index) {return pim_content[pim_index[index].index];} + + PIVector pim_content; + PIDeque pim_index; +}; +//template bool operator <(const typename PIMap::MapIndex & f, const typename PIMap::MapIndex & s) {return f.key < s.key;} +//template bool operator >(const typename PIMap::MapIndex & f, const typename PIMap::MapIndex & s) {return f.key > s.key;} + + +/*#define __PIMAP_SIMPLE_FUNCTIONS__(T) + template<> inline PIMap::~PIMap() {dealloc(); _reset();} \ + template<> inline PIMap & PIMap::push_back(const T & v) {alloc(pim_size + 1); pim_data[pim_size - 1] = v; return *this;} \ + template<> inline PIMap & PIMap::fill(const T & f) { \ + for (size_t i = 0; i < pim_size; ++i) \ + pim_data[i] = f; \ + return *this; \ + } \ + template<> inline PIMap & PIMap::resize(size_t new_size, const T & f) { \ + if (new_size < pim_size) \ + pim_size = new_size; \ + if (new_size > pim_size) { \ + size_t os = pim_size; \ + alloc(new_size); \ + for (size_t i = os; i < new_size; ++i) pim_data[i] = f; \ + } \ + return *this; \ + } \ + template<> inline PIMap & PIMap::insert(size_t index, const T & v) { \ + alloc(pim_size + 1); \ + if (index < pim_size - 1) { \ + size_t os = pim_size - index - 1; \ + memmove(&(pim_data[index + 1]), &(pim_data[index]), os * sizeof(T)); \ + } \ + pim_data[index] = v; \ + return *this; \ + } \ + template<> inline PIMap & PIMap::remove(size_t index, size_t count) { \ + if (index + count >= pim_size) { \ + resize(index); \ + return *this; \ + } \ + size_t os = pim_size - index - count; \ + memmove(&(pim_data[index]), &(pim_data[index + count]), os * sizeof(T)); \ + pim_size -= count; \ + return *this; \ + } + +__PIMAP_SIMPLE_FUNCTIONS__(char) +__PIMAP_SIMPLE_FUNCTIONS__(uchar) +__PIMAP_SIMPLE_FUNCTIONS__(short) +__PIMAP_SIMPLE_FUNCTIONS__(ushort) +__PIMAP_SIMPLE_FUNCTIONS__(int) +__PIMAP_SIMPLE_FUNCTIONS__(uint) +__PIMAP_SIMPLE_FUNCTIONS__(long) +__PIMAP_SIMPLE_FUNCTIONS__(ulong) +__PIMAP_SIMPLE_FUNCTIONS__(llong) +__PIMAP_SIMPLE_FUNCTIONS__(ullong) +__PIMAP_SIMPLE_FUNCTIONS__(float) +__PIMAP_SIMPLE_FUNCTIONS__(double) +__PIMAP_SIMPLE_FUNCTIONS__(ldouble)*/ + +#else + + +template +class PIP_EXPORT PIMap: public map { + typedef PIMap _CMap; + typedef map _stlc; + typedef std::pair _stlpair; +public: + PIMap() {;} + PIMap(const Key & key_, const Type & value_) {insert(key_, value_);} + bool isEmpty() const {return _stlc::empty();} + bool contains(const Key & key_) const {return _stlc::count(key_) > 0;} + int size_s() const {return static_cast(_stlc::size());} + _CMap & insert(const Key & key_, const Type & value_) {_stlc::insert(_stlpair(key_, value_)); return *this;} + _CMap & insert(PIPair entry_) {_stlc::insert(_stlpair(entry_.first, entry_.second)); return *this;} + Key key(Type value_, const Key & default_ = Key()) const {for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); i++) if (i->second == value_) return i->first; return default_;} + PIVector keys() const { + PIVector ret; + for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); i++) + ret << i->first; + return ret; + } + Type & at(const Key & key_) {return _stlc::find(key_)->second;} + Type value(const Key & key_) const {typename _stlc::const_iterator it = _stlc::find(key_); if (it != _stlc::end()) return it->second; return Type();} +}; + + +template +class PIP_EXPORT PIMultiMap: public multimap { + typedef PIMultiMap _CMultiMap; + typedef multimap _stlc; + typedef std::pair _stlpair; +public: + PIMultiMap() {;} + PIMultiMap(const Key & key_, const Type & value_) {insert(key_, value_);} + _CMultiMap & insert(const Key & key_, const Type & value_) {_stlc::insert(_stlpair(key_, value_)); return *this;} + _CMultiMap & insert(PIPair entry_) {_stlc::insert(_stlpair(entry_.first, entry_.second)); return *this;} + bool isEmpty() const {return _stlc::empty();} + bool contains(const Key & key_) const {return _stlc::count(key_) > 0;} + Key key(Type value_, const Key & default_ = Key()) const {for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); i++) if (i->second == value_) return i->first; return default_;} + PIVector keys(Type value_) const { + PIVector ret; + for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); i++) + if (i->second == value_) + ret << i->first; + return ret; + } + Type & value(const Key & key_) {typename _stlc::iterator i = _stlc::find(key_); if (i == _stlc::end()) return Type(); return i->second;} + Type value(const Key & key_) const {typename _stlc::const_iterator i = _stlc::find(key_); if (i == _stlc::end()) return Type(); return i->second;} + PIVector values(const Key & key_) const { + std::pair range = _stlc::equal_range(key_); + PIVector ret; + for (typename _stlc::const_iterator i = range.first; i != range.second; ++i) + ret << i->second; + return ret; + } + Type & operator [](const Key & key_) {if (!contains(key_)) return _stlc::insert(_stlpair(key_, Type()))->second; return _stlc::find(key_)->second;} + Type operator [](const Key & key_) const {return _stlc::find(key_)->second;} +}; + +#define __PIMAP_SIMPLE_FUNCTIONS__(T) + + +#endif + + +template +inline std::ostream & operator <<(std::ostream & s, const PIMap & v) { + s << "{"; + bool first = true; + for (typename PIMap::const_iterator i = v.begin(); i != v.end(); i++) { + if (!first) + s << ", "; + first = false; + s << i->first << ": " << i->second; + } + s << "}"; + return s; +} + +template +inline PICout operator <<(PICout s, const PIMap & v) { + s.space(); + s.setControl(0, true); + s << "{"; + bool first = true; + for (typename PIMap::const_iterator i = v.begin(); i != v.end(); i++) { + if (!first) + s << ", "; + first = false; + s << i->first << ": " << i->second; + } + s << "}"; + s.restoreControl(); + return s; +} + + +#endif // PIMAP_H diff --git a/src/containers/piqueue.h b/src/containers/piqueue.h new file mode 100755 index 00000000..23f808ea --- /dev/null +++ b/src/containers/piqueue.h @@ -0,0 +1,41 @@ +/*! \file picontainers.h + * \brief Queue container + * + * This file declare PIQueue +*/ +/* + PIP - Platform Independent Primitives + Queue container + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIQUEUE_H +#define PIQUEUE_H + +#include "pivector.h" + +template +class PIP_EXPORT PIQueue: public PIVector { +public: + PIQueue() {;} + PIVector & enqueue(const T & v) {PIVector::push_front(v); return *this;} + T dequeue() {return PIVector::take_back();} + T & head() {return PIVector::back();} + const T & head() const {return PIVector::back();} + PIVector toVector() {PIVector v(PIVector::size()); for (uint i = 0; i < PIVector::size(); ++i) v[i] = PIVector::at(i); return v;} +}; + +#endif // PIQUEUE_H diff --git a/src/containers/piset.h b/src/containers/piset.h new file mode 100644 index 00000000..80e4231b --- /dev/null +++ b/src/containers/piset.h @@ -0,0 +1,72 @@ +/*! \file piset.h + * \brief Set container + * + * This file declare PISet +*/ +/* + PIP - Platform Independent Primitives + Set container + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISET_H +#define PISET_H + +#include "pimap.h" + +/*! \brief Set of any type + * \details This class used to store collection of unique elements + * of any type. You can only add values to set with \a operator<< or + * with function \a insert(). You can discover if value already in + * set with \a operator[] or with function \a find(). These function + * has logarithmic complexity. + */ +template +class PIP_EXPORT PISet: public PIMap { + typedef PIMap _CSet; +public: + + //! Contructs an empty set + PISet() {} + + //! Contructs set with one element "value" + PISet(const T & value) {_CSet::insert(value, 0);} + + //! Contructs set with elements "v0" and "v1" + PISet(const T & v0, const T & v1) {_CSet::insert(v0, 0); _CSet::insert(v1, 0);} + + //! Contructs set with elements "v0", "v1" and "v2" + PISet(const T & v0, const T & v1, const T & v2) {_CSet::insert(v0, 0); _CSet::insert(v1, 0); _CSet::insert(v2, 0);} + + //! Contructs set with elements "v0", "v1", "v2" and "v3" + PISet(const T & v0, const T & v1, const T & v2, const T & v3) {_CSet::insert(v0, 0); _CSet::insert(v1, 0); _CSet::insert(v2, 0); _CSet::insert(v3, 0);} + + typedef T key_type; + + PISet & operator <<(const T & t) {_CSet::insert(t, 0); return *this;} + PISet & operator <<(const PISet & other) {(*(_CSet*)this) << *((_CSet*)&other); return *this;} + + //! Returns if element "t" exists in this set + bool operator [](const T & t) const {return _CSet::contains(t);} + + //! Returns if element "t" exists in this set + PISet & remove(const T & t) {_CSet::remove(t); return *this;} + + //! Returns content of set as PIVector + PIVector toVector() const {PIVector ret; for (typename _CSet::const_iterator i = _CSet::begin(); i != _CSet::end(); ++i) ret << (*i).first; return ret;} +}; + +#endif // PISET_H diff --git a/src/containers/pistack.h b/src/containers/pistack.h new file mode 100755 index 00000000..154ac377 --- /dev/null +++ b/src/containers/pistack.h @@ -0,0 +1,41 @@ +/*! \file pistack.h + * \brief Stack container + * + * This file declare PIStack +*/ +/* + PIP - Platform Independent Primitives + Stack container + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISTACK_H +#define PISTACK_H + +#include "pivector.h" + +template +class PIP_EXPORT PIStack: public PIVector { +public: + PIStack() {;} + PIVector & push(const T & v) {PIVector::push_back(v); return *this;} + T pop() {return PIVector::take_back();} + T & top() {return PIVector::back();} + const T & top() const {return PIVector::back();} + PIVector toVector() {PIVector v(PIVector::size()); for (uint i = 0; i < PIVector::size(); ++i) v[i] = PIVector::at(i); return v;} +}; + +#endif // PISTACK_H diff --git a/src/containers/pivector.h b/src/containers/pivector.h new file mode 100755 index 00000000..b1fc7c2c --- /dev/null +++ b/src/containers/pivector.h @@ -0,0 +1,530 @@ +/*! \file pivector.h + * \brief Dynamic array of any type + * + * This file declares PIVector +*/ +/* + PIP - Platform Independent Primitives + Dynamic array of any type + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIVECTOR_H +#define PIVECTOR_H + +#include "piincludes.h" + + +#if !defined(PIP_CONTAINERS_STL) || defined(DOXYGEN) + + +template +class PIVector { +public: + PIVector(): piv_data(0), piv_size(0), piv_rsize(0) { + //printf("new vector 1 %p (%s) ... !{\n", this, typeid(T).name()); + //printf("(s=%d, d=%p) }!\n", int(piv_size), piv_data); + } + PIVector(const T * data, size_t size): piv_data(0), piv_size(0), piv_rsize(0) { + //printf("new vector 2 %p (%s) ... !{\n", this, typeid(T).name()); + alloc(size); + newT(piv_data, data, piv_size); + //printf("(s=%d, d=%p) }!\n", int(pid_size), pid_data); + } + PIVector(const PIVector & other): piv_data(0), piv_size(0), piv_rsize(0) { + //printf("new vector 2 %p (%s) ... !{\n", this, typeid(T).name()); + alloc(other.piv_size); + newT(piv_data, other.piv_data, piv_size); + //printf("(s=%d, d=%p) }!\n", int(piv_size), piv_data); + } + PIVector(size_t piv_size, const T & f = T()): piv_data(0), piv_size(0), piv_rsize(0) { + //printf("new vector 3 %p (%s) ... !{\n", this, typeid(T).name()); + resize(piv_size, f); + //printf("(s=%d, d=%p) }!\n", int(piv_size), piv_data); + } + ~PIVector() { + //printf("delete vector %p (%s) (s=%d, d=%p) ... ~{\n", this, typeid(T).name(), int(piv_size), piv_data); + deleteT(piv_data, piv_size); + dealloc(); + //deleteRaw(piv_tdata); + _reset(); + //printf("}~\n"); + } + + PIVector & operator =(const PIVector & other) { + if (this == &other) return *this; + bool tj, oj; + tj = (piv_size != 0 && piv_data == 0);// || (piv_size == 0 && piv_data != 0); + oj = (other.piv_size != 0 && other.piv_data == 0);// || (other.piv_size == 0 && other.piv_data != 0); + //printf("operator= (%p = %p) (s=%d, d=%p, o.s=%d, o.d=%p) (%d, %d) ... o[\n", this, &other, int(piv_size), piv_data, int(other.piv_size), other.piv_data, int(tj), int(oj)); + if (tj) { + printf("JUNK this\n"); + _reset(); + } else { + clear(); + } + /*if (piv_size == other.piv_size) { + for (size_t i = 0; i < piv_size; ++i) + piv_data[i] = other.piv_data[i]; + return *this; + }*/ + if (!oj) { + deleteT(piv_data, piv_size); + alloc(other.piv_size); + //zeroRaw(piv_data, piv_size); + for (size_t i = 0; i < piv_size; ++i) + elementNew(piv_data + i, other.piv_data[i]); //piv_data[i] = other.piv_data[i]; + } else { + printf("JUNK other\n"); + } + //printf("o]\n"); + return *this; + } + + typedef T value_type; + + class iterator { + friend class PIVector; + private: + iterator(PIVector * v, size_t p): parent(v), pos(p) {} + PIVector * parent; + size_t pos; + public: + iterator(): parent(0) {} + T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const iterator & it) const {return (pos == it.pos);} + bool operator !=(const iterator & it) const {return (pos != it.pos);} + }; + + class const_iterator { + friend class PIVector; + private: + const_iterator(const PIVector * v, size_t p): parent(v), pos(p) {} + const PIVector * parent; + size_t pos; + public: + const_iterator(): parent(0) {} + //T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {++pos;} + void operator ++(int) {++pos;} + void operator --() {--pos;} + void operator --(int) {--pos;} + bool operator ==(const const_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_iterator & it) const {return (pos != it.pos);} + }; + + class reverse_iterator { + friend class PIVector; + private: + reverse_iterator(PIVector * v, size_t p): parent(v), pos(p) {} + PIVector * parent; + size_t pos; + public: + reverse_iterator(): parent(0) {} + T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} + }; + + class const_reverse_iterator { + friend class PIVector; + private: + const_reverse_iterator(const PIVector * v, size_t p): parent(v), pos(p) {} + const PIVector * parent; + size_t pos; + public: + const_reverse_iterator(): parent(0) {} + //T & operator *() {return (*parent)[pos];} + const T & operator *() const {return (*parent)[pos];} + void operator ++() {--pos;} + void operator ++(int) {--pos;} + void operator --() {++pos;} + void operator --(int) {++pos;} + bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} + bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} + }; + + iterator begin() {return iterator(this, 0);} + iterator end() {return iterator(this, piv_size);} + const_iterator begin() const {return const_iterator(this, 0);} + const_iterator end() const {return const_iterator(this, piv_size);} + reverse_iterator rbegin() {return reverse_iterator(this, piv_size - 1);} + reverse_iterator rend() {return reverse_iterator(this, -1);} + const_reverse_iterator rbegin() const {return const_reverse_iterator(this, piv_size - 1);} + const_reverse_iterator rend() const {return const_reverse_iterator(this, -1);} + + size_t size() const {return piv_size;} + ssize_t size_s() const {return piv_size;} + size_t length() const {return piv_size;} + size_t capacity() const {return piv_rsize;} + bool isEmpty() const {return (piv_size == 0);} + + T & operator [](size_t index) {return piv_data[index];} + T & at(size_t index) {return piv_data[index];} + const T & operator [](size_t index) const {return piv_data[index];} + const T & at(size_t index) const {return piv_data[index];} + T & back() {return piv_data[piv_size - 1];} + const T & back() const {return piv_data[piv_size - 1];} + T & front() {return piv_data[0];} + const T & front() const {return piv_data[0];} + bool operator ==(const PIVector & t) const {if (piv_size != t.piv_size) return false; for (size_t i = 0; i < piv_size; ++i) if (t[i] != piv_data[i]) return false; return true;} + bool operator !=(const PIVector & t) const {if (piv_size != t.piv_size) return true; for (size_t i = 0; i < piv_size; ++i) if (t[i] != piv_data[i]) return true; return false;} + bool contains(const T & v) const {for (size_t i = 0; i < piv_size; ++i) if (v == piv_data[i]) return true; return false;} + int etries(const T & v) const {int ec = 0; for (size_t i = 0; i < piv_size; ++i) if (v == piv_data[i]) ++ec; return ec;} + + T * data(size_t index = 0) {return &(piv_data[index]);} + const T * data(size_t index = 0) const {return &(piv_data[index]);} + PIVector & clear() {resize(0); return *this;} + PIVector & fill(const T & f = T()) { + //if (sizeof(T) == 1) memset(piv_data, f, piv_size); + deleteT(piv_data, piv_size); + //zeroRaw(piv_data, piv_size); + for (size_t i = 0; i < piv_size; ++i) + elementNew(piv_data + i, f); + return *this; + } + PIVector & assign(const T & f = T()) {return fill(f);} + PIVector & assign(size_t new_size, const T & f) {resize(new_size); return fill(f);} + PIVector & resize(size_t new_size, const T & f = T()) { + if (new_size < piv_size) { + T * de = &(piv_data[new_size]); + deleteT(de, piv_size - new_size); + piv_size = new_size; + } + if (new_size > piv_size) { + size_t os = piv_size; + alloc(new_size); + //if (sizeof(T) == 1) memset(&(piv_data[os]), f, ds); + //zeroRaw(&(piv_data[os]), new_size - os); + for (size_t i = os; i < new_size; ++i) elementNew(piv_data + i, f); + } + return *this; + } + PIVector & reserve(size_t new_size) {if (new_size <= piv_rsize) return *this; size_t os = piv_size; alloc(new_size); piv_size = os; return *this;} + + PIVector & insert(size_t index, const T & v = T()) { + alloc(piv_size + 1); + if (index < piv_size - 1) { + size_t os = piv_size - index - 1; + memmove(&(piv_data[index + 1]), &(piv_data[index]), os * sizeof(T)); + } + //zeroRaw(&(piv_data[index]), 1); + elementNew(piv_data + index, v); + return *this; + } + PIVector & insert(size_t index, const PIVector & other) { + if (other.isEmpty()) return *this; + ssize_t os = piv_size - index; + alloc(piv_size + other.piv_size); + if (os > 0) + memmove(&(piv_data[index + other.piv_size]), &(piv_data[index]), os * sizeof(T)); + newT(piv_data + index, other.piv_data, other.piv_size); + return *this; + } + + PIVector & remove(size_t index, size_t count = 1) { + if (count == 0) return *this; + if (index + count >= piv_size) { + resize(index); + return *this; + } + size_t os = piv_size - index - count; + deleteT(&(piv_data[index]), count); + memmove(&(piv_data[index]), &(piv_data[index + count]), os * sizeof(T)); + piv_size -= count; + return *this; + } + + void swap(PIVector & other) { + piSwap(piv_data, other.piv_data); + piSwap(piv_size, other.piv_size); + piSwap(piv_rsize, other.piv_rsize); + } + + typedef int (*CompareFunc)(const T * , const T * ); + static int compare_func(const T * t0, const T * t1) {return (*t0) < (*t1) ? -1 : ((*t0) == (*t1) ? 0 : 1);} + PIVector & sort(CompareFunc compare = compare_func) {qsort(piv_data, piv_size, sizeof(T), (int(*)(const void * , const void * ))compare); return *this;} + + PIVector & enlarge(llong piv_size) {llong ns = size_s() + piv_size; if (ns <= 0) clear(); else resize(size_t(ns)); return *this;} + + PIVector & removeOne(const T & v) {for (size_t i = 0; i < piv_size; ++i) if (piv_data[i] == v) {remove(i); return *this;} return *this;} + PIVector & removeAll(const T & v) {for (llong i = 0; i < piv_size; ++i) if (piv_data[i] == v) {remove(i); --i;} return *this;} + + PIVector & push_back(const T & v) {alloc(piv_size + 1); elementNew(piv_data + piv_size - 1, v); return *this;} + PIVector & append(const T & v) {return push_back(v);} + PIVector & operator <<(const T & v) {return push_back(v);} + PIVector & operator <<(const PIVector & other) { + size_t ps = piv_size; + alloc(piv_size + other.piv_size); + newT(piv_data + ps, other.piv_data, other.piv_size); + return *this; + } + + PIVector & push_front(const T & v) {insert(0, v); return *this;} + PIVector & prepend(const T & v) {return push_front(v);} + + PIVector & pop_back() {if (piv_size == 0) return *this; resize(piv_size - 1); return *this;} + PIVector & pop_front() {if (piv_size == 0) return *this; remove(0); return *this;} + + T take_back() {T t(back()); pop_back(); return t;} + T take_front() {T t(front()); pop_front(); return t;} + + template + PIVector toType() const {PIVector ret(piv_size); for (uint i = 0; i < piv_size; ++i) ret[i] = ST(piv_data[i]); return ret;} + +private: + void _reset() {piv_size = piv_rsize = 0; piv_data = 0;} + size_t asize(size_t s) { + if (s == 0) return 0; + if (piv_rsize + piv_rsize >= s && piv_rsize < s) + return piv_rsize + piv_rsize; + size_t t = 0, s_ = s - 1; + while (s_ >> t) ++t; + return (1 << t); + } + inline void newT(T * dst, const T * src, size_t s) { + for (size_t i = 0; i < s; ++i) + elementNew(dst + i, src[i]); + } + T * newRaw(size_t s) { + //cout << std::dec << " ![("< (new 0x" << (llong)ret << ") ok]!" << endl; + return (T*)ret; + } + /*void reallocRawTemp(size_t s) { + if (piv_tdata == 0) piv_tdata = (T*)(malloc(s * sizeof(T))); + else piv_tdata = (T*)(realloc(piv_tdata, s * sizeof(T))); + }*/ + inline void deleteT(T * d, size_t sz) { + //cout << " ~[("< ok]~" << endl; + } + void deleteRaw(T *& d) { + //cout << " ~[("< ok]~" << endl; + } + void zeroRaw(T * d, size_t s) { + //cout << " ~[("< ok]~" << endl; + } + inline void elementNew(T * to, const T & from) {new(to)T(from);} + inline void elementDelete(T & from) {from.~T();} + void dealloc() {deleteRaw(piv_data);} + inline void alloc(size_t new_size) { + if (new_size <= piv_rsize) { + piv_size = new_size; + return; + } + //int os = piv_size; + piv_size = new_size; + size_t as = asize(new_size); + if (as == piv_rsize) return; + + //cout << std::hex << " ![("< (new 0x" << (llong)piv_data << ") ok]!" << endl; + /*piv_rsize = as; + T * pd = newRaw(piv_rsize); + if (os > 0 && piv_data != 0) { + memcpy(pd, piv_data, os * sizeof(T)); + deleteRaw(piv_data); + } + piv_data = pd;*/ + } + + T * piv_data; + volatile size_t piv_size, piv_rsize; +}; +/* +#define __PIVECTOR_SIMPLE_FUNCTIONS__(T) \ + template<> inline PIVector::~PIVector() {dealloc(); _reset();} \ + template<> inline PIVector & PIVector::push_back(const T & v) {alloc(piv_size + 1); piv_data[piv_size - 1] = v; return *this;} \ + template<> inline PIVector & PIVector::fill(const T & f) { \ + for (size_t i = 0; i < piv_size; ++i) \ + piv_data[i] = f; \ + return *this; \ + } \ + template<> inline PIVector & PIVector::resize(size_t new_size, const T & f) { \ + if (new_size < piv_size) \ + piv_size = new_size; \ + if (new_size > piv_size) { \ + size_t os = piv_size; \ + alloc(new_size); \ + for (size_t i = os; i < new_size; ++i) piv_data[i] = f; \ + } \ + return *this; \ + } \ + template<> inline PIVector & PIVector::insert(size_t index, const T & v) { \ + alloc(piv_size + 1); \ + if (index < piv_size - 1) { \ + size_t os = piv_size - index - 1; \ + memmove(&(piv_data[index + 1]), &(piv_data[index]), os * sizeof(T)); \ + } \ + piv_data[index] = v; \ + return *this; \ + } \ + template<> inline PIVector & PIVector::remove(size_t index, size_t count) { \ + if (count == 0) return *this; \ + if (index + count >= piv_size) { \ + resize(index); \ + return *this; \ + } \ + size_t os = piv_size - index - count; \ + memmove(&(piv_data[index]), &(piv_data[index + count]), os * sizeof(T)); \ + piv_size -= count; \ + return *this; \ + } + +__PIVECTOR_SIMPLE_FUNCTIONS__(char) +__PIVECTOR_SIMPLE_FUNCTIONS__(uchar) +__PIVECTOR_SIMPLE_FUNCTIONS__(short) +__PIVECTOR_SIMPLE_FUNCTIONS__(ushort) +__PIVECTOR_SIMPLE_FUNCTIONS__(int) +__PIVECTOR_SIMPLE_FUNCTIONS__(uint) +__PIVECTOR_SIMPLE_FUNCTIONS__(long) +__PIVECTOR_SIMPLE_FUNCTIONS__(ulong) +__PIVECTOR_SIMPLE_FUNCTIONS__(llong) +__PIVECTOR_SIMPLE_FUNCTIONS__(ullong) +__PIVECTOR_SIMPLE_FUNCTIONS__(float) +__PIVECTOR_SIMPLE_FUNCTIONS__(double) +__PIVECTOR_SIMPLE_FUNCTIONS__(ldouble)*/ +#define __PIVECTOR_SIMPLE_TYPE__(T) \ + template<> inline void PIVector::newT(T * dst, const T * src, size_t s) {memcpy(dst, src, s * sizeof(T));} \ + template<> inline void PIVector::deleteT(T * d, size_t sz) {;} \ + template<> inline void PIVector::elementNew(T * to, const T & from) {(*to) = from;} \ + template<> inline void PIVector::elementDelete(T & from) {;} + +#else + + +template > +class PIP_EXPORT PIVector: public vector { + typedef PIVector _CVector; + typedef vector _stlc; +public: + + PIVector() {piMonitor.containers++;} + PIVector(uint size, const T & value = T()) {piMonitor.containers++; _stlc::resize(size, value);} + ~PIVector() {piMonitor.containers--;} + + const T & at(uint index) const {return (*this)[index];} + T & at(uint index) {return (*this)[index];} + const T * data(uint index = 0) const {return &(*this)[index];} + T * data(uint index = 0) {return &(*this)[index];} + +#ifdef DOXYGEN + uint size() const; +#endif + + int size_s() const {return static_cast(_stlc::size());} + bool isEmpty() const {return _stlc::empty();} + bool has(const T & t) const {for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) return true; return false;} + int etries(const T & t) const {int ec = 0; for (typename _stlc::const_iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (t == *i) ++ec; return ec;} + + typedef int (*CompareFunc)(const T * , const T * ); + + static int compare_func(const T * t0, const T * t1) {return (*t0) == (*t1) ? 0 : ((*t0) < (*t1) ? -1 : 1);} +#ifdef DOXYGEN + + void resize(uint size, const T & new_type = T()); + PIVector & enlarge(uint size); + void clear(); + PIVector & sort(CompareFunc compare = compare_func) {qsort(&at(0), _stlc::size(), sizeof(T), (int(*)(const void * , const void * ))compare); return *this;} + PIVector & fill(const T & t) {_stlc::assign(_stlc::size(), t); return *this;} + T & back(); + const T & back() const; + T & front(); + const T & front() const; + PIVector & push_back(const T & t); + PIVector & push_front(const T & t) {_stlc::insert(_stlc::begin(), t); return *this;} + PIVector & pop_back(); + PIVector & pop_front() {_stlc::erase(_stlc::begin()); return *this;} + T take_back() {T t(_stlc::back()); _stlc::pop_back(); return t;} + T take_front() {T t(_stlc::front()); pop_front(); return t;} + PIVector & remove(uint index) {_stlc::erase(_stlc::begin() + index); return *this;} + PIVector & remove(uint index, uint count) {_stlc::erase(_stlc::begin() + index, _stlc::begin() + index + count); return *this;} + PIVector & removeOne(const T & v) {for (typename _stlc::iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (v == *i) {_stlc::erase(i); return *this;} return *this;} + PIVector & removeAll(const T & v) {for (typename _stlc::iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (v == *i) {_stlc::erase(i); --i;} return *this;} + PIVector & insert(uint pos, const T & t) {_stlc::insert(_stlc::begin() + pos, t); return *this;} + PIVector & insert(uint pos, const PIVector & t) {_stlc::insert(_stlc::begin() + pos, t.begin(), t.end()); return *this;} + T & operator [](uint index); + const T & operator [](uint index) const; + PIVector & operator <<(const T & t) {_stlc::push_back(t); return *this;} + PIVector & operator <<(const PIVector & t) {for (typename _stlc::const_iterator i = t.begin(); i != t.end(); i++) _stlc::push_back(*i); return *this;} + bool operator ==(const PIVector & t) {for (uint i = 0; i < _stlc::size(); ++i) if (t[i] != at(i)) return false; return true;} + bool operator !=(const PIVector & t) {for (uint i = 0; i < _stlc::size(); ++i) if (t[i] != at(i)) return true; return false;} + bool contains(const T & v) const {for (uint i = 0; i < _stlc::size(); ++i) if (v == at(i)) return true; return false;} + +#else + _CVector & enlarge(int size_) {int ns = size_s() + size_; if (ns <= 0) _stlc::clear(); else _stlc::resize(ns); return *this;} + _CVector & sort(CompareFunc compare = compare_func) {qsort(&at(0), _stlc::size(), sizeof(T), (int(*)(const void * , const void * ))compare); return *this;} + _CVector & fill(const T & t) {_stlc::assign(_stlc::size(), t); return *this;} + _CVector & pop_front() {_stlc::erase(_stlc::begin()); return *this;} + _CVector & push_front(const T & t) {_stlc::insert(_stlc::begin(), t); return *this;} + T take_front() {T t(_stlc::front()); pop_front(); return t;} + T take_back() {T t(_stlc::back()); _stlc::pop_back(); return t;} + _CVector & remove(uint index) {_stlc::erase(_stlc::begin() + index); return *this;} + _CVector & remove(uint index, uint count) {_stlc::erase(_stlc::begin() + index, _stlc::begin() + index + count); return *this;} + _CVector & removeOne(const T & v) {for (typename _stlc::iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (v == *i) {_stlc::erase(i); return *this;} return *this;} + _CVector & removeAll(const T & v) {for (typename _stlc::iterator i = _stlc::begin(); i != _stlc::end(); ++i) if (v == *i) {_stlc::erase(i); --i;} return *this;} + _CVector & insert(uint pos, const T & t) {_stlc::insert(_stlc::begin() + pos, t); return *this;} + _CVector & insert(uint pos, const _CVector & t) {_stlc::insert(_stlc::begin() + pos, t.begin(), t.end()); return *this;} + _CVector & operator <<(const T & t) {_stlc::push_back(t); return *this;} + _CVector & operator <<(const _CVector & t) {for (typename _stlc::const_iterator i = t.begin(); i != t.end(); i++) _stlc::push_back(*i); return *this;} + bool operator ==(const _CVector & t) {for (uint i = 0; i < _stlc::size(); ++i) if (t[i] != at(i)) return false; return true;} + bool operator !=(const _CVector & t) {for (uint i = 0; i < _stlc::size(); ++i) if (t[i] != at(i)) return true; return false;} + bool contains(const T & v) const {for (uint i = 0; i < _stlc::size(); ++i) if (v == at(i)) return true; return false;} +#endif +}; + +#define __PIVECTOR_SIMPLE_TYPE__(T) + + +#endif + + +template +inline std::ostream & operator <<(std::ostream & s, const PIVector & v) {s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; return s;} + +template +inline PICout operator <<(PICout s, const PIVector & v) {s.space(); s.setControl(0, true); s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} + + +#endif // PIVECTOR_H diff --git a/src/core/pibitarray.h b/src/core/pibitarray.h new file mode 100755 index 00000000..2c874f0e --- /dev/null +++ b/src/core/pibitarray.h @@ -0,0 +1,104 @@ +/* + PIP - Platform Independent Primitives + Bit array + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIBITARRAY_H +#define PIBITARRAY_H + +#include "picontainers.h" + +class PIP_EXPORT PIBitArray { +public: + PIBitArray(const int & size = 0) {resize(size);} + PIBitArray(uchar val) {resize(sizeof(val) * 8); data_[0] = val;} + PIBitArray(ushort val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + PIBitArray(uint val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + PIBitArray(ulong val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + PIBitArray(ullong val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + PIBitArray(uchar * bytes, uint size) {resize(size * 8); memcpy(data(), bytes, size);} + + uint bitSize() const {return size_;} + uint byteSize() const {return bytesInBits(size_);} + PIBitArray & resize(const uint & size) {size_ = size; data_.resize(bytesInBits(size_)); return *this;} + + PIBitArray & clearBit(const uint & index) {data_[index / 8] &= ~(1 << (index % 8)); return *this;} + PIBitArray & setBit(const uint & index) {data_[index / 8] |= (1 << (index % 8)); return *this;} + PIBitArray & writeBit(const uint & index, const bool & value) {if (value) setBit(index); else clearBit(index); return *this;} + PIBitArray & writeBit(const uint & index, const uchar & value) {return writeBit(index, value > 0);} + + PIBitArray & push_back(const bool & value) {resize(size_ + 1); writeBit(size_ - 1, value); return *this;} + PIBitArray & push_back(const uchar & value) {return push_back(value > 0);} + PIBitArray & insert(const uint & index, const bool & value) { + resize(size_ + 1); + uint fi = byteSize() - 1, si = index / 8, ti = index % 8; + uchar c = data_[si]; + for (uint i = fi; i > si; --i) { + data_[i] <<= 1; + if ((0x80 & data_[i - 1]) == 0x80) data_[i] |= 1; + else data_[i] &= 0xFE;} + data_[si] &= (0xFF >> (7 - ti)); + data_[si] |= ((c << 1) & (0xFF << (ti))); + if (value) data_[si] |= (1 << ti); + else data_[si] &= ~(1 << ti); + return *this;} + PIBitArray & insert(const uint & index, const uchar & value) {return insert(index, value > 0);} + PIBitArray & push_front(const bool & value) {return insert(0, value);} + PIBitArray & push_front(const uchar & value) {return push_front(value > 0);} + PIBitArray & pop_back() {return resize(size_ - 1);} + PIBitArray & pop_front() { + if (size_ == 0) return *this; + uint fi = byteSize() - 1; + for (uint i = 0; i < fi; ++i) { + data_[i] >>= 1; + if ((1 & data_[i + 1]) == 1) data_[i] |= 0x80; + else data_[i] &= 0x7F;} + data_[fi] >>= 1; + resize(size_ - 1); + return *this;} + PIBitArray & append(const PIBitArray & ba) {for (uint i = 0; i < ba.bitSize(); ++i) push_back(ba[i]); return *this;} + + uchar * data() {return data_.data();} + uchar toUChar() {if (size_ == 0) return 0; return data_[0];} + ushort toUShort() {ushort t = 0; memcpy(&t, data(), piMin(byteSize(), sizeof(t))); return t;} + uint toUInt() {uint t = 0; memcpy(&t, data(), piMin(byteSize(), sizeof(t))); return t;} + ulong toULong() {ulong t = 0; memcpy(&t, data(), piMin(byteSize(), sizeof(t))); return t;} + ullong toULLong() {ullong t = 0; memcpy(&t, data(), piMin(byteSize(), sizeof(t))); return t;} + + bool at(const uint & index) const {return (1 & (data_[index / 8] >> (index % 8))) == 1 ? true : false;} + bool operator [](const uint & index) const {return at(index);} + void operator +=(const PIBitArray & ba) {append(ba);} + bool operator ==(const PIBitArray & ba) const {if (bitSize() != ba.bitSize()) return false; for (uint i = 0; i < bitSize(); ++i) if (at(i) != ba[i]) return false; return true;} + bool operator !=(const PIBitArray & ba) const {return !(*this == ba);} + void operator =(const uchar & val) {resize(sizeof(val) * 8); data_[0] = val;} + void operator =(const ushort & val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + void operator =(const uint & val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + void operator =(const ulong & val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + void operator =(const ullong & val) {resize(sizeof(val) * 8); memcpy(data(), &val, sizeof(val));} + +private: + uint bytesInBits(const uint & bits) const {return (bits + 7) / 8;} + + PIVector data_; + uint size_; + +}; + +inline std::ostream & operator <<(std::ostream & s, const PIBitArray & ba) {for (uint i = 0; i < ba.bitSize(); ++i) {s << ba[i]; if (i % 8 == 7) s << ' ';} return s;} +inline PICout operator <<(PICout s, const PIBitArray & ba) {s.space(); s.setControl(0, true); for (uint i = 0; i < ba.bitSize(); ++i) {s << ba[i]; if (i % 8 == 7) s << ' ';} s.restoreControl(); return s;} + +#endif // PIBITARRAY_H diff --git a/src/core/pibytearray.cpp b/src/core/pibytearray.cpp new file mode 100755 index 00000000..679afde4 --- /dev/null +++ b/src/core/pibytearray.cpp @@ -0,0 +1,293 @@ +/* + PIP - Platform Independent Primitives + Byte array + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pibytearray.h" +#include "pistring.h" + +/*! \class PIByteArray + * \brief Byte array + * \details This class based on PIDeque and provide some handle function + * to manipulate it. + * + * \section PIByteArray_sec0 Usage + * %PIByteArray can be used to store custom data and manipulate it. There are many + * stream operators to store/restore common types to byte array. Store operators + * places data at the end of array, restore operators takes data from the beginning + * of array. + * In addition there are Base 64 convertions and checksums: + * * plain 8-bit + * * plain 32-bit + * + * One of the major usage of %PIByteArray is stream functions. You can form binary + * packet from many types (also dynamic types, e.g. PIVector) with one line: + * \snippet pibytearray.cpp 0 + * + * Or you can descibe stream operator of your own type and store/restore vectors of + * your type: + * \snippet pibytearray.cpp 1 + * + * For store/restore custom data blocks there is PIByteArray::RawData class. Stream + * operators of this class simply store/restore data block to/from byte array. + * \snippet pibytearray.cpp 2 + * + * \section PIByteArray_sec1 Attention + * Stream operator of %PIByteArray store byte array as vector, not simply append + * content of byte array. This operators useful to transmit custom data as %PIByteArray + * packed into parent byte array, e.g. to form packet from %PIByteArray. + * To append one byte array to another use funtion \a append(). + * \snippet pibytearray.cpp 3 + * + * + */ + + +#pragma pack(push, 1) + +const char PIByteArray::base64Table[64] = { +0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, +0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, +0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, +0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, +0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, +0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, +0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, +0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f}; + +const char PIByteArray::base64InvTable[256] = { +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x3F, +0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, +0x3C, 0x3D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, +0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, +0x17, 0x18, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, +0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, +0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, +0x31, 0x32, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + +#pragma pack(pop) + + +int PIHuffman::nodeCompare(const void * f, const void * s) { + return (reinterpret_cast(const_cast(s))->freq - + reinterpret_cast(const_cast(f))->freq); +} + + +PIDeque PIHuffman::compress(const PIDeque & src) { + calcFrequencies(src); + return src; +} + + +void PIHuffman::calcFrequencies(const PIDeque & src) { + nodes.resize(256); + for (int i = 0; i < 256; ++i) { + nodes[i].parent = nodes[i].right = nodes[i].left = 0; + nodes[i].freq = 0; + nodes[i].word.resize(1); + nodes[i].word[0] = static_cast(i); + } + for (int i = 0; i < src.size_s(); ++i) + nodes[src[i]].freq++; + std::qsort(nodes.data(), 256, sizeof(node), nodeCompare); + for (int i = 255; i >= 0; --i) + if (nodes[i].freq > 0 && i < 255) + {nodes.remove(i + 1, 255 - i); break;} + for (int i = 0; i < nodes.size_s(); ++i) + cout << string((char*)nodes[i].word.data(), 1) << ": " << nodes[i].freq << endl; +} + + +PIHuffman PIByteArray::huffman; + +PIByteArray & PIByteArray::convertToBase64() { + base64HelpStruct hs; + PIByteArray t; + if (size() == 0) return *this; + int sz = (size_s() / 3) * 3; + for (int i = 0; i < sz; ++i) { + hs.byte.byte0 = hs.byte.byte1 = hs.byte.byte2 = 0; + hs.byte.byte0 = at(i); + hs.byte.byte1 = at(++i); + hs.byte.byte2 = at(++i); + t.push_back(base64Table[hs.ascii.ascii0]); + t.push_back(base64Table[hs.ascii.ascii1]); + t.push_back(base64Table[hs.ascii.ascii2]); + t.push_back(base64Table[hs.ascii.ascii3]); + } + hs.byte.byte0 = hs.byte.byte1 = hs.byte.byte2 = 0; sz = size() % 3; + switch (sz) { + case 1: + hs.byte.byte0 = back(); + t.push_back(base64Table[hs.ascii.ascii0]); + t.push_back(base64Table[hs.ascii.ascii1]); + t.push_back('='); + t.push_back('='); + break; + case 2: + hs.byte.byte0 = at(size() - 2); hs.byte.byte1 = back(); + t.push_back(base64Table[hs.ascii.ascii0]); + t.push_back(base64Table[hs.ascii.ascii1]); + t.push_back(base64Table[hs.ascii.ascii2]); + t.push_back('='); + break; + default: break; + } + *this = t; + return *this; +} + + +PIByteArray & PIByteArray::convertFromBase64() { + base64HelpStruct hs; + PIByteArray t; + uint sz = size(); + if (sz == 0) return *this; + for (uint i = 0; i < sz; ++i) { + hs.byte.byte0 = hs.byte.byte1 = hs.byte.byte2 = 0; + hs.ascii.ascii0 = base64InvTable[at(i)]; + hs.ascii.ascii1 = base64InvTable[at(++i)]; + hs.ascii.ascii2 = base64InvTable[at(++i)]; + hs.ascii.ascii3 = base64InvTable[at(++i)]; + t.push_back(hs.byte.byte0); + t.push_back(hs.byte.byte1); + t.push_back(hs.byte.byte2); + } + if (back() == '=') t.pop_back(); + if (sz > 1) if (at(sz - 2) == '=') t.pop_back(); + *this = t; + return *this; +} + + +PIByteArray & PIByteArray::compressRLE(uchar threshold) { + PIByteArray t; + uchar fb, clen, mlen = 255 - threshold; + for (uint i = 0; i < size();) { + fb = at(i); + clen = 1; + while (at(++i) == fb) { + ++clen; + if (clen == mlen) + break; + } + if (clen > 1) { + t.push_back(threshold + clen); + t.push_back(fb); + continue; + } + if (fb >= threshold) { + t.push_back(threshold + 1); + t.push_back(fb); + } else + t.push_back(fb); + } + *this = t; + return *this; +} + + +PIByteArray & PIByteArray::decompressRLE(uchar threshold) { + PIByteArray t; + uchar fb, clen; + for (uint i = 0; i < size(); ++i) { + fb = at(i); + if (fb >= threshold) { + clen = fb - threshold; + fb = at(++i); + for (uint j = 0; j < clen; ++j) + t.push_back(fb); + continue; + } else + t.push_back(fb); + } + *this = t; + return *this; +} + + +uchar PIByteArray::checksumPlain8() const { + uchar c = 0; + int sz = size_s(); + for (int i = 0; i < sz; ++i) + c += at(i); + c = ~(c + 1); + return c; +} + + +uint PIByteArray::checksumPlain32() const { + uint c = 0; + int sz = size_s(); + for (int i = 0; i < sz; ++i) + c += at(i) * (i + 1); + c = ~(c + 1); + return c; +} + + +PIString PIByteArray::toString(int base) const { + PIString ret; + int sz = size_s(); + for (int i = 0; i < sz; ++i) { + if (i > 0) ret += " "; + if (base == 2) ret += "b"; + if (base == 8) ret += "0"; + if (base == 16) ret += "0x"; + ret += PIString::fromNumber(at(i), base); + } + return ret; +} + + +PIByteArray PIByteArray::fromString(PIString str) { + PIByteArray ret; + if (str.trim().isEmpty()) return ret; + str.replaceAll("\n", " ").replaceAll("\t", " ").replaceAll(" ", " "); + PIStringList bl(str.split(" ")); + bool ok(false); + piForeachC (PIString & b, bl) { + int bv = b.toInt(-1, &ok); + if (ok) ret << uchar(bv); + } + return ret; +} diff --git a/src/core/pibytearray.h b/src/core/pibytearray.h new file mode 100755 index 00000000..92e1acf7 --- /dev/null +++ b/src/core/pibytearray.h @@ -0,0 +1,261 @@ +/*! \file pibytearray.h + * \brief Byte array +*/ +/* + PIP - Platform Independent Primitives + Byte array + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIBYTEARRAY_H +#define PIBYTEARRAY_H + +#ifdef DOXYGEN +//! This macro allow stream template operators for write and read any type from byte array. Use it with attention! +# define PIP_BYTEARRAY_STREAM_ANY_TYPE +#endif + +#include "pibitarray.h" + +class PIString; +class PIByteArray; + +class PIHuffman { +public: + PIDeque compress(const PIDeque & src); + +private: + struct node { + int freq; + PIDeque word; + PIBitArray path; + node * parent; + node * right; + node * left; + }; + static int nodeCompare(const void * f, const void * s); + void calcFrequencies(const PIDeque & src); + PIVector nodes; +}; + +class PIP_EXPORT PIByteArray: public PIDeque +{ +public: + + //! Constructs an empty byte array + PIByteArray() {;} + + //! Constructs 0-filled byte array with size "size" + PIByteArray(const uint size) {resize(size);} + + //! Constructs byte array from data "data" and size "size" + PIByteArray(const void * data, const uint size): PIDeque((const uchar*)data, size_t(size)) {/*for (uint i = 0; i < size; ++i) push_back(((uchar * )data)[i]);*/} + + + //! Help struct to store/restore custom blocks of data to/from PIByteArray + struct RawData { + friend PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v); + friend PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v); + public: + //! Constructs data block + RawData(void * data = 0, int size = 0) {d = data; s = size;} + //! Constructs data block + RawData(const void * data, const int size) {d = const_cast(data); s = size;} + RawData & operator =(const RawData & o) {d = o.d; s = o.s; return *this;} + private: + void * d; + int s; + }; + + //! Return resized byte array + PIByteArray resized(int new_size) const {PIByteArray tv(*this); tv.resize(new_size); return tv;} + + //! Convert data to Base 64 and return this byte array + PIByteArray & convertToBase64(); + + //! Convert data from Base 64 and return this byte array + PIByteArray & convertFromBase64(); + + //! Return converted to Base 64 data + PIByteArray toBase64() const {PIByteArray ba(*this); ba.convertToBase64(); return ba;} + + //! Return converted from Base 64 data + PIByteArray fromBase64() const {PIByteArray ba(*this); ba.convertFromBase64(); return ba;} + + PIByteArray & compressRLE(uchar threshold = 192); + PIByteArray & decompressRLE(uchar threshold = 192); + PIByteArray compressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.compressRLE(threshold); return ba;} + PIByteArray decompressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.decompressRLE(threshold); return ba;} + + PIByteArray & compressHuffman() {*this = huffman.compress(*this); return *this;} + + PIString toString(int base = 16) const; + + //! Add to the end data "data" with size "size" + PIByteArray & append(const void * data_, int size_) {uint ps = size(); enlarge(size_); memcpy(data(ps), data_, size_); return *this;} + + //! Add to the end byte array "data" + PIByteArray & append(const PIByteArray & data_) {uint ps = size(); enlarge(data_.size_s()); memcpy(data(ps), data_.data(), data_.size()); return *this;} + /*PIByteArray & operator <<(short v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;} + PIByteArray & operator <<(ushort v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;} + PIByteArray & operator <<(int v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;} + PIByteArray & operator <<(uint v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;} + PIByteArray & operator <<(llong v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;} + PIByteArray & operator <<(ullong v) {for (uint i = 0; i < sizeof(v); ++i) push_back(((uchar*)(&v))[i]); return *this;}*/ + //PIByteArray & operator <<(const PIByteArray & v) {for (uint i = 0; i < v.size(); ++i) push_back(v[i]); return *this;} + + //! Returns plain 8-bit checksum + uchar checksumPlain8() const; + + //! Returns plain 32-bit checksum + uint checksumPlain32() const; + + void operator =(const PIDeque & d) {resize(d.size()); memcpy(data(), d.data(), d.size());} + + static PIByteArray fromString(PIString str); + +private: + union base64HelpStruct { + base64HelpStruct() {memset(this, 0, sizeof(base64HelpStruct));} + struct { + uchar ascii0: 6; + uchar ascii1: 6; + uchar ascii2: 6; + uchar ascii3: 6; + } ascii; + struct { + uchar byte0; + uchar byte1; + uchar byte2; + } byte; + }; + + static const char base64Table[64]; + static const char base64InvTable[256]; + static PIHuffman huffman; + +}; + +inline bool operator <(const PIByteArray & v0, const PIByteArray & v1) {if (v0.size() == v1.size()) {for (uint i = 0; i < v0.size(); ++i) if (v0[i] != v1[i]) return v0[i] < v1[i]; return false;} return v0.size() < v1.size();} +//! \relatesalso PIByteArray \brief Output to std::ostream operator +inline std::ostream & operator <<(std::ostream & s, const PIByteArray & ba) {s << "{"; for (uint i = 0; i < ba.size(); ++i) {s << ba[i]; if (i < ba.size() - 1) s << ", ";} s << "}"; return s;} + +//! \relatesalso PIByteArray \brief Output to PICout operator +inline PICout operator <<(PICout s, const PIByteArray & ba) {s.space(); s.setControl(0, true); s << "{"; for (uint i = 0; i < ba.size(); ++i) {s << ba[i]; if (i < ba.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} + +#define PBA_OPERATOR_TO int os = s.size_s(); s.enlarge(sizeof(v)); memcpy(s.data(os), &v, sizeof(v)); + +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, uchar v) {s.push_back(v); return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const short v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const int v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const long & v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const llong & v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const ushort v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const uint v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const ulong & v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const ullong & v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const float v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator +inline PIByteArray & operator <<(PIByteArray & s, const double & v) {PBA_OPERATOR_TO return s;} +//! \relatesalso PIByteArray \brief Store operator, see \ref PIByteArray_sec1 for details +inline PIByteArray & operator <<(PIByteArray & s, const PIByteArray & v) {s << v.size_s(); int os = s.size_s(); s.enlarge(v.size_s()); if (v.size_s() > 0) memcpy(s.data(os), v.data(), v.size()); return s;} +//! \relatesalso PIByteArray \brief Store operator, see \ref PIByteArray_sec1 for details +inline PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v) {int os = s.size_s(); s.enlarge(v.s); if (v.s > 0) memcpy(s.data(os), v.d, v.s); return s;} +//! \relatesalso PIByteArray \brief Store operator +template +inline PIByteArray & operator <<(PIByteArray & s, const PIPair & v) {s << v.first << v.second; return s;} +//! \relatesalso PIByteArray \brief Store operator +template +inline PIByteArray & operator <<(PIByteArray & s, const PIVector & v) {s << v.size_s(); for (uint i = 0; i < v.size(); ++i) s << v[i]; return s;} +//! \relatesalso PIByteArray \brief Store operator +template +inline PIByteArray & operator <<(PIByteArray & s, const PIList & v) {s << v.size_s(); for (uint i = 0; i < v.size(); ++i) s << v[i]; return s;} +//! \relatesalso PIByteArray \brief Store operator +template +inline PIByteArray & operator <<(PIByteArray & s, const PIDeque & v) {s << v.size_s(); for (uint i = 0; i < v.size(); ++i) s << v[i]; return s;} +#ifdef PIP_BYTEARRAY_STREAM_ANY_TYPE +template +inline PIByteArray & operator <<(PIByteArray & s, const T & v) {PBA_OPERATOR_TO return s;} +#endif + +#undef PBA_OPERATOR_TO +#define PBA_OPERATOR_FROM memcpy(&v, s.data(), sizeof(v)); s.remove(0, sizeof(v)); + +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, uchar & v) {assert(s.size() >= 1u); v = s.take_front(); return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, short & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, int & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, long & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, llong & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, ushort & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, uint & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, ulong & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, ullong & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, float & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator +inline PIByteArray & operator >>(PIByteArray & s, double & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +//! \relatesalso PIByteArray \brief Restore operator, see \ref PIByteArray_sec1 for details +inline PIByteArray & operator >>(PIByteArray & s, PIByteArray & v) {assert(s.size_s() >= 4); int sz; s >> sz; v.resize(sz); if (sz > 0) memcpy(v.data(), s.data(), v.size()); s.remove(0, v.size()); return s;} +//! \relatesalso PIByteArray \brief Restore operator, see \ref PIByteArray_sec1 for details +inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) {assert(s.size_s() >= v.s); if (v.s > 0) memcpy(v.d, s.data(), v.s); s.remove(0, v.s); return s;} +//! \relatesalso PIByteArray \brief Restore operator +template +inline PIByteArray & operator >>(PIByteArray & s, PIPair & v) {s >> v.first >> v.second; return s;} +//! \relatesalso PIByteArray \brief Restore operator +template +inline PIByteArray & operator >>(PIByteArray & s, PIVector & v) {assert(s.size_s() >= 4); int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} +//! \relatesalso PIByteArray \brief Restore operator +template +inline PIByteArray & operator >>(PIByteArray & s, PIList & v) {assert(s.size_s() >= 4); int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} +//! \relatesalso PIByteArray \brief Restore operator +template +inline PIByteArray & operator >>(PIByteArray & s, PIDeque & v) {assert(s.size_s() >= 4); int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} +// //! \relatesalso PIByteArray \brief Restore operator +//template +//inline PIByteArray & operator >>(PIByteArray & s, PIMap & v) {assert(s.size_s() >= 4); int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} +#ifdef PIP_BYTEARRAY_STREAM_ANY_TYPE +template +inline PIByteArray & operator >>(PIByteArray & s, T & v) {assert(s.size() >= sizeof(v)); PBA_OPERATOR_FROM return s;} +#endif + + +#undef PBA_OPERATOR_FROM + +//! \relatesalso PIByteArray \brief Byte arrays compare operator +inline bool operator ==(PIByteArray & f, PIByteArray & s) {if (f.size_s() != s.size_s()) return false; for (int i = 0; i < f.size_s(); ++i) if (f[i] != s[i]) return false; return true;} +//! \relatesalso PIByteArray \brief Byte arrays compare operator +inline bool operator !=(PIByteArray & f, PIByteArray & s) {if (f.size_s() != s.size_s()) return true; for (int i = 0; i < f.size_s(); ++i) if (f[i] != s[i]) return true; return false;} + +#endif // PIBYTEARRAY_H diff --git a/src/core/pichar.h b/src/core/pichar.h new file mode 100755 index 00000000..c0cd81ea --- /dev/null +++ b/src/core/pichar.h @@ -0,0 +1,221 @@ +/*! \file pichar.h + * \brief Unicode char +*/ +/* + PIP - Platform Independent Primitives + Unicode char + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICHAR_H +#define PICHAR_H + +#include "pibytearray.h" +/*! \brief Unicode char + * \details This class is wrapper around \c "uint". + * There are many contructors and information functions + */ +class PIP_EXPORT PIChar +{ + friend class PIString; + friend PIByteArray & operator <<(PIByteArray & s, const PIChar & v); + friend PIByteArray & operator >>(PIByteArray & s, PIChar & v); +public: + //! Contructs ascii symbol + PIChar(const char c) {ch = c; ch &= 0xFF;} + + //! Contructs 2-bytes symbol + PIChar(const short c) {ch = c; ch &= 0xFFFF;} + + //! Contructs 4-bytes symbol + PIChar(const int c) {ch = c;} + + //! Contructs ascii symbol + PIChar(const uchar c) {ch = c; ch &= 0xFF;} + + //! Contructs 2-bytes symbol + PIChar(const ushort c) {ch = c; ch &= 0xFFFF;} + + //! Default constructor. Contructs 4-bytes symbol + PIChar(const uint c = 0) {ch = c;} + + //! Contructs symbol from no more than 4 bytes of string + PIChar(const char * c) {ch = *reinterpret_cast(c);} + + //inline operator const int() {return static_cast(ch);} + //inline operator const char() {return toAscii();} + + //! Copy operator + PIChar & operator =(const char v) {ch = v; return *this;} + /*inline PIChar & operator =(const short v) {ch = v; return *this;} + inline PIChar & operator =(const int v) {ch = v; return *this;} + inline PIChar & operator =(const uchar v) {ch = v; return *this;} + inline PIChar & operator =(const ushort v) {ch = v; return *this;} + inline PIChar & operator =(const uint v) {ch = v; return *this;}*/ + + //! Compare operator + bool operator ==(const PIChar & o) const {return strcmp(o.toCharPtr(), toCharPtr()) == 0;} + /*inline bool operator ==(const PIChar & o) const {if (o.isAscii() ^ isAscii()) return false; + if (isAscii()) return (o.toAscii() == toAscii()); + return (o.toInt() == toInt());} + inline bool operator ==(const char o) const {return (PIChar(o) == *this);} + inline bool operator ==(const short o) const {return (PIChar(o) == *this);} + inline bool operator ==(const int o) const {return (PIChar(o) == *this);} + inline bool operator ==(const uchar o) const {return (PIChar(o) == *this);} + inline bool operator ==(const ushort o) const {return (PIChar(o) == *this);} + inline bool operator ==(const uint o) const {return (PIChar(o) == *this);}*/ + + //! Compare operator + bool operator !=(const PIChar & o) const {return !(o == *this);} + /*inline bool operator !=(const char o) const {return (PIChar(o) != *this);} + inline bool operator !=(const short o) const {return (PIChar(o) != *this);} + inline bool operator !=(const int o) const {return (PIChar(o) != *this);} + inline bool operator !=(const uchar o) const {return (PIChar(o) != *this);} + inline bool operator !=(const ushort o) const {return (PIChar(o) != *this);} + inline bool operator !=(const uint o) const {return (PIChar(o) != *this);}*/ + + //! Compare operator + bool operator >(const PIChar & o) const {return strcmp(o.toCharPtr(), toCharPtr()) < 0;} + + //! Compare operator + bool operator <(const PIChar & o) const {return strcmp(o.toCharPtr(), toCharPtr()) > 0;} + + //! Compare operator + bool operator >=(const PIChar & o) const {return strcmp(o.toCharPtr(), toCharPtr()) <= 0;} + + //! Compare operator + bool operator <=(const PIChar & o) const {return strcmp(o.toCharPtr(), toCharPtr()) >= 0;} + + //! Return \b true if symbol is digit ('0' to '9') + bool isDigit() const {return isdigit(ch) != 0;} + + //! Return \b true if symbol is HEX digit ('0' to '9', 'a' to 'f', 'A' to 'F') + bool isHex() const {return isxdigit(ch) != 0;} + + //! Return \b true if symbol is drawable (without space) + bool isGraphical() const {return isgraph(ch) != 0;} + + //! Return \b true if symbol is control byte (< 32 or 127) + bool isControl() const {return iscntrl(ch) != 0;} + + //! Return \b true if symbol is in lower case + bool isLower() const {return islower(ch) != 0;} + + //! Return \b true if symbol is in upper case + bool isUpper() const {return isupper(ch) != 0;} + + //! Return \b true if symbol is printable (with space) + bool isPrint() const {return isprint(ch) != 0;} + + //! Return \b true if symbol is space or tab + bool isSpace() const {return isspace(ch) != 0;} + + //! Return \b true if symbol is alphabetical letter + bool isAlpha() const {return isalpha(ch) != 0;} + + //! Return \b true if symbol is ascii (< 128) + bool isAscii() const {return isascii(ch) != 0;} + + int toInt() const {return int(ch);} + const wchar_t * toWCharPtr() const {return reinterpret_cast(&ch);} + + //! Return as "char * " string + const char * toCharPtr() const {return reinterpret_cast(&ch);} + + wchar_t toWChar() const {return wchar_t(ch);} + char toAscii() const {return ch % 256;} + int unicode16Code() const {wchar_t wc; if (mbtowc(&wc, toCharPtr(), 4) > 0) return wc; return 0;} +//#ifdef WINDOWS +// inline PIChar toUpper() const __attribute__ ((optimize(0))) {return PIChar(toupper(ch));} +// inline PIChar toLower() const __attribute__ ((optimize(0))) {return PIChar(tolower(ch));} +//#else + + //! Return symbol in upper case + PIChar toUpper() const {return PIChar(toupper(ch));} + + //! Return symbol in lower case + PIChar toLower() const {return PIChar(tolower(ch));} +//#endif + +private: + uint ch; + +}; + +__PICONTAINERS_SIMPLE_TYPE__(PIChar) + +//! Output operator to \c std::ostream +inline std::ostream & operator <<(std::ostream & s, const PIChar & v) {s << v.toCharPtr(); return s;} + +//! Output operator to \a PICout +inline PICout operator <<(PICout s, const PIChar & v) {s.space(); s.setControl(0, true); s << v.toCharPtr(); s.restoreControl(); return s;} + + +//! Write operator to \c PIByteArray +inline PIByteArray & operator <<(PIByteArray & s, const PIChar & v) {s << uint(v.ch); return s;} + +//! Read operator from \c PIByteArray +inline PIByteArray & operator >>(PIByteArray & s, PIChar & v) {uint i; s >> i; v.ch = wchar_t(i); return s;} + + +//! Compare operator +inline bool operator ==(const char v, const PIChar & c) {return (PIChar(v) == c);} + +//! Compare operator +inline bool operator >(const char v, const PIChar & c) {return (PIChar(v) > c);} + +//! Compare operator +inline bool operator <(const char v, const PIChar & c) {return (PIChar(v) < c);} + +//! Compare operator +inline bool operator >=(const char v, const PIChar & c) {return (PIChar(v) >= c);} + +//! Compare operator +inline bool operator <=(const char v, const PIChar & c) {return (PIChar(v) <= c);} + + +//! Compare operator +inline bool operator ==(const char * v, const PIChar & c) {return (PIChar(v) == c);} + +//! Compare operator +inline bool operator >(const char * v, const PIChar & c) {return (PIChar(v) > c);} + +//! Compare operator +inline bool operator <(const char * v, const PIChar & c) {return (PIChar(v) < c);} + +//! Compare operator +inline bool operator >=(const char * v, const PIChar & c) {return (PIChar(v) >= c);} + +//! Compare operator +inline bool operator <=(const char * v, const PIChar & c) {return (PIChar(v) <= c);} + + +//! Compare operator +inline bool operator ==(const int v, const PIChar & c) {return (PIChar(v) == c);} + +//! Compare operator +inline bool operator >(const int v, const PIChar & c) {return (PIChar(v) > c);} + +//! Compare operator +inline bool operator <(const int v, const PIChar & c) {return (PIChar(v) < c);} + +//! Compare operator +inline bool operator >=(const int v, const PIChar & c) {return (PIChar(v) >= c);} + +//! Compare operator +inline bool operator <=(const int v, const PIChar & c) {return (PIChar(v) <= c);} + +#endif // PICHAR_H diff --git a/src/core/picli.cpp b/src/core/picli.cpp new file mode 100755 index 00000000..5567f2c1 --- /dev/null +++ b/src/core/picli.cpp @@ -0,0 +1,101 @@ +/* + PIP - Platform Independent Primitives + Command-Line Parser + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picli.h" +#include "pisysteminfo.h" + + +/*! \class PICLI + * \brief Command-line arguments parser + * + * \section PICLI_sec0 Synopsis + * This class provide handy parsing of command-line arguments. First you should add + * arguments to PICLI with function \a addArgument(). Then you can check if there + * is some argument in application command-line with function \a hasArgument(); + * \section PICLI_sec1 Example + * \snippet picli.cpp main + */ + + +PICLI::PICLI(int argc, char * argv[]) { + setName("CLI"); + needParse = true; + _prefix_short = "-"; + _prefix_full = "--"; + _count_opt = 0; + _count_mand = 0; + for (int i = 0; i < argc; ++i) + _args_raw << argv[i]; + if (argc > 0) + PISystemInfo::instance()->execCommand = argv[0]; +} + + +void PICLI::parse() { + if (!needParse) return; + PIString cra, full; + Argument * last = 0; + for (int i = 1; i < _args_raw.size_s(); ++i) { + cra = _args_raw[i]; + if (cra.left(2) == _prefix_full) { + last = 0; + full = cra.right(cra.length() - 2); + piForeach (Argument & a, _args) { + if (a.full_key == full) { + a.found = true; + last = &a; + break; + } + } + } else { + if (cra.left(1) == _prefix_short) { + last = 0; + for (int j = 1; j < cra.length(); ++j) { + bool found = false; + piForeach (Argument & a, _args) { + if (a.short_key == cra[j]) { + a.found = true; + last = &a; + found = true; + break; + } + } + if (!found) break; + } + } else { + if (last == 0 ? true : !last->has_value) { + if (_args_mand.size_s() < _count_mand) { + _args_mand << cra; + continue; + } + if (_args_opt.size_s() < _count_opt || _count_opt < 0) { + _args_opt << cra; + continue; + } + piCoutObj << "[PICli] Arguments overflow, \"" << cra << "\" ignored"; + } + if (last == 0 ? false : last->has_value) { + last->value = cra; + last = 0; + } + } + } + } + needParse = false; +} diff --git a/src/core/picli.h b/src/core/picli.h new file mode 100755 index 00000000..ce58d5f8 --- /dev/null +++ b/src/core/picli.h @@ -0,0 +1,101 @@ +/*! \file picli.h + * \brief Command-Line parser +*/ +/* + PIP - Platform Independent Primitives + Command-Line Parser + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICLI_H +#define PICLI_H + +#include "piobject.h" + +class PIP_EXPORT PICLI: public PIObject +{ + PIOBJECT(PICLI) +public: + + //! Constructor + PICLI(int argc, char * argv[]); + + + //! Add argument with name "name", short key = name first letter, full key = name + void addArgument(const PIString & name, bool value = false) {_args << Argument(name, name[0], name, value); needParse = true;} + + //! Add argument with name "name", short key = "shortKey", full key = name + void addArgument(const PIString & name, const PIChar & shortKey, bool value = false) {_args << Argument(name, shortKey, name, value); needParse = true;} + + //! Add argument with name "name", short key = "shortKey", full key = name + void addArgument(const PIString & name, const char * shortKey, bool value = false) {_args << Argument(name, PIChar(shortKey), name, value); needParse = true;} + + //! Add argument with name "name", short key = "shortKey", full key = "fullKey" + void addArgument(const PIString & name, const PIChar & shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, shortKey, fullKey, value); needParse = true;} + + //! Add argument with name "name", short key = "shortKey", full key = "fullKey" + void addArgument(const PIString & name, const char * shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, PIChar(shortKey), fullKey, value); needParse = true;} + + + //! Returns unparsed command-line argument by index "index". Index 0 is program execute command. + PIString rawArgument(int index) {parse(); return _args_raw[index];} + PIString mandatoryArgument(int index) {parse(); return _args_mand[index];} + PIString optionalArgument(int index) {parse(); return _args_opt[index];} + + //! Returns unparsed command-line arguments + const PIStringList & rawArguments() {parse(); return _args_raw;} + const PIStringList & mandatoryArguments() {parse(); return _args_mand;} + const PIStringList & optionalArguments() {parse(); return _args_opt;} + + //! Returns program execute command without arguments + PIString programCommand() {parse(); return _args_raw.size() > 0 ? _args_raw.front() : PIString();} + bool hasArgument(const PIString & name) {parse(); piForeach (Argument & i, _args) if (i.name == name && i.found) return true; return false;} + PIString argumentValue(const PIString & name) {parse(); piForeach (Argument &i, _args) if (i.name == name && i.found) return i.value; return PIString();} + PIString argumentShortKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.short_key; return PIString();} + PIString argumentFullKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.full_key; return PIString();} + + const PIString & shortKeyPrefix() const {return _prefix_short;} + const PIString & fullKeyPrefix() const {return _prefix_full;} + int mandatoryArgumentsCount() const {return _count_mand;} + int optionalArgumentsCount() const {return _count_opt;} + void setShortKeyPrefix(const PIString & prefix) {_prefix_short = prefix; needParse = true;} + void setFullKeyPrefix(const PIString & prefix) {_prefix_full = prefix; needParse = true;} + void setMandatoryArgumentsCount(const int count) {_count_mand = count; needParse = true;} + void setOptionalArgumentsCount(const int count) {_count_opt = count; needParse = true;} + +private: + struct Argument { + Argument() {has_value = found = false;} + Argument(const PIString & n, const PIChar & s, const PIString & f, bool v) {name = n; short_key = s; full_key = f; has_value = v; found = false;} + PIString name; + PIChar short_key; + PIString full_key; + PIString value; + bool has_value, found; + }; + + void parse(); + + PIString _prefix_short, _prefix_full; + PIStringList _args_raw, _args_mand, _args_opt; + PISet keys_full, keys_short; + PIVector _args; + int _count_mand, _count_opt; + bool needParse; + +}; + +#endif // PICLI_H diff --git a/src/core/picollection.cpp b/src/core/picollection.cpp new file mode 100755 index 00000000..d9fd72cd --- /dev/null +++ b/src/core/picollection.cpp @@ -0,0 +1,57 @@ +#include "picollection.h" + + +/** \class PICollection + * \brief Interface to discover element groups + * \details + * \section PICollection_sec0 Synopsis + * This class has only static functions so no need to create instance of the + * %PICollection. This class provide macros to add some classes or existing + * objects to global collection and access to them from any place of the code. + * \snippet picollection.cpp main + * */ + + +PIStringList PICollection::groups() { + PIStringList sl; + piForeachC (Group & g, *_groups) + sl << g.name; + return sl; +} + + +PIVector PICollection::groupElements(const PIString & group) { + piForeachC (Group & g, *_groups) + if (g.name == group) + return g.elements; + return PIVector(); +} + + +void PICollection::addToGroup(const PIString & group, const PIObject * element) { + //piCout << "add to" << group << element; + PIString n = element->className(); + piForeach (Group & g, *_groups) + if (g.name == group) { + for (int i = 0; i < g.elements.size_s(); ++i) + if (PIString(g.elements[i]->className()) == n) + return; + g.elements << element; + //piCout << "new group" << group << ", ok"; + return; + } + *_groups << Group(group); + _groups->back().elements << element; + //piCout << "new group" << group << ", ok"; +} + + +PICollection::CollectionAdder::CollectionAdder(const PIString & group, const PIObject * element, const PIString & name) { + if (element == 0) return; + const_cast(element)->setName(name); + PICollection::addToGroup(group, element); +} + + +bool __PICollectionInitializer::_inited_(false); +PIVector * PICollection::_groups; diff --git a/src/core/picollection.h b/src/core/picollection.h new file mode 100755 index 00000000..dc4b0cbb --- /dev/null +++ b/src/core/picollection.h @@ -0,0 +1,96 @@ +/*! \file picollection.h + * \brief Custom elements collection +*/ +/* + PIP - Platform Independent Primitives + Peer - named I/O ethernet node, forming self-organized peering network + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICOLLECTION_H +#define PICOLLECTION_H + +#include "piobject.h" + +#ifdef DOXYGEN + +/** \brief Add existing element "object" in group with name "group" + * \relatesalso PICollection + * \details If there is no group with name "group" it will be created. + * Only one element of the class "object" can be in group "group". If + * this is already exists nothing be happens. \n "object" should to + * be pointer to object based on PIObject. */ +# define ADD_TO_COLLECTION(group, object) + +/** \brief Add new element of class "class" in group with name "group" + * \relatesalso PICollection + * \details If there is no group with name "group" it will be created. + * Only one element of the class "class" can be in group "group". If + * this is already exists nothing be happens. \n "class" should to + * be name of the any class based on PIObject. */ +# define ADD_NEW_TO_COLLECTION(group, class) + +#else +# define ADD_TO_COLLECTION(group, object) static PICollection::CollectionAdder __##group##_##__LINE__##_##adder##__(#group, object); +# define ADD_TO_COLLECTION_WITH_NAME(group, object, name) static PICollection::CollectionAdder __##group##_##__LINE__##_##adder##__(#group, object, #name); +# define ADD_NEW_TO_COLLECTION(group, class) static PICollection::CollectionAdder __##group##_##class##_##adder##__(#group, new class()); +# define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name) static PICollection::CollectionAdder __##group##_##class##_##adder##__(#group, new class(), #name); +#endif + +class PIP_EXPORT PICollection +{ + friend class __PICollectionInitializer; +public: + PICollection() {;} + + //! \brief Returns all existing groups by their names + static PIStringList groups(); + + //! \brief Returns all elements of group "group" + static PIVector groupElements(const PIString & group); + + static void addToGroup(const PIString & group, const PIObject * element); + + class CollectionAdder { + public: + CollectionAdder(const PIString & group, const PIObject * element, const PIString & name = PIString()); + }; + +protected: + struct Group { + Group(const PIString & name_ = PIString()) {name = name_;} + //~Group() {piCout << "delete group" << name << this; piForeach (const PIObject * o, elements) delete o; elements.clear();} + PIString name; + PIVector elements; + }; + + static PIVector * _groups; + +}; + +class PIP_EXPORT __PICollectionInitializer { +public: + __PICollectionInitializer() { + if (_inited_) return; + _inited_ = true; + PICollection::_groups = new PIVector(); + } + static bool _inited_; +}; + +static __PICollectionInitializer __picollectioninitializer; + +#endif // PICOLLECTION_H diff --git a/src/core/picout.cpp b/src/core/picout.cpp new file mode 100644 index 00000000..e90f1a9f --- /dev/null +++ b/src/core/picout.cpp @@ -0,0 +1,348 @@ +/* + PIP - Platform Independent Primitives + Universal output to console class + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picout.h" +#include "piconsole.h" + +/*! \class PICout + * \brief Class for formatted output similar std::cout + * + * \section PICout_sec0 Synopsis + * This class provide many stream operators for output with some features. + * Output to PICout is thread-sequential, i.e. doesn`t mixed from parallel + * threads. + * + * \section PICout_sec1 Features + * - insertion spaces between entries + * - insertion new line at the end of output + * - strings are quoted + * - custom output operator can be easily written + * + * \section PICout_ex0 Usage + * \snippet picout.cpp 0 + * + * \section PICout_ex1 Writing your own output operator + * \snippet picout.cpp own + */ + +PIMutex __PICout_mutex__; +PIString __PICout_string__; + +#ifdef WINDOWS +void * PICout::hOut = 0; +WORD PICout::dattr = 0; +DWORD PICout::smode = 0; +#endif + +bool PICout::buffer_ = false; + + +PICout::PICout(PIFlags controls): fo_(true), cc_(false), fc_(false), cnb_(10), co_(controls) { +#ifdef WINDOWS + if (hOut == 0) { + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO sbi; + GetConsoleScreenBufferInfo(hOut, &sbi); + dattr = sbi.wAttributes; + } + attr_ = dattr; +#endif + __PICout_mutex__.lock(); +} + + +PICout::~PICout() { + if (fc_) applyFormat(PICoutManipulators::Default); + if (cc_) return; + newLine(); + __PICout_mutex__.unlock(); +} + + +PICout PICout::operator <<(const PICoutAction v) { +#ifdef WINDOWS + CONSOLE_SCREEN_BUFFER_INFO sbi; + COORD coord; + CONSOLE_CURSOR_INFO curinfo; +#endif + switch (v) { + case PICoutManipulators::Flush: + if (!PICout::buffer_) + std::cout << std::flush; + break; + case PICoutManipulators::Backspace: + if (!PICout::buffer_) { +#ifdef WINDOWS + GetConsoleScreenBufferInfo(hOut, &sbi); + coord = sbi.dwCursorPosition; + coord.X = piMax(0, int(coord.X) - 1); + SetConsoleCursorPosition(hOut, coord); + printf(" "); + SetConsoleCursorPosition(hOut, coord); +#else + printf("\e[1D \e[1D"); +#endif + } + break; + case PICoutManipulators::ShowCursor: + if (!PICout::buffer_) { +#ifdef WINDOWS + GetConsoleCursorInfo(hOut, &curinfo); + curinfo.bVisible = true; + SetConsoleCursorInfo(hOut, &curinfo); +#else + printf("\e[?25h"); +#endif + } + break; + case PICoutManipulators::HideCursor: + if (!PICout::buffer_) { +#ifdef WINDOWS + GetConsoleCursorInfo(hOut, &curinfo); + curinfo.bVisible = false; + SetConsoleCursorInfo(hOut, &curinfo); +#else + printf("\e[?25l"); +#endif + } + break; + case PICoutManipulators::ClearScreen: + if (!PICout::buffer_) { +#ifdef WINDOWS + /// TODO !!! + /*GetConsoleCursorInfo(hOut, &curinfo); + curinfo.bVisible = false; + SetConsoleCursorInfo(hOut, &curinfo); + + SetConsoleCursorPosition(hOut, ulcoord); + FillConsoleOutputAttribute(hOut, dattr, width * (height + 1), ulcoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width * (height + 1), ulcoord, &written);*/ +#else + printf("\e[H\e[J"); +#endif + } + break; + case PICoutManipulators::SaveContol: saveControl(); break; + case PICoutManipulators::RestoreControl: restoreControl(); break; + default: break; + }; + return *this; +} + + +#define PICOUTTOTARGET(v) {if (PICout::buffer_) __PICout_string__ << (v); else std::cout << (v);} +#define PINUMERICCOUT if (cnb_ == 10) PICOUTTOTARGET(v) else PICOUTTOTARGET(PIString::fromNumber(v, cnb_)) + + +PICout PICout::operator <<(const char * v) {if (v == '\0') return *this; space(); quote(); PICOUTTOTARGET(v) quote(); return *this;} + +PICout PICout::operator <<(const string & v) {space(); quote(); PICOUTTOTARGET(v) quote(); return *this;} + +PICout PICout::operator <<(const bool v) {space(); if (v) PICOUTTOTARGET("true") else PICOUTTOTARGET("false") return *this;} + +PICout PICout::operator <<(const char v) {space(); PICOUTTOTARGET(v) return *this;} + +PICout PICout::operator <<(const uchar v) {space(); if (cnb_ == 10) PICOUTTOTARGET(ushort(v)) else PICOUTTOTARGET(PIString::fromNumber(v, cnb_)) return *this;} + +PICout PICout::operator <<(const short int v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const ushort v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const int v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const uint v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const long v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const ulong v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const llong v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const ullong v) {space(); PINUMERICCOUT return *this;} + +PICout PICout::operator <<(const float v) {space(); PICOUTTOTARGET(v) return *this;} + +PICout PICout::operator <<(const double v) {space(); PICOUTTOTARGET(v) return *this;} + +PICout PICout::operator <<(const void * v) {space(); PICOUTTOTARGET("0x") PICOUTTOTARGET(PIString::fromNumber(ullong(v), 16)) return *this;} + +PICout PICout::operator <<(const PIObject * v) { + space(); + if (v == 0) PICOUTTOTARGET("PIObject*(0x0)") + else { + PICOUTTOTARGET(v->className()) + PICOUTTOTARGET("*(0x") + PICOUTTOTARGET(PIString::fromNumber(ullong(v), 16)) + PICOUTTOTARGET(", \"") + PICOUTTOTARGET(v->name()) + PICOUTTOTARGET("\")") + } + return *this; +} + +PICout PICout::operator <<(const PICoutSpecialChar v) { + switch (v) { + case Null: + if (PICout::buffer_) __PICout_string__ << PIChar(0); + else std::cout << char(0); + break; + case NewLine: + if (PICout::buffer_) __PICout_string__ << "\n"; + else std::cout << '\n'; + fo_ = true; + break; + case Tab: + if (PICout::buffer_) __PICout_string__ << "\t"; + else std::cout << '\t'; + break; + case Esc: +#ifdef CC_VC + if (PICout::buffer_) __PICout_string__ << PIChar(27); + else std::cout << char(27); +#else + if (PICout::buffer_) __PICout_string__ << "\e"; + else std::cout << '\e'; +#endif + break; + case Quote: + if (PICout::buffer_) __PICout_string__ << "\""; + else std::cout << '"'; + break; + }; + return *this; +} + +#undef PICOUTTOTARGET +#undef PINUMERICCOUT + +PICout & PICout::space() { + if (!fo_ && co_[AddSpaces]) { + if (PICout::buffer_) __PICout_string__ << " "; + else std::cout << ' '; + } + fo_ = false; + return *this; +} + +PICout & PICout::quote() { + if (co_[AddQuotes]) { + if (PICout::buffer_) __PICout_string__ << "\""; + else std::cout << '"'; + } + fo_ = false; + return *this; +} + +PICout & PICout::newLine() { + if (co_[AddNewLine]) { + if (PICout::buffer_) __PICout_string__ << "\n"; + else std::cout << std::endl; + } + fo_ = false; + return *this; +} + + +void PICout::applyFormat(PICoutFormat f) { + if (PICout::buffer_) return; + fc_ = true; +#ifdef WINDOWS + static int mask_fore = ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); + static int mask_back = ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); + switch (f) { + case Bin: case Oct: case Dec: case Hex: break; + case PICoutManipulators::Bold: attr_ |= FOREGROUND_INTENSITY; break; + case PICoutManipulators::Underline: attr_ |= COMMON_LVB_UNDERSCORE; break; + case PICoutManipulators::Black: attr_ = (attr_ & mask_fore); break; + case PICoutManipulators::Red: attr_ = (attr_ & mask_fore) | FOREGROUND_RED; break; + case PICoutManipulators::Green: attr_ = (attr_ & mask_fore) | FOREGROUND_GREEN; break; + case PICoutManipulators::Blue: attr_ = (attr_ & mask_fore) | FOREGROUND_BLUE; break; + case PICoutManipulators::Yellow: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN; break; + case PICoutManipulators::Magenta: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_BLUE; break; + case PICoutManipulators::Cyan: attr_ = (attr_ & mask_fore) | FOREGROUND_GREEN | FOREGROUND_BLUE; break; + case PICoutManipulators::White: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break; + case PICoutManipulators::BackBlack: attr_ = (attr_ & mask_back); break; + case PICoutManipulators::BackRed: attr_ = (attr_ & mask_back) | BACKGROUND_RED; break; + case PICoutManipulators::BackGreen: attr_ = (attr_ & mask_back) | BACKGROUND_GREEN; break; + case PICoutManipulators::BackBlue: attr_ = (attr_ & mask_back) | BACKGROUND_BLUE; break; + case PICoutManipulators::BackYellow: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN; break; + case PICoutManipulators::BackMagenta: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_BLUE; break; + case PICoutManipulators::BackCyan: attr_ = (attr_ & mask_back) | BACKGROUND_GREEN | BACKGROUND_BLUE; break; + case PICoutManipulators::BackWhite: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break; + case PICoutManipulators::Default: attr_ = dattr; break; + default: break; + } + SetConsoleTextAttribute(hOut, attr_); +#else + switch (f) { + case Bin: case Oct: case Dec: case Hex: break; + case PICoutManipulators::Bold: printf("\e[1m"); break; + case PICoutManipulators::Faint: printf("\e[2m"); break; + case PICoutManipulators::Italic: printf("\e[3m"); break; + case PICoutManipulators::Underline: printf("\e[4m"); break; + case PICoutManipulators::Blink: printf("\e[5m"); break; + case PICoutManipulators::Black: printf("\e[30m"); break; + case PICoutManipulators::Red: printf("\e[31m"); break; + case PICoutManipulators::Green: printf("\e[32m"); break; + case PICoutManipulators::Blue: printf("\e[34m"); break; + case PICoutManipulators::Yellow: printf("\e[33m"); break; + case PICoutManipulators::Magenta: printf("\e[35m"); break; + case PICoutManipulators::Cyan: printf("\e[36m"); break; + case PICoutManipulators::White: printf("\e[37m"); break; + case PICoutManipulators::BackBlack: printf("\e[40m"); break; + case PICoutManipulators::BackRed: printf("\e[41m"); break; + case PICoutManipulators::BackGreen: printf("\e[42m"); break; + case PICoutManipulators::BackBlue: printf("\e[44m"); break; + case PICoutManipulators::BackYellow: printf("\e[43m"); break; + case PICoutManipulators::BackMagenta: printf("\e[45m"); break; + case PICoutManipulators::BackCyan: printf("\e[46m"); break; + case PICoutManipulators::BackWhite: printf("\e[47m"); break; + case PICoutManipulators::Default: printf("\e[0m"); break; + default: break; + } +#endif +} + + +bool PICout::setBufferActive(bool on, bool clear) { + PIMutexLocker ml(__PICout_mutex__); + bool ret = PICout::buffer_; + if (clear) __PICout_string__.clear(); + PICout::buffer_ = on; + return ret; +} + + +bool PICout::isBufferActive() { + return PICout::buffer_; +} + + +PIString PICout::buffer(bool clear) { + PIMutexLocker ml(__PICout_mutex__); + PIString ret = __PICout_string__; + if (clear) __PICout_string__.clear(); + return ret; +} + + +void PICout::clearBuffer() { + PIMutexLocker ml(__PICout_mutex__); + __PICout_string__.clear(); +} diff --git a/src/core/picout.h b/src/core/picout.h new file mode 100644 index 00000000..0da3f595 --- /dev/null +++ b/src/core/picout.h @@ -0,0 +1,266 @@ +/*! \file picout.h + * \brief Universal output to console class +*/ +/* + PIP - Platform Independent Primitives + Universal output to console class + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICOUT_H +#define PICOUT_H + +#include "piincludes.h" + +#ifdef DOXYGEN + +//! \brief Macro used for conditional (piDebug) output to PICout +# define piCout + +//! \relatesalso PIObject \brief Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject +# define piCoutObj + +#else +# define piCout if (piDebug) PICout() +# define piCoutObj if (piDebug && debug()) PICout() << "" << (PIString("[") + className() + " \"" + name() + "\"]") +#endif + +extern PIMutex __PICout_mutex__; +extern PIString __PICout_string__; + +//! \brief Namespace contains enums controlled PICout +namespace PICoutManipulators { + + //! \brief Enum contains special characters + enum PIP_EXPORT PICoutSpecialChar { + Null /*! Null-character, '\\0' */, + NewLine /*! New line character, '\\n' */, + Tab /*! Tab character, '\\t' */, + Esc /*! Escape character, '\\e' */, + Quote /*! Quote character, '"' */ + }; + + //! \brief Enum contains immediate action + enum PIP_EXPORT PICoutAction { + Flush /*! Flush the output */, + Backspace /*! Remove last symbol */, + ShowCursor /*! Show cursor */, + HideCursor /*! Hide cursor */, + ClearScreen /*! Clear the screen */, + SaveContol /*! Save control flags, equivalent to \a saveControl() */, + RestoreControl /*! Restore control flags, equivalent to \a restoreControl() */ + }; + + //! \brief Enum contains control of PICout + enum PIP_EXPORT PICoutControl { + AddNone /*! No controls */ = 0x0, + AddSpaces /*! Spaces will be appear after each output */ = 0x1, + AddNewLine /*! New line will be appear after all output */ = 0x2, + AddQuotes /*! Each string will be quoted */ = 0x4, + AddAll /*! All controls */ = 0xFFFFFFFF + }; + + //! \brief Enum contains output format + enum PIP_EXPORT PICoutFormat { + Bin /*! Binary representation of integers */ = 0x01, + Oct /*! Octal representation of integers */ = 0x02, + Dec /*! Decimal representation of integers */ = 0x04, + Hex /*! Hexadecimal representation of integers */ = 0x08, + Bold /*! Bold */ = 0x10, + Faint /*! */ = 0x20, + Italic /*! */ = 0x40, + Underline /*! Underline */ = 0x80, + Blink /*! Blink */ = 0x100, + Black /*! Black font */ = 0x400, + Red /*! Red font */ = 0x800, + Green /*! Green font */ = 0x1000, + Blue /*! Blue font */ = 0x2000, + Yellow /*! Yellow font */ = 0x4000, + Magenta /*! Magenta font */ = 0x8000, + Cyan /*! Cyan font */ = 0x10000, + White /*! White font */ = 0x20000, + BackBlack /*! Black background */ = 0x40000, + BackRed /*! Red background */ = 0x80000, + BackGreen /*! Green background */ = 0x100000, + BackBlue /*! Blue background */ = 0x200000, + BackYellow /*! Yellow background */ = 0x400000, + BackMagenta /*! Magenta background */ = 0x800000, + BackCyan /*! Cyan background */ = 0x1000000, + BackWhite /*! White background */ = 0x2000000, + Default /*! Default format */ = 0x4000000 + }; +}; + +using namespace PICoutManipulators; + +typedef PIFlags PICoutControls; + +class PIP_EXPORT PICout { +public: + //! Default constructor with default features (AddSpaces and AddNewLine) + PICout(PIFlags controls = AddSpaces | AddNewLine); + + PICout(const PICout & other): fo_(other.fo_), cc_(true), fc_(false), cnb_(other.cnb_), attr_(other.attr_), co_(other.co_) {;} + ~PICout(); + + //! Output operator for strings with "const char * " type + PICout operator <<(const char * v); + + //! Output operator for strings with "std::string" type + PICout operator <<(const string & v); + + //! Output operator for boolean values + PICout operator <<(const bool v); + + //! Output operator for "char" values + PICout operator <<(const char v); + + //! Output operator for "unsigned char" values + PICout operator <<(const uchar v); + + //! Output operator for "short" values + PICout operator <<(const short v); + + //! Output operator for "unsigned short" values + PICout operator <<(const ushort v); + + //! Output operator for "int" values + PICout operator <<(const int v); + + //! Output operator for "unsigned int" values + PICout operator <<(const uint v); + + //! Output operator for "long" values + PICout operator <<(const long v); + + //! Output operator for "unsigned long" values + PICout operator <<(const ulong v); + + //! Output operator for "long long" values + PICout operator <<(const llong v); + + //! Output operator for "unsigned long long" values + PICout operator <<(const ullong v); + + //! Output operator for "float" values + PICout operator <<(const float v); + + //! Output operator for "double" values + PICout operator <<(const double v); + + //! Output operator for pointers + PICout operator <<(const void * v); + + //! Output operator for PIObject and ancestors + PICout operator <<(const PIObject * v); + + //! Output operator for \a PICoutSpecialChar values + PICout operator <<(const PICoutSpecialChar v); + + //! Output operator for \a PIFlags values + PICout operator <<(const PIFlags v) { + if (v[Bin]) cnb_ = 2; + if (v[Oct]) cnb_ = 8; + if (v[Dec]) cnb_ = 10; + if (v[Hex]) cnb_ = 16; + if (v[Bold]) applyFormat(Bold); + if (v[Faint]) applyFormat(Faint); + if (v[Italic]) applyFormat(Italic); + if (v[Underline]) applyFormat(Underline); + if (v[Blink]) applyFormat(Blink); + if (v[Black]) applyFormat(Black); + if (v[Red]) applyFormat(Red); + if (v[Green]) applyFormat(Green); + if (v[Blue]) applyFormat(Blue); + if (v[Yellow]) applyFormat(Yellow); + if (v[Magenta]) applyFormat(Magenta); + if (v[Cyan]) applyFormat(Cyan); + if (v[White]) applyFormat(White); + if (v[BackBlack]) applyFormat(BackBlack); + if (v[BackRed]) applyFormat(BackRed); + if (v[BackGreen]) applyFormat(BackGreen); + if (v[BackBlue]) applyFormat(BackBlue); + if (v[BackYellow]) applyFormat(BackYellow); + if (v[BackMagenta]) applyFormat(BackMagenta); + if (v[BackCyan]) applyFormat(BackCyan); + if (v[BackWhite]) applyFormat(BackWhite); + if (v[Default]) applyFormat(Default); + return *this; + } + + //! Output operator for \a PICoutFormat values + PICout operator <<(const PICoutFormat v) { + switch (v) { + case Bin: cnb_ = 2; break; + case Oct: cnb_ = 8; break; + case Dec: cnb_ = 10; break; + case Hex: cnb_ = 16; break; + default: applyFormat(v); + }; + return *this; + } + + //! Do some action + PICout operator <<(const PICoutAction v); + + //! Set control flag "c" is "on" state + PICout & setControl(PICoutControl c, bool on = true) {co_.setFlag(c, on); return *this;} + + //! Set control flags "c" and if "save" exec \a saveControl() + PICout & setControl(PICoutControls c, bool save = false) {if (save) saveControl(); co_ = c; return *this;} + + //! Save control flags to internal stack \sa \a restoreControl() + PICout & saveControl() {cos_.push(co_); return *this;} + + //! Restore control flags from internal stack \sa \a saveControl() + PICout & restoreControl() {if (!cos_.empty()) {co_ = cos_.top(); cos_.pop();} return *this;} + + /*! \brief Conditional put space character to output + * \details If it is not a first output and control \a AddSpaces is set + * space character is put \sa \a quote(), \a newLine() */ + PICout & space(); + + /*! \brief Conditional put quote character to output + * \details If control \a AddQuotes is set + * quote character is put \sa \a space(), \a newLine() */ + PICout & quote(); + + /*! \brief Conditional put new line character to output + * \details If control \a AddNewLine is set + * new line character is put \sa \a space(), \a quote() */ + PICout & newLine(); + + static bool setBufferActive(bool on, bool clear = false); + static bool isBufferActive(); + static PIString buffer(bool clear = false); + static void clearBuffer(); + +private: + void applyFormat(PICoutFormat f); + + static bool buffer_; + bool fo_, cc_, fc_; + int cnb_, attr_; + PICoutControls co_; + std::stack cos_; +#ifdef WINDOWS + static void * hOut; + static WORD dattr; + static DWORD smode; +#endif +}; + +#endif // PICOUT_H diff --git a/src/core/piflags.h b/src/core/piflags.h new file mode 100644 index 00000000..676fd9b4 --- /dev/null +++ b/src/core/piflags.h @@ -0,0 +1,137 @@ +/*! \file piflags.h + * \brief General flags class +*/ +/* + PIP - Platform Independent Primitives + General flags class + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIFLAGS_H +#define PIFLAGS_H + +#include "pimonitor.h" + +/*! \brief This class used as container for bit flags + * \details PIFlags is wrapper around \c "int". There are many + * bit-wise operators, native conversion to int and function + * to test flag. \n Example: + * \snippet piincludes.cpp flags + */ +template +class PIP_EXPORT PIFlags { +public: + //! Constructor with flags = 0 + PIFlags(): flags(0) {;} + //! Constructor with flags = Enum "e" + PIFlags(Enum e): flags(e) {;} + //! Constructor with flags = PIFlags "f" + PIFlags(const PIFlags & f): flags(f.flags) {;} + //! Constructor with flags = int "i" + PIFlags(const int i): flags(i) {;} + //! Set flags "f" to value "on" + PIFlags & setFlag(const PIFlags & f, bool on = true) {if (on) flags |= f.flags; else flags &= ~f.flags; return *this;} + //! Set flag "e" to value "on" + PIFlags & setFlag(const Enum & e, bool on = true) {if (on) flags |= e; else flags &= ~e; return *this;} + //! Set flag "i" to value "on" + PIFlags & setFlag(const int & i, bool on = true) {if (on) flags |= i; else flags &= ~i; return *this;} + //! copy operator + void operator =(const PIFlags & f) {flags = f.flags;} + //! copy operator + void operator =(const Enum & e) {flags = e;} + //! copy operator + void operator =(const int & i) {flags = i;} + //! compare operator + bool operator ==(const PIFlags & f) {return flags == f.flags;} + //! compare operator + bool operator ==(const Enum & e) {return flags == e;} + //! compare operator + bool operator ==(const int i) {return flags == i;} + //! compare operator + bool operator !=(const PIFlags & f) {return flags != f.flags;} + //! compare operator + bool operator !=(const Enum & e) {return flags != e;} + //! compare operator + bool operator !=(const int i) {return flags != i;} + //! compare operator + bool operator >(const PIFlags & f) {return flags > f.flags;} + //! compare operator + bool operator >(const Enum & e) {return flags > e;} + //! compare operator + bool operator >(const int i) {return flags > i;} + //! compare operator + bool operator <(const PIFlags & f) {return flags < f.flags;} + //! compare operator + bool operator <(const Enum & e) {return flags < e;} + //! compare operator + bool operator <(const int i) {return flags < i;} + //! compare operator + bool operator >=(const PIFlags & f) {return flags >= f.flags;} + //! compare operator + bool operator >=(const Enum & e) {return flags >= e;} + //! compare operator + bool operator >=(const int i) {return flags >= i;} + //! compare operator + bool operator <=(const PIFlags & f) {return flags <= f.flags;} + //! compare operator + bool operator <=(const Enum & e) {return flags <= e;} + //! compare operator + bool operator <=(const int i) {return flags <= i;} + //! Bit-wise AND operator + void operator &=(const PIFlags & f) {flags &= f.flags;} + //! Bit-wise AND operator + void operator &=(const Enum & e) {flags &= e;} + //! Bit-wise AND operator + void operator &=(const int i) {flags &= i;} + //! Bit-wise OR operator + void operator |=(const PIFlags & f) {flags |= f.flags;} + //! Bit-wise OR operator + void operator |=(const Enum & e) {flags |= e;} + //! Bit-wise OR operator + void operator |=(const int i) {flags |= i;} + //! Bit-wise XOR operator + void operator ^=(const PIFlags & f) {flags ^= f.flags;} + //! Bit-wise XOR operator + void operator ^=(const Enum & e) {flags ^= e;} + //! Bit-wise XOR operator + void operator ^=(const int i) {flags ^= i;} + //! Bit-wise AND operator + PIFlags operator &(PIFlags f) const {PIFlags tf(flags & f.flags); return tf;} + //! Bit-wise AND operator + PIFlags operator &(Enum e) const {PIFlags tf(flags & e); return tf;} + //! Bit-wise AND operator + PIFlags operator &(int i) const {PIFlags tf(flags & i); return tf;} + //! Bit-wise OR operator + PIFlags operator |(PIFlags f) const {PIFlags tf(flags | f.flags); return tf;} + //! Bit-wise OR operator + PIFlags operator |(Enum e) const {PIFlags tf(flags | e); return tf;} + //! Bit-wise OR operator + PIFlags operator |(int i) const {PIFlags tf(flags | i); return tf;} + //! Bit-wise XOR operator + PIFlags operator ^(PIFlags f) const {PIFlags tf(flags ^ f.flags); return tf;} + //! Bit-wise XOR operator + PIFlags operator ^(Enum e) const {PIFlags tf(flags ^ e); return tf;} + //! Bit-wise XOR operator + PIFlags operator ^(int i) const {PIFlags tf(flags ^ i); return tf;} + //! Test flag operator + bool operator [](Enum e) const {return (flags & e) == e;} + //! Implicity conversion to \c int + operator int() const {return flags;} +private: + int flags; +}; + +#endif // PIFLAGS_H diff --git a/src/core/piincludes.cpp b/src/core/piincludes.cpp new file mode 100755 index 00000000..ce8f04c0 --- /dev/null +++ b/src/core/piincludes.cpp @@ -0,0 +1,235 @@ +/* + PIP - Platform Independent Primitives + Global includes + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piincludes.h" +#include "piconsole.h" + +bool piDebug = true; +double piMountInfoRefreshIntervalMs = 10000.; + +lconv * currentLocale = +#ifdef ANDROID + 0; +#else + std::localeconv(); +#endif + +#ifdef MAC_OS +clock_serv_t __pi_mac_clock; +#endif + +#ifdef WINDOWS +FILETIME __pi_ftjan1970; +long long __pi_perf_freq = -1; +PINtSetTimerResolution setTimerResolutionAddr = 0; +#endif + +void errorClear() { +#ifdef WINDOWS + SetLastError(0); +#else + errno = 0; +#endif +} + +PIString errorString() { +#ifdef WINDOWS + char * msg; + int err = GetLastError(); + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msg, 0, NULL); + return "code " + itos(err) + " - " + string(msg); +#else + int e = errno; + return PIString("code ") + PIString::fromNumber(e) + " - " + PIString(strerror(e)); +#endif +} + +PIString PIPVersion() { + static PIString ret(PIString::fromNumber(PIP_VERSION_MAJOR) + "." + + PIString::fromNumber(PIP_VERSION_MINOR) + "." + + PIString::fromNumber(PIP_VERSION_REVISION) + + PIP_VERSION_SUFFIX); + return ret; +} + +/*! \class PICout + * \brief Class for formatted output similar std::cout + * + * \section PICout_sec0 Synopsis + * This class provide many stream operators for output with some features. + * Output to PICout is thread-sequential, i.e. doesn`t mixed from parallel + * threads. + * + * \section PICout_sec1 Features + * - insertion spaces between entries + * - insertion new line at the end of output + * - strings are quoted + * - custom output operator can be easily written + * + * \section PICout_ex0 Usage + * \snippet picout.cpp 0 + * + * \section PICout_ex1 Writing your own output operator + * \snippet picout.cpp own + */ + + +/*! \mainpage What is PIP + * PIP - Platform-Independent Primitives - is crossplatform library for C++ developers. + * It is wrap around STL and pure C++. This library can help developers write non-GUI + * projects much more quickly, efficiently and customizable than on pure C++. + * Library contains many classes, some of them are pure abstract, some classes + * can be used as they are, some classes should be inherited to new classes. + * PIP provide classes: + * * direct output to console (\a PICout) + * * containers (\a PIVector, \a PIList, \a PIMap, \a PIStack) + * * byte array (\a PIByteArray) + * * string (\a PIString, \a PIStringList) + * * base object (events and handlers) (\a PIObject) + * * thread (\a PIThread) + * * timer (\a PITimer) + * * console (information output) (\a PIConsole) + * * stand-alone + * * server + * * client + * * I/O devices + * * base class (\a PIIODevice) + * * file (\a PIFile) + * * serial port (\a PISerial) + * * ethernet (\a PIEthernet) + * * USB (\a PIUSB) + * * packets extractor (\a PIPacketExtractor) + * * binary log (\a PIBinaryLog) + * * complex I/O point (\a PIConnection) + * * connection quality diagnotic (\a PIDiagnostics) + * * command-line arguments parser (\a PICLI) + * * math evaluator (\a PIEvaluator) + * * peering net node (\a PIPeer) + * * process (\a PIProcess) + * * state machine (\a PIStateMachine) + * \n \n Basic using of PIP described at page \ref using_basic */ + + +/*! \page using_basic Getting started + * Many novice programmers are solved many common task with system integrity: output to console, + * keyboard buttons press detecting, working with serial ports, ethernet or files, and many other. + * These tasks can solve this library, and code, based only on PIP will be compile and work + * similar on many systems: Windows, any Linux, Red Hat, FreeBSD, MacOS X and QNX. + * Typical application on PIP looks like this: \n +\code{.cpp} +#include + + +// declare key press handler +void key_event(char key, void * ); + + +PIConsole console(false, key_event); // don`t start now, key handler is "key_event" + + +// some vars +int i = 2, j = 3; + + +// implicit key press handler +void key_event(char key, void * ) { + switch (key) { + case '-': + i--; + break; + case '+': + i++; + break; + case '(': + j--; + break; + case ')': + j++; + break; + }; +}; + + +class MainClass: public PITimer { + PIOBJECT(MainClass) +public: + MainClass() {} +protected: + void tick(void * data, int delimiter) { + piCout << "timer tick"; + // timer tick + } +}; + + +MainClass main_class; + + +int main(int argc, char * argv[]) { + // enabling auto-detection of exit button press, by default 'Q' (shift+q) + console.enableExitCapture(); + + // if we want to parse command-line arguments + PICLI cli(argc, argv); + cli.addArgument("console"); // "-c" or "--console" + cli.addArgument("debug"); // "-d" or "--debug" + + // enabling or disabling global debug flag + piDebug = cli.hasArgument("debug"); + + // configure console + console.addTab("first tab", '1'); + console.addString("PIP console", 1, PIConsole::Bold); + console.addVariable("int var (i)", &i, 1); + console.addVariable("int green var (j)", &j, 1, PIConsole::Green); + console.addString("'-' - i--", 2); + console.addString("'+' - i++", 2); + console.addString("'(' - j--", 2); + console.addString("')' - j++", 2); + console.addTab("second tab", '2'); + console.addString("col 1", 1); + console.addString("col 2", 2); + console.addString("col 3", 3); + console.setTab("first tab"); + + // start output to console if "console" argument exists + if (cli.hasArgument("console")) + console.start(); + + // start main class, e.g. 40 Hz + main_class.start(25.); + + // wait for 'Q' press, independently if console is started or not + console.waitForFinish(); + + return 0; +}; +\endcode + * This code demonstrates simple interactive configurable program, which can be started with console + * display or not, and with debug or not. \b MainClass is central class that also can be inherited from + * \a PIThread and reimplement \a run() function. + * \n Many PIP classes has events and event handlers, which can be connected one to another. + * Details you can see at \a PIObject reference page (\ref PIObject_sec0). + * \n To configure your program from file use \a PIConfig. + * \n If you want more information see \ref using_advanced */ + + +/*! \page using_advanced Advanced using + * Sorry, creativity crysis xD + */ diff --git a/src/core/piincludes.h b/src/core/piincludes.h new file mode 100755 index 00000000..2704f86c --- /dev/null +++ b/src/core/piincludes.h @@ -0,0 +1,538 @@ +/*! \file piincludes.h + * \brief Global includes of PIP + * + * This file include all needed system headers, STL + * and declare many useful macros and functions +*/ +/* + PIP - Platform Independent Primitives + Global includes + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIINCLUDES_H +#define PIINCLUDES_H + +#include "piversion.h" + +//! Version of PIP in hex - 0x##(Major)##(Minor)##(Revision) +#define PIP_VERSION ((PIP_VERSION_MAJOR << 16) | (PIP_VERSION_MINOR < 8) | PIP_VERSION_REVISION) + +#ifdef DOXYGEN + +//! Major value of PIP version +# define PIP_VERSION_MAJOR + +//! Minor value of PIP version +# define PIP_VERSION_MINOR + +//! Revision value of PIP version +# define PIP_VERSION_REVISION + +//! Suffix of PIP version +# define PIP_VERSION_SUFFIX + +//! Macro is defined when compile-time debug is enabled +# define PIP_DEBUG + +//! Macro is defined when host is any Windows +# define WINDOWS + +//! Macro is defined when host is QNX +# define QNX + +//! Macro is defined when host is FreeBSD +# define FREE_BSD + +//! Macro is defined when host is Mac OS +# define MAC_OS + +//! Macro is defined when host is Android +# define ANDROID + +//! Macro is defined when host is any Linux +# define LINUX + +//! Macro is defined when compiler is GCC or MinGW +# define CC_GCC + +//! Macro is defined when PIP is decided that host is support language +# define HAS_LOCALE + +//! Macro is defined when compiler is Visual Studio +# define CC_VC + +//! Macro is defined when compiler is unknown +# define CC_OTHER + +//! Macro is defined when PIP use "rt" library for timers implementation +# define PIP_TIMER_RT + +//! Define this macro to use STL implementation of containers, else PIP implementation will be used +# define PIP_CONTAINERS_STL + +#endif + +#include "piplatform.h" + +#include "pip_export.h" +#if defined(DOXYGEN) || defined(CC_GCC) || defined(PICODE) +# undef PIP_EXPORT +# define PIP_EXPORT +#endif +#include +#ifdef CC_GCC +# include +#endif +#include +#include +#ifndef QNX +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef WINDOWS +# include +# include +# include +# ifdef CC_VC +# define SHUT_RDWR 2 +# pragma comment(lib, "Ws2_32.lib") +# pragma comment(lib, "Iphlpapi.lib") +# pragma comment(lib, "Psapi.lib") +# else +# define SHUT_RDWR SD_BOTH +# endif +# include +# include +# include +# include + typedef int socklen_t; + typedef void(*PINtSetTimerResolution)(ULONG, BOOLEAN, PULONG); + extern FILETIME __pi_ftjan1970; + extern long long __pi_perf_freq; + extern PINtSetTimerResolution setTimerResolutionAddr; + inline long long __PIQueryPerformanceCounter() {LARGE_INTEGER li; QueryPerformanceCounter(&li); return li.QuadPart;} + inline void __PISetTimerResolution() {if (setTimerResolutionAddr == NULL) return; ULONG ret; setTimerResolutionAddr(1, TRUE, &ret);} +#else +# include +# include +# include +# include +# include +# include +# include +# include +# ifndef ANDROID +# include +# endif +#endif +#ifdef ANDROID +# define tcdrain(fd) ioctl(fd, TCSBRK, 1) + inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;} + inline int mbtowc(wchar_t * w, const char * c, size_t) {*w = ((wchar_t * )&c)[0]; return 1;} +#endif +#ifdef MAC_OS +# include +# include +# include +# include +# define environ (*_NSGetEnviron()) + typedef long time_t; + extern clock_serv_t __pi_mac_clock; +#endif +#ifdef LINUX +# define environ __environ +#endif +#if !defined(WINDOWS) && !defined(MAC_OS) +//# define PIP_TIMER_RT +#endif +#ifdef FREE_BSD + extern char ** environ; +#endif +#if defined(DOXYGEN) || defined(PICODE) +# undef PIP_EXPORT +# define PIP_EXPORT +# undef DEPRECATED +# define DEPRECATED +#endif + +#include "pimonitor.h" +#include "piflags.h" + +extern PIMonitor piMonitor; + +//! Macro used for infinite loop +#define FOREVER for (;;) + +//! Macro used for infinite wait +#define FOREVER_WAIT FOREVER msleep(1); + +//! Macro used for infinite wait +#define WAIT_FOREVER FOREVER msleep(1); + +using std::cout; +using std::cin; +using std::endl; +using std::flush; +using std::vector; +using std::list; +using std::queue; +using std::deque; +using std::stack; +using std::set; +using std::map; +using std::multimap; +using std::string; +using std::complex; +#ifndef QNX + using std::wstring; +#else + typedef std::basic_string wstring; +#endif + +typedef long long llong; +typedef unsigned char uchar; +typedef unsigned short int ushort; +typedef unsigned int uint; +typedef unsigned long ulong; +typedef unsigned long long ullong; +typedef long double ldouble; +typedef complex complexi; +typedef complex complexf; +typedef complex complexd; +typedef complex complexld; + +const complexld complexld_i(0., 1.); +const complexld complexld_0(0.); +const complexld complexld_1(1.); +const complexd complexd_i(0., 1.); +const complexd complexd_0(0.); +const complexd complexd_1(1.); + +/*! \brief Templated function for swap two values + * \details Example:\n \snippet piincludes.cpp swap */ +template inline void piSwap(T & f, T & s) {T t = f; f = s; s = t;} + +/*! \brief Templated function for swap two values without "=" + * \details Example:\n \snippet piincludes.cpp swapBinary */ +template inline void piSwapBinary(T & f, T & s) { + static size_t j = (sizeof(T) / sizeof(size_t)), bs = j * sizeof(size_t), bf = sizeof(T); + size_t i = 0; + for (i = 0; i < j; ++i) { + ((size_t*)(&f))[i] ^= ((size_t*)(&s))[i]; + ((size_t*)(&s))[i] ^= ((size_t*)(&f))[i]; + ((size_t*)(&f))[i] ^= ((size_t*)(&s))[i]; + } + for (i = bs; i < bf; ++i) { + ((uchar*)(&f))[i] ^= ((uchar*)(&s))[i]; + ((uchar*)(&s))[i] ^= ((uchar*)(&f))[i]; + ((uchar*)(&f))[i] ^= ((uchar*)(&s))[i]; + } +} + +/*! \brief Templated function return round of float falue + * \details Round is the nearest integer value \n + * There are some macros: + * - \c piRoundf for "float" + * - \c piRoundd for "double" + * + * Example: + * \snippet piincludes.cpp round */ +template inline int piRound(const T & v) {return int(v >= T(0.) ? v + T(0.5) : v - T(0.5));} + +/*! \brief Templated function return floor of float falue + * \details Floor is the largest integer that is not greater than value \n + * There are some macros: + * - \c piFloorf for "float" + * - \c piFloord for "double" + * + * Example: + * \snippet piincludes.cpp floor */ +template inline int piFloor(const T & v) {return v < T(0) ? int(v) - 1 : int(v);} + +/*! \brief Templated function return ceil of float falue + * \details Ceil is the smallest integer that is not less than value \n + * There are some macros: + * - \c piCeilf for "float" + * - \c piCeild for "double" + * + * Example: + * \snippet piincludes.cpp ceil */ +template inline int piCeil(const T & v) {return v < T(0) ? int(v) : int(v) + 1;} + +/*! \brief Templated function return absolute of numeric falue + * \details Absolute is the positive or equal 0 value \n + * There are some macros: + * - \c piAbss for "short" + * - \c piAbsi for "int" + * - \c piAbsl for "long" + * - \c piAbsll for "llong" + * - \c piAbsf for "float" + * - \c piAbsd for "double" + * + * Example: + * \snippet piincludes.cpp abs */ +template inline T piAbs(const T & v) {return (v >= T(0) ? v : -v);} + +/*! \brief Templated function return minimum of two values + * \details There are some macros: + * - \c piMins for "short" + * - \c piMini for "int" + * - \c piMinl for "long" + * - \c piMinll for "llong" + * - \c piMinf for "float" + * - \c piMind for "double" + * + * Example: + * \snippet piincludes.cpp min2 */ +template inline T piMin(const T & f, const T & s) {return ((f > s) ? s : f);} + +/*! \brief Templated function return minimum of tree values + * \details There are some macros: + * - \c piMins for "short" + * - \c piMini for "int" + * - \c piMinl for "long" + * - \c piMinll for "llong" + * - \c piMinf for "float" + * - \c piMind for "double" + * + * Example: + * \snippet piincludes.cpp min3 */ +template inline T piMin(const T & f, const T & s, const T & t) {return ((f < s && f < t) ? f : ((s < t) ? s : t));} + +/*! \brief Templated function return maximum of two values + * \details There are some macros: + * - \c piMaxs for "short" + * - \c piMaxi for "int" + * - \c piMaxl for "long" + * - \c piMaxll for "llong" + * - \c piMaxf for "float" + * - \c piMaxd for "double" + * + * Example: + * \snippet piincludes.cpp max2 */ +template inline T piMax(const T & f, const T & s) {return ((f < s) ? s : f);} + +/*! \brief Templated function return maximum of tree values + * \details There are some macros: + * - \c piMaxs for "short" + * - \c piMaxi for "int" + * - \c piMaxl for "long" + * - \c piMaxll for "llong" + * - \c piMaxf for "float" + * - \c piMaxd for "double" + * + * Example: + * \snippet piincludes.cpp max3 */ +template inline T piMax(const T & f, const T & s, const T & t) {return ((f > s && f > t) ? f : ((s > t) ? s : t));} + +/*! \brief Templated function return clamped value + * \details Clamped is the not greater than "max" and not lesser than "min" value \n + * There are some macros: + * - \c piClamps for "short" + * - \c piClampi for "int" + * - \c piClampl for "long" + * - \c piClampll for "llong" + * - \c piClampf for "float" + * - \c piClampd for "double" + * + * Example: + * \snippet piincludes.cpp clamp */ +template inline T piClamp(const T & v, const T & min, const T & max) {return (v > max ? max : (v < min ? min : v));} + +/// Function inverse byte order in memory block +inline void piLetobe(void * data, int size) { + for (int i = 0; i < size / 2; i++) + piSwap(((uchar*)data)[size - i - 1], ((uchar*)data)[i]); +} + +/// \brief Templated function that inverse byte order of value "v" +template inline void piLetobe(T * v) {piLetobe(v, sizeof(T));} + +/*! \brief Templated function that returns "v" with inversed byte order + * \details This function used to convert values between little and big endian \n + * There are some macros: + * - \c piLetobes for "ushort" + * - \c piLetobei for "uint" + * - \c piLetobel for "ulong" + * - \c piLetobell for "ullong" + * + * Example: + * \snippet piincludes.cpp letobe */ +template inline T piLetobe(const T & v) {T tv(v); piLetobe(&tv, sizeof(T)); return tv;} + +// specialization +template<> inline ushort piLetobe(const ushort & v) {return (v << 8) | (v >> 8);} +template<> inline uint piLetobe(const uint & v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);} + +DEPRECATED inline ushort letobe_s(const ushort & v) {return (v << 8) | (v >> 8);} +DEPRECATED inline uint letobe_i(const uint & v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);} + +#ifdef DOXYGEN + +/// \deprecated \brief Use \a piLetobe() instead of this function +ushort letobe_s(ushort v) {return (v << 8) | (v >> 8);} + +/// \deprecated \brief Use \a piLetobe() instead of this function +uint letobe_i(uint v) {return (v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | ((v << 24) & 0xFF000000);} + +#endif + +#define piRoundf piRound +#define piRoundd piRound +#define piFloorf piFloor +#define piFloord piFloor +#define piCeilf piCeil +#define piCeild piCeil +#define piAbss piAbs +#define piAbsi piAbs +#define piAbsl piAbs +#define piAbsll piAbs +#define piAbsf piAbs +#define piAbsd piAbs +#define piMins piMin +#define piMini piMin +#define piMinl piMin +#define piMinll piMin +#define piMinf piMin +#define piMind piMin +#define piMaxs piMax +#define piMaxi piMax +#define piMaxl piMax +#define piMaxll piMax +#define piMaxf piMax +#define piMaxd piMax +#define piClamps piClamp +#define piClampi piClamp +#define piClampl piClamp +#define piClampll piClamp +#define piClampf piClamp +#define piClampd piClamp +#define piLetobes piLetobe +#define piLetobei piLetobe +#define piLetobel piLetobe +#define piLetobell piLetobe + +class PIObject; +class PIMutex; +class PIString; +class PIInit; + +//! global variable enabling output to piCout, default is true +extern PIP_EXPORT bool piDebug; + +//! global variable that set minimum real update interval +//! for function PIInit::mountInfo(), default is 10000 ms +extern PIP_EXPORT double piMountInfoRefreshIntervalMs; + +extern lconv * currentLocale; + +#ifdef WINDOWS +inline int random() {return rand();} +# ifdef CC_VC +inline double round(const double & v) {return floor(v + 0.5);} +# endif +#endif +inline bool atob(const string & str) {return str == "1" ? true : false;} +inline string btos(const bool num) {return num ? "0" : "1";} +inline string itos(const int num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%d", num); +#else + sprintf_s(ch, 256, "%d", num); +#endif + return string(ch);} +inline string ltos(const long num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%ld", num); +#else + sprintf_s(ch, 256, "%ld", num); +#endif + return string(ch);} +inline string uitos(const uint num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%u", num); +#else + sprintf_s(ch, 256, "%u", num); +#endif + return string(ch);} +inline string ultos(const ulong num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%lu", num); +#else + sprintf_s(ch, 256, "%lu", num); +#endif + return string(ch);} +inline string ftos(const float num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%.8f", num); +#else + sprintf_s(ch, 256, "%.8f", num); +#endif + return string(ch);} +inline string dtos(const double num) { + char ch[256]; +#ifndef CC_VC + sprintf(ch, "%.8f", num); +#else + sprintf_s(ch, 256, "%.8f", num); +#endif + return string(ch);} + +/*! \fn errorString() + * \brief Return readable error description in format "code - " */ +PIString errorString(); + +void errorClear(); + +/// Return readable version of PIP +PIString PIPVersion(); + +#endif // PIINCLUDES_H diff --git a/src/core/piinit.cpp b/src/core/piinit.cpp new file mode 100644 index 00000000..3c8879d6 --- /dev/null +++ b/src/core/piinit.cpp @@ -0,0 +1,212 @@ +/* + PIP - Platform Independent Primitives + Initialization + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piplatform.h" +#include "piinit.h" +#include "pisignals.h" +#include "piobject.h" +#include "pisysteminfo.h" +#include "pidir.h" +#include "piprocess.h" +#ifdef WINDOWS +#else +# include +#endif + + +#ifdef HAS_LOCALE +static locale_t currentLocale_t = 0; +#endif + + +void __sighandler__(PISignals::Signal s) { + //piCout << Hex << int(s); + if (s == PISignals::StopTTYInput || s == PISignals::StopTTYOutput) + piMSleep(10); + if (s == PISignals::UserDefined1) + dumpApplicationToFile(PIDir::home().path() + PIDir::separator + "_PIP_DUMP_" + PIString::fromNumber(PIProcess::currentPID())); +} + + +PIInit::PIInit() { + PISystemInfo * sinfo = PISystemInfo::instance(); + sinfo->execDateTime = PIDateTime::current(); + PISignals::setSlot(__sighandler__); + PISignals::grabSignals(PISignals::UserDefined1); +#ifndef WINDOWS + PISignals::grabSignals(PISignals::StopTTYInput | PISignals::StopTTYOutput); + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss, SIGALRM); + sigprocmask(SIG_BLOCK, &ss, 0); + pthread_sigmask(SIG_BLOCK, &ss, 0); + signal(SIGPIPE, SIG_IGN); + PIStringList ifpathes; + ifpathes << "/bin/ifconfig" << "/sbin/ifconfig" << "/usr/bin/ifconfig" << "/usr/sbin/ifconfig"; + piForeachC (PIString & i, ifpathes) + if (fileExists(i)) { + sinfo->ifconfigPath = i; + piBreak; + } +#else + // OS version + DWORD dwVersion = GetVersion(); + DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); + sinfo->OS_version = PIString(dwMajorVersion) + "." + PIString(dwMinorVersion); + + // WinSock inint + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); + + // Timers init + SYSTEMTIME jan1970 = {1970, 1, 4, 1, 0, 14, 15, 0}; + SystemTimeToFileTime(&jan1970, &__pi_ftjan1970); + LARGE_INTEGER pf; + pf.QuadPart = -1; + if (QueryPerformanceFrequency(&pf) != 0) __pi_perf_freq = pf.QuadPart; + if (__pi_perf_freq == 0) __pi_perf_freq = -1; + + // Sleep precision init + ntlib = LoadLibrary("ntdll.dll"); + if (ntlib) setTimerResolutionAddr = (PINtSetTimerResolution)GetProcAddress(ntlib, "NtSetTimerResolution"); + /*if (setTimerResolution) setTimerResolutionAddr(1, TRUE, &prev_res);*/ +#endif + //piDebug = true; +#ifdef HAS_LOCALE + //cout << "has locale" << endl; + if (currentLocale_t != 0) { + freelocale(currentLocale_t); + currentLocale_t = 0; + } + currentLocale_t = newlocale(LC_ALL, setlocale(LC_ALL, ""), 0); +#else + setlocale(LC_ALL, ""); + setlocale(LC_NUMERIC, "C"); +#endif +#ifdef MAC_OS + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &__pi_mac_clock); +#endif + char cbuff[1024]; + memset(cbuff, 0, 1024); + if (gethostname(cbuff, 1023) == 0) + sinfo->hostname = cbuff; +#ifdef WINDOWS + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + sinfo->processorsCount = sysinfo.dwNumberOfProcessors; + switch (sysinfo.wProcessorArchitecture) { + case PROCESSOR_ARCHITECTURE_AMD64: sinfo->architecture = "x64"; break; + case PROCESSOR_ARCHITECTURE_ARM: sinfo->architecture = "ARM"; break; + case PROCESSOR_ARCHITECTURE_IA64: sinfo->architecture = "Intel Itanium-based"; break; + case PROCESSOR_ARCHITECTURE_INTEL: sinfo->architecture = "x86"; break; + case PROCESSOR_ARCHITECTURE_UNKNOWN: + default: sinfo->architecture = "unknown"; break; + } + int argc_(0); + wchar_t ** argv_ = CommandLineToArgvW(GetCommandLineW(), &argc_); + if (argc_ > 0 && argv_ != 0) + sinfo->execCommand = argv_[0]; + LocalFree(argv_); + memset(cbuff, 0, 1024); + ulong unlen = 1023; + if (GetUserName(cbuff, &unlen) != 0) + sinfo->user = cbuff; +#else + sinfo->processorsCount = piMaxi(1, int(sysconf(_SC_NPROCESSORS_ONLN))); + passwd * ps = getpwuid(getuid()); + if (ps) + sinfo->user = ps->pw_name; + else { + memset(cbuff, 0, 1024); + if (getlogin_r(cbuff, 1023) == 0) + sinfo->user = cbuff; + } + struct utsname uns; + if (uname(&uns) == 0) { + sinfo->OS_version = uns.release; + sinfo->architecture = uns.machine; + } +#endif + sinfo->OS_name = +#ifdef WINDOWS + "Windows"; +#else +# ifdef QNX + "QNX"; +# else +# ifdef MAC_OS + "MacOS"; +# else +# ifdef ANDROID + "Android"; +# else + uns.sysname; +# endif +# endif +# endif +#endif +} + + +PIInit::~PIInit() { +#ifdef WINDOWS + WSACleanup(); + //if (setTimerResolution) setTimerResolutionAddr(prev_res, TRUE, &prev_res); + if (ntlib) FreeLibrary(ntlib); + ntlib = 0; +#endif +#ifdef MAC_OS + mach_port_deallocate(mach_task_self(), __pi_mac_clock); +#endif + //if (currentLocale_t != 0) freelocale(currentLocale_t); +} + + +bool PIInit::fileExists(const PIString & p) { + FILE * f = fopen(p.data(), "r"); + if (f == 0) + return false; + fclose(f); + return true; +} + + + +int __PIInit_Initializer__::count_(0); +PIInit * __PIInit_Initializer__::__instance__(0); + + +__PIInit_Initializer__::__PIInit_Initializer__() { + count_++; + if (count_ > 1) return; + //piCout << "create PIInit"; + __instance__ = new PIInit(); +} + + +__PIInit_Initializer__::~__PIInit_Initializer__() { + count_--; + if (count_ > 1) return; + //piCout << "delete PIInit"; + if (__instance__ != 0) { + delete __instance__; + __instance__ = 0; + } +} diff --git a/src/core/piinit.h b/src/core/piinit.h new file mode 100644 index 00000000..07bccba1 --- /dev/null +++ b/src/core/piinit.h @@ -0,0 +1,56 @@ +/*! \file piinit.h + * \brief Initialization + * + * +*/ +/* + PIP - Platform Independent Primitives + Initialization + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIINIT_H +#define PIINIT_H + +#include "piincludes.h" + + +class __PIInit_Initializer__ { +public: + __PIInit_Initializer__(); + ~__PIInit_Initializer__(); + static int count_; + static PIInit * __instance__; +}; + + +class PIInit { +public: + PIInit(); + ~PIInit(); + static PIInit * instance() {return __PIInit_Initializer__::__instance__;} +private: + bool fileExists(const PIString & p); +#ifdef WINDOWS + HMODULE ntlib; + ULONG prev_res; +#endif +}; + +static __PIInit_Initializer__ __piinit_initializer__; + + +#endif // PIINIT_H diff --git a/src/core/piobject.cpp b/src/core/piobject.cpp new file mode 100755 index 00000000..a94341a6 --- /dev/null +++ b/src/core/piobject.cpp @@ -0,0 +1,417 @@ +/* + PIP - Platform Independent Primitives + Object, base class of some PIP classes, provide EVENT -> EVENT_HANDLER mechanism + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piobject.h" +#include "pifile.h" +#include "pisysteminfo.h" + + +/** \class PIObject + * \brief This is base class for any classes which use events -> handlers mechanism. + * \details + * \section PIObject_sec0 Events and Event handlers + * %PIObject provide notification mechanism similar Qt but implemented + * on language capabilities without any special preprocessors or compilers. + * Any class inherits PIObject should use macro \a PIOBJECT() immediate + * after declaration to proper compile. + * + * Event is a some abstract event that can be raised at any time. + * Event is a function but declared with special macro \a EVENT(). + * To raise event simply execute event function. + * + * Event handler is a function but declared with special macro + * \a EVENT_HANDLER(). You can use event handlers as ordinary functions. + * + * Main goal of this mechanism is perform abstract connections between + * various objects. This functionality provide macro \a CONNECT() which + * connect some event of first object to some event handler or event of + * second object. Each event can be connected any times to any event handlers. + * + * \image html events_handlers.png + * + * Example: \snippet piobject.cpp main + * Result: +\code{.cpp} +handler B: 2 , 0.5 +handler A: event to handler +handler A: event to event +\endcode + */ + + +PIVector PIObject::objects; +PIMutex PIObject::__eh_mutex; +PIMap PIObject::__eh_data; + + +PIString PIObject::__EHFunc::fullFormat() const { + PIString ret = type_ret + " " + scope + "::" + func_name +"("; + for (int i = 0; i < types.size_s(); ++i) { + if (i > 0) ret += ", "; + ret += types[i] + " " + names[i]; + } + ret += ")"; + return ret; +} + + +PIObject::PIObject(const PIString & name): _signature_(__PIOBJECT_SIGNATURE__), emitter_(0), thread_safe_(false) { + piMonitor.objects++; + setName(name); + setDebug(true); + objects << this; + //piCout << "new" << this; +} + + +PIObject::~PIObject() { + //piCout << "delete" << this; + piMonitor.objects--; + objects.removeAll(this); + piDisconnect(this); +} + + +void PIObject::piConnect(const PIString & src, const PIString & sig, void * dest, void * ev_h) { + PIObject * o = findByName(src); + if (o == 0) { + piCout << "[PIObject] Can`t find object with name \"" << src << "\"!"; + return; + } + PIMutexLocker _ml(o->mutex_connect); + o->connections << Connection(ev_h, 0, sig, (PIObject*)dest, dest); + ((PIObject*)dest)->connectors << o; +} + + +void PIObject::piConnect(PIObject * src, const PIString & sig, const PIString & dest, void * ev_h) { + PIObject * o = findByName(dest); + if (o == 0) { + piCout << "[PIObject] Can`t find object with name \"" << dest << "\"!"; + return; + } + PIMutexLocker _ml(o->mutex_connect); + src->connections << Connection(ev_h, 0, sig, o, o); + ((PIObject*)o)->connectors << src; +} + + +void PIObject::piConnect(const PIString & src, const PIString & sig, const PIString & dest, void * ev_h) { + PIObject * s = findByName(src); + if (s == 0) { + piCout << "[PIObject] Can`t find object with name \"" << src << "\"!"; + return; + } + PIObject * d = findByName(dest); + if (d == 0) { + piCout << "[PIObject] Can`t find object with name \"" << dest << "\"!"; + return; + } + PIMutexLocker _ml(s->mutex_connect); + s->connections << Connection(ev_h, 0, sig, d, d); + d->connectors << s; +} + +/* +PIStringList PIObject::events() { + PIStringList l; + for (PIMap::const_iterator i = signals_.begin(); i != signals_.end(); i++) + l << (*i).first; + return l; +} +*/ + +PIStringList PIObject::methodsEH() { + PIMutexLocker ml(__eh_mutex); + PIStringList ret; + __EHData & ehd(__eh_data[className()]); + piForeachC (__EHPair & eh, ehd.eh_func) + ret << eh.second.fullFormat(); + return ret; +} + + +bool PIObject::isMethodEHContains(const PIString & name) const { + PIMutexLocker ml(__eh_mutex); + __EHData & ehd(__eh_data[className()]); + piForeachC (__EHPair & eh, ehd.eh_func) + if (eh.second.func_name == name) + return true; + return false; +} + + +PIString PIObject::methodEHArguments(const PIString & name) const { + PIMutexLocker ml(__eh_mutex); + __EHData & ehd(__eh_data[className()]); + piForeachC (__EHPair & eh, ehd.eh_func) + if (eh.second.func_name == name) + return eh.second.arguments(); + return PIString(); +} + + +PIString PIObject::methodEHFullFormat(const PIString & name) const { + PIMutexLocker ml(__eh_mutex); + __EHData & ehd(__eh_data[className()]); + piForeachC (__EHPair & eh, ehd.eh_func) + if (eh.second.func_name == name) + return eh.second.fullFormat(); + return PIString(); +} + + +PIString PIObject::methodEHFromAddr(const void * addr) const { + return methodEH(addr).func_name; +} + + +PIVector PIObject::findEH(const PIString & name) const { + PIVector<__EHFunc> ret; + __EHData & ehd(__eh_data[className()]); + piForeachC (__EHPair & eh, ehd.eh_func) + if (eh.second.func_name == name) + ret << eh.second; + return ret; +} + + +PIObject::__EHFunc PIObject::methodEH(const void * addr) const { + PIMutexLocker ml(__eh_mutex); + return __eh_data[className()].eh_func.value(addr); +} + + +void PIObject::piConnect(PIObject * src, const PIString & sig, PIObject * dest_o, void * dest, void * ev_h, void * e_h, int args) { + //piCout << "piConnect ..."; + //piCout << "piConnect" << src << (void*)(dest) << sig; + //piCout << "piConnect" << src->className() << "->" << ((PIObject*)dest)->className(); + PIMutexLocker _ml(src->mutex_connect); + src->connections << Connection(ev_h, e_h, sig, dest_o, dest, args); + //piCout << "piConnect" << ((PIObject*)dest) << sig << ((PIObject*)dest)->connectors.size_s() << "..."; + //piCout << "addConnector" << dest_o << src; + dest_o->connectors << src; + //piCout << "piConnect" << ((PIObject*)dest) << sig << ((PIObject*)dest)->connectors.size_s(); + //piCout << "piConnect ok"; +} + + +bool PIObject::piConnectU(PIObject * src, const PIString & ename, PIObject * dest_o, void * dest, const PIString & hname) { + if (src == 0 || dest_o == 0 || dest == 0) return false; + PIMutexLocker ml(__eh_mutex); + PIVector<__EHFunc> m_src = src->findEH(ename), m_dest = dest_o->findEH(hname); + if (m_src.isEmpty()) { + piCout << "[piConnectU] Error: can`t find event \"" << ename << "\" in class \"" << src->className() << "\"!"; + return false; + } + if (m_dest.isEmpty()) { + piCout << "[piConnectU] Error: can`t find handler \"" << hname << "\" in class \"" << dest_o->className() << "\"!"; + return false; + } + void * addr_src(0), * addr_dest(0); + int args(0); + piForeachC (__EHFunc & fs, m_src) { + if (addr_src != 0) break; + piForeachC (__EHFunc & fd, m_dest) { + if (addr_src != 0) break; + if (fs.arguments().startsWith(fd.arguments()) || fd.arguments().isEmpty()) { + addr_src = fs.addr; + addr_dest = fd.addr; + args = fd.names.size_s(); + } + } + } + if (addr_src == 0) { + piCout << "[piConnectU] Error: can`t find suitable pair of event \"" << ename << "\" in class \"" << src->className() + << "\" and handler \"" << hname << "\" in class \"" << dest_o->className() << "\"!"; + return false; + } + //piCout << "connect" << ename << "->" << hname << "with" << args << "args"; + src->connections << PIObject::Connection(addr_dest, addr_src, ename, dest_o, dest, args); + dest_o->connectors << src; + return true; +} + + +void PIObject::piDisconnect(PIObject * src, const PIString & sig, PIObject * dest, void * ev_h) { + PIMutexLocker _ml(src->mutex_connect); + for (int i = 0; i < src->connections.size_s(); ++i) { + Connection & cc(src->connections[i]); + if (cc.event == sig && cc.dest_o == dest && cc.slot == ev_h) { + src->connections.remove(i); + i--; + } + } + ((PIObject*)dest)->updateConnectors(); +} + + +void PIObject::piDisconnect(PIObject * src, const PIString & sig, PIObject * dest) { + PIMutexLocker _ml(src->mutex_connect); + for (int i = 0; i < src->connections.size_s(); ++i) { + Connection & cc(src->connections[i]); + if (cc.event == sig && cc.dest_o == dest) { + src->connections.remove(i); + i--; + } + } + ((PIObject*)dest)->updateConnectors(); +} + + +void PIObject::piDisconnect(PIObject * src, const PIString & sig) { + PIMutexLocker _ml(src->mutex_connect); + for (int i = 0; i < src->connections.size_s(); ++i) { + Connection & cc(src->connections[i]); + if (cc.event == sig) { + PIObject * dest = cc.dest_o; + src->connections.remove(i); + i--; + dest->updateConnectors(); + } + } +} + + +void PIObject::piDisconnect(PIObject * src) { + PIMutexLocker _ml(src->mutex_connect); + PIVector cv = src->connectors.toVector(); + piForeach (PIObject * o, cv) { + if (o == src) continue; + PIVector & oc(o->connections); + for (int i = 0; i < oc.size_s(); ++i) { + //piCout << " check" << (void*)(oc[i].dest_o) << "==" << (void*)(src); + if (oc[i].dest_o == src) { + oc.remove(i); + --i; + } + } + } + piForeachC (PIObject::Connection & c, src->connections) + c.dest_o->connectors.remove(src); + src->connections.clear(); +} + + +void PIObject::updateConnectors() { + //piCout << "*** updateConnectors" << this; + connectors.clear(); + piForeach (PIObject * o, objects) { + if (o == this) continue; + PIVector & oc(o->connections); + piForeach (Connection & c, oc) + if (c.dest == this) + connectors << o; + } +} + + +bool PIObject::execute(const PIString & method) { + if (method.isEmpty()) return false; + PIVector<__EHFunc> ml = findEH(method); + piForeachC (__EHFunc & m, ml) { + if (!m.names.isEmpty()) continue; + ((void(*)(void*))m.addr)(this); + return true; + } + piCoutObj << "Error: can`t find event or handler \"" << (method + "()") << "\" to execute!"; + return false; +} + + + + +void PIObject::dump(const PIString & line_prefix) const { + //printf("dump %s \"%s\"\n", className(), name().data()); + PICout(AddNewLine) << line_prefix << "class " << className() << " (" << (const void*)this << ", \"" << name() << "\") {"; + PICout(AddNewLine) << line_prefix << " properties {"; + PICout(AddNewLine) << line_prefix << " count: " << properties_.size_s(); + //printf("dump %d properties\n", properties_.size()); + piForeachC (Property p, properties_) + if (p.first != "name") + PICout(AddNewLine) << line_prefix << " " << p.first << ": " << p.second; + //printf("dump %d properties ok\n", properties_.size()); + PICout(AddNewLine) << line_prefix << " }"; + PICout(AddNewLine) << line_prefix << " methodsEH {"; + __EHData & ehd(__eh_data[className()]); + PICout(AddNewLine) << line_prefix << " count: " << ehd.eh_func.size_s(); + //printf("dump %d methods\n", ehd.eh_func.size()); + piForeachC (__EHPair & eh, ehd.eh_func) { + PICout(AddNewLine) << line_prefix << " " << eh.second.fullFormat(); + } + //printf("dump %d methods ok\n", ehd.eh_func.size()); + PICout(AddNewLine) << line_prefix << " }"; + PICout(AddNewLine) << line_prefix << " connections {"; + PICout(AddNewLine) << line_prefix << " count: " << connections.size_s(); + //printf("dump %d connections\n",connections.size()); + piForeachC (Connection & c, connections) { + PIObject * dst = c.dest_o; + __EHFunc hf = dst->methodEH(c.slot); + __EHFunc ef = methodEH(c.signal); + if (hf.func_name.isEmpty()) hf.func_name = "[BROKEN]"; + else hf.func_name += "(" + hf.arguments() + ")"; + PIString src(c.event); + if (!ef.func_name.isEmpty()) + src = ef.func_name + "(" + ef.arguments() + ")"; + PICout(AddNewLine) << line_prefix << " " << src << " -> " << dst->className() << " (" << c.dest << ", \"" << dst->name() << "\")::" << hf.func_name; + } + //printf("dump %d connections ok\n",connections.size()); + PICout(AddNewLine) << line_prefix << " }"; + PICout(AddNewLine) << line_prefix << "}"; +} + + + + +void dumpApplication() { + //printf("dump application ...\n"); + PIDateTime cd = PIDateTime::current(); + PISystemInfo * pi = PISystemInfo::instance(); + PICout(AddNewLine) << "application {"; + PICout(AddNewLine) << " PIP version: " << PIPVersion(); + PICout(AddNewLine) << " processors: " << pi->processorsCount; + PICout(AddNewLine) << " hostname: \"" << pi->hostname << "\""; + PICout(AddNewLine) << " user: \"" << pi->user << "\""; + PICout(AddNewLine) << " exec command: \"" << pi->execCommand << "\""; + PICout(AddNewLine) << " started: " << pi->execDateTime.toString(); + PICout(AddNewLine) << " uptime, s: " << (cd.toSystemTime() - pi->execDateTime.toSystemTime()).toSeconds(); + PICout(AddNewLine) << " PIObjects {"; + PICout(AddNewLine) << " count: " << PIObject::objects.size_s(); + piForeachC (PIObject * o, PIObject::objects) + o->dump(" "); + PICout(AddNewLine) << " }"; + PICout(AddNewLine) << "}"; + //printf("dump application done\n"); +} + + +bool dumpApplicationToFile(const PIString & path) { + PIFile f(path + "_tmp"); + f.setName("__S__DumpFile"); + f.clear(); + if (!f.open(PIIODevice::WriteOnly)) return false; + bool ba = PICout::isBufferActive(); + PICout::setBufferActive(true, true); + dumpApplication(); + f << PICout::buffer(); + f.close(); + PICout::setBufferActive(ba, true); + PIFile::rename(path + "_tmp", path); + return true; +} diff --git a/src/core/piobject.h b/src/core/piobject.h new file mode 100755 index 00000000..51cb4bf8 --- /dev/null +++ b/src/core/piobject.h @@ -0,0 +1,733 @@ +/*! \file piobject.h + * \brief Base object + * + * This file declare PIObject class and associated macros +*/ +/* + PIP - Platform Independent Primitives + Object, base class of some PIP classes, provide EVENT -> EVENT_HANDLER mechanism + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIOBJECT_H +#define PIOBJECT_H + +#include "piinit.h" +#include "pivariant.h" +#include "pimutex.h" + + +#ifdef DOXYGEN + + +/// \relatesalso PIObject \brief you should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output +#define PIOBJECT(name) + +/// \relatesalso PIObject \brief you should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class +#define PIOBJECT_SUBCLASS(name, parent) + + +/// \relatesalso PIObject \brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name() +#define EVENT_HANDLER0(ret, name) ret name() + +/// \relatesalso PIObject \brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0) +#define EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0) + +/// \relatesalso PIObject \brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1) +#define EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1) + +/// \relatesalso PIObject \brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2) +#define EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2) ret name(type0 var0, type1 var1, type2 var2) + +/// \relatesalso PIObject \brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2, type3 var3) +#define EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) ret name(type0 var0, type1 var1, type2 var2, type3 var3) + +/// \relatesalso PIObject \brief EVENT_HANDLER is synonym of EVENT_HANDLER0 +#define EVENT_HANDLER EVENT_HANDLER0 + + +/// \relatesalso PIObject \brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name() +#define EVENT_VHANDLER0(ret, name) virtual ret name() + +/// \relatesalso PIObject \brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0) +#define EVENT_VHANDLER1(ret, name, type0, var0) virtual ret name(type0 var0) + +/// \relatesalso PIObject \brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1) +#define EVENT_VHANDLER2(ret, name, type0, var0, type1, var1) virtual ret name(type0 var0, type1 var1) + +/// \relatesalso PIObject \brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2) +#define EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2) virtual ret name(type0 var0, type1 var1, type2 var2) + +/// \relatesalso PIObject \brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3) +#define EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3) + +/// \relatesalso PIObject \brief EVENT_VHANDLER is synonym of EVENT_VHANDLER0 +#define EVENT_VHANDLER EVENT_VHANDLER0 + + +/// \relatesalso PIObject \brief declare event \"event\" with name \"name\", void name(); +#define EVENT0(name) void name(); + +/// \relatesalso PIObject \brief declare event \"event\" with name \"name\", void name(type0 var0); +#define EVENT1(name, type0, var0) void name(type0 var0); + +/// \relatesalso PIObject \brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1); +#define EVENT2(name, type0, var0, type1, var1) void name(type0 var0, type1 var1); + +/// \relatesalso PIObject \brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1, type2 var2); +#define EVENT3(name, type0, var0, type1, var1, type2, var2) void name(type0 var0, type1 var1, type2 var2); + +/// \relatesalso PIObject \brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1, type2 var2, type3 var3); +#define EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3) void name(type0 var0, type1 var1, type2 var2, type3 var3); + +/// \relatesalso PIObject \brief EVENT is synonym of EVENT0 +#define EVENT EVENT0 + + +#define RAISE_EVENT0(src, event) +#define RAISE_EVENT1(src, event, v0) +#define RAISE_EVENT2(src, event, v0, v1) +#define RAISE_EVENT3(src, event, v0, v1, v2) +#define RAISE_EVENT4(src, event, v0, v1, v2, v3) +#define RAISE_EVENT RAISE_EVENT0 + + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\". \"Event\" and \"handler\" must has equal argument lists. +#define CONNECTU(src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists +#define CONNECT0(ret, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists +#define CONNECT1(ret, type0, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists +#define CONNECT2(ret, type0, type1, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists +#define CONNECT3(ret, type0, type1, type2, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists +#define CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) + +/// \relatesalso PIObject \brief CONNECT is synonym of CONNECT0 +#define CONNECT CONNECT0 + + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists +#define WEAK_CONNECT0(ret, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists +#define WEAK_CONNECT1(ret, type0, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists +#define WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists +#define WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler) + +/// \relatesalso PIObject \brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists +#define WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) + +/// \relatesalso PIObject \brief WEAK_CONNECT is synonym of WEAK_CONNECT0 +#define WEAK_CONNECT WEAK_CONNECT0 + + +/// \relatesalso PIObject \brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" +#define DISCONNECT0(ret, src, event, dest, handler) + +/// \relatesalso PIObject \brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" +#define DISCONNECT1(ret, type0, src, event, dest, handler) + +/// \relatesalso PIObject \brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" +#define DISCONNECT2(ret, type0, type1, src, event, dest, handler) + +/// \relatesalso PIObject \brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" +#define DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler) + +/// \relatesalso PIObject \brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" +#define DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) + +/// \relatesalso PIObject \brief DISCONNECT is synonym of DISCONNECT0 +#define DISCONNECT DISCONNECT0 + + +/// \relatesalso PIObject \brief Returns pointer to events handler \"handler\" +#define HANDLER(handler) + + +#define PIOBJECT(name) +#define PIOBJECT_SUBCLASS(name) + + +#else + + +#define PIOBJECT(name) \ + protected: \ + typedef name __PIObject__; \ + static const PIString __classNameS() {return PIString(#name);} \ + public: \ + virtual const char * className() const {return #name;} \ + private: + +#define PIOBJECT_PARENT(name) \ + class __##name##_ParentInitializer__ { \ + public: \ + __##name##_ParentInitializer__() { \ + PIString pn(name::__classNameS()); \ + if (pn.isEmpty()) return; \ + PIMutexLocker ml(__eh_mutex); \ + if (__eh_data.contains(__classNameS())) return; \ + __eh_data[pn]; \ + __eh_data[__classNameS()]; \ + __EHData & ehp(__eh_data[pn]); \ + __EHData & eh(__eh_data[__classNameS()]); \ + eh.eh_set << ehp.eh_set; \ + eh.eh_func << ehp.eh_func; \ + } \ + }; \ + __##name##_ParentInitializer__ __##name##_parent_init__; \ + public: \ + virtual const char * superClassName() const {return #name;} \ + private: + +#define PIOBJECT_SUBCLASS(name, parent) PIOBJECT(name) PIOBJECT_PARENT(parent) + + +#define EH_INIT0(ret, name) \ + class __##name##0_Initializer__ { \ + public: \ + __##name##0_Initializer__() { \ + PIMutexLocker ml(__eh_mutex); \ + __EHData & eh(__eh_data[__classNameS()]); \ + void * fp = (void*)(ret(*)(void*))__stat_eh_##name##__; \ + if (eh.eh_set[fp]) return; \ + eh.eh_set << fp; \ + __EHFunc & f(eh.eh_func[fp]); \ + f.scope = __classNameS(); \ + f.func_name = #name; \ + f.addr = fp; \ + f.type_ret = #ret; \ + } \ + }; \ + __##name##0_Initializer__ __##name##0_init__; \ + +#define EH_INIT1(ret, name, a0, n0) \ + class __##name##1##n0##_Initializer__ { \ + public: \ + __##name##1##n0##_Initializer__() { \ + PIMutexLocker ml(__eh_mutex); \ + __EHData & eh(__eh_data[__classNameS()]); \ + void * fp = (void*)(ret(*)(void*, a0))__stat_eh_##name##__; \ + if (eh.eh_set[fp]) return; \ + eh.eh_set << fp; \ + __EHFunc & f(eh.eh_func[fp]); \ + f.scope = __classNameS(); \ + f.func_name = #name; \ + f.addr = fp; \ + f.type_ret = #ret; \ + f.types << #a0; \ + f.names << #n0; \ + } \ + }; \ + __##name##1##n0##_Initializer__ __##name##1##n0##_init__; \ + +#define EH_INIT2(ret, name, a0, n0, a1, n1) \ + class __##name##2##n0##n1##_Initializer__ { \ + public: \ + __##name##2##n0##n1##_Initializer__() { \ + PIMutexLocker ml(__eh_mutex); \ + __EHData & eh(__eh_data[__classNameS()]); \ + void * fp = (void*)(ret(*)(void*, a0, a1))__stat_eh_##name##__; \ + if (eh.eh_set[fp]) return; \ + eh.eh_set << fp; \ + __EHFunc & f(eh.eh_func[fp]); \ + f.scope = __classNameS(); \ + f.func_name = #name; \ + f.addr = fp; \ + f.type_ret = #ret; \ + f.types << #a0 << #a1; \ + f.names << #n0 << #n1; \ + } \ + }; \ + __##name##2##n0##n1##_Initializer__ __##name##2##n0##n1##_init__; \ + +#define EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \ + class __##name##3##n0##n1##n2##_Initializer__ { \ + public: \ + __##name##3##n0##n1##n2##_Initializer__() { \ + PIMutexLocker ml(__eh_mutex); \ + __EHData & eh(__eh_data[__classNameS()]); \ + void * fp = (void*)(ret(*)(void*, a0, a1, a2))__stat_eh_##name##__; \ + if (eh.eh_set[fp]) return; \ + eh.eh_set << fp; \ + __EHFunc & f(eh.eh_func[fp]); \ + f.scope = __classNameS(); \ + f.func_name = #name; \ + f.addr = fp; \ + f.type_ret = #ret; \ + f.types << #a0 << #a1 << #a2; \ + f.names << #n0 << #n1 << #n2; \ + } \ + }; \ + __##name##3##n0##n1##n2##_Initializer__ __##name##3##n0##n1##n2##_init__; \ + +#define EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \ + class __##name##4##n0##n1##n2##n3##_Initializer__ { \ + public: \ + __##name##4##n0##n1##n2##n3##_Initializer__() { \ + PIMutexLocker ml(__eh_mutex); \ + __EHData & eh(__eh_data[__classNameS()]); \ + void * fp = (void*)(ret(*)(void*, a0, a1, a2, a3))__stat_eh_##name##__; \ + if (eh.eh_set[fp]) return; \ + eh.eh_set << fp; \ + __EHFunc & f(eh.eh_func[fp]); \ + f.scope = __classNameS(); \ + f.func_name = #name; \ + f.addr = fp; \ + f.type_ret = #ret; \ + f.types << #a0 << #a1 << #a2 << #a3; \ + f.names << #n0 << #n1 << #n2 << #n3; \ + } \ + }; \ + __##name##4##n0##n1##n2##n3##_Initializer__ __##name##4##n0##n1##n2##n3##_init__; \ + + +#define EVENT_HANDLER0(ret, name) \ + EH_INIT0(ret, name) \ + static ret __stat_eh_##name##__(void * __o__) {return ((__PIObject__*)__o__)->name();} \ + ret name() + +#define EVENT_HANDLER1(ret, name, a0, n0) \ + EH_INIT1(ret, name, a0, n0) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0) {return ((__PIObject__*)__o__)->name(n0);} \ + ret name(a0 n0) + +#define EVENT_HANDLER2(ret, name, a0, n0, a1, n1) \ + EH_INIT2(ret, name, a0, n0, a1, n1) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) {return ((__PIObject__*)__o__)->name(n0, n1);} \ + ret name(a0 n0, a1 n1) + +#define EVENT_HANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \ + EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) {return ((__PIObject__*)__o__)->name(n0, n1, n2);} \ + ret name(a0 n0, a1 n1, a2 n2) + +#define EVENT_HANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \ + EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) {return ((__PIObject__*)__o__)->name(n0, n1, n2, n3);} \ + ret name(a0 n0, a1 n1, a2 n2, a3 n3) + +#define EVENT_HANDLER EVENT_HANDLER0 + + +#define EVENT_VHANDLER0(ret, name) \ + EH_INIT0(ret, name) \ + static ret __stat_eh_##name##__(void * __o__) {return ((__PIObject__*)__o__)->name();} \ + virtual ret name() + +#define EVENT_VHANDLER1(ret, name, a0, n0) \ + EH_INIT1(ret, name, a0, n0) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0) {return ((__PIObject__*)__o__)->name(n0);} \ + virtual ret name(a0 n0) + +#define EVENT_VHANDLER2(ret, name, a0, n0, a1, n1) \ + EH_INIT2(ret, name, a0, n0, a1, n1) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) {return ((__PIObject__*)__o__)->name(n0, n1);} \ + virtual ret name(a0 n0, a1 n1) + +#define EVENT_VHANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \ + EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) {return ((__PIObject__*)__o__)->name(n0, n1, n2);} \ + virtual ret name(a0 n0, a1 n1, a2 n2) + +#define EVENT_VHANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \ + EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \ + static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) {return ((__PIObject__*)__o__)->name(n0, n1, n2, n3);} \ + virtual ret name(a0 n0, a1 n1, a2 n2, a3 n3) + +#define EVENT_VHANDLER EVENT_VHANDLER0 + + +#define EVENT0(name) EVENT_HANDLER0(void, name) {PIObject::raiseEvent(this, #name);} +#define EVENT1(name, a0, n0) EVENT_HANDLER1(void, name, a0, n0) {PIObject::raiseEvent(this, #name, n0);} +#define EVENT2(name, a0, n0, a1, n1) EVENT_HANDLER2(void, name, a0, n0, a1, n1) {PIObject::raiseEvent(this, #name, n0, n1);} +#define EVENT3(name, a0, n0, a1, n1, a2, n2) EVENT_HANDLER3(void, name, a0, n0, a1, n1, a2, n2) {PIObject::raiseEvent(this, #name, n0, n1, n2);} +#define EVENT4(name, a0, n0, a1, n1, a2, n2, a3, n3) EVENT_HANDLER4(void, name, a0, n0, a1, n1, a2, n2, a3, n3) {PIObject::raiseEvent(this, #name, n0, n1, n2, n3);} +#define EVENT EVENT0 + +#define RAISE_EVENT0(src, event) (src)->event(); +#define RAISE_EVENT1(src, event, v0) (src)->event(v0); +#define RAISE_EVENT2(src, event, v0, v1) (src)->event(v0, v1); +#define RAISE_EVENT3(src, event, v0, v1, v2) (src)->event(v0, v1, v2); +#define RAISE_EVENT4(src, event, v0, v1, v2, v3) (src)->event(v0, v1, v2, v3); +#define RAISE_EVENT RAISE_EVENT0 + +#define CONNECTU(src, event, dest, handler) PIObject::piConnectU(src, #event, dest, dest, #handler); + +#define CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*))(&(src)->__stat_eh_##event##__), 0); +#define CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0))(&(src)->__stat_eh_##event##__), 1); +#define CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1))(&(src)->__stat_eh_##event##__), 2); +#define CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2))(&(src)->__stat_eh_##event##__), 3); +#define CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), (void*)(void(*)(void*, a0, a1, a2, a3))(&(src)->__stat_eh_##event##__), 4); +#define CONNECT CONNECT0 + +#define WEAK_CONNECT0(ret, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__), 0, 0); +#define WEAK_CONNECT1(ret, a0, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__), 0, 1); +#define WEAK_CONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__), 0, 2); +#define WEAK_CONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), 0, 3); +#define WEAK_CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piConnect(src, #event, dest, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), 0, 4); +#define WEAK_CONNECT WEAK_CONNECT0 + +#define DISCONNECT0(ret, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT1(ret, a0, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT2(ret, a0, a1, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT3(ret, a0, a1, a2, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1, a2))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) PIObject::piDisconnect(src, #event, dest, (void*)(ret(*)(void*, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__)); +#define DISCONNECT DISCONNECT0 + +#define HANDLER(handler) __stat_eh_##handler##__ + +#define __PIOBJECT_SIGNATURE__ 0xabcdbadc + +#endif + +typedef void (*Handler)(void * ); + +class PIP_EXPORT PIObject +{ + friend class PIObjectManager; + friend void dumpApplication(); +public: + + //! Contructs PIObject with name "name" + PIObject(const PIString & name = PIString()); + + virtual ~PIObject(); + +private: + uint _signature_; + +public: + + + //! Returns object name + PIString name() const {return property("name").toString();} + + //! Returns object class name + virtual const char * className() const {return "PIObject";} + + //! Returns object superclass name + virtual const char * superClassName() const {return "";} + + //! Return if debug of this object is active + bool debug() const {return property("debug").toBool();} + + + //! Set object name + void setName(const PIString & name) {setProperty("name", name);} + + //! Set object debug active + void setDebug(bool debug) {setProperty("debug", debug);} + + //! Returns properties of the object + const PIMap & properties() const {return properties_;} + + //! Returns properties count of the object + int propertiesCount() const {return properties_.size_s();} + + //! Returns property with name "name" + PIVariant property(const PIString & name) const {if (!properties_.contains(name)) return PIVariant(); return properties_.value(name);} + + //! Set property with name "name" to "value". If there is no such property in object it will be added + void setProperty(const PIString & name, const PIVariant & value) {properties_[name] = value; propertyChanged(name);} + + //! Returns if property with name "name" exists + bool isPropertyExists(const PIString & name) const {return properties_.contains(name);} + + void setThreadSafe(bool yes) {thread_safe_ = yes;} + bool isThreadSafe() const {return thread_safe_;} + + void dump(const PIString & line_prefix = PIString()) const; + + + PIStringList methodsEH(); + bool isMethodEHContains(const PIString & name) const; + PIString methodEHArguments(const PIString & name) const; + PIString methodEHFullFormat(const PIString & name) const; + PIString methodEHFromAddr(const void * addr) const; + + /* + template + static void piConnectU(PIObject * src, RS(*sig)(void*), PIObject * dest, RD(*slt)(void*), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + template + static void piConnectU(PIObject * src, RS(*sig)(void*,A0), PIObject * dest, RD(*slt)(void*,A0), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + template + static void piConnectU(PIObject * src, RS(*sig)(void*,A0,A1), PIObject * dest, RD(*slt)(void*,A0,A1), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + template + static void piConnectU(PIObject * src, RS(*sig)(void*,A0,A1,A2), PIObject * dest, RD(*slt)(void*,A0,A1,A2), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + template + static void piConnectU(PIObject * src, RS(*sig)(void*,A0,A1,A2,A3), PIObject * dest, RD(*slt)(void*,A0,A1,A2,A3), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + template + static void piConnectU(PIObject * src, RS(*sig)(void*,A0,A1,A2,A3,A4), PIObject * dest, RD(*slt)(void*,A0,A1,A2,A3,A4), PIString signame) { + src->connections << PIObject::Connection((void*)slt, (void*)sig, signame, dest); + } + */ + + // / Direct connect + static void piConnect(PIObject * src, const PIString & sig, PIObject * dest_o, void * dest, void * ev_h, void * e_h, int args); + static bool piConnectU(PIObject * src, const PIString & ename, PIObject * dest_o, void * dest, const PIString & hname); + + // / Through names and mixed + static void piConnect(const PIString & src, const PIString & sig, void * dest, void * ev_h); + static void piConnect(PIObject * src, const PIString & sig, const PIString & dest, void * ev_h); + static void piConnect(const PIString & src, const PIString & sig, const PIString & dest, void * ev_h); + + + static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest, void * ev_h); + static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest); + + //! Disconnect object "src" from all connections with event name "sig" + static void piDisconnect(PIObject * src, const PIString & sig); + + //! Disconnect object "src" from all connections, i.e. all connections where object "src" is emitter + static void piDisconnect(PIObject * src); + + // / Raise events + static void raiseEvent(PIObject * sender, const PIString & event) { + for (int j = 0; j < sender->connections.size_s(); ++j) { + Connection & i(sender->connections[j]); + if (i.event != event) continue; + //piCout << uint(i.dest) << uint(i.dest_o); + if (sender->thread_safe_) i.dest_o->mutex_.lock(); + i.dest_o->emitter_ = sender; + ((void( *)(void * ))i.slot)(i.dest); + i.dest_o->emitter_ = 0; + if (sender->thread_safe_) i.dest_o->mutex_.unlock(); + } + } + + template + static void raiseEvent(PIObject * sender, const PIString & event, const T0 & v0 = T0()) { + for (int j = 0; j < sender->connections.size_s(); ++j) { + Connection & i(sender->connections[j]); + if (i.event != event) continue; + if (sender->thread_safe_) i.dest_o->mutex_.lock(); + i.dest_o->emitter_ = sender; + if (i.args_count == 0) ((void(*)(void *))i.slot)(i.dest); + else ((void(*)(void * , T0))i.slot)(i.dest, v0); + i.dest_o->emitter_ = 0; + if (sender->thread_safe_) i.dest_o->mutex_.unlock(); + } + } + template + static void raiseEvent(PIObject * sender, const PIString & event, const T0 & v0 = T0(), const T1 & v1 = T1()) { + for (int j = 0; j < sender->connections.size_s(); ++j) { + Connection & i(sender->connections[j]); + if (i.event != event) continue; + if (sender->thread_safe_) i.dest_o->mutex_.lock(); + i.dest_o->emitter_ = sender; + switch (i.args_count) { + case 0: ((void(*)(void *))i.slot)(i.dest); break; + case 1: ((void(*)(void * , T0))i.slot)(i.dest, v0); break; + default: ((void(*)(void * , T0, T1))i.slot)(i.dest, v0, v1); break; + } + i.dest_o->emitter_ = 0; + if (sender->thread_safe_) i.dest_o->mutex_.unlock(); + } + } + template + static void raiseEvent(PIObject * sender, const PIString & event, const T0 & v0 = T0(), const T1 & v1 = T1(), const T2 & v2 = T2()) { + for (int j = 0; j < sender->connections.size_s(); ++j) { + Connection & i(sender->connections[j]); + if (i.event != event) continue; + if (sender->thread_safe_) i.dest_o->mutex_.lock(); + i.dest_o->emitter_ = sender; + switch (i.args_count) { + case 0: ((void(*)(void *))i.slot)(i.dest); break; + case 1: ((void(*)(void * , T0))i.slot)(i.dest, v0); break; + case 2: ((void(*)(void * , T0, T1))i.slot)(i.dest, v0, v1); break; + default: ((void(*)(void * , T0, T1, T2))i.slot)(i.dest, v0, v1, v2); break; + } + i.dest_o->emitter_ = 0; + if (sender->thread_safe_) i.dest_o->mutex_.unlock(); + } + } + template + static void raiseEvent(PIObject * sender, const PIString & event, const T0 & v0 = T0(), const T1 & v1 = T1(), const T2 & v2 = T2(), const T3 & v3 = T3()) { + for (int j = 0; j < sender->connections.size_s(); ++j) { + Connection & i(sender->connections[j]); + if (i.event != event) continue; + if (sender->thread_safe_) i.dest_o->mutex_.lock(); + i.dest_o->emitter_ = sender; + switch (i.args_count) { + case 0: ((void(*)(void *))i.slot)(i.dest); break; + case 1: ((void(*)(void * , T0))i.slot)(i.dest, v0); break; + case 2: ((void(*)(void * , T0, T1))i.slot)(i.dest, v0, v1); break; + case 3: ((void(*)(void * , T0, T1, T2))i.slot)(i.dest, v0, v1, v2); break; + default: ((void(*)(void * , T0, T1, T2, T3))i.slot)(i.dest, v0, v1, v2, v3); break; + } + i.dest_o->emitter_ = 0; + if (sender->thread_safe_) i.dest_o->mutex_.unlock(); + } + } + + /* + // / Raise events through manager + static void raiseEvent(const PIString & destObject, const PIString & name) { + PIObject * dest = findByName(destObject); + if (dest == 0) { + cout << "PIObject::piConnect: can`t find PIObject with \"" << destObject << "\" name!" << endl; + return; + } + raiseEvent(dest, name); + } + template + static void raiseEvent(const PIString & destObject, const PIString & name, const T0 & v0 = T0()) { + PIObject * dest = findByName(destObject); + if (dest == 0) { + cout << "PIObject::piConnect: can`t find PIObject with \"" << destObject << "\" name!" << endl; + return; + } + raiseEvent(dest, name, v0); + } + template + static void raiseEvent(const PIString & destObject, const PIString & name, const T0 & v0 = T0(), const T1 & v1 = T1()) { + PIObject * dest = findByName(destObject); + if (dest == 0) { + cout << "PIObject::piConnect: can`t find PIObject with \"" << destObject << "\" name!" << endl; + return; + } + raiseEvent(dest, name, v0, v1); + } + template + static void raiseEvent(const PIString & destObject, const PIString & name, const T0 & v0 = T0(), const T1 & v1 = T1(), const T2 & v2 = T2()) { + PIObject * dest = findByName(destObject); + if (dest == 0) { + cout << "PIObject::piConnect: can`t find PIObject with \"" << destObject << "\" name!" << endl; + return; + } + raiseEvent(name, dest, v0, v1, v2); + } + template + static void raiseEvent(const PIString & destObject, const PIString & name, const T0 & v0 = T0(), const T1 & v1 = T1(), const T2 & v2 = T2(), const T3 & v3 = T3()) { + PIObject * dest = findByName(destObject); + if (dest == 0) { + cout << "PIObject::piConnect: can`t find PIObject with \"" << destObject << "\" name!" << endl; + return; + } + raiseEvent(name,dest , v0, v1, v2, v3); + } + */ + + //! Returns PIObject* with name "name" or 0, if there is no object found + static PIObject * findByName(const PIString & name) { + piForeach (PIObject * i, PIObject::objects) { + if (i->name() != name) continue; + return i; + } + return 0; + }; + + bool isPIObject() const {return isPIObject(this);} + bool execute(const PIString & method); + static bool isPIObject(const PIObject * o) {return o->_signature_ == __PIOBJECT_SIGNATURE__;} + static bool isPIObject(const void * o) {return isPIObject((PIObject*)o);} + static bool execute(PIObject * o, const PIString & method) {return o->execute(method);} + static bool execute(void * o, const PIString & method) {return ((PIObject*)o)->execute(method);} + + struct __EHFunc { + __EHFunc(): addr(0) {;} + bool isNull() const {return addr == 0;} + PIString arguments() const {return types.join(",").removeAll(" ").removeAll("\t");} + PIString fullFormat() const; + void * addr; + PIString func_name; + PIString type_ret; + PIString scope; + PIStringList types; + PIStringList names; + }; + struct __EHData { + PISet eh_set; + PIMap eh_func; + }; + typedef PIPair __EHPair; + static PIMap __eh_data; + static PIMutex __eh_mutex; + +protected: + + //! Returns PIObject* which has raised an event. This value is correct only in definition of some event handler + PIObject * emitter() const {return emitter_;} + + //! Virtual function executes after property with name "name" has been changed + virtual void propertyChanged(const PIString & name) {} + + + static const PIString __classNameS() {return PIString();} \ + +private: + struct Connection { + Connection(void * sl = 0, void * si = 0, const PIString & e = PIString(), PIObject * d_o = 0, void * d = 0, int ac = 0) { + slot = sl; + signal = si; + event = e; + dest_o = d_o; + dest = d; + args_count = ac; + } + void * slot; + void * signal; + PIString event; + PIObject * dest_o; + void * dest; + int args_count; + }; + + PIVector<__EHFunc> findEH(const PIString & name) const; + __EHFunc methodEH(const void * addr) const; + void updateConnectors(); + + PIVector connections; + typedef PIPair Property; + PIMap properties_; + + static PIVector objects; + + PISet connectors; + PIMutex mutex_, mutex_connect; + PIObject * emitter_; + bool thread_safe_; + +}; + + +void dumpApplication(); +bool dumpApplicationToFile(const PIString & path); + +#endif // PIOBJECT_H diff --git a/src/core/pistatemachine.h b/src/core/pistatemachine.h new file mode 100755 index 00000000..2df7214a --- /dev/null +++ b/src/core/pistatemachine.h @@ -0,0 +1,334 @@ +/*! \file pistatemachine.h + * \brief Base class for custom state machine +*/ +/* + PIP - Platform Independent Primitives + State machine + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISTATEMACHINE_H +#define PISTATEMACHINE_H + +#include "piobject.h" + +/*! \brief Base class for custom state machine + * + * \section PIStateMachine_synopsis Synopsis + * This class provide functionality of state machine. + * You should inherit from this class, implement \a execution() + * and \a transition() functions, set rules and periodically + * call \a tick() function to proper work of machine. + * + * \section PIStateMachine_prepare Prepare for work + * %State machine operates with "state", "rule" and "condition". + * * "State" is some class (by default \c int), associated name and + * optional "handler" - pointer to function executed on every \a tick(); + * * "Rule" define rule of transition from one machine state to other. + * It is also has optional "handler"; + * * "Condition" is a part of rule and define possibility of transition. + * + * First of all you should define states of your machine by function + * \a addState(). Then you should define transition rules for machine + * by function \a addRule(). Finally you can set initial state by function + * \a setInitialState() and provide periodically execution of function + * \a tick(). + * + * \section PIStateMachine_principle Principle of work + * At any time the state machine is in some state. You can ask machine + * to enter in new state by function \a switchToState(). If all conditions + * done machine switch it state immediately, else machine remember request + * and will be try switch to the new state every tick. Successfull state + * switching execute function \a transition(), every tick execute + * function \a execution() with current state. On successfull transition + * if rule "handler" is not null it execute. Every \a tick() if current + * state "handler" is not null it execute. + * + * \section PIStateMachine_conditions Conditions + * Each rule has transition condition. Condition is array of pairs + * (string, number). It means that every condition by name "string" + * should be performed as least "number" times. Empty condition always + * permits transition. + * + * %State machine have current performed conditions. You can read this + * conditions by function \a currentConditions() and perform new + * conditions by functions \a performCondition() and \a performConditions(). + * Currend conditions can de erased by function \a resetConditions(). + * + * \section PIStateMachine_example Example + * This is simple example demonstrates all features: + * \snippet pistatemachine.cpp main +*/ +template +class PIP_EXPORT PIStateMachine: public PIObject +{ + PIOBJECT(PIStateMachine) +public: + //! Constructs an empty state machine + PIStateMachine(void * _parent = 0) {if (_parent == 0) parent_ = this; else parent_ = _parent; resetConditions();} + ~PIStateMachine() {;} + + //! %Condition is a pair (string, number) + typedef PIPair Condition; + + //! %Rule of transition between states of machine + struct Rule { + //! Constuctor + Rule() {handler = 0;} + //! Constuctor + Rule(Type f, Type t, const PIStringList & c = PIStringList(), Handler h = 0, bool at = false, bool rac = false) { + from = f; + to = t; + for (int i = 0; i < c.size_s(); ++i) + conditions << Condition(c[i], 1); + autoTransition = at; + resetAllConditions = rac; + handler = h; + } + //! Source state + Type from; + //! Destination state + Type to; + //! %Conditions of transition + PIVector conditions; + //! Automatic transition + bool autoTransition; + //! Reset or not all performed conditions of machine on transition + bool resetAllConditions; + //! Pointer to function executed on transition + Handler handler; + //! Add condition of transition + void addCondition(const PIString & name, int times = 1) {if (times > 0) conditions << Condition(name, times);} + bool operator ==(const Rule & other) const {return (from == other.from) && (to == other.to);} + bool operator !=(const Rule & other) const {return (from != other.from) || (to != other.to);} + }; + + //! %State of machine + struct State { + //! Constuctor + State() {handler = 0;} + //! Constuctor + State(Type v, const PIString & n = "", Handler h = 0) {value = v; name = n; handler = h;} + //! %State value + Type value; + //! %State name + PIString name; + //! Pointer to function executed on tick + Handler handler; + bool operator ==(const State & other) const {return value == other.value;} + bool operator !=(const State & other) const {return value != other.value;} + }; + + void * parent() const {return parent_;} + void setParent(void * parent) {parent_ = parent;} + + //! Add state of machine + void addState(Type value, const PIString & name = "", Handler handler = 0) {if (states_.contains(State(value, name))) return; states_ << State(value, name, handler);} + + //! States count + int statesCount() const {return states_.size_s();} + + //! Remove all states + void clearStates() {states_.clear();} + + + //! Add rule of transition + void addRule(Type from, Type to, const PIString & condition, Handler handler = 0, bool autoTransition = false, bool resetAllConditions = false) {if (rules_.contains(Rule(from, to))) return; rules_ << Rule(from, to, PIStringList(condition), handler, autoTransition, resetAllConditions);} + + //! Add rule of transition + void addRule(Type from, Type to, Handler handler, bool autoTransition = false, bool resetAllConditions = false) {if (rules_.contains(Rule(from, to))) return; rules_ << Rule(from, to, PIStringList(), handler, autoTransition, resetAllConditions);} + + //! Add rule of transition + void addRule(Type from, Type to, const PIStringList & conditions = PIStringList(), Handler handler = 0, bool autoTransition = false, bool resetAllConditions = false) {if (rules_.contains(Rule(from, to))) return; rules_ << Rule(from, to, conditions, handler, autoTransition, resetAllConditions);} + + //! Add rule of transition + void addRule(const Rule & rule) {if (rules_.contains(rule)) return; rules_ << rule;} + + //! Rules count + int rulesCount() const {return rules_.size_s();} + + //! Remove all rules + void clearRules() {rules_.clear();} + + + //! Setup initial state. \a reset() will set machine state to "value" + void setInitialState(Type value) { + for (int i = 0; i < states_.size_s(); ++i) + if (states_[i].value == value) { + init_ = state_ = states_[i]; + return; + } + } + + /** \brief Try to switch machine state to state "to" + * \details If there is rule of transition exists and this rule conditions + * is performed then machine switched to new state immediately. Otherwise machine + * will be try to enter to new state every \a tick(). + * \return \c true if state switched immediately, otherwise \c false */ + bool switchToState(Type to) { + switch_to = to; + for (int i = 0; i < rules_.size_s(); ++i) { + Rule & r(rules_[i]); + if ((r.from != state_.value) || (r.to != to)) continue; + if (!checkConditions(r)) continue; + State ts = findState(to); + if (r.handler != 0 && parent_ != 0) r.handler(parent_); + transition(state_, ts); + state_ = ts; + resetConditions(r); + return true; + } + return false; + } + + //! Reset machine state to initial and clear all conditions + void reset() {state_ = init_; resetConditions();} + + //! Returns current state of machine + const State & currentState() const {return state_;} + + + //! Reset all performed conditions + void resetConditions() {cond.clear(); cond_count = 0;} + + //! Reset performed condition with name "name" + void resetCondition(const PIString & name) { + for (int i = 0; i < cond.size_s(); ++i) + if (cond[i].first == name) { + cond.remove(i); + i--; + } + } + + //! Perform condition with name "name" "times" times. + void performCondition(const PIString & name, int times = 1) { + if (times <= 0) return; + for (int i = 0; i < cond.size_s(); ++i) + if (cond[i].first == name) { + cond[i].second += times; + return; + } + cond << Condition(name, times); + } + + //! Perform every condition with name from "names" one time. + void performConditions(const PIStringList & names) { + bool ok; + for (int n = 0; n < names.size_s(); ++n) { + ok = false; + for (int i = 0; i < cond.size_s(); ++i) { + if (cond[i].first == names[n]) { + cond[i].second++; + ok = true; + break; + } + } + if (ok) continue; + cond << Condition(names[n], 1); + } + } + + //! Returns all current performed conditions + const PIVector & currentConditions() const {return cond;} + + Type * currentState_ptr() {return &state_.value;} + int * conditionsCount_ptr() {cond_count = cond.size_s(); return &cond_count;} + +//! \handlers +//! \{ + + //! \fn void tick() + //! \brief Main function of machine. Execute \a execution() and check if need to switch state + + //! \fn void tick(void * data, int delim) + //! \brief Main function of machine. Execute \a execution() and check if need to switch state + +//! \} + + EVENT_HANDLER(void, tick) {tick(0, 0);} + EVENT_HANDLER2(void, tick, void * , data, int, delim) { + execution(state_); + if (state_.handler != 0 && parent_ != 0) state_.handler(parent_); + if (switch_to != state_.value) switchToState(switch_to); + else { + piForeachC (Rule & r, rules_) { + if (!r.autoTransition || r.from != state_.value) continue; + if (checkConditions(r)) { + switchToState(r.to); + break; + } + } + } + } + +protected: + + //! Reimplement this function to process current state of machine + virtual void execution(const State & state) {;} + + //! Reimplement this function to process switching current state of machine + virtual void transition(const State & from, const State & to) {;} + +private: + State findState(Type value) { + for (int i = 0; i < states_.size_s(); ++i) + if (states_[i].value == value) + return states_[i]; + return State(); + } + bool checkConditions(const Rule & rule) { + //if (cond.size_s() < rule.conditions.size_s()) return false; + int oc = 0; + for (int i = 0; i < cond.size_s(); ++i) { + PIString & rn(cond[i].first); + for (int j = 0; j < rule.conditions.size_s(); ++j) { + if (rn != rule.conditions[j].first) continue; + if (cond[i].second < rule.conditions[j].second) return false; + oc++; + } + } + return (rule.conditions.size_s() == oc); + } + void resetConditions(const Rule & rule) { + if (rule.resetAllConditions) { + cond.clear(); + return; + } + for (int i = 0; i < cond.size_s(); ++i) { + PIString & rn(cond[i].first); + for (int j = 0; j < rule.conditions.size_s(); ++j) { + if (rn != rule.conditions[j].first) continue; + cond[i].second -= rule.conditions[j].second; + if (cond[i].second <= 0) { + cond.remove(i); + i--; + } + } + } + } + + PIVector states_; + PIVector rules_; + State init_, state_; + Type switch_to; + void * parent_; + int cond_count; + PIVector cond; + +}; + + +#endif // PISTATEMACHINE_H diff --git a/src/core/pistring.cpp b/src/core/pistring.cpp new file mode 100755 index 00000000..9adb9a15 --- /dev/null +++ b/src/core/pistring.cpp @@ -0,0 +1,775 @@ +/* + PIP - Platform Independent Primitives + String + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pistring.h" + + +/*! \class PIString + * \brief String class + * \details PIP use this class for use string information. + * + * \section PIString_sec0 Synopsis + * This class based on \a PIVector to store information. + * String is a sequence of \a PIChar and can contain multibyte + * symbols. Therefore real memory size of string is symbols count * 4. + * String can be constucted from many types of data and can be converted + * to many types. There are man operators and handly functions to use + * string as you wish. + * + * \section PIString_sec1 To/from data convertions + * Most common constructor is \a PIString(const char * str), where "str" + * is null-terminated string, e.g. \c "string". This is 7 chars with last char = 0. + * Also you can constructs \a PIString from single \a PIChar, \a PIByteArray, + * other \a PIString or sequency of the same characters with custom length.\n \n + * This class has implicit conversions to const char * and + * \c std::string. Also there are functions to make same convertions: + * * \a data() - to const char * , + * * \a stdString() - to \c std::string, + * * \a toByteArray() - to \a PIByteArray. + * + * \section PIString_sec2 Numeric operations + * You can get symbolic representation of any numeric value with function + * \a setNumber(any integer value, int base = 10, bool * ok = 0). Default + * arguments are set for decimal base system, but you can choose any system + * from 2 to 40. There are the same static functions \a fromNumber(), that + * returns \a PIString. \n + * Also there is function \a setReadableSize() which is set human-readable + * size in bytes, Kb, Mb, Gb or Pb. Static analog is \a readableSize(). + * + */ + + +const char PIString::toBaseN[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^'}; +const int PIString::fromBaseN[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; + + +void PIString::appendFromChars(const char * c, int s) { + int sz; + wchar_t wc; + for (int i = 0; i < s; ++i) { + if (/*isascii(c[i])*/c[i] >= 0) { + push_back(PIChar(c[i])); + continue; + } + sz = mbtowc(&wc, &(c[i]), 4); + //cout << sz << endl; + switch (sz) { + case 4: + push_back(PIChar(*(int*)&(c[i]))); + i += 3; + continue; + case 3: + push_back(PIChar(*(int*)&(c[i]))); + back().ch &= 0xFFFFFF; + i += 2; + continue; + case 2: + push_back(PIChar(*(short * )&(c[i]))); + ++i; + continue; + default: + push_back(PIChar(c[i])); + break; + } + } +} + + +PIString & PIString::operator +=(const char * str) { + int l = 0; + while (str[l] != '\0') ++l; + appendFromChars(str, l); + return *this; +} + + +PIString & PIString::operator +=(const wchar_t * str) { + //cout << "wc" << endl; + int l = 0, sz; + char * c = new char[MB_CUR_MAX]; + while (str[l] != 0) ++l; + for (int i = 0; i < l; ++i) { + sz = wctomb(c, str[i]); + switch (sz) { + case 4: + push_back(PIChar(*(int*)c)); + continue; + case 3: + push_back(PIChar(*(int*)c)); + back().ch &= 0xFFFFFF; + continue; + case 2: + push_back(PIChar(*(short * )c)); + continue; + default: + push_back(PIChar(c[0])); + break; + } + } + delete[] c; + return *this; +} + + +#ifdef HAS_LOCALE +PIString & PIString::operator +=(const wstring & str) { + uint l = str.size(); + for (uint i = 0; i < l; ++i) push_back(str[i]); + return *this; +} +#endif + + +PIString & PIString::operator +=(const PIString & str) { + //uint l = str.size(); + *((PIDeque*)this) << *((PIDeque*)&str); + return *this; +} + +/* +#ifdef WINDOWS +PIString & PIString::operator +=(const WCHAR * str) { + int l = 0; + while (str[l] != 0) ++l; + for (int i = 0; i < l; ++i) + push_back(str[i]); + return *this; +} +#endif +*/ + +bool PIString::operator ==(const PIString & str) const { + uint l = str.size(); + if (size() != l) return false; + for (uint i = 0; i < l; ++i) + if (str[i] != at(i)) + return false; + return true; +} + + +bool PIString::operator !=(const PIString & str) const { + uint l = str.size(); + if (size() != l) return true; + for (uint i = 0; i < l; ++i) + if (str[i] != at(i)) + return true; + return false; +} + + +bool PIString::operator <(const PIString & str) const { + uint l = str.size(); + if (size() < l) return true; + if (size() > l) return false; + for (uint i = 0; i < l; ++i) { + if (str[i] == at(i)) continue; + if (str[i] < at(i)) return true; + else return false; + } + return false; +} + + +bool PIString::operator >(const PIString & str) const { + uint l = str.size(); + if (size() < l) return false; + if (size() > l) return true; + for (uint i = 0; i < l; ++i) { + if (str[i] == at(i)) continue; + if (str[i] < at(i)) return false; + else return true; + } + return false; +} + + +PIString PIString::mid(const int start, const int len) const { + //PIString str; + int s = start, l = len; + if (l == 0) return PIString(); + if (s < 0) { + l += s; + s = 0; + } + if (l < 0) { + //for (uint i = s; i < size(); ++i) + // str += at(i); + return PIString(&(at(s)), size() - s); + } else { + if (l > length() - s) + l = length() - s; + //for (int i = s; i < s + l; ++i) + // str += at(i); + return PIString(&(at(s)), l); + } + return PIString(); +} + + +PIString & PIString::cutMid(const int start, const int len) { + int s = start, l = len; + if (l == 0) return *this; + if (s < 0) { + l += s; + s = 0; + } + if (l < 0) + remove(s, size() - s); + else { + if (l > length() - s) + l = length() - s; + remove(s, l); + } + return *this; +} + + +PIString & PIString::trim() { + int st = 0, fn = 0; + for (int i = 0; i < length(); ++i) + if (at(i) != ' ' && at(i) != '\t' && at(i) != '\n' && at(i) != '\r' && at(i) != char(12)) + {st = i; break;} + for (int i = length() - 1; i >= 0; --i) + if (at(i) != ' ' && at(i) != '\t' && at(i) != '\n' && at(i) != '\r' && at(i) != char(12)) + {fn = i; break;} + //*this = mid(st, fn - st + 1); + if (fn < size_s() - 1) cutRight(size_s() - fn - 1); + if (st > 0) cutLeft(st); + return *this; +} + + +PIString PIString::trimmed() const { + int st = 0, fn = 0; + for (int i = 0; i < length(); ++i) + if (at(i) != ' ' && at(i) != '\t' && at(i) != '\n' && at(i) != '\r' && at(i) != char(12)) + {st = i; break;} + for (int i = length() - 1; i >= 0; --i) + if (at(i) != ' ' && at(i) != '\t' && at(i) != '\n' && at(i) != '\r' && at(i) != char(12)) + {fn = i; break;} + return mid(st, fn - st + 1); +} + + +PIString & PIString::replace(int from, int count, const PIString & with) { + if (count < length() - from) remove(from, count); + else remove(from, length() - from); + uint c = with.length(); + for (uint i = 0; i < c; ++i) insert(from + i, with[i]); + return *this; +} + + +PIString & PIString::replace(const PIString & what, const PIString & with, bool * ok) { + //piCout << "replace" << what << with; + if (what.isEmpty()) { + if (ok != 0) *ok = false; + return *this; + } + int s = find(what); + if (s >= 0) replace(s, what.length(), with); + if (ok != 0) *ok = (s >= 0); + return *this; +} + + +PIString & PIString::replaceAll(const PIString & what, const PIString & with) { + if (what.isEmpty() || what == with) return *this; + bool ok = true; + while (ok) replace(what, with, &ok); + return *this; +} + + +PIString & PIString::insert(int index, const PIString & str) { + //uint c = str.length(); + //for (uint i = 0; i < c; ++i) insert(index + i, str[i]); + PIDeque::insert(index, *((const PIDeque*)&str)); + return *this; +} + + +PIStringList PIString::split(const PIString & delim) const { + PIStringList sl; + if (isEmpty() || delim.isEmpty()) return sl; + PIString ts(*this); + int ci = ts.find(delim); + while (ci >= 0) { + sl << ts.left(ci); + ts.cutLeft(ci + delim.length()); + ci = ts.find(delim); + } + if (ts.length() > 0) sl << ts; + return sl; +} + + +int PIString::find(const char str, const int start) const { + for (int i = start; i < length(); ++i) + if (at(i) == str) + return i; + return -1; +} + + +int PIString::find(const PIString str, const int start) const { + int l = str.length(); + for (int i = start; i < length() - l + 1; ++i) + if (mid(i, l) == str) + return i; + return -1; +} + + +int PIString::findLast(const char str, const int start) const { + for (int i = length() - 1; i >= start; --i) + if (at(i) == str) + return i; + return -1; +} + + +int PIString::findLast(const PIString str, const int start) const { + int l = str.length(); + for (int i = length() - l; i >= start; --i) + if (mid(i, l) == str) + return i; + return -1; +} + + +int PIString::findWord(const PIString & word, const int start) const { + int f = start - 1, tl = length(), wl = word.length(); + while ((f = find(word, f + 1)) >= 0) { + bool ok = true; + PIChar c; + if (f > 0) {c = (*this)[f - 1]; if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r')) {ok = false; continue;}} + if (f + wl < tl) {c = (*this)[f + wl]; if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r')) {ok = false; continue;}} + if (ok) return f; + } + return -1; +} + + +int PIString::findCWord(const PIString & word, const int start) const { + int f = start - 1, tl = length(), wl = word.length(); + while ((f = find(word, f + 1)) >= 0) { + bool ok = true; + PIChar c; + if (f > 0) {c = (*this)[f - 1]; if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r' || (c != '_' && !c.isAlpha() && !c.isDigit()))) {ok = false; continue;}} + if (f + wl < tl) {c = (*this)[f + wl]; if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r' || (c != '_' && !c.isAlpha() && !c.isDigit()))) {ok = false; continue;}} + if (ok) return f; + } + return -1; +} + + +bool PIString::startsWith(const PIString & str) const { + if (size() < str.size()) return false; + return str == left(str.size()); +} + + +bool PIString::endsWith(const PIString & str) const { + if (size() < str.size()) return false; + return str == right(str.size()); +} + + +PIString PIString::takeSymbol() { + PIString ret; + int sz = size_s(), ss = -1; + for (int i = 0; i < sz; ++i) { + PIChar c = at(i); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') + continue; + ss = i; + break; + } + if (ss < 0) return ret; + ret = mid(ss, 1); + cutLeft(ss + 1); + return ret; +} + + +PIString PIString::takeWord() { + int sz = size_s(), ws = -1, we = -1; + for (int i = 0; i < sz; ++i) { + PIChar c = at(i); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + if (we < 0 && ws >= 0) { + we = i; + break; + } + } else { + if (ws < 0) ws = i; + if (we >= 0) break; + } + } + PIString ret = mid(ws, we - ws); + cutLeft(we < 0 ? sz : we); + return ret; +} + + +PIString PIString::takeCWord() { + PIString ret; + int sz = size_s(), ws = -1, we = -1; + for (int i = 0; i < sz; ++i) { + PIChar c = at(i); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + if (we < 0 && ws >= 0) { + we = i; + break; + } + } else { + if (ws < 0) { + if (c.isAlpha() || c == '_') + ws = i; + else + return ret; + } else { + if (!c.isAlpha() && !c.isDigit() && c != '_') { + we = i; + break; + } + } + if (we >= 0) break; + } + } + ret = mid(ws, we - ws); + cutLeft(we < 0 ? sz : we); + return ret; +} + + +PIString PIString::takeLine() { + int sz = size_s(), le = -1; + for (int i = 0; i < sz; ++i) { + PIChar c = at(i); + if (c == '\n') { + le = i; + break; + } + } + PIString ret = left(le); + if (!ret.isEmpty()) + if (ret.back() == '\r') + ret.cutRight(1); + cutLeft(le < 0 ? sz : le + 1); + return ret; +} + + +PIString PIString::takeNumber() { + PIString ret; + int sz = size_s(), ls = -1, le = -1, phase = 0; + for (int i = 0; i < sz; ++i) { + if (phase > 7) break; + PIChar c = at(i); + //piCout << "char " << c << "phase" << phase; + switch (phase) { + case 0: // trim + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') + continue; + phase = 7; + case 7: // sign + if (c == '-' || c == '+') {ls = i; phase = 1; break;} + case 1: // search start + if (c >= '0' && c <= '9') {le = i; if (ls < 0) ls = i; phase = 2; break;} + if (c == '.') {le = i; if (ls < 0) ls = i; phase = 3; break;} + phase = 9; + break; + case 2: // integer + if (c == '.') {le = i; phase = 3; break;} + if (c == 'e' || c == 'E') {le = i; phase = 4; break;} + if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || c == 'x') {le = i; break;} + phase = 6; + break; + case 3: // point + if (c == 'e' || c == 'E') {le = i; phase = 4; break;} + if (c >= '0' && c <= '9') {le = i; break;} + phase = 6; + break; + case 4: // exp + if ((c >= '0' && c <= '9') || c == '-' || c == '+') {le = i; phase = 5; break;} + phase = 6; + break; + case 5: // power + if (c >= '0' && c <= '9') {le = i; break;} + phase = 6; + break; + case 6: // suffix + if (c == 'f' || c == 's' || c == 'u' || c == 'l' || c == 'L') {le = i; break;} + phase = 9; + break; + } + if (phase == 6) { + if (c == 'f' || c == 's' || c == 'u' || c == 'l' || c == 'L') le = i; + else phase = 9; + } + } + //piCout << ls << le; + if (le < ls) return ret; + ret = mid(ls, le - ls + 1); + cutLeft(le + 1); + return ret; +} + + +PIString PIString::takeRange(const PIChar & start, const PIChar & end, const PIChar & shield) { + PIString ret; + bool trim_ = (start != ' ' && start != '\t' && start != '\n' && start != '\r'), eq = (start == end); + int sz = size_s(), ls = -1, le = -1, cnt = 0; + for (int i = 0; i < sz; ++i) { + PIChar c = at(i); + if (c == shield) {++i; continue;} + if (trim_) { + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') + continue; + trim_ = false; + } + if (eq) { + if (c == start) { + if (cnt == 0) ls = i; + else {le = i; cnt = 0; break;} + cnt++; + } + } else { + if (c == start) { + if (cnt == 0) ls = i; + cnt++; + } + if (c == end) { + cnt--; + if (cnt == 0) le = i; + } + } + if (cnt <= 0) break; + } + //piCout << ls << le << cnt; + if (le < ls || ls < 0 || le < 0 || cnt != 0) return ret; + ret = mid(ls + 1, le - ls - 1); + cutLeft(le + 1); + return ret; +} + + +PIString PIString::toUpperCase() const { + PIString str(*this); + int l = str.size(); + for (int i = 0; i < l; ++i) str[i] = str[i].toUpper(); + return str; +} + + +PIString PIString::toLowerCase() const { + PIString str(*this); + int l = str.size(); + for (int i = 0; i < l; ++i) str[i] = str[i].toLower(); + return str; +} + + +int PIString::lengthAscii() const { + int j = 0; + for (int i = 0; i < size_s(); ++i, ++j) + if (!at(i).isAscii()) ++j; + return j; +} + + +const char * PIString::data() const { + data_.clear(); + uint wc; + uchar tc; + //printf("PIString::data %d\n", size_s()); + for (int i = 0, j = 0; i < size_s(); ++i) { + wc = uint(at(i).toInt()); + //printf("__%d_%d\n", i, wc); + while (tc = wc & 0xFF, tc) { + data_.push_back(uchar(tc)); ++j; + wc >>= 8; + //printf("____%d\n", wc); + } + /*if (at(i).isAscii()) + data_.push_back(uchar(at(i).toAscii())); + else { + data_.push_back((at(i).toCharPtr()[0])); ++j; + data_.push_back((at(i).toCharPtr()[1])); + }*/ + } + data_.push_back(uchar('\0')); + return (const char * )data_.data(); +} + + +string PIString::convertToStd() const { + string s; + uint wc; + uchar tc; + if (size() > 0) { + for (int i = 0; i < length(); ++i) { + wc = uint(at(i).toInt()); + while (tc = wc & 0xFF, tc) { + s.push_back(char(tc)); + wc >>= 8; + } + /*if (at(i).isAscii()) + s.push_back(at(i).toAscii()); + else { + s.push_back(at(i).toCharPtr()[0]); + s.push_back(at(i).toCharPtr()[1]); + }*/ + } + } + return s; +} + + +char PIString::toChar() const { + PIString s(toNativeDecimalPoints()); + char v; + sscanf(s.data(), "%c", &v); + return v; +} + +/* +short PIString::toShort() const { + PIString s(trimmed().toLowerCase().toNativeDecimalPoints()); + short v; + if (s.left(2) == "0x") {sscanf(s.data(), "%hx", &v); return v;} + if (s.left(1) == "0") {sscanf(s.data(), "%ho", &v); return v;} + sscanf(s.data(), "%hd", &v); + return v; +} + + +int PIString::toInt() const { + PIString s(trimmed().toLowerCase().toNativeDecimalPoints()); + int v; + if (s.left(2) == "0x") {sscanf(s.data(), "%x", &v); return v;} + if (s.left(1) == "0") {sscanf(s.data(), "%o", &v); return v;} + sscanf(s.data(), "%d", &v); + return v; +} + + +long PIString::toLong() const { + PIString s(trimmed().toLowerCase().toNativeDecimalPoints()); + long v; + if (s.left(2) == "0x") {sscanf(s.data(), "%lx", &v); return v;} + if (s.left(1) == "0") {sscanf(s.data(), "%lo", &v); return v;} + sscanf(s.data(), "%ld", &v); + return v; +} + + +llong PIString::toLLong() const { + PIString s(trimmed().toLowerCase().toNativeDecimalPoints()); + llong v; + if (s.left(2) == "0x") {sscanf(s.data(), "%llx", &v); return v;} + if (s.left(1) == "0") {sscanf(s.data(), "%llo", &v); return v;} + sscanf(s.data(), "%lld", &v); + return v; +} +*/ + +PIString & PIString::setReadableSize(llong bytes) { + clear(); + if (bytes < 1024) {*this += (PIString::fromNumber(bytes) + " B"); return *this;} + double fres = bytes / 1024.; + llong res = bytes / 1024; + fres -= res; + if (res < 1024) {*this += (PIString::fromNumber(res) + "." + PIString::fromNumber(llong(fres * 10)).left(1) + " kB"); return *this;} + fres = res / 1024.; + res /= 1024; + fres -= res; + if (res < 1024) {*this += (PIString::fromNumber(res) + "." + PIString::fromNumber(llong(fres * 10)).left(1) + " MB"); return *this;} + fres = res / 1024.; + res /= 1024; + fres -= res; + if (res < 1024) {*this += (PIString::fromNumber(res) + "." + PIString::fromNumber(llong(fres * 10)).left(1) + " GB"); return *this;} + fres = res / 1024.; + res /= 1024; + fres -= res; + if (res < 1024) {*this += (PIString::fromNumber(res) + "." + PIString::fromNumber(llong(fres * 10)).left(1) + " TB"); return *this;} + fres = res / 1024.; + res /= 1024; + fres -= res; + *this += (PIString::fromNumber(res) + "." + PIString::fromNumber(llong(fres * 10)).left(1) + " PB"); + return *this; +} + + +inline char chrUpr(char c) { + if (c >= 'a' && c <= 'z') return c + 'A' - 'a'; + //if (c >= 'а' && c <= 'Ñ') return c + 'Ð' - 'а'; + return c; +} + + +inline char chrLwr(char c) { + if (c >= 'A' && c <= 'Z') return c + 'a' - 'A'; + //if (c >= 'Ð' && c <= 'Я') return c + 'а' - 'Ð'; + return c; +} + + + +PIStringList& PIStringList::removeDuplicates() { + PIStringList l; + PIString s; + bool ae; + for (int i = 0; i < size_s(); ++i) { + ae = false; + s = at(i); + for (int j = 0; j < l.size_s(); ++j) { + if (s != l[j]) continue; + ae = true; break; + } + if (!ae) { + l << s; + continue; + } + remove(i); + --i; + } + return *this; +} diff --git a/src/core/pistring.h b/src/core/pistring.h new file mode 100755 index 00000000..5812cfb6 --- /dev/null +++ b/src/core/pistring.h @@ -0,0 +1,916 @@ +/*! \file pistring.h + * \brief String + * + * This file declare string and string list classes +*/ +/* + PIP - Platform Independent Primitives + String + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISTRING_H +#define PISTRING_H + +#include "pibytearray.h" +#include "pichar.h" +#include "math.h" + +class PIStringList; + +class PIP_EXPORT PIString: public PIDeque +{ +public: + //! Contructs an empty string + PIString(): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--;} + + //inline PIString & operator +=(const char c) {push_back(c); return *this;} + PIString & operator +=(const PIChar & c) {push_back(c); return *this;} + PIString & operator +=(const char * str); + PIString & operator +=(const wchar_t * str); + PIString & operator +=(const string & str) {appendFromChars(str.c_str(), str.length()); return *this;} + PIString & operator +=(const PIByteArray & ba) {appendFromChars((const char * )ba.data(), ba.size_s()); return *this;} + PIString & operator +=(const PIString & str); +#ifdef HAS_LOCALE + PIString & operator +=(const wstring & str); +#endif + + //PIString(const char c) {*this += c;} + PIString(const PIString & o): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += o;} + + + //! Contructs string with single symbol "c" + PIString(const PIChar & c): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += c;} + PIString(const char c): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += PIChar(c);} + + /*! \brief Contructs string from c-string "str" + * \details "str" should be null-terminated\n + * Example: \snippet pistring.cpp PIString(char * ) */ + PIString(const char * str): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += str;} + + /*! \brief Contructs string from \c wchar_t c-string "str" + * \details "str" should be null-terminated\n + * Example: \snippet pistring.cpp PIString(wchar_t * ) */ + PIString(const wchar_t * str): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += str;} + + //! Contructs string from std::string "str" + PIString(const string & str): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += str;} + +#ifdef HAS_LOCALE + PIString(const wstring & str): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += str;} +#endif + + //! Contructs string from byte array "ba" + PIString(const PIByteArray & ba): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += ba;} + + //! \brief Contructs string from "len" characters of buffer "str" + PIString(const PIChar * str, const int len): PIDeque(str, size_t(len)) {/*reserve(256); */piMonitor.strings++; piMonitor.containers--;} + + /*! \brief Contructs string from "len" characters of buffer "str" + * \details Example: \snippet pistring.cpp PIString(char * , int) */ + PIString(const char * str, const int len): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this += string(str, len);} + + /*! \brief Contructs string as sequence of characters "c" of buffer with length "len" + * \details Example: \snippet pistring.cpp PIString(int, char) */ + PIString(const int len, const char c): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; for (int i = 0; i < len; ++i) push_back(c);} + + /*! \brief Contructs string as sequence of symbols "c" of buffer with length "len" + * \details Example: \snippet pistring.cpp PIString(int, PIChar) */ + PIString(const int len, const PIChar & c): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; for (int i = 0; i < len; ++i) push_back(c);} +/* +#ifdef WINDOWS + PIString(const WCHAR * str): PIDeque() {piMonitor.strings++; piMonitor.containers--; *this += str;} + PIString & operator +=(const WCHAR * str); + PIString & operator <<(const WCHAR * str) {*this += str; return *this;} +#endif +*/ + + PIString(const short & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const ushort & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const int & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const uint & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const long & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const ulong & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const llong & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const ullong & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const float & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + PIString(const double & value): PIDeque() {/*reserve(256); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} + + + //~PIString() {piMonitor.strings--; piMonitor.containers++;} + + + PIString & operator =(const PIString & o) {clear(); *this += o; return *this;} + + /*! \brief Return c-string representation of string + * \details Converts content of string to c-string and return + * pointer to first char. This buffer is valid until new convertion + * or execution \a data() or \a toByteArray().\n + * Example: \snippet pistring.cpp PIString::char* */ + operator const char*() {return data();} + + //! Return std::string representation of string + operator const string() {if (size() == 0) return string(); string s; for (int i = 0; i < length(); ++i) s.push_back(at(i).toAscii()); return s;} + + //! Return symbol at index "pos" + PIChar operator [](const int pos) const {return at(pos);} + + //! Return reference to symbol at index "pos" + PIChar & operator [](const int pos) {return at(pos);} + + //! Compare operator + bool operator ==(const PIString & str) const; + + //! Compare operator + bool operator ==(const PIChar c) const {return *this == PIString(c);} + //inline bool operator ==(const char c) const {return *this == PIString(c);} + + //! Compare operator + bool operator ==(const char * str) const {return *this == PIString(str);} + + //! Compare operator + bool operator ==(const string & str) const {return *this == PIString(str);} + + + //! Compare operator + bool operator !=(const PIString & str) const; + + //! Compare operator + bool operator !=(const PIChar c) const {return *this != PIString(c);} + //inline bool operator !=(const char c) const {return *this != PIString(c);} + + //! Compare operator + bool operator !=(const char * str) const {return *this != PIString(str);} + + //! Compare operator + bool operator !=(const string & str) const {return *this != PIString(str);} + + + //! Compare operator + bool operator <(const PIString & str) const; + + //! Compare operator + bool operator <(const PIChar c) const {return *this < PIString(c);} + //inline bool operator <(const char c) const {return *this < PIString(c);} + + //! Compare operator + bool operator <(const char * str) const {return *this < PIString(str);} + + //! Compare operator + bool operator <(const string & str) const {return *this < PIString(str);} + + + //! Compare operator + bool operator >(const PIString & str) const; + + //! Compare operator + bool operator >(const PIChar c) const {return *this > PIString(c);} + //inline bool operator >(const char c) const {return *this > PIString(c);} + + //! Compare operator + bool operator >(const char * str) const {return *this > PIString(str);} + + //! Compare operator + bool operator >(const string & str) const {return *this > PIString(str);} + + + //! Compare operator + bool operator <=(const PIString & str) const {return !(*this > str);} + + //! Compare operator + bool operator <=(const PIChar c) const {return *this <= PIString(c);} + //inline bool operator <=(const char c) const {return *this <= PIString(c);} + + //! Compare operator + bool operator <=(const char * str) const {return *this <= PIString(str);} + + //! Compare operator + bool operator <=(const string & str) const {return *this <= PIString(str);} + + + //! Compare operator + bool operator >=(const PIString & str) const {return !(*this < str);} + + //! Compare operator + bool operator >=(const PIChar c) const {return *this >= PIString(c);} + //inline bool operator >=(const char c) const {return *this >= PIString(c);} + + //! Compare operator + bool operator >=(const char * str) const {return *this >= PIString(str);} + + //! Compare operator + bool operator >=(const string & str) const {return *this >= PIString(str);} + + + operator bool() const {return toBool();} + operator short() const {return toShort();} + operator ushort() const {return toUShort();} + operator int() const {return toInt();} + operator uint() const {return toUInt();} + operator long() const {return toLong();} + operator ulong() const {return toULong();} + operator llong() const {return toLLong();} + operator ullong() const {return toULLong();} + operator float() const {return toFloat();} + operator double() const {return toDouble();} + + + /*! \brief Append string "str" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(PIString) */ + PIString & operator <<(const PIString & str) {*this += str; return *this;} + //inline PIString & operator <<(const char c) {*this += c; return *this;} + + /*! \brief Append symbol "c" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(PIChar) */ + PIString & operator <<(const PIChar & c) {*this += c; return *this;} + + /*! \brief Append c-string "str" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(char * ) */ + PIString & operator <<(const char * str) {*this += str; return *this;} + + /*! \brief Append \c wchar_t c-string "str" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(wchar_t * ) */ + PIString & operator <<(const wchar_t * str) {*this += str; return *this;} + + //! Append std::string "str" at the end of string + PIString & operator <<(const string & str) {*this += str; return *this;} + + /*! \brief Append string representation of "num" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(int) */ + PIString & operator <<(const int & num) {*this += PIString::fromNumber(num); return *this;} + PIString & operator <<(const uint & num) {*this += PIString::fromNumber(num); return *this;} + + /*! \brief Append string representation of "num" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(int) */ + PIString & operator <<(const short & num) {*this += PIString::fromNumber(num); return *this;} + PIString & operator <<(const ushort & num) {*this += PIString::fromNumber(num); return *this;} + + /*! \brief Append string representation of "num" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(int) */ + PIString & operator <<(const long & num) {*this += PIString::fromNumber(num); return *this;} + PIString & operator <<(const ulong & num) {*this += PIString::fromNumber(num); return *this;} + + PIString & operator <<(const llong & num) {*this += PIString::fromNumber(num); return *this;} + PIString & operator <<(const ullong & num) {*this += PIString::fromNumber(num); return *this;} + + /*! \brief Append string representation of "num" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(int) */ + PIString & operator <<(const float & num) {*this += PIString::fromNumber(num); return *this;} + + /*! \brief Append string representation of "num" at the end of string + * \details Example: \snippet pistring.cpp PIString::<<(int) */ + PIString & operator <<(const double & num) {*this += PIString::fromNumber(num); return *this;} + + + //! \brief Insert string "str" at the begin of string + PIString & prepend(const PIString & str) {insert(0, str); return *this;} + + //! \brief Insert string "str" at the end of string + PIString & append(const PIString & str) {*this += str; return *this;} + + + /*! \brief Return part of string from symbol at index "start" and maximum length "len" + * \details All variants demonstrated in example: \snippet pistring.cpp PIString::mid + * \sa \a left(), \a right() */ + PIString mid(const int start, const int len = -1) const; + + /*! \brief Return part of string from left and maximum length "len" + * \details Example: \snippet pistring.cpp PIString::left + * \sa \a mid(), \a right() */ + PIString left(const int len) const {return len <= 0 ? PIString() : mid(0, len);} + + /*! \brief Return part of string from right and maximum length "len" + * \details Example: \snippet pistring.cpp PIString::right + * \sa \a mid(), \a left() */ + PIString right(const int len) const {return len <= 0 ? PIString() : mid(size() - len, len);} + + /*! \brief Remove part of string from symbol as index "start" and maximum length "len" + * and return this string + * \details All variants demonstrated in example: \snippet pistring.cpp PIString::cutMid + * \sa \a cutLeft(), \a cutRight() */ + PIString & cutMid(const int start, const int len); + + /*! \brief Remove part of string from left and maximum length "len" and return this string + * \details Example: \snippet pistring.cpp PIString::cutLeft + * \sa \a cutMid(), \a cutRight() */ + PIString & cutLeft(const int len) {return len <= 0 ? *this : cutMid(0, len);} + + /*! \brief Remove part of string from right and maximum length "len" and return this string + * \details Example: \snippet pistring.cpp PIString::cutRight + * \sa \a cutMid(), \a cutLeft() */ + PIString & cutRight(const int len) {return len <= 0 ? *this : cutMid(size() - len, len);} + + /*! \brief Remove spaces at the start and at the end of string and return this string + * \details Example: \snippet pistring.cpp PIString::trim + * \sa \a trimmed() */ + PIString & trim(); + + /*! \brief Return copy of this string without spaces at the start and at the end + * \details Example: \snippet pistring.cpp PIString::trimmed + * \sa \a trim() */ + PIString trimmed() const; + + /*! \brief Replace part of string from index "from" and maximum length "len" + * with string "with" and return this string + * \details Example: \snippet pistring.cpp PIString::replace_0 + * \sa \a replaced(), \a replaceAll() */ + PIString & replace(const int from, const int count, const PIString & with); + + /*! \brief Replace part copy of this string from index "from" and maximum length "len" + * with string "with" and return copied string + * \details Example: \snippet pistring.cpp PIString::replaced_0 + * \sa \a replace(), \a replaceAll() */ + PIString replaced(const int from, const int count, const PIString & with) const {PIString str(*this); str.replace(from, count, with); return str;} + + /*! \brief Replace first founded substring "what" with string "with" and return this string + * \details If "ok" is not null, it set to "true" if something was replaced\n + * Example: \snippet pistring.cpp PIString::replace_1 + * \sa \a replaced(), \a replaceAll() */ + PIString & replace(const PIString & what, const PIString & with, bool * ok = 0); + + /*! \brief Replace first founded substring "what" with string "with" and return copied string + * \details If "ok" is not null, it set to "true" if something was replaced\n + * Example: \snippet pistring.cpp PIString::replaced_1 + * \sa \a replaced(), \a replaceAll() */ + PIString replaced(const PIString & what, const PIString & with, bool * ok = 0) const {PIString str(*this); str.replace(what, with, ok); return str;} + + /*! \brief Replace all founded substrings "what" with strings "with" and return this string + * \details Example: \snippet pistring.cpp PIString::replaceAll + * \sa \a replace(), \a replaced() */ + PIString & replaceAll(const PIString & what, const PIString & with); + PIString replaceAll(const PIString & what, const PIString & with) const {PIString str(*this); str.replaceAll(what, with); return str;} + + /*! \brief Repeat content of string "times" times and return this string + * \details Example: \snippet pistring.cpp PIString::repeat */ + PIString & repeat(int times) {PIString ss(*this); times--; piForTimes (times) *this += ss; return *this;} + + /*! \brief Returns repeated "times" times string + * \details Example: \snippet pistring.cpp PIString::repeated */ + PIString repeated(int times) const {PIString ss(*this); return ss.repeat(times);} + + /*! \brief Insert symbol "c" after index "index" and return this string + * \details Example: \snippet pistring.cpp PIString::insert_0 */ + PIString & insert(const int index, const PIChar & c) {PIDeque::insert(index, c); return *this;} + + /*! \brief Insert symbol "c" after index "index" and return this string + * \details Example: \snippet pistring.cpp PIString::insert_1 */ + PIString & insert(const int index, const char & c) {return insert(index, PIChar(c));} + + /*! \brief Insert string "str" after index "index" and return this string + * \details Example: \snippet pistring.cpp PIString::insert_2 */ + PIString & insert(const int index, const PIString & str); + + /*! \brief Insert string "str" after index "index" and return this string + * \details Example: \snippet pistring.cpp PIString::insert_2 */ + PIString & insert(const int index, const char * c) {return insert(index, PIString(c));} + + /*! \brief Enlarge string to length "len" by addition sequence of symbols + * "c" at the end of string, and return this string + * \details Example: \snippet pistring.cpp PIString::expandRightTo + * \sa \a expandLeftTo() */ + PIString & expandRightTo(const int len, const PIChar & c) {if (len > length()) resize(len, c); return *this;} + + /*! \brief Enlarge string to length "len" by addition sequence of symbols + * "c" at the beginning of string, and return this string + * \details Example: \snippet pistring.cpp PIString::expandLeftTo + * \sa \a expandRightTo() */ + PIString & expandLeftTo(const int len, const PIChar & c) {if (len > length()) insert(0, PIString(len - length(), c)); return *this;} + + /*! \brief Reverse string and return this string + * \details Example: \snippet pistring.cpp PIString::reverse + * \sa \a reversed() */ + PIString & reverse() {PIString str(*this); clear(); piForeachR (const PIChar & c, str) push_back(c); return *this;} + + /*! \brief Reverse copy of this string and return it + * \details Example: \snippet pistring.cpp PIString::reversed + * \sa \a reverse() */ + PIString reversed() const {PIString str(*this); str.reverse(); return str;} + + + /*! \brief Take a part of string from symbol at index "start" and maximum length "len" and return it + * \details Example: \snippet pistring.cpp PIString::takeMid + * \sa \a takeLeft, \a takeRight() */ + PIString takeMid(const int start, const int len = -1) {PIString ret(mid(start, len)); cutMid(start, len); return ret;} + + /*! \brief Take a part from the begin of string with maximum length "len" and return it + * \details Example: \snippet pistring.cpp PIString::takeLeft + * \sa \a takeMid(), \a takeRight() */ + PIString takeLeft(const int len) {PIString ret(left(len)); cutLeft(len); return ret;} + + /*! \brief Take a part from the end of string with maximum length "len" and return it + * \details Example: \snippet pistring.cpp PIString::takeRight + * \sa \a takeMid(), \a takeLeft() */ + PIString takeRight(const int len) {PIString ret(right(len)); cutRight(len); return ret;} + + /*! \brief Take a symbol from the begin of this string and return it + * \details Example: \snippet pistring.cpp PIString::takeSymbol + * \sa \a takeWord(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ + PIString takeSymbol(); + + /*! \brief Take a word from the begin of this string and return it + * \details Example: \snippet pistring.cpp PIString::takeWord + * \sa \a takeSymbol(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ + PIString takeWord(); + + /*! \brief Take a word with letters, numbers and '_' symbols from the + * begin of this string and return it + * \details Example: \snippet pistring.cpp PIString::takeCWord + * \sa \a takeSymbol(), \a takeWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ + PIString takeCWord(); + + /*! \brief Take a line from the begin of this string and return it + * \details Example: \snippet pistring.cpp PIString::takeLine + * \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeNumber(), \a takeRange() */ + PIString takeLine(); + + /*! \brief Take a number with C-format from the begin of this string and return it + * \details Example: \snippet pistring.cpp PIString::takeNumber + * \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeLine(), \a takeRange() */ + PIString takeNumber(); + + /*! \brief Take a range between "start" and "end" symbols from the begin of this + * string and return it. + * \details "Shield" symbol prevent analysis of the next symbol. + * Example: \snippet pistring.cpp PIString::takeRange + * \sa \a takeSymbol(), \a takeWord(), \a takeLine(), \a takeNumber() */ + PIString takeRange(const PIChar & start, const PIChar & end, const PIChar & shield = '\\'); + + //const char * data() {return convertToStd().c_str();} + + + /*! \brief Return real bytes count of this string + * \details It`s equivalent length of char sequence + * returned by function \a data() \n + * Example: \snippet pistring.cpp PIString::lengthAscii + * \sa \a data() */ + int lengthAscii() const; + + /*! \brief Return \c char * representation of this string + * \details This function fill buffer by sequence + * of chars. Minimum length of this buffer is count + * of symbols. Returned \c char * is valid until next + * execution of this function.\n + * Example: \snippet pistring.cpp PIString::data + * \sa \a lengthAscii() */ + const char * data() const; + + //! \brief Return \c std::string representation of this string + std::string stdString() const {return convertToStd();} +#ifdef HAS_LOCALE + wstring stdWString() const {return convertToWString();} +#endif + + //! \brief Return \a PIByteArray contains \a data() of this string + PIByteArray toByteArray() const {const char * d = data(); return PIByteArray(d, lengthAscii());} + + /*! \brief Split string with delimiter "delim" to \a PIStringList and return it + * \details Example: \snippet pistring.cpp PIString::split */ + PIStringList split(const PIString & delim) const; + + + //! \brief Convert each symbol in copyed string to upper case and return it + PIString toUpperCase() const; + + //! \brief Convert each symbol in copyed string to lower case and return it + PIString toLowerCase() const; +#ifdef HAS_LOCALE + PIString toNativeDecimalPoints() const {PIString s(*this); if (currentLocale == 0) return s; return s.replaceAll(".", currentLocale->decimal_point).replaceAll(",", currentLocale->decimal_point);} +#else + PIString toNativeDecimalPoints() const {return PIString(*this).replaceAll(",", ".");} +#endif + + + //! \brief Search substring "str" from symbol at index "start" and return first occur position + //! \details Example: \snippet pistring.cpp PIString::find + int find(const char str, const int start = 0) const; + + //! \brief Search substring "str" from symbol at index "start" and return first occur position + //! \details Example: \snippet pistring.cpp PIString::find + int find(const PIString str, const int start = 0) const; + + //! \brief Search substring "str" from symbol at index "start" and return first occur position + //! \details Example: \snippet pistring.cpp PIString::find + int find(const char * str, const int start = 0) const {return find(PIString(str), start);} + + //! \brief Search substring "str" from symbol at index "start" and return first occur position + //! \details Example: \snippet pistring.cpp PIString::find + int find(const string str, const int start = 0) const {return find(PIString(str), start);} + + //! \brief Search substring "str" from symbol at index "start" and return last occur position + //! \details Example: \snippet pistring.cpp PIString::findLast + int findLast(const char str, const int start = 0) const; + + //! \brief Search substring "str" from symbol at index "start" and return last occur position + //! \details Example: \snippet pistring.cpp PIString::findLast + int findLast(const PIString str, const int start = 0) const; + + //! \brief Search substring "str" from symbol at index "start" and return last occur position + //! \details Example: \snippet pistring.cpp PIString::findLast + int findLast(const char * str, const int start = 0) const {return findLast(PIString(str), start);} + + //! \brief Search substring "str" from symbol at index "start" and return last occur position + //! \details Example: \snippet pistring.cpp PIString::findLast + int findLast(const string str, const int start = 0) const {return findLast(PIString(str), start);} + + //! \brief Search word "word" from symbol at index "start" and return first occur position. + //! \details Example: \snippet pistring.cpp PIString::findWord + int findWord(const PIString & word, const int start = 0) const; + + //! \brief Search C-style word "word" from symbol at index "start" and return first occur position. + //! \details Example: \snippet pistring.cpp PIString::findCWord + int findCWord(const PIString & word, const int start = 0) const; + + //! \brief Return if string starts with "str" + bool startsWith(const PIString & str) const; + + //! \brief Return if string ends with "str" + bool endsWith(const PIString & str) const; + + //! \brief Return symbols length of string + int length() const {return size();} + + //! \brief Return \c true if string is empty, i.e. length = 0 + bool isEmpty() const {return (size() == 0 || *this == "");} + + + //! \brief Return \c true if string equal "true", "yes", "on" or positive not null numeric value + bool toBool() const {PIString s(*this); if (atof(s.toNativeDecimalPoints().data()) > 0. || s.trimmed().toLowerCase() == "true" || s.trimmed().toLowerCase() == "yes" || s.trimmed().toLowerCase() == "on") return true; return false;} + + //! \brief Return \c char numeric value of string + char toChar() const; + + //! \brief Return \c short numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + short toShort(int base = -1, bool * ok = 0) const {return short(toNumberBase(*this, base, ok));} + + //! \brief Return \c ushort numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + ushort toUShort(int base = -1, bool * ok = 0) const {return ushort(toNumberBase(*this, base, ok));} + + //! \brief Return \c int numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + int toInt(int base = -1, bool * ok = 0) const {return int(toNumberBase(*this, base, ok));} + + //! \brief Return \c uint numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + uint toUInt(int base = -1, bool * ok = 0) const {return uint(toNumberBase(*this, base, ok));} + + //! \brief Return \c long numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + long toLong(int base = -1, bool * ok = 0) const {return long(toNumberBase(*this, base, ok));} + + //! \brief Return \c ulong numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + ulong toULong(int base = -1, bool * ok = 0) const {return ulong(toNumberBase(*this, base, ok));} + + //! \brief Return \c llong numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + llong toLLong(int base = -1, bool * ok = 0) const {return toNumberBase(*this, base, ok);} + + //! \brief Return \c ullong numeric value of string in base "base" + //! \details Example: \snippet pistring.cpp PIString::toNumber + ullong toULLong(int base = -1, bool * ok = 0) const {return ullong(toNumberBase(*this, base, ok));} + + //! \brief Return \c float numeric value of string + //! \details Example: \snippet pistring.cpp PIString::toFloat + float toFloat() const {return (float)atof(toNativeDecimalPoints().data());} + + //! \brief Return \c double numeric value of string + //! \details Example: \snippet pistring.cpp PIString::toFloat + double toDouble() const {return atof(toNativeDecimalPoints().data());} + + //! \brief Return \c ldouble numeric value of string + //! \details Example: \snippet pistring.cpp PIString::toFloat + ldouble toLDouble() const {return atof(toNativeDecimalPoints().data());} + + //inline PIString & setNumber(const char value) {clear(); *this += itos(value); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const short value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const ushort value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const int value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const uint value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const long value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const ulong value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const llong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::setNumber + PIString & setNumber(const ullong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} + + //! \brief Set string content to numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::setFloat + PIString & setNumber(const float value) {clear(); *this += ftos(value); return *this;} + + //! \brief Set string content to numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::setFloat + PIString & setNumber(const double & value) {clear(); *this += dtos(value); return *this;} + + //! \brief Set string content to numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::setFloat + PIString & setNumber(const ldouble & value) {clear(); *this += dtos(value); return *this;} + + //! \brief Set string content to human readable size in B/kB/MB/GB/TB + //! \details Example: \snippet pistring.cpp PIString::setReadableSize + PIString & setReadableSize(llong bytes); + + //inline static PIString fromNumber(const char value) {return PIString(itos(value));} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const short value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const ushort value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const int value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const uint value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const long value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const ulong value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const llong & value, int base = 10, bool * ok = 0) {return fromNumberBaseS(value, base, ok);} + + //! \brief Return string contains numeric representation of "value" in base "base" + //! \details Example: \snippet pistring.cpp PIString::fromNumber + static PIString fromNumber(const ullong & value, int base = 10, bool * ok = 0) {return fromNumberBaseU(value, base, ok);} + + //! \brief Return string contains numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::fromFloat + static PIString fromNumber(const float value) {return PIString(ftos(value));} + + //! \brief Return string contains numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::fromFloat + static PIString fromNumber(const double & value) {return PIString(dtos(value));} + + //! \brief Return string contains numeric representation of "value" + //! \details Example: \snippet pistring.cpp PIString::fromFloat + static PIString fromNumber(const ldouble & value) {return PIString(dtos(value));} + + //! \brief Return "true" or "false" + static PIString fromBool(const bool value) {return PIString(value ? "true" : "false");} + + //! \brief Return string contains human readable size in B/kB/MB/GB/TB + //! \details Example: \snippet pistring.cpp PIString::readableSize + static PIString readableSize(llong bytes) {PIString s; s.setReadableSize(bytes); return s;} + + PIString & removeAll(char v) {replaceAll(v, ""); return *this;} + PIString & removeAll(const PIString & v) {replaceAll(v, ""); return *this;} + +private: + static const char toBaseN[]; + static const int fromBaseN[]; + + static PIString fromNumberBaseS(const llong value, int base = 10, bool * ok = 0) { + if (value == 0) return PIString("0"); + if (base < 2 || base > 40) {if (ok != 0) *ok = false; return PIString();} + if (ok != 0) *ok = true; + if (base == 10) return itos(value); + PIString ret; + llong v = value < 0 ? -value : value, cn; + int b = base; + while (v >= llong(base)) { + cn = v % b; + v /= b; + //cout << int(cn) << ", " << int(v) << endl; + ret.push_front(PIChar(toBaseN[cn])); + } + if (v > 0) ret.push_front(PIChar(toBaseN[v])); + if (value < 0) ret.push_front('-'); + return ret; + } + static PIString fromNumberBaseU(const ullong value, int base = 10, bool * ok = 0) { + if (value == 0) return PIString("0"); + if (base < 2 || base > 40) {if (ok != 0) *ok = false; return PIString();} + if (ok != 0) *ok = true; + if (base == 10) return itos(value); + PIString ret; + ullong v = value, cn; + int b = base; + while (v >= ullong(base)) { + cn = v % b; + v /= b; + //cout << int(cn) << ", " << int(v) << endl; + ret.push_front(PIChar(toBaseN[cn])); + } + if (v > 0) ret.push_front(PIChar(toBaseN[v])); + return ret; + } + static llong toNumberBase(const PIString & value, int base = -1, bool * ok = 0) { + PIString v = value.trimmed(); + if (base < 0) { + int ind = v.find("0x"); + if (ind == 0 || ind == 1) {v.remove(ind, 2); base = 16;} + else base = 10; + } else + if (base < 2 || base > 40) {if (ok != 0) *ok = false; return 0;} + //v.reverse(); + if (ok != 0) *ok = true; + PIVector digits; + llong ret = 0, m = 1; + bool neg = false; + int cs; + for (int i = 0; i < v.size_s(); ++i) { + if (v[i] == PIChar('-')) {neg = !neg; continue;} + cs = fromBaseN[int(v[i].toAscii())]; + if (cs < 0 || cs >= base) break; + digits << cs; + } + for (int i = digits.size_s() - 1; i >= 0; --i) { + ret += digits[i] * m; + m *= base; + } + if (neg) ret = -ret; + /*piForeachC (PIChar & i, v) { + if (i == PIChar('-')) {ret = -ret; continue;} + cs = fromBaseN[int(i.toAscii())]; + cout << i << " = " << cs << endl; + if (cs < 0 || cs >= base) return ret; + ret += cs * m; + m *= base; + }*/ + return ret; + } + void appendFromChars(const char * c, int s); + string convertToStd() const; +#ifdef HAS_LOCALE + wstring convertToWString() const {wstring s; for (int i = 0; i < length(); ++i) s.push_back(at(i).toWChar()); return s;} +#endif + + mutable PIByteArray data_; + //string std_string; + //wstring std_wstring; + +}; + + +//! \relatesalso PIString \brief Output operator to std::ostream (cout) +inline std::ostream & operator <<(std::ostream & s, const PIString & v) {for (int i = 0; i < v.length(); ++i) s << v[i]; return s;} + +//! \relatesalso PIString \brief Input operator from std::istream (cin) +inline std::istream & operator >>(std::istream & s, PIString & v) {string ss; s >> ss; v << PIString(ss); return s;} + +//! \relatesalso PIString \relatesalso PICout \brief Output operator to PICout +inline PICout operator <<(PICout s, const PIString & v) {s.space(); s.quote(); s.setControl(0, true); for (int i = 0; i < v.length(); ++i) s << v[i]; s.restoreControl(); s.quote(); return s;} + + +//! \relatesalso PIString \relatesalso PIByteArray \brief Output operator to PIByteArray +inline PIByteArray & operator <<(PIByteArray & s, const PIString & v) {int l = v.lengthAscii(); s << l; if (l <= 0) return s; int os = s.size_s(); s.enlarge(l); memcpy(s.data(os), v.data(), l); return s;} + +//! \relatesalso PIString \relatesalso PIByteArray \brief Input operator from PIByteArray +inline PIByteArray & operator >>(PIByteArray & s, PIString & v) {if (s.size() < 4) {v.clear(); return s;} int l; s >> l; if (l <= 0) return s; v = PIString((const char * )s.data(), l); s.remove(0, l); return s;} + + +//! \relatesalso PIString \brief Return concatenated string +inline PIString operator +(const PIString & str, const PIString & f) {PIString s(str); s += f; return s;} + +//inline PIString operator +(const PIString & f, const char c) {PIString s(f); s.push_back(c); return s;} + +//! \relatesalso PIString \brief Return concatenated string +inline PIString operator +(const PIString & f, const char * str) {PIString s(f); s += str; return s;} + +//! \relatesalso PIString \brief Return concatenated string +inline PIString operator +(const PIString & f, const string & str) {PIString s(f); s += str; return s;} + +//inline PIString operator +(const char c, const PIString & f) {return PIString(c) + f;} + +//! \relatesalso PIString \brief Return concatenated string +inline PIString operator +(const char * str, const PIString & f) {return PIString(str) + f;} + +//! \relatesalso PIString \brief Return concatenated string +inline PIString operator +(const string & str, const PIString & f) {return PIString(str) + f;} + +inline char chrUpr(char c); +inline char chrLwr(char c); + + +/*!\brief Strings array class + * \details This class is based on \a PIDeque and + * expand it functionality. */ +class PIP_EXPORT PIStringList: public PIDeque +{ +public: + + //! Contructs empty strings list + PIStringList() {;} + + //! Contructs strings list with one string "str" + PIStringList(const PIString & str) {push_back(str);} + + //! Contructs empty strings list with strings "s0" and "s1" + PIStringList(const PIString & s0, const PIString & s1) {push_back(s0); push_back(s1);} + + //! Contructs empty strings list with strings "s0", "s1" and "s2" + PIStringList(const PIString & s0, const PIString & s1, const PIString & s2) {push_back(s0); push_back(s1); push_back(s2);} + + //! Contructs empty strings list with strings "s0", "s1", "s2" and "s3" + PIStringList(const PIString & s0, const PIString & s1, const PIString & s2, const PIString & s3) {push_back(s0); push_back(s1); push_back(s2); push_back(s3);} + + PIStringList(const PIStringList & o): PIDeque() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];} + PIStringList(const PIVector & o): PIDeque() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];} + PIStringList(const PIDeque & o): PIDeque() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];} + + + //! \brief Join all strings in one with delimiter "delim" and return it + //! \details Example: \snippet pistring.cpp PIStringList::join + PIString join(const PIString & delim) const {PIString s; for (uint i = 0; i < size(); ++i) {s += at(i); if (i < size() - 1) s += delim;} return s;} + + //! \brief Remove all strings equal "value" and return this + //! \details Example: \snippet pistring.cpp PIStringList::removeStrings + PIStringList & removeStrings(const PIString & value) {for (uint i = 0; i < size(); ++i) {if (at(i) == value) {remove(i); --i;}} return *this;} + + PIStringList & remove(uint num) {PIDeque::remove(num); return *this;} + PIStringList & remove(uint num, uint count) {PIDeque::remove(num, count); return *this;} + + //! \brief Remove duplicated strings and return this + //! \details Example: \snippet pistring.cpp PIStringList::removeDuplicates + PIStringList & removeDuplicates(); + + //! \brief Trim all strings + //! \details Example: \snippet pistring.cpp PIStringList::trim + PIStringList & trim() {for (uint i = 0; i < size(); ++i) at(i).trim(); return *this;} + + //! Return sum of lengths of all strings + uint contentSize() {uint s = 0; for (uint i = 0; i < size(); ++i) s += at(i).size(); return s;} + + //! Compare operator + bool operator ==(const PIStringList & o) const {if (size() != o.size()) return false; for (size_t i = 0; i < size(); ++i) if (o[i] != (*this)[i]) return false; return true;} + + //! Compare operator + bool operator !=(const PIStringList & o) const {return !(o == (*this));} + + PIStringList & operator =(const PIStringList & o) {clear(); for (uint i = 0; i < o.size(); ++i) *this << o[i]; return *this;} + + PIStringList & operator <<(const PIString & str) {push_back(str); return *this;} + PIStringList & operator <<(const PIStringList & sl) {piForeachC (PIString & i, sl) push_back(i); return *this;} + //inline PIStringList & operator <<(const char c) {push_back(PIString(c)); return *this;} + PIStringList & operator <<(const char * str) {push_back(PIString(str)); return *this;} + PIStringList & operator <<(const string & str) {push_back(str); return *this;} + PIStringList & operator <<(const int & num) {push_back(PIString::fromNumber(num)); return *this;} + PIStringList & operator <<(const short & num) {push_back(PIString::fromNumber(num)); return *this;} + PIStringList & operator <<(const long & num) {push_back(PIString::fromNumber(num)); return *this;} + PIStringList & operator <<(const float & num) {push_back(PIString::fromNumber(num)); return *this;} + PIStringList & operator <<(const double & num) {push_back(PIString::fromNumber(num)); return *this;} + +}; + + +//! \relatesalso PIStringList \relatesalso PIByteArray \brief Output operator to PIByteArray +inline PIByteArray & operator <<(PIByteArray & s, const PIStringList & v) {s << v.size_s(); for (int i = 0; i < v.size_s(); ++i) s << v[i]; return s;} + +//! \relatesalso PIStringList \relatesalso PIByteArray \brief Input operator from PIByteArray +inline PIByteArray & operator >>(PIByteArray & s, PIStringList & v) {int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} + + +//! \relatesalso PIStringList \brief Output operator to std::ostream (cout) +inline std::ostream & operator <<(std::ostream & s, const PIStringList & v) {s << "{"; for (uint i = 0; i < v.size(); ++i) {s << '\"' << v[i] << '\"'; if (i < v.size() - 1) s << ", ";} s << "}"; return s;} + +//! \relatesalso PIStringList \relatesalso PICout \brief Output operator to PICout +inline PICout operator <<(PICout s, const PIStringList & v) {s.space(); s.setControl(0, true); s << "{"; for (uint i = 0; i < v.size(); ++i) {s << '\"' << v[i] << '\"'; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} + +#endif // PISTRING_H diff --git a/src/core/pitime.cpp b/src/core/pitime.cpp new file mode 100755 index 00000000..4b276c4a --- /dev/null +++ b/src/core/pitime.cpp @@ -0,0 +1,404 @@ +/* + PIP - Platform Independent Primitives + Timer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pitime.h" +#include "pisystemtests.h" + + +/*! \class PISystemTime + * \brief System time + * + * \section PISystemTime_sec0 Synopsis + * This class provide arithmetic functions for POSIX system time. + * This time represents as seconds and nanosecons in integer formats. + * You can take current system time with function \a PISystemTime::current(), + * compare times, sum or subtract two times, convert time to/from + * seconds, milliseconds, microseconds or nanoseconds. + * \section PISystemTime_sec1 Example + * \snippet pitimer.cpp system_time +*/ + + +/*! \class PITimeMeasurer + * \brief Time measurements + * + * \section PITimeMeasurer_sec0 Synopsis + * Function \a reset() set time mark to current + * system time, then functions double elapsed_*() returns time elapsed from this mark. + * These functions can returns nano-, micro-, milli- and seconds with suffixes "n", "u", "m" + * and "s" +*/ + + +void piUSleep(int usecs) { + if (usecs <= 0) return; +#ifdef WINDOWS + if (usecs > 0) Sleep(usecs / 1000); +#else + usecs -= PISystemTests::usleep_offset_us; + if (usecs > 0) usleep(usecs); +#endif +} + + +bool operator ==(const PITime & t0, const PITime & t1) { + return (t0.hours == t1.hours && t0.minutes == t1.minutes && t0.seconds == t1.seconds); +} + + +bool operator <(const PITime & t0, const PITime & t1) { + if (t0.hours == t1.hours) { + if (t0.minutes == t1.minutes) { + return t0.seconds < t1.seconds; + } else return t0.minutes < t1.minutes; + } else return t0.hours < t1.hours; +} + + +bool operator >(const PITime & t0, const PITime & t1) { + if (t0.hours == t1.hours) { + if (t0.minutes == t1.minutes) { + return t0.seconds > t1.seconds; + } else return t0.minutes > t1.minutes; + } else return t0.hours > t1.hours; +} + +bool operator ==(const PIDate & t0, const PIDate & t1) { + return (t0.year == t1.year && t0.month == t1.month && t0.day == t1.day); +} + + +bool operator <(const PIDate & t0, const PIDate & t1) { + if (t0.year == t1.year) { + if (t0.month == t1.month) { + return t0.day < t1.day; + } else return t0.month < t1.month; + } else return t0.year < t1.year; +} + + +bool operator >(const PIDate & t0, const PIDate & t1) { + if (t0.year == t1.year) { + if (t0.month == t1.month) { + return t0.day > t1.day; + } else return t0.month > t1.month; + } else return t0.year > t1.year; +} + +bool operator ==(const PIDateTime & t0, const PIDateTime & t1) { + return (t0.year == t1.year && t0.month == t1.month && t0.day == t1.day && + t0.hours == t1.hours && t0.minutes == t1.minutes && t0.seconds == t1.seconds); +} + + +bool operator <(const PIDateTime & t0, const PIDateTime & t1) { + if (t0.year == t1.year) { + if (t0.month == t1.month) { + if (t0.day == t1.day) { + if (t0.hours == t1.hours) { + if (t0.minutes == t1.minutes) { + return t0.seconds < t1.seconds; + } else return t0.minutes < t1.minutes; + } else return t0.hours < t1.hours; + } else return t0.day < t1.day; + } else return t0.month < t1.month; + } else return t0.year < t1.year; +} + + +bool operator >(const PIDateTime & t0, const PIDateTime & t1) { + if (t0.year == t1.year) { + if (t0.month == t1.month) { + if (t0.day == t1.day) { + if (t0.hours == t1.hours) { + if (t0.minutes == t1.minutes) { + return t0.seconds > t1.seconds; + } else return t0.minutes > t1.minutes; + } else return t0.hours > t1.hours; + } else return t0.day > t1.day; + } else return t0.month > t1.month; + } else return t0.year > t1.year; +} + + +PITime PITime::current() { + time_t rt = ::time(0); + tm * pt = localtime(&rt); + PITime t; + t.seconds = pt->tm_sec; + t.minutes = pt->tm_min; + t.hours = pt->tm_hour; + return t; +} + + +PIDate PIDate::current() { + time_t rt = ::time(0); + tm * pt = localtime(&rt); + PIDate d; + d.day = pt->tm_mday; + d.month = pt->tm_mon + 1; + d.year = pt->tm_year + 1900; + return d; +} + + +PIDateTime PIDateTime::current() { + time_t rt = ::time(0); + tm * pt = localtime(&rt); + PIDateTime dt; + dt.milliseconds = 0; + dt.seconds = pt->tm_sec; + dt.minutes = pt->tm_min; + dt.hours = pt->tm_hour; + dt.day = pt->tm_mday; + dt.month = pt->tm_mon + 1; + dt.year = pt->tm_year + 1900; + return dt; +} + + +#ifdef WINDOWS +PISystemTime::PISystemTime(const FILETIME & t) { + ullong lt = ullong(t.dwHighDateTime) * 0x100000000U + ullong(t.dwLowDateTime); + seconds = lt / 10000000U; + nanoseconds = (lt % 10000000U) * 100U; +} +#endif + + +PISystemTime PISystemTime::abs() const { + if (seconds < 0) + return PISystemTime(piAbsl(seconds) - 1, 1e+9 - piAbsl(nanoseconds)); + else + return PISystemTime(piAbsl(seconds), piAbsl(nanoseconds)); +} + + +PISystemTime PISystemTime::current(bool precise_but_not_system) { +#ifdef WINDOWS + if (precise_but_not_system) { + llong qpc(0); + if (__pi_perf_freq > 0) { + qpc = __PIQueryPerformanceCounter(); + return PISystemTime::fromSeconds(qpc / double(__pi_perf_freq)); + } + return PISystemTime(); + } else { + FILETIME ft, sft; +# if (_WIN32_WINNT >= 0x0602) + GetSystemTimePreciseAsFileTime(&ft); +# else + GetSystemTimeAsFileTime(&ft); +# endif + sft.dwHighDateTime = ft.dwHighDateTime - __pi_ftjan1970.dwHighDateTime; + if (ft.dwLowDateTime < __pi_ftjan1970.dwLowDateTime) { + sft.dwLowDateTime = ft.dwLowDateTime + (0xFFFFFFFF - __pi_ftjan1970.dwLowDateTime); + sft.dwHighDateTime++; + } else + sft.dwLowDateTime = ft.dwLowDateTime - __pi_ftjan1970.dwLowDateTime; + ullong lt = ullong(sft.dwHighDateTime) * 0x100000000U + ullong(sft.dwLowDateTime); + return PISystemTime(lt / 10000000U, (lt % 10000000U) * 100U); + } + //long t_cur = GetCurrentTime(); + //return PISystemTime(t_cur / 1000, (t_cur % 1000) * 1000000); +#else +# ifdef MAC_OS + mach_timespec_t t_cur; + clock_get_time(__pi_mac_clock, &t_cur); +# else + timespec t_cur; + clock_gettime(0, &t_cur); +# endif + return PISystemTime(t_cur.tv_sec, t_cur.tv_nsec); +#endif +} + + +PIString PITime::toString(const PIString & format) const { + PIString ts = format; + ts.replace("hh", PIString::fromNumber(hours).expandLeftTo(2, '0')); + ts.replace("h", PIString::fromNumber(hours)); + ts.replace("mm", PIString::fromNumber(minutes).expandLeftTo(2, '0')); + ts.replace("m", PIString::fromNumber(minutes)); + ts.replace("ss", PIString::fromNumber(seconds).expandLeftTo(2, '0')); + ts.replace("s", PIString::fromNumber(seconds)); + ts.replace("zzz", PIString::fromNumber(milliseconds).expandLeftTo(3, '0')); + ts.replace("zz", PIString::fromNumber(milliseconds).expandLeftTo(2, '0')); + ts.replace("z", PIString::fromNumber(milliseconds)); + return ts; +} + + +PIString PIDate::toString(const PIString & format) const { + PIString ts = format; + ts.replace("yyyy", PIString::fromNumber(year).expandLeftTo(4, '0')); + ts.replace("yy", PIString::fromNumber(year).right(2)); + ts.replace("y", PIString::fromNumber(year).right(1)); + ts.replace("MM", PIString::fromNumber(month).expandLeftTo(2, '0')); + ts.replace("M", PIString::fromNumber(month)); + ts.replace("dd", PIString::fromNumber(day).expandLeftTo(2, '0')); + ts.replace("d", PIString::fromNumber(day)); + return ts; +} + + +PIString PIDateTime::toString(const PIString & format) const { + PIString ts = format; + ts.replace("yyyy", PIString::fromNumber(year).expandLeftTo(4, '0')); + ts.replace("yy", PIString::fromNumber(year).right(2)); + ts.replace("y", PIString::fromNumber(year).right(1)); + ts.replace("MM", PIString::fromNumber(month).expandLeftTo(2, '0')); + ts.replace("M", PIString::fromNumber(month)); + ts.replace("dd", PIString::fromNumber(day).expandLeftTo(2, '0')); + ts.replace("d", PIString::fromNumber(day)); + ts.replace("hh", PIString::fromNumber(hours).expandLeftTo(2, '0')); + ts.replace("h", PIString::fromNumber(hours)); + ts.replace("mm", PIString::fromNumber(minutes).expandLeftTo(2, '0')); + ts.replace("m", PIString::fromNumber(minutes)); + ts.replace("ss", PIString::fromNumber(seconds).expandLeftTo(2, '0')); + ts.replace("s", PIString::fromNumber(seconds)); + ts.replace("zzz", PIString::fromNumber(milliseconds).expandLeftTo(3, '0')); + ts.replace("zz", PIString::fromNumber(milliseconds).expandLeftTo(2, '0')); + ts.replace("z", PIString::fromNumber(milliseconds)); + return ts; +} + + +#ifdef WINDOWS + PIDateTime::PIDateTime(FILETIME t) { + FILETIME lt; + FileTimeToLocalFileTime(&t, <); + SYSTEMTIME st; + FileTimeToSystemTime(<, &st); + year = st.wYear; + month = st.wMonth; + day = st.wDay; + hours = st.wHour; + minutes = st.wMinute; + seconds = st.wSecond; + milliseconds = st.wMilliseconds; + } +#endif + + +time_t PIDateTime::toSecondSinceEpoch() const { + tm pt; + memset(&pt, 0, sizeof(pt)); + pt.tm_sec = seconds; + pt.tm_min = minutes; + pt.tm_hour = hours; + pt.tm_mday = day; + pt.tm_mon = month - 1; +#ifdef WINDOWS + pt.tm_year = piMaxi(year - 1900, 70); +#else + pt.tm_year = piMaxi(year - 1900, 0); +#endif + return mktime(&pt); +} + + +PIDateTime PIDateTime::fromSecondSinceEpoch(const time_t sec) { + tm * pt = localtime(&sec); + PIDateTime dt; + dt.seconds = pt->tm_sec; + dt.minutes = pt->tm_min; + dt.hours = pt->tm_hour; + dt.day = pt->tm_mday; + dt.month = pt->tm_mon + 1; + dt.year = pt->tm_year + 1900; + return dt; + +} + + +PIString time2string(const PITime & time, const PIString & format) { + PIString ts = format; + ts.replace("hh", PIString::fromNumber(time.hours).expandLeftTo(2, '0')); + ts.replace("h", PIString::fromNumber(time.hours)); + ts.replace("mm", PIString::fromNumber(time.minutes).expandLeftTo(2, '0')); + ts.replace("m", PIString::fromNumber(time.minutes)); + ts.replace("ss", PIString::fromNumber(time.seconds).expandLeftTo(2, '0')); + ts.replace("s", PIString::fromNumber(time.seconds)); + return ts; +} + + +PIString date2string(const PIDate & date, const PIString & format) { + PIString ts = format; + ts.replace("yyyy", PIString::fromNumber(date.year).expandLeftTo(4, '0')); + ts.replace("yy", PIString::fromNumber(date.year).right(2)); + ts.replace("y", PIString::fromNumber(date.year).right(1)); + ts.replace("MM", PIString::fromNumber(date.month).expandLeftTo(2, '0')); + ts.replace("M", PIString::fromNumber(date.month)); + ts.replace("dd", PIString::fromNumber(date.day).expandLeftTo(2, '0')); + ts.replace("d", PIString::fromNumber(date.day)); + return ts; +} + + +PIString datetime2string(const PIDateTime & date, const PIString & format) { + PIString ts = format; + ts.replace("hh", PIString::fromNumber(date.hours).expandLeftTo(2, '0')); + ts.replace("h", PIString::fromNumber(date.hours)); + ts.replace("mm", PIString::fromNumber(date.minutes).expandLeftTo(2, '0')); + ts.replace("m", PIString::fromNumber(date.minutes)); + ts.replace("ss", PIString::fromNumber(date.seconds).expandLeftTo(2, '0')); + ts.replace("s", PIString::fromNumber(date.seconds)); + ts.replace("yyyy", PIString::fromNumber(date.year).expandLeftTo(4, '0')); + ts.replace("yy", PIString::fromNumber(date.year).right(2)); + ts.replace("y", PIString::fromNumber(date.year).right(1)); + ts.replace("MM", PIString::fromNumber(date.month).expandLeftTo(2, '0')); + ts.replace("M", PIString::fromNumber(date.month)); + ts.replace("dd", PIString::fromNumber(date.day).expandLeftTo(2, '0')); + ts.replace("d", PIString::fromNumber(date.day)); + return ts; +} + + + +PITimeMeasurer::PITimeMeasurer() { + reset(); +} + + +double PITimeMeasurer::elapsed_n() { + return (PISystemTime::current(true) - t_st).toNanoseconds() - PISystemTests::time_elapsed_ns; +} + + +double PITimeMeasurer::elapsed_u() { + return (PISystemTime::current(true) - t_st).toMicroseconds() - PISystemTests::time_elapsed_ns / 1.E+3; +} + + +double PITimeMeasurer::elapsed_m() { + return (PISystemTime::current(true) - t_st).toMilliseconds() - PISystemTests::time_elapsed_ns / 1.E+6; +} + + +double PITimeMeasurer::elapsed_s() { + return (PISystemTime::current(true) - t_st).toSeconds() - PISystemTests::time_elapsed_ns / 1.E+9; +} + + +PISystemTime PITimeMeasurer::elapsed() { + return (PISystemTime::current(true) - t_st); +} diff --git a/src/core/pitime.h b/src/core/pitime.h new file mode 100755 index 00000000..cf8b2d90 --- /dev/null +++ b/src/core/pitime.h @@ -0,0 +1,328 @@ +/*! \file pitime.h + * \brief Time structs +*/ +/* + PIP - Platform Independent Primitives + Time structs + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PITIME_H +#define PITIME_H + +#include +#include +#include "pistring.h" + +#ifdef DOXYGEN +//! \brief Sleep for "msecs" milliseconds +void msleep(int msecs); +#else +# ifdef WINDOWS +inline void msleep(int msecs) {Sleep(msecs);} +# else +inline void msleep(int msecs) {usleep(msecs * 1000);} +# endif +#endif + +/*! \brief Precise sleep for "usecs" microseconds + * \details This function consider \c "usleep" offset + * on QNX/Linux/Mac, which is calculated with + * \a pip_sys_test program. If there is correct + * offset value in system config, this function + * wait \b exactly "usecs" microseconds. */ +void piUSleep(int usecs); // on !Windows consider constant "usleep" offset + +/*! \brief Precise sleep for "msecs" milliseconds + * \details This function exec \a piUSleep (msecs * 1000). */ +inline void piMSleep(double msecs) {piUSleep(msecs * 1000);} // on !Windows consider constant "usleep" offset + +/*! \brief Precise sleep for "secs" seconds + * \details This function exec \a piUSleep (msecs * 1000000). */ +inline void piSleep(double secs) {piUSleep(secs * 1000000);} // on !Windows consider constant "usleep" offset + +class PIP_EXPORT PISystemTime { +public: + + //! Contructs system time with s = ns = 0 + PISystemTime() {seconds = nanoseconds = 0;} + + //! Contructs system time with s = "s" and ns = "ns" + PISystemTime(long s, long ns) {seconds = s; nanoseconds = ns; checkOverflows();} + + //! Contructs system time from another + PISystemTime(const PISystemTime & t) {seconds = t.seconds; nanoseconds = t.nanoseconds;} + +#ifdef WINDOWS + PISystemTime(const FILETIME & t); +#endif + + //! Returns stored system time value in seconds + double toSeconds() const {return double(seconds) + nanoseconds / 1.e+9;} + + //! Returns stored system time value in milliseconds + double toMilliseconds() const {return seconds * 1.e+3 + nanoseconds / 1.e+6;} + + //! Returns stored system time value in microseconds + double toMicroseconds() const {return seconds * 1.e+6 + nanoseconds / 1.e+3;} + + //! Returns stored system time value in nanoseconds + double toNanoseconds() const {return seconds * 1.e+9 + double(nanoseconds);} + + + //! Add to stored system time "v" seconds + PISystemTime & addSeconds(double v) {*this += fromSeconds(v); return *this;} + + //! Add to stored system time "v" milliseconds + PISystemTime & addMilliseconds(double v) {*this += fromMilliseconds(v); return *this;} + + //! Add to stored system time "v" microseconds + PISystemTime & addMicroseconds(double v) {*this += fromMicroseconds(v); return *this;} + + //! Add to stored system time "v" nanoseconds + PISystemTime & addNanoseconds(double v) {*this += fromNanoseconds(v); return *this;} + + + //! Sleep for stored value. \warning Use this function to sleep for difference of system times or constructs system time. + //! If you call this function on system time returned with \a PISystemTime::current() thread will be sleep almost forever. + void sleep() {piUSleep(piFloord(toMicroseconds()));} // wait self value, useful to wait some dT = (t1 - t0) + + + //! Returns copy of this system time with absolutely values of s and ns + PISystemTime abs() const; + + //! Returns sum of this system time with "t" + PISystemTime operator +(const PISystemTime & t) const {PISystemTime tt(*this); tt.seconds += t.seconds; tt.nanoseconds += t.nanoseconds; tt.checkOverflows(); return tt;} + + //! Returns difference between this system time and "t" + PISystemTime operator -(const PISystemTime & t) const {PISystemTime tt(*this); tt.seconds -= t.seconds; tt.nanoseconds -= t.nanoseconds; tt.checkOverflows(); return tt;} + + //! Returns multiplication between this system time and "t" + PISystemTime operator *(const double & v) const {return fromMilliseconds(toMilliseconds() * v);} + + //! Returns division between this system time and "t" + PISystemTime operator /(const double & v) const {return fromMilliseconds(toMilliseconds() / v);} + + //! Add to stored value system time "t" + PISystemTime & operator +=(const PISystemTime & t) {seconds += t.seconds; nanoseconds += t.nanoseconds; checkOverflows(); return *this;} + + //! Subtract from stored value system time "t" + PISystemTime & operator -=(const PISystemTime & t) {seconds -= t.seconds; nanoseconds -= t.nanoseconds; checkOverflows(); return *this;} + + //! Multiply stored value system time by "v" + PISystemTime & operator *=(const double & v) {*this = fromMilliseconds(toMilliseconds() * v); return *this;} + + //! Divide stored value system time by "v" + PISystemTime & operator /=(const double & v) {*this = fromMilliseconds(toMilliseconds() / v); return *this;} + + + //! Compare system times + bool operator ==(const PISystemTime & t) const {return ((seconds == t.seconds) && (nanoseconds == t.nanoseconds));} + + //! Compare system times + bool operator !=(const PISystemTime & t) const {return ((seconds != t.seconds) || (nanoseconds != t.nanoseconds));} + + //! Compare system times + bool operator >(const PISystemTime & t) const {if (seconds == t.seconds) return nanoseconds > t.nanoseconds; return seconds > t.seconds;} + + //! Compare system times + bool operator <(const PISystemTime & t) const {if (seconds == t.seconds) return nanoseconds < t.nanoseconds; return seconds < t.seconds;} + + //! Compare system times + bool operator >=(const PISystemTime & t) const {if (seconds == t.seconds) return nanoseconds >= t.nanoseconds; return seconds >= t.seconds;} + + //! Compare system times + bool operator <=(const PISystemTime & t) const {if (seconds == t.seconds) return nanoseconds <= t.nanoseconds; return seconds <= t.seconds;} + + + //! Contructs system time from seconds "v" + static PISystemTime fromSeconds(double v) {long s = piFloord(v); return PISystemTime(s, (v - s) * 1000000000);} + + //! Contructs system time from milliseconds "v" + static PISystemTime fromMilliseconds(double v) {long s = piFloord(v / 1000.); return PISystemTime(s, (v / 1000. - s) * 1000000000);} + + //! Contructs system time from microseconds "v" + static PISystemTime fromMicroseconds(double v) {long s = piFloord(v / 1000000.); return PISystemTime(s, (v / 1000000. - s) * 1000000000);} + + //! Contructs system time from nanoseconds "v" + static PISystemTime fromNanoseconds(double v) {long s = piFloord(v / 1000000000.); return PISystemTime(s, (v / 1000000000. - s) * 1000000000);} + + //! Returns current system time + static PISystemTime current(bool precise_but_not_system = false); + + //! Seconds of stored system time + long seconds; + + //! Nanoseconds of stored system time + long nanoseconds; + +private: + void checkOverflows() {while (nanoseconds >= 1000000000) {nanoseconds -= 1000000000; seconds++;} while (nanoseconds < 0) {nanoseconds += 1000000000; seconds--;}} + +}; + +//! \relatesalso PICout \relatesalso PIByteArray \brief Output operator to PICout +inline PICout operator <<(PICout s, const PISystemTime & v) {s.space(); s.setControl(0, true); s << "(" << v.seconds << " s, " << v.nanoseconds << " ns)"; s.restoreControl(); return s;} + +//! \relatesalso PISystemTime \relatesalso PIByteArray \brief Output operator to PIByteArray +inline PIByteArray & operator <<(PIByteArray & s, const PISystemTime & v) {s << v.seconds << v.nanoseconds; return s;} + +//! \relatesalso PISystemTime \relatesalso PIByteArray \brief Input operator from PIByteArray +inline PIByteArray & operator >>(PIByteArray & s, PISystemTime & v) {s >> v.seconds >> v.nanoseconds; return s;} + +struct PIP_EXPORT PITime { + PITime(int hours_ = 0, int minutes_ = 0, int seconds_ = 0, int milliseconds_ = 0): hours(hours_), minutes(minutes_), seconds(seconds_), milliseconds(milliseconds_) {;} + int hours; + int minutes; + int seconds; + int milliseconds; + PIString toString(const PIString & format = "h:mm:ss") const; + static PITime current(); +}; +PIP_EXPORT bool operator ==(const PITime & t0, const PITime & t1); +PIP_EXPORT bool operator <(const PITime & t0, const PITime & t1); +PIP_EXPORT bool operator >(const PITime & t0, const PITime & t1); +inline bool operator !=(const PITime & t0, const PITime & t1) {return !(t0 == t1);} +inline bool operator <=(const PITime & t0, const PITime & t1) {return !(t0 > t1);} +inline bool operator >=(const PITime & t0, const PITime & t1) {return !(t0 < t1);} +inline PIByteArray & operator <<(PIByteArray & s, const PITime & v) {s << v.hours << v.minutes << v.seconds << v.milliseconds; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PITime & v) {s >> v.hours >> v.minutes >> v.seconds >> v.milliseconds; return s;} + +struct PIP_EXPORT PIDate { + PIDate(int year_ = 0, int month_ = 0, int day_ = 0): year(year_), month(month_), day(day_) {;} + int year; + int month; + int day; + PIString toString(const PIString & format = "d.MM.yyyy") const; + static PIDate current(); +}; +PIP_EXPORT bool operator ==(const PIDate & t0, const PIDate & t1); +PIP_EXPORT bool operator <(const PIDate & t0, const PIDate & t1); +PIP_EXPORT bool operator >(const PIDate & t0, const PIDate & t1); +inline bool operator !=(const PIDate & t0, const PIDate & t1) {return !(t0 == t1);} +inline bool operator <=(const PIDate & t0, const PIDate & t1) {return !(t0 > t1);} +inline bool operator >=(const PIDate & t0, const PIDate & t1) {return !(t0 < t1);} +inline PIByteArray & operator <<(PIByteArray & s, const PIDate & v) {s << v.year << v.month << v.day; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIDate & v) {s >> v.year >> v.month >> v.day; return s;} + +struct PIP_EXPORT PIDateTime { + PIDateTime() {year = month = day = hours = minutes = seconds = milliseconds = 0;} + PIDateTime(const PITime & time) {year = month = day = 0; hours = time.hours; minutes = time.minutes; seconds = time.seconds; milliseconds = time.milliseconds;} + PIDateTime(const PIDate & date) {year = date.year; month = date.month; day = date.day; hours = minutes = seconds = milliseconds = 0;} + PIDateTime(const PIDate & date, const PITime & time) {year = date.year; month = date.month; day = date.day; hours = time.hours; minutes = time.minutes; seconds = time.seconds; milliseconds = time.milliseconds;} +#ifdef WINDOWS + PIDateTime(FILETIME t); +#endif + int year; + int month; + int day; + int hours; + int minutes; + int seconds; + int milliseconds; + PIDateTime normalized() const {return PIDateTime::fromSecondSinceEpoch(toSecondSinceEpoch());} + void normalize() {*this = normalized();} + PIString toString(const PIString & format = "h:mm:ss d.MM.yyyy") const; + time_t toSecondSinceEpoch() const; + PISystemTime toSystemTime() const {return PISystemTime(int(toSecondSinceEpoch()), milliseconds * 1000000);} + PIDate date() const {return PIDate(year, month, day);} + PITime time() const {return PITime(hours, minutes, seconds, milliseconds);} + void setDate(const PIDate & d) {year = d.year; month = d.month; day = d.day;} + void setTime(const PITime & t) {hours = t.hours; minutes = t.minutes; seconds = t.seconds; milliseconds = t.milliseconds;} + void operator +=(const PIDateTime & d1) {year += d1.year; month += d1.month; day += d1.day; hours += d1.hours; minutes += d1.minutes; seconds += d1.seconds; normalize();} + void operator -=(const PIDateTime & d1) {year -= d1.year; month -= d1.month; day -= d1.day; hours -= d1.hours; minutes -= d1.minutes; seconds -= d1.seconds; normalize();} + static PIDateTime fromSecondSinceEpoch(const time_t sec); + static PIDateTime fromSystemTime(const PISystemTime & st) {PIDateTime dt = fromSecondSinceEpoch(st.seconds); dt.milliseconds = piClampi(st.nanoseconds / 1000000, 0, 999); return dt;} + static PIDateTime current(); +}; +inline PIDateTime operator +(const PIDateTime & d0, const PIDateTime & d1) {PIDateTime td = d0; td += d1; return td.normalized();} +inline PIDateTime operator -(const PIDateTime & d0, const PIDateTime & d1) {PIDateTime td = d0; td -= d1; return td.normalized();} +PIP_EXPORT bool operator ==(const PIDateTime & t0, const PIDateTime & t1); +PIP_EXPORT bool operator <(const PIDateTime & t0, const PIDateTime & t1); +PIP_EXPORT bool operator >(const PIDateTime & t0, const PIDateTime & t1); +inline bool operator !=(const PIDateTime & t0, const PIDateTime & t1) {return !(t0 == t1);} +inline bool operator <=(const PIDateTime & t0, const PIDateTime & t1) {return !(t0 > t1);} +inline bool operator >=(const PIDateTime & t0, const PIDateTime & t1) {return !(t0 < t1);} +inline PIByteArray & operator <<(PIByteArray & s, const PIDateTime & v) {s << v.year << v.month << v.day << v.hours << v.minutes << v.seconds << v.milliseconds; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIDateTime & v) {s >> v.year >> v.month >> v.day >> v.hours >> v.minutes >> v.seconds >> v.milliseconds; return s;} + +DEPRECATED inline PITime currentTime() {return PITime::current();} // obsolete, use PITime::current() instead +DEPRECATED inline PIDate currentDate() {return PIDate::current();} // obsolete, use PIDate::current() instead +DEPRECATED inline PIDateTime currentDateTime() {return PIDateTime::current();} // obsolete, use PIDateTime::current() instead + +//! \brief Returns current system time \deprecated Use \a PISystemTime::current() instead +DEPRECATED inline PISystemTime currentSystemTime() {return PISystemTime::current();} // obsolete, use PISystemTime::current() instead +DEPRECATED PIP_EXPORT PIString time2string(const PITime & time, const PIString & format = "h:mm:ss"); // obsolete, use PITime.toString() instead +DEPRECATED PIP_EXPORT PIString date2string(const PIDate & date, const PIString & format = "d.MM.yyyy"); // obsolete, use PITime.toString() instead +DEPRECATED PIP_EXPORT PIString datetime2string(const PIDateTime & datetime, const PIString & format = "h:mm:ss d.MM.yyyy"); // obsolete, use PIDateTime.toString() instead + + +class PITimeMeasurer { +public: + PITimeMeasurer(); + + /** \brief Set internal time mark to current system time + * \details This function used for set start time mark. Later + * you can find out elapsed time from this time mark to any + * moment of time with \a elapsed_s(), \a elapsed_m(), + * \a elapsed_u() or \a elapsed_n() functions. + * \sa \a elapsed_s(), \a elapsed_m(), \a elapsed_u(), \a elapsed_n() */ + void reset() {t_st = PISystemTime::current(true);} + + //! \brief Returns nanoseconds elapsed from last \a reset() execution or from timer measurer creation. + double elapsed_n(); + + //! \brief Returns microseconds elapsed from last \a reset() execution or from timer measurer creation. + double elapsed_u(); + + //! \brief Returns milliseconds elapsed from last \a reset() execution or from timer measurer creation. + double elapsed_m(); + + //! \brief Returns seconds elapsed from last \a reset() execution or from timer measurer creation. + double elapsed_s(); + + //! \brief Returns PISystemTime elapsed from last \a reset() execution or from timer measurer creation. + PISystemTime elapsed(); + + double reset_time_n() {return t_st.toNanoseconds();} + double reset_time_u() {return t_st.toMicroseconds();} + double reset_time_m() {return t_st.toMilliseconds();} + double reset_time_s() {return t_st.toSeconds();} + + //! \brief Returns time mark of last \a reset() execution or timer measurer creation. + PISystemTime reset_time() {return t_st;} + + //! \brief Returns nanoseconds representation of current system time. + static double elapsed_system_n() {return PISystemTime::current(true).toNanoseconds();} + + //! \brief Returns microseconds representation of current system time. + static double elapsed_system_u() {return PISystemTime::current(true).toMicroseconds();} + + //! \brief Returns milliseconds representation of current system time. + static double elapsed_system_m() {return PISystemTime::current(true).toMilliseconds();} + + //! \brief Returns seconds representation of current system time. + static double elapsed_system_s() {return PISystemTime::current(true).toSeconds();} + + //! \brief Returns time mark of current system time. + static PISystemTime elapsed_system() {return PISystemTime::current(true);} + +private: + PISystemTime t_st, t_cur; + +}; + +#endif // PITIME_H diff --git a/src/core/pivariant.cpp b/src/core/pivariant.cpp new file mode 100755 index 00000000..b170e884 --- /dev/null +++ b/src/core/pivariant.cpp @@ -0,0 +1,534 @@ +/* + PIP - Platform Independent Primitives + Variant type + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pivariant.h" + + +/** \class PIVariant + * \brief Variant type + * \details + * \section PIVariant_sec0 Synopsis + * This class provides general type that can contains all standard types, some + * PIP types or custom type. In case of standard types this class also provides + * convertions between them. + * + * \section PIVariant_sec1 Usage + * %PIVariant useful if you want pass many variables with different types in + * single array, e.g.: + * \code{cpp} + * PIVector array; + * array << PIVariant(10) << PIVariant(1.61) << PIVariant(true) << PIVariant("0xFF"); + * piCout << array; + * piForeachC (PIVariant & i, array) + * piCout << i.toInt(); + * \endcode + * Result: + * \code{cpp} + * {PIVariant(Int, 10), PIVariant(Double, 1,61), PIVariant(Bool, true), PIVariant(String, 0xFF)} + * 10 + * 1 + * 1 + * 255 + * \endcode + * */ + + +PIVariant::PIVariant() { + type_ = PIVariant::Invalid; + memset(_vraw, 0, __PIVARIANT_UNION_SIZE__); +} + + +PIVariant & PIVariant::operator =(const PIVariant & v) { + type_ = v.type_; + memcpy(_vraw, v._vraw, __PIVARIANT_UNION_SIZE__); + _vbytearray = v._vbytearray; + _vbitarray = v._vbitarray; + _vstring = v._vstring; + _vstringlist = v._vstringlist; + _vcustom = v._vcustom; + return *this; +} + + +bool PIVariant::operator ==(const PIVariant & v) const { + if (type_ != v.type_) return false; + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint == v._vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong == v._vllong; + case PIVariant::Float: return _vfloat == v._vfloat; + case PIVariant::Double: return _vdouble == v._vdouble; + case PIVariant::LDouble: return _vldouble == v._vldouble; + case PIVariant::Complexd: return _vcomplexd == _vvcomplexd(v); + case PIVariant::Complexld: return _vcomplexld == _vvcomplexld(v); + case PIVariant::BitArray: return _vbitarray == v._vbitarray; + case PIVariant::ByteArray: return _vbytearray == v._vbytearray; + case PIVariant::String: return _vstring == v._vstring; + case PIVariant::StringList: return _vstringlist == v._vstringlist; + case PIVariant::Time: return _vtime == _vvtime(v); + case PIVariant::Date: return _vdate == _vvdate(v); + case PIVariant::DateTime: return _vdatetime == _vvdatetime(v); + case PIVariant::SystemTime: return _vsystime == _vvsystime(v); + default: break; + }; + return false; +} + + +PIVariant::Type PIVariant::typeFromName(const PIString & tname) { + PIString s = tname.trimmed().toLowerCase().replaceAll(" ", ""); + if (s == "bool" || s == "boolean") return PIVariant::Bool; + if (s == "char" || s == "sbyte") return PIVariant::Char; + if (s == "short" || s == "shortint" || s == "signedshort" || s == "signedshortint" || s == "sword") return PIVariant::Short; + if (s == "int" || s == "signed" || s == "signedint") return PIVariant::Int; + if (s == "long" || s == "longint" || s == "signedlong" || s == "signedlongint" || s == "sdword") return PIVariant::Long; + if (s == "llong" || s == "longlong" || s == "longlongint" || s == "signedlonglong" || s == "signedlonglongint" || s == "sqword") return PIVariant::LLong; + if (s == "uchar" || s == "byte") return PIVariant::UChar; + if (s == "ushort" || s == "unsignedshort" || s == "unsignedshortint" || s == "word") return PIVariant::UShort; + if (s == "uint" || s == "unsigned" || s == "unsignedint") return PIVariant::UInt; + if (s == "ulong" || s == "unsignedlong" || s == "unsignedlongint" || s == "dword") return PIVariant::ULong; + if (s == "ullong" || s == "unsignedlonglong" || s == "unsignedlonglongint" || s == "qword") return PIVariant::ULLong; + if (s == "float") return PIVariant::Float; + if (s == "double" || s == "real") return PIVariant::Double; + if (s == "ldouble" || s == "longdouble") return PIVariant::LDouble; + if (s == "complexd" || s == "complex") return PIVariant::Complexd; + if (s == "complexld" || s == "complex" || s == "complex") return PIVariant::Complexld; + if (s == "pibitarray" || s == "bitarray") return PIVariant::BitArray; + if (s == "pibytearray" || s == "bytearray" || s == "vector" || s == "pivector" || s == "vector" || s == "pivector" || + s == "vector" || s == "pivector") return PIVariant::ByteArray; + if (s == "pistring" || s == "string") return PIVariant::String; + if (s == "pistringlist" || s == "stringlist" || s == "vector" || s == "vector" || s == "pivector" || s == "pivector") return PIVariant::StringList; + if (s == "pitime" || s == "time") return PIVariant::Time; + if (s == "pidate" || s == "date") return PIVariant::Date; + if (s == "pidatetime" || s == "datetime") return PIVariant::DateTime; + if (s == "pisystemtime" || s == "systemtime") return PIVariant::SystemTime; + return PIVariant::Invalid; +} + + +PIString PIVariant::typeName(PIVariant::Type type) { + switch (type) { + case PIVariant::Bool: return "Bool"; + case PIVariant::Char: return "Char"; + case PIVariant::UChar: return "UChar"; + case PIVariant::Short: return "Short"; + case PIVariant::UShort: return "UShort"; + case PIVariant::Int: return "Int"; + case PIVariant::UInt: return "UInt"; + case PIVariant::Long: return "Long"; + case PIVariant::ULong: return "ULong"; + case PIVariant::LLong: return "LLong"; + case PIVariant::ULLong: return "ULLong"; + case PIVariant::Float: return "Float"; + case PIVariant::Double: return "Double"; + case PIVariant::LDouble: return "LDouble"; + case PIVariant::Complexd: return "Complexd"; + case PIVariant::Complexld: return "Complexld"; + case PIVariant::BitArray: return "BitArray"; + case PIVariant::ByteArray: return "ByteArray"; + case PIVariant::String: return "String"; + case PIVariant::StringList: return "StringList"; + case PIVariant::Time: return "Time"; + case PIVariant::Date: return "Date"; + case PIVariant::DateTime: return "DateTime"; + case PIVariant::SystemTime: return "SystemTime"; + case PIVariant::Custom: return "Custom"; + default: break; + } + return "Invalid"; +} + + +/** \brief Returns variant content as boolean + * \details In case of numeric types returns \b true if value != 0. \n + * In case of String type returns \a PIString::toBool(). \n + * In case of StringList type returns \b false if string list is empty, + * otherwise returns \a PIString::toBool() of first string. \n + * In case of other types returns \b false. */ +bool PIVariant::toBool() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint != 0; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong != 0; + case PIVariant::Float: return _vfloat != 0; + case PIVariant::Double: return _vdouble != 0; + case PIVariant::LDouble: return _vldouble != 0; + case PIVariant::Complexd: return _vcomplexd.real() != 0; + case PIVariant::Complexld: return _vcomplexld.real() != 0; + case PIVariant::String: return _vstring.toBool(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return false; return _vstringlist.front().toBool(); + default: break; + } + return false; +} + + + +/** \brief Returns variant content as int + * \details In case of numeric types returns integer value. \n + * In case of String type returns \a PIString::toInt(). \n + * In case of StringList type returns \b 0 if string list is empty, + * otherwise returns \a PIString::toInt() of first string. \n + * In case of other types returns \b 0. */ +int PIVariant::toInt() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toInt(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return 0; return _vstringlist.front().toInt(); + default: break; + } + return 0; +} + + +/** \brief Returns variant content as long long + * \details In case of numeric types returns integer value. \n + * In case of String type returns \a PIString::toLLong(). \n + * In case of StringList type returns \b 0L if string list is empty, + * otherwise returns \a PIString::toLLong() of first string. \n + * In case of other types returns \b 0L. */ +llong PIVariant::toLLong() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toLLong(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return 0L; return _vstringlist.front().toLLong(); + default: break; + } + return 0L; +} + + +/** \brief Returns variant content as float + * \details In case of numeric types returns float value. \n + * In case of String type returns \a PIString::toFloat(). \n + * In case of StringList type returns \b 0.f if string list is empty, + * otherwise returns \a PIString::toFloat() of first string. \n + * In case of other types returns \b 0.f. */ +float PIVariant::toFloat() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toFloat(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return 0.f; return _vstringlist.front().toFloat(); + default: break; + } + return 0.f; +} + + +/** \brief Returns variant content as double + * \details In case of numeric types returns double value. \n + * In case of String type returns \a PIString::toDouble(). \n + * In case of StringList type returns \b 0. if string list is empty, + * otherwise returns \a PIString::toDouble() of first string. \n + * In case of other types returns \b 0.. */ +double PIVariant::toDouble() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toDouble(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return 0.; return _vstringlist.front().toDouble(); + default: break; + } + return 0.; +} + + +/** \brief Returns variant content as long double + * \details In case of numeric types returns long double value. \n + * In case of String type returns \a PIString::toLDouble(). \n + * In case of StringList type returns \b 0. if string list is empty, + * otherwise returns \a PIString::toLDouble() of first string. \n + * In case of other types returns \b 0.. */ +ldouble PIVariant::toLDouble() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toLDouble(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return 0.; return _vstringlist.front().toLDouble(); + default: break; + } + return 0.; +} + + +/** \brief Returns variant content as complex + * \details In case of numeric types returns complex value. \n + * In case of String type returns \a PIString::toDouble(). \n + * In case of StringList type returns \b 0. if string list is empty, + * otherwise returns \a PIString::toDouble() of first string. \n + * In case of other types returns \b 0.. */ +complexd PIVariant::toComplexd() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toDouble(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return complexd_0; return _vstringlist.front().toDouble(); + default: break; + } + return complexd_0; +} + + +/** \brief Returns variant content as long complex + * \details In case of numeric types returns long complex value. \n + * In case of String type returns \a PIString::toLDouble(). \n + * In case of StringList type returns \b 0. if string list is empty, + * otherwise returns \a PIString::toLDouble() of first string. \n + * In case of other types returns \b 0.. */ +complexld PIVariant::toComplexld() const { + switch (type_) { + case PIVariant::Bool: + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return _vint; + case PIVariant::LLong: + case PIVariant::ULLong: return _vllong; + case PIVariant::Float: return _vfloat; + case PIVariant::Double: return _vdouble; + case PIVariant::LDouble: return _vldouble; + case PIVariant::Complexd: return _vcomplexd.real(); + case PIVariant::Complexld: return _vcomplexld.real(); + case PIVariant::String: return _vstring.toLDouble(); + case PIVariant::StringList: if (_vstringlist.isEmpty()) return complexld_0; return _vstringlist.front().toLDouble(); + default: break; + } + return complexld_0; +} + + +/** \brief Returns variant content as time + * \details In case of Time type returns time value. \n + * In case of DateTime type returns time part of value. \n + * In case of other types returns \a PITime(). */ +PITime PIVariant::toTime() const { + if (type_ == PIVariant::Time) return _vtime; + if (type_ == PIVariant::DateTime) return _vtime; + return PITime(); +} + + +/** \brief Returns variant content as date + * \details In case of Date type returns date value. \n + * In case of DateTime type returns date part of value. \n + * In case of other types returns \a PIDate(). */ +PIDate PIVariant::toDate() const { + if (type_ == PIVariant::Date) return _vdate; + if (type_ == PIVariant::DateTime) return *((PIDate*)(&(_vdatetime.day))); + return PIDate(); +} + + +/** \brief Returns variant content as date and time + * \details In case of Time type returns time value with null date. \n + * In case of Date type returns date value with null time. \n + * In case of DateTime type returns date and time. \n + * In case of other types returns \a PIDateTime(). */ +PIDateTime PIVariant::toDateTime() const { + if (type_ == PIVariant::DateTime) return _vdatetime; + if (type_ == PIVariant::Time) return PIDateTime(_vtime); + if (type_ == PIVariant::Date) return PIDateTime(_vdate); + return PIDateTime(); +} + + +/** \brief Returns variant content as system time + * \details In case of SystemTime type returns system time. \n + * In case of other types returns \a PISystemTime::fromSeconds() from + * double value of variant content. */ +PISystemTime PIVariant::toSystemTime() const { + if (type_ == PIVariant::SystemTime) return _vsystime; + return PISystemTime::fromSeconds(toDouble()); +} + + +/** \brief Returns variant content as string + * \details In case of numeric types returns \a PIString::fromNumber(). \n + * In case of String type returns string value. \n + * In case of StringList type returns joined string ("(" + PIStringList::join("; ") + ")"). \n + * In case of BitArray or ByteArray types returns number of bits/bytes. \n + * In case of Time, Date or DateTime types returns toString() of this values. \n + * In case of SystemTime types returns second and nanoseconds of time + * ("(PISystemTime::seconds s, PISystemTime::nanoseconds ns)"). \n + * In case of other types returns \b "". */ +PIString PIVariant::toString() const { + switch (type_) { + case PIVariant::Bool: return _vint == 0 ? "false" : "true"; + case PIVariant::Char: + case PIVariant::UChar: + case PIVariant::Short: + case PIVariant::UShort: + case PIVariant::Int: + case PIVariant::UInt: + case PIVariant::Long: + case PIVariant::ULong: return PIString::fromNumber(_vint); + case PIVariant::LLong: + case PIVariant::ULLong: return PIString::fromNumber(_vllong); + case PIVariant::Float: return PIString::fromNumber(_vfloat); + case PIVariant::Double: return PIString::fromNumber(_vdouble); + case PIVariant::LDouble: return PIString::fromNumber(_vldouble); + case PIVariant::Complexd: return "(" + PIString::fromNumber(_vcomplexd.real()) + "; " + PIString::fromNumber(_vcomplexd.imag()) + ")"; + case PIVariant::Complexld: return "(" + PIString::fromNumber(_vcomplexld.real()) + "; " + PIString::fromNumber(_vcomplexld.imag()) + ")"; + case PIVariant::BitArray: return PIString::fromNumber(_vbitarray.bitSize()) + " bits"; + case PIVariant::ByteArray: return _vbytearray.toString(); + case PIVariant::String: return _vstring; + case PIVariant::StringList: return "(" + _vstringlist.join("; ") + ")"; + case PIVariant::Time: return _vtime.toString(); + case PIVariant::Date: return _vdate.toString(); + case PIVariant::DateTime: return _vdatetime.toString(); + case PIVariant::SystemTime: return "(" + PIString::fromNumber(_vsystime.seconds) + " s, " + PIString::fromNumber(_vsystime.nanoseconds) + " ns)"; + default: break; + } + return ""; +} + + +/** \brief Returns variant content as strings list + * \details In case of StringList type returns strings list value. \n + * In case of other types returns \a PIStringList with one string value of variant content. */ +PIStringList PIVariant::toStringList() const { + if (type_ == PIVariant::StringList) return _vstringlist; + return PIStringList(toString()); +} + + +/** \brief Returns variant content as bit array + * \details In case of BitArray type returns bit array value. \n + * In case of other types returns \a PIBitArray from \a toLLong() value. */ +PIBitArray PIVariant::toBitArray() const { + if (type_ == PIVariant::BitArray) return _vbitarray; + return PIBitArray(ullong(toLLong())); +} + + +/** \brief Returns variant content as byte array + * \details In case of ByteArray type returns byte array value. \n + * In case of other types returns empty \a PIByteArray. */ +PIByteArray PIVariant::toByteArray() const { + if (type_ == PIVariant::ByteArray) return _vbytearray; + return PIByteArray(); +} diff --git a/src/core/pivariant.h b/src/core/pivariant.h new file mode 100755 index 00000000..7cba2770 --- /dev/null +++ b/src/core/pivariant.h @@ -0,0 +1,461 @@ +/*! \file pivariant.h + * \brief Variant type + * + * This file declares PIVariant +*/ +/* + PIP - Platform Independent Primitives + Variant type + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIVARIANT_H +#define PIVARIANT_H + +#include "pistring.h" +#include "pibitarray.h" +#include "pitime.h" +#include "pimath.h" + +#define __PIVARIANT_UNION_SIZE__ 32 + +#define _vcomplexd (*((complexd*)_vraw)) +#define _vcomplexld (*((complexld*)_vraw)) +#define _vtime (*((PITime*)_vraw)) +#define _vdate (*((PIDate*)_vraw)) +#define _vdatetime (*((PIDateTime*)_vraw)) +#define _vsystime (*((PISystemTime*)_vraw)) + +#define _vvcomplexd(v) (*((complexd*)v._vraw)) +#define _vvcomplexld(v) (*((complexld*)v._vraw)) +#define _vvtime(v) (*((PITime*)v._vraw)) +#define _vvdate(v) (*((PIDate*)v._vraw)) +#define _vvdatetime(v) (*((PIDateTime*)v._vraw)) +#define _vvsystime(v) (*((PISystemTime*)v._vraw)) + +class PIP_EXPORT PIVariant { + friend PICout operator <<(PICout s, const PIVariant & v); +public: + + //! Type of %PIVariant content + enum Type { + Invalid /** Invalid type , default type of empty contructor */ = 0 , + Bool /** bool */ , + Char /** char */ , + UChar /** uchar */ , + Short /** short */ , + UShort /** ushort */ , + Int /** int */ , + UInt /** uint */ , + Long /** long */ , + ULong /** ulong */ , + LLong /** llong */ , + ULLong /** ullong */ , + Float /** float */ , + Double /** double */ , + LDouble /** ldouble */ , + Complexd /** complexd */ , + Complexld /** complexld */ , + BitArray /** PIBitArray */ , + ByteArray /** PIByteArray */ , + String /** PIString */ , + StringList /** PIStringList */ , + Time /** PITime */ , + Date /** PIDate */ , + DateTime /** PIDateTime */ , + SystemTime /** PISystemTime */ , + Custom /** Custom */ = 0xFF + }; + + //! Empty constructor, \a type() will be set to \a Invalid + PIVariant(); + + //! Constructs variant from string + PIVariant(const char * v) {setValue(PIString(v));} + + //! Constructs variant from boolean + PIVariant(const bool v) {setValue(v);} + + //! Constructs variant from char + PIVariant(const char v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const uchar v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const short v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const ushort v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const int & v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const uint & v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const long & v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const ulong & v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const llong & v) {setValue(v);} + + //! Constructs variant from integer + PIVariant(const ullong & v) {setValue(v);} + + //! Constructs variant from float + PIVariant(const float & v) {setValue(v);} + + //! Constructs variant from double + PIVariant(const double & v) {setValue(v);} + + //! Constructs variant from long double + PIVariant(const ldouble & v) {setValue(v);} + + //! Constructs variant from complex + PIVariant(const complexd & v) {setValue(v);} + + //! Constructs variant from complex + PIVariant(const complexld & v) {setValue(v);} + + //! Constructs variant from bit array + PIVariant(const PIBitArray & v) {setValue(v);} + + //! Constructs variant from byte array + PIVariant(const PIByteArray & v) {setValue(v);} + + //! Constructs variant from string + PIVariant(const PIString & v) {setValue(v);} + + //! Constructs variant from strings list + PIVariant(const PIStringList & v) {setValue(v);} + + //! Constructs variant from time + PIVariant(const PITime & v) {setValue(v);} + + //! Constructs variant from date + PIVariant(const PIDate & v) {setValue(v);} + + //! Constructs variant from date and time + PIVariant(const PIDateTime & v) {setValue(v);} + + //! Constructs variant from system time + PIVariant(const PISystemTime & v) {setValue(v);} + + + //! Set variant content and type to string + void setValue(const char * v) {setValue(PIString(v));} + + //! Set variant content and type to boolean + void setValue(const bool v) {type_ = PIVariant::Bool; _vint = (v ? 1 : 0);} + + //! Set variant content and type to char + void setValue(const char v) {type_ = PIVariant::Char; _vint = v;} + + //! Set variant content and type to integer + void setValue(const uchar v) {type_ = PIVariant::UChar; _vint = v;} + + //! Set variant content and type to integer + void setValue(const short v) {type_ = PIVariant::Short; _vint = v;} + + //! Set variant content and type to integer + void setValue(const ushort v) {type_ = PIVariant::UShort; _vint = v;} + + //! Set variant content and type to integer + void setValue(const int & v) {type_ = PIVariant::Int; _vint = v;} + + //! Set variant content and type to integer + void setValue(const uint & v) {type_ = PIVariant::UInt; _vint = v;} + + //! Set variant content and type to integer + void setValue(const long & v) {type_ = PIVariant::Long; _vint = v;} + + //! Set variant content and type to integer + void setValue(const ulong & v) {type_ = PIVariant::ULong; _vint = v;} + + //! Set variant content and type to integer + void setValue(const llong & v) {type_ = PIVariant::LLong; _vllong = v;} + + //! Set variant content and type to integer + void setValue(const ullong & v) {type_ = PIVariant::ULLong; _vllong = v;} + + //! Set variant content and type to float + void setValue(const float & v) {type_ = PIVariant::Float; _vfloat = v;} + + //! Set variant content and type to double + void setValue(const double & v) {type_ = PIVariant::Double; _vdouble = v;} + + //! Set variant content and type to long double + void setValue(const ldouble & v) {type_ = PIVariant::LDouble; _vldouble = v;} + + //! Set variant content and type to complex + void setValue(const complexd & v) {type_ = PIVariant::Complexd; _vcomplexd = v;} + + //! Set variant content and type to complex + void setValue(const complexld & v) {type_ = PIVariant::Complexld; _vcomplexld = v;} + + //! Set variant content and type to bit array + void setValue(const PIBitArray & v) {type_ = PIVariant::BitArray; _vbitarray = v;} + + //! Set variant content and type to byte array + void setValue(const PIByteArray & v) {type_ = PIVariant::ByteArray; _vbytearray = v;} + + //! Set variant content and type to string + void setValue(const PIString & v) {type_ = PIVariant::String; _vstring = v;} + + //! Set variant content and type to strings list + void setValue(const PIStringList & v) {type_ = PIVariant::StringList; _vstringlist = v;} + + //! Set variant content and type to time + void setValue(const PITime & v) {type_ = PIVariant::Time; _vtime = v;} + + //! Set variant content and type to date + void setValue(const PIDate & v) {type_ = PIVariant::Date; _vdate = v;} + + //! Set variant content and type to date and time + void setValue(const PIDateTime & v) {type_ = PIVariant::DateTime; _vdatetime = v;} + + //! Set variant content and type to system time + void setValue(const PISystemTime & v) {type_ = PIVariant::SystemTime; _vsystime = v;} + + + bool toBool() const; + int toInt() const; + llong toLLong() const; + float toFloat() const; + double toDouble() const; + ldouble toLDouble() const; + complexd toComplexd() const; + complexld toComplexld() const; + PITime toTime() const; + PIDate toDate() const; + PIDateTime toDateTime() const; + PISystemTime toSystemTime() const; + PIString toString() const; + PIStringList toStringList() const; + PIBitArray toBitArray() const; + PIByteArray toByteArray() const; + + + /** \brief Returns variant content as custom type + * \details In case of known types this function equivalent \a to function. \n + * Otherwise returns content as type T. */ + template + T toValue() const {if (_vcustom.size() != sizeof(T)) return T(); return *((T*)_vcustom.data());} + /* + operator bool() const {return toBool();} + operator char() const {return toInt();} + operator uchar() const {return toInt();} + operator short() const {return toInt();} + operator ushort() const {return toInt();} + operator int() const {return toInt();} + operator uint() const {return toInt();} + operator long() const {return toInt();} + operator ulong() const {return toInt();} + operator llong() const {return toLLong();} + operator ullong() const {return (ullong)toLLong();} + operator float() const {return toFloat();} + operator double() const {return toDouble();} + operator ldouble() const {return toLDouble();} + operator complexd() const {return toComplexd();} + operator complexld() const {return toComplexld();} + operator PITime() const {return toTime();} + operator PIDate() const {return toDate();} + operator PIDateTime() const {return toDateTime();} + operator PIString() const {return toString();} + operator PIStringList() const {return toStringList();} + operator PIBitArray() const {return toBitArray();} + operator PIByteArray() const {return toByteArray();} + operator const char*() const {return toString().data();} + operator void*() const {return (void*)(toLLong());} + */ + + //! Assign operator + PIVariant & operator =(const PIVariant & v); + //! Assign operator + PIVariant & operator =(const char * v) {setValue(PIString(v)); return *this;} + //! Assign operator + PIVariant & operator =(const bool v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const char v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const uchar v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const short v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const ushort v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const int & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const uint & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const long & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const ulong & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const llong & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const ullong & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const float & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const double & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const ldouble & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const complexd & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const complexld & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIBitArray & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIByteArray & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIString & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIStringList & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PITime & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIDate & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PIDateTime & v) {setValue(v); return *this;} + //! Assign operator + PIVariant & operator =(const PISystemTime & v) {setValue(v); return *this;} + + + //! Compare operator + bool operator ==(const PIVariant & v) const; + //! Compare operator + bool operator !=(const PIVariant & v) const {return !(*this == v);} + + + //! Returns type of variant content + PIVariant::Type type() const {return type_;} + + //! Returns type name of variant content + PIString typeName() const {return typeName(type_);} + + + //! Returns \b true if type is not Invalid + bool isValid() const {return type_ != PIVariant::Invalid;} + + + /** \brief Returns new variant from custom type + * \details In case of known types this function equivalent \a PIVariant(T) constructors. \n + * Otherwise returns variant with content \a v and type Custom. */ + template + static PIVariant fromValue(const T & v) {PIVariant ret; ret._vcustom.resize(sizeof(T)); new((T*)(ret._vcustom.data()))T(v); ret.type_ = PIVariant::Custom; return ret;} + + + //! Returns type from name + static PIVariant::Type typeFromName(const PIString & tname); + + //! Returns type name + static PIString typeName(PIVariant::Type type); + +private: + void destroy() {_vcustom.clear();} + + union { + int _vint; + llong _vllong; + float _vfloat; + double _vdouble; + ldouble _vldouble; + uchar _vraw[__PIVARIANT_UNION_SIZE__]; + /*complexd _vcomplexd; + complexld _vcomplexld; + PITime _vtime; + PIDate _vdate; + PIDateTime _vdatetime; + PISystemTime _vsystime;*/ + }; + PIBitArray _vbitarray; + PIByteArray _vbytearray; + PIString _vstring; + PIStringList _vstringlist; + PIByteArray _vcustom; + PIVariant::Type type_; + +}; + +template<> inline bool PIVariant::toValue() const {return toBool();} +template<> inline char PIVariant::toValue() const {return (char)toInt();} +template<> inline uchar PIVariant::toValue() const {return (uchar)toInt();} +template<> inline short PIVariant::toValue() const {return (short)toInt();} +template<> inline ushort PIVariant::toValue() const {return (ushort)toInt();} +template<> inline int PIVariant::toValue() const {return toInt();} +template<> inline uint PIVariant::toValue() const {return (uint)toInt();} +template<> inline long PIVariant::toValue() const {return (long)toInt();} +template<> inline ulong PIVariant::toValue() const {return (ulong)toInt();} +template<> inline llong PIVariant::toValue() const {return toLLong();} +template<> inline ullong PIVariant::toValue() const {return (ullong)toLLong();} +template<> inline float PIVariant::toValue() const {return toFloat();} +template<> inline double PIVariant::toValue() const {return toDouble();} +template<> inline ldouble PIVariant::toValue() const {return toLDouble();} +template<> inline complexd PIVariant::toValue() const {return toComplexd();} +template<> inline complexld PIVariant::toValue() const {return toComplexld();} +template<> inline void* PIVariant::toValue() const {return (void*)toLLong();} +template<> inline const char* PIVariant::toValue() const {return toString().data();} +template<> inline PITime PIVariant::toValue() const {return toTime();} +template<> inline PIDate PIVariant::toValue() const {return toDate();} +template<> inline PIDateTime PIVariant::toValue() const {return toDateTime();} +template<> inline PIString PIVariant::toValue() const {return toString();} +template<> inline PIStringList PIVariant::toValue() const {return toStringList();} +template<> inline PIBitArray PIVariant::toValue() const {return toBitArray();} +template<> inline PIByteArray PIVariant::toValue() const {return toByteArray();} + +//template<> inline PIVariant PIVariant::fromValue(const char * v) {return PIVariant(PIString(v));} +template<> inline PIVariant PIVariant::fromValue(const bool & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const char & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const uchar & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const short & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const ushort & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const int & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const uint & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const long & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const ulong & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const llong & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const ullong & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const float & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const double & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const ldouble & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const complexd & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const complexld & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIBitArray & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIByteArray & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIString & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIStringList & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PITime & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIDate & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PIDateTime & v) {return PIVariant(v);} +template<> inline PIVariant PIVariant::fromValue(const PISystemTime & v) {return PIVariant(v);} + +inline PICout operator <<(PICout s, const PIVariant & v) { + s.space(); s.setControl(0, true); + s << "PIVariant(" << PIVariant::typeName(v.type()) << ", "; + if (v.type() == PIVariant::Custom) s << v._vcustom.size() << " bytes"; + else s << v.toString(); + s << ")"; + s.restoreControl(); return s; +} + + +#endif // PIVARIANT_H diff --git a/src/io/pibinarylog.cpp b/src/io/pibinarylog.cpp new file mode 100644 index 00000000..e2efeb47 --- /dev/null +++ b/src/io/pibinarylog.cpp @@ -0,0 +1,524 @@ +/* + PIP - Platform Independent Primitives + Class for write binary data to logfile, and read or playback this data + Copyright (C) 2014 Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pibinarylog.h" +#include "pidir.h" + +/*! \class PIBinaryLog + * \brief Class for read and write binary data to logfile, and playback this data in realtime, or custom speed + * + * \section PIBinaryLog_sec0 Synopsis + * Binary Log is a file with simple header, where you can read and write some binary data. + * Any written data include special header with ID, size and timestamp. + * This header provides separation different messages from the one file by choosing different IDs. + * With \a filterID or special functions, like \a readBinLog() you can choose IDs what you want to read. + * With function \a writeBinLog() or \a setDefaultID() you can choose ID that mark you data. + * By default ID = 1, and \a filterID is empty, that mean you read any ID without filtering. + * ThreadedRead provide you playback data, with delay that you write data. + * You can choose different playbak modes by set \a PlayMode. + * + * \section PIBinaryLog_sec1 Basic usage + * This class provide all functions of \a PIIODevice, such \a open(), \a close(), + * \a read() ,\a write(), and threaded read/write. + * function \a setLogDir() need to set directory for BinLog files + * function \a createNewFile() need to create new binlog file + * function \a restart() need start from the begining of binlog file + * + */ + +REGISTER_DEVICE(PIBinaryLog) + +PIBinaryLog::PIBinaryLog() { + setThreadedReadBufferSize(65536); + is_started = is_indexed = false; + current_index = -1; + setPlaySpeed(1.); + setDefaultID(1); + setPlaySpeed(1.0); + setPlayDelay(PISystemTime::fromSeconds(1.0)); + setPlayRealTime(); + setSplitTime(PISystemTime(600, 0)); + setSplitRecordCount(1000); + setSplitFileSize(0xFFFFFF); + setSplitMode(SplitNone); + setLogDir(PIString()); + setFilePrefix(PIString()); + setRapidStart(false); + file.setName("__S__PIBinaryLog::file"); +} + + +bool PIBinaryLog::openDevice() { + lastrecord.timestamp = PISystemTime(); + lastrecord.id = 0; + write_count = 0; + is_started = false; + is_thread_ok = true; + is_indexed = false; + index.clear(); + index_pos.clear(); + if (mode_ == ReadWrite) { + piCoutObj << "Error: ReadWrite mode not supported, use WriteOnly or ReadOnly"; + return false; + } + if (!file.open(path(), mode_)) { + piCoutObj << "Error: Can't open file" << path(); + return false; + } + setName(path()); + if (mode_ == WriteOnly) { + file.clear(); + if (!writeFileHeader()) { + piCoutObj << "Error: Can't write binlog file header" << path(); + return false; + } + is_started = true; + } + if (mode_ == ReadOnly) { + if (file.isEmpty()) { + piCoutObj << "Error: File is null" << path(); + fileError(); + return false; + } + if (!checkFileHeader()) { + fileError(); + return false; + } + if (isEmpty()) { + piCoutObj << "Warning: Empty BinLog file" << path(); + fileEnd(); + } + play_time = 0; + if (!rapidStart()) is_started = true; + } + startlogtime = PISystemTime::current(); + return true; +} + + +bool PIBinaryLog::closeDevice() { + moveIndex(-1); + is_indexed = false; + index.clear(); + index_pos.clear(); + if (canWrite() && isEmpty()) { + file.remove(); + return true; + } + return file.close(); +} + + +bool PIBinaryLog::threadedRead(uchar *readed, int size) { + is_thread_ok = false; + PISystemTime pt; + double delay; + switch (play_mode) { + case PlayRealTime: + pt = PISystemTime::current() - startlogtime; + if (is_started) { + if (lastrecord.timestamp > pt) + (lastrecord.timestamp - pt).sleep(); + } else { + startlogtime = PISystemTime::current() - lastrecord.timestamp; + is_started = true; + } + break; + case PlayVariableSpeed: + delay = lastrecord.timestamp.toMilliseconds() - play_time; + delay /= play_speed; + if (is_started) { + if (delay > 0) + /// TODO: Sleep by steps (about 100ms) + PISystemTime::fromMilliseconds(delay).sleep(); + } else is_started = true; + play_time = lastrecord.timestamp.toMilliseconds(); + break; + case PlayStaticDelay: + if (is_started) play_delay.sleep(); + else is_started = true; + break; + default: + return false; + } + bool res = PIIODevice::threadedRead(readed, size); + is_thread_ok = true; + return res; +} + + +PIString PIBinaryLog::createNewFile() { + if (!file.close()) return PIString(); + PIDir dir(logDir()); + dir.setDir(dir.absolutePath()); + if (!dir.isExists()) { + piCoutObj << "Creating directory" << dir.path(); + dir.make(true); + } + PIString npath = logDir() + "/" + filePrefix() + PIDateTime::current().toString("yyyy_MM_dd__hh_mm_ss"); + PIString cnpath = npath + ".binlog"; + int i = 1; + while (PIFile::isExists(cnpath)) { + cnpath = npath + "_" + PIString::fromNumber(i) + ".binlog"; + i++; + } + if (open(cnpath, PIIODevice::WriteOnly)) { + newFile(file.path()); + return file.path(); + } + piCoutObj << "Can't create new file, maybe LogDir is invalid."; + return PIString(); +} + + +int PIBinaryLog::writeBinLog(int id, const void *data, int size) { + if (size <= 0 || !canWrite()) return -1; + switch (split_mode) { + case SplitSize: + if (logSize() > split_size) createNewFile(); + break; + case SplitTime: + if ((PISystemTime::current() - startlogtime) > split_time) createNewFile(); + break; + case SplitCount: + if (write_count > split_count) createNewFile(); + break; + default: break; + } + PIByteArray logdata; + logdata << id << size << (PISystemTime::current() - startlogtime) << PIByteArray::RawData(data, size); + int res = file.write(logdata.data(), logdata.size()); + file.flush(); + write_count++; + if (res > 0) return size; + else return res; +} + + +PIByteArray PIBinaryLog::readBinLog(int id) { + if (!canRead()) return PIByteArray(); + BinLogRecord br = readRecord(); + if (br.id == -1) { + piCoutObj << "End of BinLog file"; + fileEnd(); + return PIByteArray(); + } + if (id == 0 && br.id > 0) return br.data; + while (br.id != id && !isEnd()) br = readRecord(); + if (br.id == -1) { + piCoutObj << "End of BinLog file"; + fileEnd(); + return PIByteArray(); + } + if (br.id == id) return br.data; + piCoutObj << "Can't find record with id =" << id; + return PIByteArray(); +} + + +int PIBinaryLog::readBinLog(int id, void *read_to, int max_size) { + if (max_size <= 0 || read_to == 0) return -1; + PIByteArray ba = readBinLog(id); + if (ba.isEmpty()) return -1; + int sz = piMini(max_size, ba.size()); + memcpy(read_to, ba.data(), sz); + return sz; +} + + +int PIBinaryLog::read(void *read_to, int max_size) { + if (lastrecord.id == -1 || isEnd()) return 0; + if(!is_thread_ok && lastrecord.id > 0) return lastrecord.data.size(); + if (!canRead()) return -1; + if (max_size <= 0 || read_to == 0) return -1; + BinLogRecord br; + br.id = 0; + if (filterID.isEmpty()) br = readRecord(); + else { + while (!filterID.contains(br.id) && !isEnd()) br = readRecord(); + } + if (br.id == -1) { + fileEnd(); + piCoutObj << "End of BinLog file"; + return 0; + } + if (br.id <= 0) { + piCoutObj << "Read record error"; + return -1; + } + int sz = piMini(max_size, br.data.size()); + memcpy(read_to, br.data.data(), sz); + return sz; +} + + +void PIBinaryLog::restart() { + bool th = isRunning(); + if (th) stopThreadedRead(); + if (!canRead()) return; + lastrecord.timestamp = PISystemTime(); + lastrecord.id = 0; + is_thread_ok = true; + is_started = !rapidStart(); + play_time = 0; + file.seekToBegin(); + checkFileHeader(); + moveIndex(0); + startlogtime = PISystemTime::current(); + if (th) startThreadedRead(); +} + + +bool PIBinaryLog::writeFileHeader() { + if (file.write(&__S__PIBinaryLog::binlog_sig, PIBINARYLOG_SIGNATURE_SIZE) <= 0) return false; + uchar version = PIBINARYLOG_VERSION; + if (file.write(&version, 1) <= 0) return false; + file.flush(); + return true; +} + + +bool PIBinaryLog::checkFileHeader() { + uchar read_sig[PIBINARYLOG_SIGNATURE_SIZE]; + for (uint i=0; i PIBINARYLOG_VERSION) + piCoutObj << "BinLogFile has too newest version"; + return false; +} + + +PIBinaryLog::BinLogRecord PIBinaryLog::readRecord() { + PIByteArray ba; + BinLogRecord br; + lastrecord.id = 0; + lastrecord.data.clear(); + lastrecord.timestamp = PISystemTime(); + ba.resize(sizeof(BinLogRecord) - sizeof(PIByteArray)); + if(file.read(ba.data(), ba.size_s()) > 0) { + ba >> br.id >> br.size >> br.timestamp; + } else { + br.id = -1; + return br; + } + if (br.id > 0 && br.size > 0) { + ba.resize(br.size); + if(file.read(ba.data(), ba.size_s()) > 0) br.data = ba; + else br.id = 0; + } else br.id = 0; + lastrecord = br; + if (br.id == 0) fileError(); + moveIndex(index_pos.value(file.pos(), -1)); + return br; +} + + + +void PIBinaryLog::parseLog(PIFile * f, PIBinaryLog::BinLogInfo * info, PIVector * index) { + BinLogInfo * bi = info; + bool ginfo = info != 0; + bool gindex = index != 0; + if (!ginfo && !gindex) return; + if (ginfo) { + bi->log_size = -1; + bi->records_count = 0; + bi->records.clear(); + } + if (gindex) index->clear(); + if (f == 0) return; + if (!f->canRead()) return; + if (ginfo) { + bi->path = f->path(); + bi->log_size = f->size(); + } + uchar read_sig[PIBINARYLOG_SIGNATURE_SIZE]; + for (uint i=0; iread(read_sig, PIBINARYLOG_SIGNATURE_SIZE) < 0) {if (ginfo) bi->records_count = -1; ok = false;} + for (uint i=0; irecords_count = -2; ok = false;} + uchar read_version = 0; + if (f->read(&read_version, 1) < 0) {if (ginfo) bi->records_count = -3; ok = false;} + if (read_version == 0) {if (ginfo) bi->records_count = -4; ok = false;} + if (read_version < PIBINARYLOG_VERSION) {if (ginfo) bi->records_count = -5; ok = false;} + if (read_version > PIBINARYLOG_VERSION) {if (ginfo) bi->records_count = -6; ok = false;} + if (!ok) return; + PIByteArray ba; + BinLogRecord br; + bool first = true; + llong hdr_size = sizeof(BinLogRecord) - sizeof(PIByteArray); + ba.resize(hdr_size); + while (1) { + ba.resize(hdr_size); + if(f->read(ba.data(), ba.size_s()) > 0) { + ba >> br.id >> br.size >> br.timestamp; + } else break; + if (f->size() - f->pos() >= br.size) f->seek(f->pos() + br.size); + else break; + if (br.id > 0) { + if (gindex) { + BinLogIndex bl_ind; + bl_ind.id = br.id; + bl_ind.pos = f->pos() - br.size - hdr_size; + bl_ind.timestamp = br.timestamp; + index->append(bl_ind); + } + if (ginfo) { + bi->records_count++; + if (first) { + bi->start_time = br.timestamp; + first = false; + } + BinLogRecordInfo &bri(bi->records[br.id]); + bri.count++; + if (bri.id == 0) { + bri.id = br.id; + bri.minimum_size = bri.maximum_size = br.size; + bri.start_time = br.timestamp; + } else { + bri.end_time = br.timestamp; + if (bri.minimum_size > br.size) bri.minimum_size = br.size; + if (bri.maximum_size < br.size) bri.maximum_size = br.size; + } + } + } + } + if (ginfo) bi->end_time = br.timestamp; +} + + +void PIBinaryLog::moveIndex(int i) { + if (is_indexed) { + current_index = i; + posChanged(current_index); + } +} + + +PIBinaryLog::BinLogInfo PIBinaryLog::getLogInfo(const PIString & path) { + BinLogInfo bi; + bi.path = path; + bi.records_count = 0; + PIFile tfile; + if (!tfile.open(path, PIIODevice::ReadOnly)) return bi; + parseLog(&tfile, &bi, 0); + return bi; +} + + +PIString PIBinaryLog::constructFullPath() const { + PIString ret(fullPathPrefix() + "://"); + ret << logDir() << ":" << filePrefix() << ":" << defaultID(); + return ret; +} + + +bool PIBinaryLog::createIndex() { + llong cp = file.pos(); + file.seekToBegin(); + index.clear(); + index_pos.clear(); + parseLog(&file, &binfo, &index); + file.seek(cp); + is_indexed = !index.isEmpty(); + for (uint i=0; i= 0) { + file.seek(index[rindex].pos); + moveIndex(index_pos.value(file.pos(), -1)); + play_time = index[rindex].timestamp.toMilliseconds(); + } +} + + +bool PIBinaryLog::seek(const PISystemTime & time) { + int ci = -1; + for (uint i=0; i= 0) { + seekTo(ci); + return true; + } + return false; +} + + +bool PIBinaryLog::seek(llong filepos) { + int ci = -1; + for (uint i=0; i= 0) { + seekTo(ci); + return true; + } + return false; +} + + +void PIBinaryLog::configureFromFullPath(const PIString & full_path) { + PIStringList pl = full_path.split(":"); + for (int i = 0; i < pl.size_s(); ++i) { + PIString p(pl[i]); + switch (i) { + case 0: setLogDir(p); break; + case 1: setFilePrefix(p); break; + case 2: setDefaultID(p.toInt()); break; + } + } +} + + +void PIBinaryLog::propertyChanged(const PIString &) { + default_id = property("defaultID").toInt(); + rapid_start = property("rapidStart").toBool(); + play_mode = (PlayMode)property("playMode").toInt(); + play_speed = property("playSpeed").toDouble(); + play_delay = property("playDelay").toSystemTime(); + split_mode = (SplitMode)property("splitMode").toInt(); + split_time = property("splitTime").toSystemTime(); + split_size = property("splitFileSize").toLLong(); + split_count = property("splitRecordCount").toInt(); +} + diff --git a/src/io/pibinarylog.h b/src/io/pibinarylog.h new file mode 100644 index 00000000..c4b775b5 --- /dev/null +++ b/src/io/pibinarylog.h @@ -0,0 +1,333 @@ +/*! \file pibinarylog.h + * \brief Binary log +*/ +/* + PIP - Platform Independent Primitives + Class for write binary data to logfile, and read or playback this data + Copyright (C) 2014 Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIBINARYLOG_H +#define PIBINARYLOG_H + +#include "pifile.h" + +#define PIBINARYLOG_VERSION 0x31 +namespace __S__PIBinaryLog { +static const uchar binlog_sig[] = {'B','I','N','L','O','G'}; +}; +#define PIBINARYLOG_SIGNATURE_SIZE sizeof(__S__PIBinaryLog::binlog_sig) + +/// TODO: Create static functions to split and join binlog files +/// TODO: Create functions to insert and delete records +class PIBinaryLog: public PIIODevice +{ + PIIODEVICE(PIBinaryLog) +public: + PIBinaryLog(); + ~PIBinaryLog() {closeDevice();} + + //! \brief Play modes for \a PIBinaryLog + enum PlayMode { + PlayRealTime /*! Play in system realtime, default mode */ , + PlayVariableSpeed /*! Play in software realtime with speed, set by \a setSpeed */ , + PlayStaticDelay /*! Play with custom static delay, ignoring timestamp */ + }; + + //! \brief Different split modes for writing \a PIBinaryLog, which can separate files by size, by time or by records count + enum SplitMode { + SplitNone /*! Without separate, default mode */ , + SplitTime /*! Separate files by record time */ , + SplitSize /*! Separate files by size */ , + SplitCount /*! Separate files by records count */ + }; + + //! \brief Struct contains information about all records with same ID + struct BinLogRecordInfo { + BinLogRecordInfo() { + id = count = 0; + minimum_size = maximum_size = 0; + } + int id; + int count; + int minimum_size; + int maximum_size; + PISystemTime start_time; + PISystemTime end_time; + }; + + //! \brief Struct contains full information about Binary Log file and about all Records using map of \a BinLogRecordInfo + struct BinLogInfo { + PIString path; + int records_count; + llong log_size; + PISystemTime start_time; + PISystemTime end_time; + PIMap records; + }; + + //! \brief Struct contains position, ID and timestamp of record in file + struct BinLogIndex { + int id; + llong pos; + PISystemTime timestamp; + }; + + + //! Current \a PlayMode + PlayMode playMode() const {return play_mode;} + + //! Current \a SplitMode + SplitMode splitMode() const {return split_mode;} + + //! Current directory where billogs wiil be saved + PIString logDir() const {return property("logDir").toString();} + + //! Returns current file prefix + PIString filePrefix() const {return property("filePrefix").toString();} + + //! Current LogDir, returns directory where billogs wiil be saved + int defaultID() const {return default_id;} + + //! Returns current play speed + double playSpeed() const {return play_speed;} + + //! Returns current play delay + PISystemTime playDelay() const {return play_delay;} + + //! Returns current binlog file split time + PISystemTime splitTime() const {return split_time;} + + //! Returns current binlog file split size + llong splitFileSize() const {return split_size;} + + //! Returns current binlog file split records count + int splitRecordCount() const {return split_count;} + + //! Returns if rapid start enabled + bool rapidStart() const {return rapid_start;} + + + //! Set \a PlayMode + void setPlayMode(PlayMode mode) {setProperty("playMode", (int)mode);} + + //! Set \a SplitMode + void setSplitMode(SplitMode mode) {setProperty("splitMode", (int)mode);} + + //! Set path to directory where binlogs will be saved + void setLogDir(const PIString & path) {setProperty("logDir", path);} + + //! Set file prefix, used to + void setFilePrefix(const PIString & prefix) {setProperty("filePrefix", prefix);} + + //! Set defaultID, used in \a write function + void setDefaultID(int id) {setProperty("defaultID", id);} + + //! If enabled BinLog \a ThreadedRead starts without delay for first record, i.e. first record will be readed immediately + void setRapidStart(bool enabled) {setProperty("rapidStart", enabled);} + + //! Set play speed to "speed", default value is 1.0x + //! Also this function set \a playMode to \a PlayVariableSpeed + void setPlaySpeed(double speed) {setPlayMode(PlayVariableSpeed); setProperty("playSpeed", speed);} + + //! Setting static delay between records, default value is 1 sec + //! Also this function set \a playMode to \a PlayStaticDelay + void setPlayDelay(const PISystemTime & delay) {setPlayMode(PlayStaticDelay); setProperty("playDelay", delay);} + + //! Set \a playMode to \a PlayRealTime + void setPlayRealTime() {setPlayMode(PlayRealTime);} + + //! Set binlog file split time + //! Also this function set \a splitMode to \a SplitTime + void setSplitTime(const PISystemTime & time) {setSplitMode(SplitTime); setProperty("splitTime", time);} + + //! Set binlog file split size + //! Also this function set \a splitMode to \a SplitSize + void setSplitFileSize(llong size) {setSplitMode(SplitSize); setProperty("splitFileSize", size);} + + //! Set binlog file split records count + //! Also this function set \a splitMode to \a SplitCount + void setSplitRecordCount(int count) {setSplitMode(SplitCount); setProperty("splitRecordCount", count);} + + + //! Write one record to BinLog file, with ID = id, id must be greather than 0 + int writeBinLog(int id, PIByteArray data) {return writeBinLog(id, data.data(), data.size_s());} + + //! Write one record to BinLog file, with ID = id, id must be greather than 0 + int writeBinLog(int id, const void * data, int size); + + //! Returns count of writed records + int writeCount() const {return write_count;} + + //! Read one record from BinLog file, with ID = id, if id = 0 than any id will be readed + PIByteArray readBinLog(int id = 0); + + //! Read one record from BinLog file, with ID = id, if id = 0 than any id will be readed + int readBinLog(int id, void * read_to, int max_size); + + //! Returns binary log file size + llong logSize() const {return file.size();} + + //! Return true, if position at the end of BinLog file + bool isEnd() const {if (!opened_) return true; return file.isEnd();} + + //! Returns if BinLog file is empty + bool isEmpty() const {return (file.size() <= PIBINARYLOG_SIGNATURE_SIZE + 1);} + + //! Returns if BinLog file is empty + int lastReadedID() const {return lastrecord.id;} + + //! Set position in file to reading/playing + + //! Read one message from binlog file, with ID contains in "filterID" or any ID, if "filterID" is empty + int read(void *read_to, int max_size); + + //! Write one record to BinLog file, with ID = "defaultID" + int write(const void * data, int size) {return writeBinLog(default_id, data, size);} + + //! Array of ID, that BinLog can read from binlog file, when use \a read function, or in \a ThreadedRead + PIVector filterID; + + //! Go to begin of BinLog file + void restart(); + + PIString constructFullPath() const; + + //! Get binlog info \a BinLogInfo + BinLogInfo logInfo() const {if (is_indexed) return binfo; return getLogInfo(path());} + + //! Get binlog index \a BinLogIndex, need \a createIndex before getting index + const PIVector & logIndex() const {return index;} /// TODO: Think about index positions + + //! Create index of current binlog file + bool createIndex(); + + //! Go to record #index + void seekTo(int rindex); + + //! Go to nearest record + bool seek(const PISystemTime & time); + bool seek(llong filepos); + + //! Get current record index (position record in file) + int pos() const {if (is_indexed) return current_index; return -1;} /// TODO: Think about index positions + + //! \handlers + //! \{ + + //! \fn PIString createNewFile() + //! \brief Create new binlog file in \a logDir, if successful returns filename, else returns empty string. + //! Filename is like \a filePrefix + "yyyy_MM_dd__hh_mm_ss.binlog" + + //! \} + //! \events + //! \{ + + //! \fn void fileEnd() + //! \brief Raise on file end while reading + + //! \fn void fileError() + //! \brief Raise on file creation error + + //! \fn void newFile(const PIString & filename) + //! \brief Raise on new file created + + //! \} + + EVENT_HANDLER(PIString, createNewFile); + EVENT(fileEnd) + EVENT(fileError) + EVENT1(newFile, const PIString &, filename) + EVENT1(posChanged, int, pos) /// TODO: Think about index positions + + //! Get binlog info and statistic + static BinLogInfo getLogInfo(const PIString & path); + +protected: + PIString fullPathPrefix() const {return "binlog";} + void configureFromFullPath(const PIString & full_path); + bool openDevice(); + bool closeDevice(); + void propertyChanged(const PIString &); + bool threadedRead(uchar *readed, int size); + +private: + struct BinLogRecord { + int id; + int size; + PISystemTime timestamp; + PIByteArray data; + }; + + bool writeFileHeader(); + bool checkFileHeader(); + BinLogRecord readRecord(); + static void parseLog(PIFile *f, BinLogInfo *info, PIVector * index); + void moveIndex(int i); + + PIVector index; + PIMap index_pos; + BinLogInfo binfo; + + PlayMode play_mode; + SplitMode split_mode; + PIFile file; + BinLogRecord lastrecord; + PISystemTime startlogtime, play_delay, split_time; + double play_time, play_speed; + llong split_size; + int write_count, split_count, default_id, current_index; + bool is_started, is_thread_ok, is_indexed, rapid_start; +}; + +//! \relatesalso PICout \relatesalso PIBinaryLog::BinLogInfo \brief Output operator to PICout +inline PICout operator <<(PICout s, const PIBinaryLog::BinLogInfo & bi) { + s.space(); + s.setControl(0, true); + s << "[PIBinaryLog] " << bi.path << "\n"; + if (bi.log_size < 0) { + s << "invalid file path"; + s.restoreControl(); + return s; + } + if (bi.log_size == 0) { + s << "Invalid empty file"; + s.restoreControl(); + return s; + } if (bi.records_count < 0 && bi.records_count > -4) { + s << "Invalid file or corrupted signature"; + s.restoreControl(); + return s; + } + if (bi.records_count < -3) { + s << "Invalid binlog version"; + s.restoreControl(); + return s; + } + s << "read records " << bi.records_count << " in " << bi.records.size() << " types, log size " << bi.log_size; + s << "\nlog start " << bi.start_time << " , log end " << bi.end_time; + PIVector keys = bi.records.keys(); + piForeachC(int i, keys) { + const PIBinaryLog::BinLogRecordInfo &bri(bi.records[i]); + s << "\n record id " << bri.id << " , count " << bri.count; + s << "\n record start " << bri.start_time << " , end " << bri.end_time; + s << "\n record size " << bri.minimum_size << " - " << bri.maximum_size; + } + s.restoreControl(); + return s; +} + +#endif // PIBINARYLOG_H diff --git a/src/io/piconfig.cpp b/src/io/piconfig.cpp new file mode 100755 index 00000000..f858d9f8 --- /dev/null +++ b/src/io/piconfig.cpp @@ -0,0 +1,710 @@ +/* + PIP - Platform Independent Primitives + Config parser + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piconfig.h" +#include "pifile.h" +#include "piiostring.h" + +/*! \class PIConfig + * \brief Configuration file + * \details This class provide handle access to configuration file. + * + * \section PIConfig_sec0 Synopsis + * PIConfig reads configuration file and create internal dendritic + * representation of all entries of this file. You can easily read + * some values and write new. + * \image html piconfig.png + * + * %PIConfig supports also INI-style files with sections "[section]". + * In this case line with section name interpret as prefix to the next + * lines. For example, these configs are equal: + * \code + * ser.device = /dev/ttyS0 + * ser.speed = 115200 + * debug = true + * \endcode + * \code + * [ser] + * device = /dev/ttyS0 + * speed = 115200 + * [] + * debug = true + * \endcode + * + * \section PIConfig_sec1 Concepts + * Each node of internal tree has type PIConfig::Entry. %PIConfig + * has one root element \a rootEntry(). Any entry of configuration file is a + * child of this element. + * + */ + +/*! \class PIConfig::Entry + * \brief %Entry of configuration file + * \details This class is node of internal PIConfig tree. + * %Entry provide access to elements of PIConfig. Each entry has + * children or next properties: + * * name + * * value + * * type + * * comment + * + * Each property is a PIString. These properties forms from text line with + * format: \code{.cpp} = # \endcode + * Type and comment are optional fields. Type is a single letter immediately + * after comment symbol "#". \n \n + * %Entry has many implicit convertions to common types: boolean, integers, + * float, double, PIString, PIStringList. \n \n + * Generally there is no need to create instance of %PIConfig::Entry manually, + * it returns by functions \a getValue() of \a PIConfig, \a PIConfig::Entry or + * \a PIConfig::Branch. If there is no suitable entry to return, reference to + * internal instance of %PIConfig::Entry with "default" value will be returned. + * \snippet piconfig.cpp PIConfig::Entry + * +*/ + +/*! \class PIConfig::Branch + * \brief %Branch is a list of entries of configuration file + * \details %Branch provides some features to get entries lists. + * \snippet piconfig.cpp PIConfig::Branch + * +*/ + + +PIConfig::Entry PIConfig::Branch::_empty; +PIConfig::Entry PIConfig::Entry::_empty; + + +PIConfig::Branch PIConfig::Branch::allLeaves() { + Branch b; + b.delim = delim; + piForeach (Entry * i, *this) { + if (i->isLeaf()) b << i; + else allLeaves(b, i); + } + return b; +} + + +PIConfig::Entry & PIConfig::Branch::getValue(const PIString & vname, const PIString & def, bool * exist) { + if (vname.isEmpty()) { + _empty.clear(); + _empty.delim = delim; + if (exist != 0) *exist = false; + return _empty; + } + PIStringList tree = vname.split(delim); + PIString name = tree.front(); + tree.pop_front(); + Entry * ce = 0; + piForeach (Entry * i, *this) + if (i->_name == name) { + ce = i; + break; + } + if (ce == 0) { + _empty._name = vname; + _empty._value = def; + _empty.delim = delim; + if (exist != 0) *exist = false; + return _empty; + } + piForeach (PIString & i, tree) { + ce = ce->findChild(i); + if (ce == 0) { + _empty._name = vname; + _empty._value = def; + _empty.delim = delim; + if (exist != 0) *exist = false; + return _empty; + } + } + if (exist != 0) *exist = true; + return *ce; +} + + +PIConfig::Branch PIConfig::Branch::getValues(const PIString & name) { + Branch b; + b.delim = delim; + piForeach (Entry * i, *this) { + if (i->isLeaf()) { + if (i->_name.find(name) >= 0) + b << i; + } else { + piForeach (Entry * j, i->_children) + if (j->_name.find(name) >= 0) + b << j; + } + } + return b; +} + + +PIConfig::Branch PIConfig::Branch::getLeaves() { + Branch b; + b.delim = delim; + piForeach (Entry * i, *this) + if (i->isLeaf()) + b << i; + return b; +} + + +PIConfig::Branch PIConfig::Branch::getBranches() { + Branch b; + b.delim = delim; + piForeach (Entry * i, *this) + if (!i->isLeaf()) + b << i; + return b; +} + + +PIConfig::Branch & PIConfig::Branch::filter(const PIString & f) { + for (int i = 0; i < size_s(); ++i) { + if (at(i)->_name.find(f) < 0) { + remove(i); + --i; + } + } + return *this; +} + + +bool PIConfig::Branch::entryExists(const Entry * e, const PIString & name) const { + if (e->_children.isEmpty()) { + return (e->_name == name); + } + piForeachC (Entry * i, e->_children) + if (entryExists(i, name)) return true; + return false; +} + + +PIConfig::Entry & PIConfig::Entry::getValue(const PIString & vname, const PIString & def, bool * exist) { + PIStringList tree = vname.split(delim); + Entry * ce = this; + piForeach (PIString & i, tree) { + ce = ce->findChild(i); + if (ce == 0) { + _empty._name = vname; + _empty._value = def; + _empty.delim = delim; + if (exist != 0) *exist = false; + return _empty; + } + } + if (exist != 0) *exist = true; + return *ce; +} + + +PIConfig::Branch PIConfig::Entry::getValues(const PIString & vname) { + Branch b; + b.delim = delim; + piForeach (Entry * i, _children) + if (i->_name.find(vname) >= 0) + b << i; + return b; +}; + + +bool PIConfig::Entry::entryExists(const Entry * e, const PIString & name) const { + if (e->_children.isEmpty()) { + return (e->_name == name); + } + piForeachC (Entry * i, e->_children) + if (entryExists(i, name)) return true; + return false; +} + + +PIConfig::PIConfig(const PIString & path, PIIODevice::DeviceMode mode) { + _init(); + own_dev = true; + dev = new PIFile(path, mode); + if (!dev->isOpened()) + dev->open(path, mode); + parse(); +} + + +PIConfig::PIConfig(PIString * string, PIIODevice::DeviceMode mode) { + _init(); + own_dev = true; + dev = new PIIOString(string, mode); + parse(); +} + + +PIConfig::PIConfig(PIIODevice * device, PIIODevice::DeviceMode mode) { + _init(); + own_dev = false; + dev = device; + if (dev) dev->open(mode); + parse(); +} + + +PIConfig::~PIConfig() { + root.deleteBranch(); + if (own_dev && dev) delete dev; + dev = 0; +} + + +bool PIConfig::open(const PIString & path, PIIODevice::DeviceMode mode) { + if (own_dev && dev) delete dev; + own_dev = true; + dev = new PIFile(path, mode); + if (!dev->isOpened()) + dev->open(path, mode); + parse(); + return dev->isOpened(); +} + + +bool PIConfig::open(PIString * string, PIIODevice::DeviceMode mode) { + if (own_dev && dev) delete dev; + own_dev = true; + dev = new PIIOString(string, mode); + parse(); + return true; +} + + +void PIConfig::_init() { + delim = "."; + root.delim = delim; + empty.delim = delim; + empty._parent = 0; +} + + +void PIConfig::_clearDev() { + if (!dev) return; + if (PIString(dev->className()) == "PIFile") {((PIFile*)dev)->clear(); return;} + if (PIString(dev->className()) == "PIIOString") {((PIIOString*)dev)->clear(); return;} +} + + +void PIConfig::_flushDev() { + if (!dev) return; + if (PIString(dev->className()) == "PIFile") {((PIFile*)dev)->flush();} +} + + +bool PIConfig::_isEndDev() { + if (!dev) return true; + if (PIString(dev->className()) == "PIFile") {return ((PIFile*)dev)->isEnd();} + if (PIString(dev->className()) == "PIIOString") {return ((PIIOString*)dev)->isEnd();} + return true; +} + + +void PIConfig::_seekToBeginDev() { + if (!dev) return; + if (PIString(dev->className()) == "PIFile") {((PIFile*)dev)->seekToBegin(); return;} + if (PIString(dev->className()) == "PIIOString") {((PIIOString*)dev)->seekToBegin(); return;} +} + + +PIString PIConfig::_readLineDev() { + if (!dev) return PIString(); + if (PIString(dev->className()) == "PIFile") {return ((PIFile*)dev)->readLine();} + if (PIString(dev->className()) == "PIIOString") {return ((PIIOString*)dev)->readLine();} + return PIString(); +} + + +void PIConfig::_writeDev(const PIString & l) { + //piCout << "write \"" << l << "\""; + if (!dev) return; + if (PIString(dev->className()) == "PIFile") {*((PIFile*)dev) << (l); return;} + if (PIString(dev->className()) == "PIIOString") {((PIIOString*)dev)->writeString(l); return;} + dev->write(l.toByteArray()); +} + + +bool PIConfig::isOpened() const { + if (dev) return dev->isOpened(); + return false; +} + + +PIConfig::Entry & PIConfig::getValue(const PIString & vname, const PIString & def, bool * exist) { + PIStringList tree = vname.split(delim); + Entry * ce = &root; + piForeach (PIString & i, tree) { + ce = ce->findChild(i); + if (ce == 0) { + if (exist != 0) *exist = false; + empty._name = vname; + empty._value = def; + empty.delim = delim; + return empty; + } + } + if (exist != 0) *exist = true; + return *ce; +} + + +PIConfig::Branch PIConfig::getValues(const PIString & vname) { + Branch b; + b.delim = delim; + piForeach (Entry * i, root._children) + if (i->_name.find(vname) >= 0) + b << i; + return b; +}; + + +void PIConfig::addEntry(const PIString & name, const PIString & value, const PIString & type, bool write) { + if (getValue(name)._parent != 0) + return; + bool toRoot = false; + PIStringList tree = name.split(delim); + PIString ename = tree.back(); + tree.pop_back(); + Entry * te, * ce, * entry = &root; + if (tree.isEmpty()) toRoot = true; + piForeach (PIString & i, tree) { + te = entry->findChild(i); + if (te == 0) { + ce = new Entry(); + ce->delim = delim; + ce->_tab = entry->_tab; + ce->_line = entry->_line; + ce->_name = i; + ce->_parent = entry; + entry->_children << ce; + entry = ce; + } else entry = te; + } + PIConfig::Branch ch = entry->_children; + ch.sort(PIConfig::Entry::compare); + te = (entry->isLeaf() ? 0 : ch.back()); + ce = new Entry(); + ce->delim = delim; + ce->_name = ename; + ce->_value = value; + ce->_type = type; + if (te == 0) { + ce->_tab = entry->_tab; + if (toRoot) ce->_line = other.size_s() - 1; + else ce->_line = entry->_line; + } else { + ce->_tab = te->_tab; + if (toRoot) ce->_line = other.size_s() - 1; + else { + ch = entry->_parent->_children; + ch.sort(PIConfig::Entry::compare); + ce->_line = ch.back()->_line + 1; + } + } + ce->_parent = entry; + entry->_children << ce; + other.insert(ce->_line, ""); + Branch b = allLeaves(); + bool found = false; + for (int i = 0; i < b.size_s(); ++i) { + if (found) { + b[i]->_line++; + continue; + } + if (b[i] == ce) { + found = true; + if (i > 0) + if (b[i - 1]->_line == b[i]->_line) + b[i - 1]->_line++; + } + } + if (write) writeAll(); +} + + +void PIConfig::setValue(const PIString & name, const PIString & value, const PIString & type, bool write) { + Entry & e(getValue(name)); + if (&e == &empty) { + addEntry(name, value, type, write); + return; + } + e._value = value; + e._type = type; + if (write) writeAll(); +} + + +int PIConfig::entryIndex(const PIString & name) { + PIStringList tree = name.split(delim); + Entry * ce = &root; + piForeach (PIString & i, tree) { + ce = ce->findChild(i); + if (ce == 0) + return -1; + } + return allLeaves().indexOf(ce); +} + + +void PIConfig::setValue(uint number, const PIString & value, bool write) { + Entry & e(entryByIndex(number)); + if (&e == &empty) return; + e._value = value; + if (write) writeAll(); +} + + +void PIConfig::setName(uint number, const PIString & name, bool write) { + Entry & e(entryByIndex(number)); + if (&e == &empty) return; + e._name = name; + if (write) writeAll(); +} + + +void PIConfig::setType(uint number, const PIString & type, bool write) { + Entry & e(entryByIndex(number)); + if (&e == &empty) return; + e._type = type; + if (write) writeAll(); +} + + +void PIConfig::setComment(uint number, const PIString & comment, bool write) { + Entry & e(entryByIndex(number)); + if (&e == &empty) return; + e._comment = comment; + if (write) writeAll(); +} + + +void PIConfig::removeEntry(const PIString & name, bool write) { + Entry & e(getValue(name)); + if (&e == &empty) return; + Branch b = allLeaves(); + removeEntry(b, &e); + if (write) writeAll(); +} + + +void PIConfig::removeEntry(uint number, bool write) { + Entry & e(entryByIndex(number)); + if (&e == &empty) return; + Branch b = allLeaves(); + removeEntry(b, &e); + if (write) writeAll(); +} + + +void PIConfig::removeEntry(Branch & b, PIConfig::Entry * e) { + bool leaf = true; + if (e->isLeaf()) other.remove(e->_line); + if (!e->isLeaf() && !e->_value.isEmpty()) { + e->_value.clear(); + leaf = false; + } else { + int cc = e->_children.size_s(); + piForTimes (cc) + removeEntry(b, e->_children.back()); + } + bool found = false; + for (int i = 0; i < b.size_s(); ++i) { + if (found) { + b[i]->_line--; + continue; + } + if (b[i] == e) found = true; + } + if (!leaf) return; + e->_parent->_children.removeOne(e); + b.removeOne(e); + delete e; +} + + +PIString PIConfig::getPrefixFromLine(PIString line, bool * exists) { + line.trim(); + if (line.left(1) == "#") {if (exists) *exists = false; return PIString();} + int ci = line.find("#"); + if (ci >= 0) line.cutRight(line.size() - ci); + if (line.find("=") >= 0) {if (exists) *exists = false; return PIString();} + if (line.find("[") >= 0 && line.find("]") >= 0) { + if (exists) *exists = true; + return line.takeRange('[', ']').trim(); + } + if (exists) *exists = false; + return PIString(); +} + + +void PIConfig::writeAll() { + //cout << this << " write < " << size() << endl; + _clearDev(); + //*this << "1234567894132456798\n"; return; + //writeEntry(&root); + buildFullNames(&root); + Branch b = allLeaves(); + PIString prefix, tprefix; + bool isPrefix; + //for (int i = 0; i < b.size_s(); ++i) + // cout << b[i]->_name << " = " << b[i]->_value << endl; + int j = 0; + for (int i = 0; i < other.size_s(); ++i) { + //cout << j << endl; + if (j >= 0 && j < b.size_s()) { + if (b[j]->_line == i) { + b[j]->buildLine(); + _writeDev((b[j]->_all).cutLeft(prefix.size()) + "\n"); + //cout << this << " " << b[j]->_all << endl; + ++j; + } else { + _writeDev(other[i]); + tprefix = getPrefixFromLine(other[i], &isPrefix); + if (isPrefix) { + prefix = tprefix; + if (!prefix.isEmpty()) + prefix += delim; + } + if (i < other.size_s() - 1) + _writeDev('\n'); + //cout << this << " " << other[i] << endl; + } + } else { + _writeDev(other[i]); + tprefix = getPrefixFromLine(other[i], &isPrefix); + if (isPrefix) { + prefix = tprefix; + if (!prefix.isEmpty()) + prefix += delim; + } + if (i < other.size_s() - 1) + _writeDev('\n'); + //cout << this << " " << other[i] << endl; + } + } + _flushDev(); + readAll(); + //cout << this << " write > " << size() << endl; +} + + +void PIConfig::clear() { + _clearDev(); + parse(); +} + + +void PIConfig::readAll() { + root.deleteBranch(); + root.clear(); + parse(); +} + + +bool PIConfig::entryExists(const Entry * e, const PIString & name) const { + if (e->_children.isEmpty()) { + return (e->_name == name); + } + piForeachC (Entry * i, e->_children) + if (entryExists(i, name)) return true; + return false; +} + + +void PIConfig::parse() { + PIString src, str, tab, comm, all, name, type, prefix, tprefix; + PIStringList tree; + Entry * entry, * te, * ce; + int ind, sind; + bool isNew, isPrefix; + if (!isOpened()) return; + _seekToBeginDev(); + other.clear(); + lines = centry = 0; + while (!_isEndDev()) { + other.push_back(PIString()); + src = str = _readLineDev(); + tprefix = getPrefixFromLine(src, &isPrefix); + if (isPrefix) { + prefix = tprefix; + if (!prefix.isEmpty()) + prefix += delim; + } + //piCout << "line \"" << str << "\""; + tab = str.left(str.find(str.trimmed().left(1))); + str.trim(); + //cout << endl << str << endl << endl; + all = str; + ind = str.find('='); + if ((ind > 0) && (str[0] != '#')) { + sind = str.find('#'); + if (sind > 0) { + comm = str.right(str.length() - sind - 1).trimmed(); + if (comm.length() > 0) type = comm[0]; + else type = "s"; + comm = comm.right(comm.length() - 1).trimmed(); + str = str.left(sind); + } else { + type = "s"; + comm = ""; + } + //name = str.left(ind).trimmed(); + tree = (prefix + str.left(ind).trimmed()).split(delim); + name = tree.back(); + tree.pop_back(); + entry = &root; + piForeachC (PIString & i, tree) { + te = entry->findChild(i); + if (te == 0) { + ce = new Entry(); + ce->delim = delim; + ce->_tab = tab; + ce->_line = lines; + ce->_name = i; + ce->_parent = entry; + entry->_children << ce; + entry = ce; + } else entry = te; + } + isNew = false; + ce = entry->findChild(name); + if (ce == 0) { + ce = new Entry(); + isNew = true; + } + ce->delim = delim; + ce->_tab = tab; + ce->_name = name; + ce->_value = str.right(str.length() - ind - 1).trimmed(); + ce->_type = type; + ce->_comment = comm; + ce->_line = lines; + ce->_all = all; + if (isNew) { + ce->_parent = entry; + entry->_children << ce; + } + } else other.back() = src; + lines++; + } + setEntryDelim(&root, delim); + buildFullNames(&root); +} diff --git a/src/io/piconfig.h b/src/io/piconfig.h new file mode 100755 index 00000000..0b34938f --- /dev/null +++ b/src/io/piconfig.h @@ -0,0 +1,525 @@ +/*! \file piconfig.h + * \brief Configuration parser and writer +*/ +/* + PIP - Platform Independent Primitives + Configuration parser and writer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICONFIG_H +#define PICONFIG_H + +#include "piiodevice.h" + +#define PICONFIG_GET_VALUE \ + Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) {return getValue(vname, PIString(def), exists);} \ + Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) {return getValue(vname, def.join("%|%"), exists);} \ + Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) {return getValue(vname, PIString::fromBool(def), exists);} \ + Entry & getValue(const PIString & vname, const short def, bool * exists = 0) {return getValue(vname, itos(def), exists);} \ + Entry & getValue(const PIString & vname, const int def, bool * exists = 0) {return getValue(vname, itos(def), exists);} \ + Entry & getValue(const PIString & vname, const long def, bool * exists = 0) {return getValue(vname, ltos(def), exists);} \ + Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) {return getValue(vname, ultos(def), exists);} \ + Entry & getValue(const PIString & vname, const float def, bool * exists = 0) {return getValue(vname, ftos(def), exists);} \ + Entry & getValue(const PIString & vname, const double def, bool * exists = 0) {return getValue(vname, dtos(def), exists);} \ + \ + Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) const {return getValue(vname, PIString(def), exists);} \ + Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) const {return getValue(vname, def.join("%|%"), exists);} \ + Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) const {return getValue(vname, PIString::fromBool(def), exists);} \ + Entry & getValue(const PIString & vname, const short def, bool * exists = 0) const {return getValue(vname, itos(def), exists);} \ + Entry & getValue(const PIString & vname, const int def, bool * exists = 0) const {return getValue(vname, itos(def), exists);} \ + Entry & getValue(const PIString & vname, const long def, bool * exists = 0) const {return getValue(vname, ltos(def), exists);} \ + Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) const {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) const {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) const {return getValue(vname, uitos(def), exists);} \ + Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) const {return getValue(vname, ultos(def), exists);} \ + Entry & getValue(const PIString & vname, const float def, bool * exists = 0) const {return getValue(vname, ftos(def), exists);} \ + Entry & getValue(const PIString & vname, const double def, bool * exists = 0) const {return getValue(vname, dtos(def), exists);} + +class PIP_EXPORT PIConfig +{ + friend class Entry; + friend class Branch; +public: + + //! Contructs and read configuration file at path "path" in mode "mode" + PIConfig(const PIString & path, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + //! Contructs and read configuration string "string" in mode "mode" + PIConfig(PIString * string, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + //! Contructs and read configuration from custom device "device" in mode "mode" + PIConfig(PIIODevice * device = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + ~PIConfig(); + + class Entry; + + + class PIP_EXPORT Branch: public PIVector { + friend class PIConfig; + friend class Entry; + friend std::ostream & operator <<(std::ostream & s, const Branch & v); + friend PICout operator <<(PICout s, const Branch & v); + public: + Branch() {;} + + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0); + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0) const {return const_cast(this)->getValue(vname, def, exists);} + PICONFIG_GET_VALUE + + Branch allLeaves(); + Branch getValues(const PIString & name); + Branch getLeaves(); + Branch getBranches(); + Branch & filter(const PIString & f); + bool isEntryExists(const PIString & name) const {piForeachC (Entry * i, *this) if (entryExists(i, name)) return true; return false;} + int indexOf(const Entry * e) {for (int i = 0; i < size_s(); ++i) if (at(i) == e) return i; return -1;} + + //void clear() {piForeach (Entry * i, *this) delete i; PIVector::clear();} + + private: + bool entryExists(const Entry * e, const PIString & name) const; + void allLeaves(Branch & b, Entry * e) {piForeach (Entry * i, e->_children) {if (i->isLeaf()) b << i; else allLeaves(b, i);}} + void coutt(std::ostream & s, const PIString & p) const {piForeachC (Entry * i, *this) i->coutt(s, p);} + void piCoutt(PICout s, const PIString & p) const {piForeachC (Entry * i, *this) i->piCoutt(s, p);} + + static Entry _empty; + PIString delim; + + }; + + + class PIP_EXPORT Entry { + friend class PIConfig; + friend class Branch; + public: + Entry() {_parent = 0;} + + //! Returns parent entry, or 0 if there is no parent (root of default value) + Entry * parent() const {return _parent;} + + //! Returns children count + int childCount() const {return _children.size_s();} + + //! Returns children as \a PIConfig::Branch + Branch & children() const {_children.delim = delim; return _children;} + + //! Returns child at index "index" + Entry * child(const int index) const {return _children[index];} + + //! Returns first child with name "name" + Entry * findChild(const PIString & name) {piForeach (Entry * i, _children) if (i->_name == name) return i; return 0;} + + //! Returns first child with name "name" + const Entry * findChild(const PIString & name) const {piForeachC (Entry * i, _children) if (i->_name == name) return i; return 0;} + + //! Returns \b true if there is no children + bool isLeaf() const {return _children.isEmpty();} + + + //! Returns name + const PIString & name() const {return _name;} + + //! Returns value + const PIString & value() const {return _value;} + + //! Returns type + const PIString & type() const {return _type;} + + //! Returns comment + const PIString & comment() const {return _comment;} + + /** \brief Returns full name, i.e. name as it looks in file + * \details In case of default entry full name always is empty + * \snippet piconfig.cpp fullName */ + const PIString & fullName() const {return _full_name;} + + //! Set name to "value" and returns this + Entry & setName(const PIString & value) {_name = value; return *this;} + + //! Set type to "value" and returns this + Entry & setType(const PIString & value) {_type = value; return *this;} + + //! Set comment to "value" and returns this + Entry & setComment(const PIString & value) {_comment = value; return *this;} + + //! Set value to "value" and returns this + Entry & setValue(const PIString & value) {_value = value; return *this;} + + //! Set value to "value" and returns this. Type is set to "l" + Entry & setValue(const PIStringList & value) {setValue(value.join("%|%")); setType("l"); return *this;} + + //! Set value to "value" and returns this. Type is set to "s" + Entry & setValue(const char * value) {setValue(PIString(value)); setType("s"); return *this;} + + //! Set value to "value" and returns this. Type is set to "b" + Entry & setValue(const bool value) {setValue(btos(value)); setType("b"); return *this;} + + //! Set value to "value" and returns this. Type is set to "s" + Entry & setValue(const char value) {setValue(PIString(1, value)); setType("s"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const short value) {setValue(itos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const int value) {setValue(itos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const long value) {setValue(ltos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const uchar value) {setValue(uitos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const ushort value) {setValue(uitos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const uint value) {setValue(uitos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "n" + Entry & setValue(const ulong value) {setValue(ultos(value)); setType("n"); return *this;} + + //! Set value to "value" and returns this. Type is set to "f" + Entry & setValue(const float value) {setValue(ftos(value)); setType("f"); return *this;} + + //! Set value to "value" and returns this. Type is set to "f" + Entry & setValue(const double value) {setValue(dtos(value)); setType("f"); return *this;} + + + /** \brief Returns entry with name "vname" and default value "def" + * \details If there is no suitable entry found, reference to default internal entry with + * value = "def" will be returned, and if "exists" not null it will be set to \b false */ + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0); + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0) const {return const_cast(this)->getValue(vname, def, exists);} + PICONFIG_GET_VALUE + + //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0) + //! \brief Returns entry with name "vname" and default value "def" + + + //! Find all entries with names with substrings "vname" and returns them as \a PIConfig::Branch + Branch getValues(const PIString & vname); + + + //! If there is no children returns if name == "name". Else returns if any child has name == "name" + bool isEntryExists(const PIString & name) const {return entryExists(this, name);} + + + //! Convertion to boolean + operator bool() {return _value.toBool();} + + //! Convertion to char + operator char() {return (_value.isEmpty() ? 0 : _value[0].toAscii());} + + //! Convertion to short + operator short() {return _value.toShort();} + + //! Convertion to int + operator int() {return _value.toInt();} + + //! Convertion to long + operator long() {return _value.toLong();} + + //! Convertion to uchar + operator uchar() {return _value.toInt();} + + //! Convertion to ushort + operator ushort() {return _value.toShort();} + + //! Convertion to uint + operator uint() {return _value.toInt();} + + //! Convertion to ulong + operator ulong() {return _value.toLong();} + + //! Convertion to float + operator float() {return _value.toFloat();} + + //! Convertion to double + operator double() {return _value.toDouble();} + + //! Convertion to PIString + operator PIString() {return _value;} + + //! Convertion to PIStringList + operator PIStringList() {return _value.split("%|%");} + + private: + typedef PIConfig::Entry * EntryPtr; + static int compare(const EntryPtr * f, const EntryPtr * s) {return (*f)->_line == (*s)->_line ? 0 : (*f)->_line < (*s)->_line ? -1 : 1;} + bool entryExists(const Entry * e, const PIString & name) const; + void buildLine() {_all = _tab + _full_name + " = " + _value + " #" + _type + " " + _comment;} + void clear() {_children.clear(); _name = _value = _type = _comment = _all = PIString(); _line = 0; _parent = 0;} + void coutt(std::ostream & s, const PIString & p) const {PIString nl = p + " "; if (!_value.isEmpty()) s << p << _name << " = " << _value << endl; else cout << p << _name << endl; piForeachC (Entry * i, _children) i->coutt(s, nl);} + void piCoutt(PICout s, const PIString & p) const {PIString nl = p + " "; if (!_value.isEmpty()) s << p << _name << " = " << _value << NewLine; else cout << p << _name << endl; piForeachC (Entry * i, _children) i->piCoutt(s, nl);} + void deleteBranch() {piForeach (Entry * i, _children) {i->deleteBranch(); delete i;}} + + static Entry _empty; + Entry * _parent; + mutable Branch _children; + PIString _tab; + PIString _name; + PIString _value; + PIString _type; + PIString _comment; + PIString _all; + PIString _full_name; + PIString delim; + int _line; + }; + + + //! Read configuration file at path "path" in mode "mode" + bool open(const PIString & path, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + //! Read configuration string "string" in mode "mode" + bool open(PIString * string, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite);\ + + bool isOpened() const; + + //! Returns top-level entry with name "vname", if doesn`t exists return entry with value "def" and set *exist to false + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0); + Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0) const {return const_cast(this)->getValue(vname, def, exists);} + + PICONFIG_GET_VALUE + + //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + //! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0) + //! \brief Returns top-level entry with name "vname" and default value "def" + + + //! Returns top-level entries with names with substrings "vname" + Branch getValues(const PIString & vname); + + + //! Set top-level entry with name "name" value to "value", type to "type" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const PIString & value, const PIString & type = "s", bool write = true); + + //! Set top-level entry with name "name" value to "value", type to "l" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const PIStringList & value, bool write = true) {setValue(name, value.join("%|%"), "l", write);} + + //! Set top-level entry with name "name" value to "value", type to "s" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const char * value, bool write = true) {setValue(name, PIString(value), "s", write);} + + //! Set top-level entry with name "name" value to "value", type to "b" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const bool value, bool write = true) {setValue(name, btos(value), "b", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const short value, bool write = true) {setValue(name, itos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const int value, bool write = true) {setValue(name, itos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const long value, bool write = true) {setValue(name, ltos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const uchar value, bool write = true) {setValue(name, uitos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const ushort value, bool write = true) {setValue(name, uitos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const uint value, bool write = true) {setValue(name, uitos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "n" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const ulong value, bool write = true) {setValue(name, ultos(value), "n", write);} + + //! Set top-level entry with name "name" value to "value", type to "f" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const float value, bool write = true) {setValue(name, ftos(value), "f", write);} + + //! Set top-level entry with name "name" value to "value", type to "f" and if "write" immediate write to file. Add new entry if there is no suitable exists + void setValue(const PIString & name, const double value, bool write = true) {setValue(name, dtos(value), "f", write);} + + //! Returns root entry + Entry & rootEntry() {return root;} + + //! Returns top-level entries count + int entriesCount() const {return childCount(&root);} + + //! Returns if top-level entry with name "name" exists + bool isEntryExists(const PIString & name) const {return entryExists(&root, name);} + + //! Returns all top-level entries + Branch allTree() {Branch b; piForeach (Entry * i, root._children) b << i; b.delim = delim; return b;} + + //! Returns all entries without children + Branch allLeaves() {Branch b; allLeaves(b, &root); b.sort(Entry::compare); b.delim = delim; return b;} + + int entryIndex(const PIString & name); + + PIString getName(uint number) {return entryByIndex(number)._name;} + PIString getValue(uint number) {return entryByIndex(number)._value;} + PIChar getType(uint number) {return entryByIndex(number)._type[0];} + PIString getComment(uint number) {return entryByIndex(number)._comment;} + + void addEntry(const PIString & name, const PIString & value, const PIString & type = "s", bool write = true); + void setName(uint number, const PIString & name, bool write = true); + void setValue(uint number, const PIString & value, bool write = true); + void setType(uint number, const PIString & type, bool write = true); + void setComment(uint number, const PIString & comment, bool write = true); + + void removeEntry(const PIString & name, bool write = true); + void removeEntry(uint number, bool write = true); + + //! Remove all tree and device content + void clear(); + + //! Parse device and build internal tree + void readAll(); + + //! Write all internal tree to device + void writeAll(); + + //! Returns current tree delimiter, default "." + const PIString & delimiter() const {return delim;} + + //! Set current tree delimiter + void setDelimiter(const PIString & d) {delim = d; setEntryDelim(&root, d); readAll();} + +private: + void _init(); + void _clearDev(); + void _flushDev(); + bool _isEndDev(); + void _seekToBeginDev(); + PIString _readLineDev(); + void _writeDev(const PIString & l); + int childCount(const Entry * e) const {int c = 0; piForeachC (Entry * i, e->_children) c += childCount(i); c += e->_children.size_s(); return c;} + bool entryExists(const Entry * e, const PIString & name) const; + void buildFullNames(Entry * e) {piForeach (Entry * i, e->_children) {if (e != &root) i->_full_name = e->_full_name + delim + i->_name; else i->_full_name = i->_name; buildFullNames(i);}} + void allLeaves(Branch & b, Entry * e) {piForeach (Entry * i, e->_children) {if ((!i->_value.isEmpty() && !i->isLeaf()) || i->isLeaf()) b << i; allLeaves(b, i);}} + void setEntryDelim(Entry * e, const PIString & d) {piForeach (Entry * i, e->_children) setEntryDelim(i, d); e->delim = d;} + Entry & entryByIndex(const int index) {Branch b = allLeaves(); if (index < 0 || index >= b.size_s()) return empty; return *(b[index]);} + void removeEntry(Branch & b, Entry * e); + void deleteEntry(Entry * e) {piForeach (Entry * i, e->_children) deleteEntry(i); delete e;} + PIString getPrefixFromLine(PIString line, bool * exists); + void parse(); + + int centry; + bool own_dev; + PIIODevice * dev; + PIString delim; + Entry root, empty; + uint lines; + PIStringList other; + +}; + + +inline std::ostream & operator <<(std::ostream & s, const PIConfig::Branch & v) {v.coutt(s, ""); return s;} +inline std::ostream & operator <<(std::ostream & s, const PIConfig::Entry & v) {s << v.value(); return s;} +inline PICout operator <<(PICout s, const PIConfig::Branch & v) {s.setControl(0, true); v.piCoutt(s, ""); s.restoreControl(); return s;} +inline PICout operator <<(PICout s, const PIConfig::Entry & v) {s << v.value(); return s;} + + +/** \relatesalso PIConfig \relatesalso PIIODevice + * \brief Service function. useful for configuring devices + * \details Function takes entry name "name", default value "def" and two + * \a PIConfig::Entry sections: "em" and their parent "ep". If there is no + * parent ep = 0. If "ep" is not null and entry "name" exists in "ep" function + * returns this value. Else returns value of entry "name" in section "em" or + * "def" if entry doesn`t exists. \n This function useful to read settings + * from configuration file in implementation \a PIIODevice::configureDevice() function */ +template +T readDeviceSetting(const PIString & name, const T & def, const PIConfig::Entry * em, const PIConfig::Entry * ep) { + if (ep != 0) { + T ret; + bool ex; + ret = ep->getValue(name, def, &ex); + if (!ex) ret = em->getValue(name, def); + return ret; + } + return em->getValue(name, def); + +} + +#endif // PICONFIG_H diff --git a/src/io/piconnection.cpp b/src/io/piconnection.cpp new file mode 100755 index 00000000..6247b8eb --- /dev/null +++ b/src/io/piconnection.cpp @@ -0,0 +1,1195 @@ +/* + PIP - Platform Independent Primitives + Complex I/O point + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piconnection.h" +#include "piconfig.h" + +/** \class PIConnection + * \brief Complex Input/Output point + * + * \section PIConnection_synopsis Synopsis + * %PIConnection provides abstract layer over physical devices, + * filtering and connecting data streams. Each %PIConnection + * works through Device Pool, so several %PIConnections can + * read from single physical device. General scheme: + * \image html piconnection.png + * + * \section PIConnection_pool Device pool concept + * Device pool is static object, single for each application, which + * contains unique devices. Each %PIConnection works with real devices + * through Device pool. Each device has assosiated thread for read + * and it can be started or stopped with %PIConnection functions + * \a startThreadedRead() and \a stopThreadedRead(). + * + * \section PIConnection_filters Filters + * %PIConnection filter is a PIPacketExtractor and assosiated + * array of devices or other filters. When read thread is successfully read + * from device this data can be passed to one or more filters. Each filter + * has name and filter names should be unique. You can use this name for + * access to PIPacketExtractor* with function \a filter(), or get array of + * assosiated devices and filters with function \a filterBoundedDevices(). + * One filter can receive data from several sources, and can be bounded to + * several filters. + * \image html piconnection_filters.png + * + * \section PIConnection_diag Diagnostics + * %PIConnection create PIDiagnostics for each device or filter. You can + * access to these objects with functions \a diagnostic(). + * + * \section PIConnection_sender Senders + * %PIConnection can send data to devices with named timers ("senders"). + * You can create sender or add device to sender with function \a addSender(). + * Each sender has internal timer and every tick execute virtual function + * \a senderData(). Returns value of this function sended to bounded devices. + * You can assign fixed send data to sender with function \a setSenderFixedData(). + * In this case sender will NOT execute \a senderData(), but send assigned data. + * \image html piconnection_senders.png + * + * \section PIConnection_config Configuration + * You can create %PIConnection from config file section or configure + * it later with function \a configureFromConfig(). Devices describes + * with its full pathes, for details see \ref PIIODevice_sec7. Example: + * \image html piconnection_conf.png + * Also %PIConnection can create PIString with its configuration with + * function \a makeConfig(). This string can be directly inserted into the + * config file. + * +*/ + + +PIVector PIConnection::_connections; + + +PIConnection::PIConnection(): PIObject() { + _connections << this; +} + + +PIConnection::PIConnection(const PIString & name): PIObject(name) { + _connections << this; +} + + +PIConnection::PIConnection(const PIString & config, const PIString & name_): PIObject(name_) { + _connections << this; + configureFromConfig(config, name_); +} + + +PIConnection::PIConnection(PIString * string, const PIString & name_): PIObject(name_) { + _connections << this; + configureFromString(string, name_); +} + + +PIConnection::~PIConnection() { + __device_pool__->unboundConnection(this); + removeAllFilters(); + _connections.removeAll(this); +} + + +bool PIConnection::configureFromConfig(const PIString & conf_path, const PIString & name_) { + PIConfig conf(conf_path, PIIODevice::ReadOnly); + return configure(conf, name_); +} + + +bool PIConnection::configureFromString(PIString * string, const PIString & name_) { + PIConfig conf(string, PIIODevice::ReadOnly); + return configure(conf, name_); +} + + +bool PIConnection::configure(PIConfig & conf, const PIString & name_) { + if (!conf.isOpened()) return false; + __device_pool__->unboundConnection(this); + removeAllSenders(); + removeAllChannels(); + removeAllFilters(); + removeAllDevices(); + setName(name_); + PIConfig::Entry ce(conf.getValue(name_)); + PIConfig::Branch db(ce.getValue("device").children()), fb(ce.getValue("filter").children()), + cb(ce.getValue("channel").children()), sb(ce.getValue("sender").children()); + PIStringList dev_list(ce.getValue("device").value()); + PIStringList name_list(ce.getValue("device").name()); + piForeachC (PIConfig::Entry * e, db) { + dev_list << e->value(); + name_list << e->name(); + } + PIMap dev_aliases; + for (int i = 0; i < dev_list.size_s(); ++i) { + PIString fn(dev_list[i]); + if (fn.isEmpty()) continue; + PIString & n(name_list[i]); + PIIODevice::DeviceMode dm = PIIODevice::ReadWrite; + splitFullPathWithMode(fn, &fn, &dm); + //piCout << fn; + PIIODevice * dev = addDevice(fn, dm); + if (!dev) continue; + dev_aliases[n] = fn; + device_names[n] = dev; + setDeviceName(dev, n); + dev->setName(name_ + ".device." + dev_list[i]); + PIDiagnostics * diag = diags_.value(dev, 0); + if (diag != 0) + diag->setDisconnectTimeout(ce.getValue("device." + n + ".disconnectTimeout", diag->disconnectTimeout())); + } + int added(0), padded(-1), tries(0); + bool pdebug = debug(); + setDebug(false); + PIStringList filter_fails; + while (added != padded && tries < 100) { + padded = added; + added = 0; + ++tries; + piForeachC (PIConfig::Entry * e, fb) { + PIPacketExtractor::SplitMode sm = PIPacketExtractor::None; + PIString sms(e->getValue("splitMode").value()); + int smi = sms.toInt(); + if (smi >= 1 && smi <= 5) sm = (PIPacketExtractor::SplitMode)smi; + else { + sms = sms.trim().toLowerCase(); + if (sms.find("header") >= 0 && sms.find("footer") >= 0) + sm = PIPacketExtractor::HeaderAndFooter; + else { + if (sms.find("header") >= 0) + sm = PIPacketExtractor::Header; + else { + if (sms.find("footer") >= 0) + sm = PIPacketExtractor::Footer; + else { + if (sms.find("time") >= 0) + sm = PIPacketExtractor::Timeout; + else { + if (sms.find("size") >= 0) + sm = PIPacketExtractor::Size; + } + } + } + } + } + PIStringList devs(e->value()); + PIConfig::Branch db(e->getValue("device").children()); + devs << e->getValue("device", "").value(); + piForeachC (PIConfig::Entry * e2, db) + devs << e2->value(); + devs.removeStrings(""); + if (devs.isEmpty()) continue; + PIString dname = dev_aliases.value(devs.front(), devs.front()); + PIPacketExtractor * pe = addFilter(e->name(), dname, sm); + if (pe == 0) { + if (!filter_fails.contains(dname)) + filter_fails << dname; + continue; + } else { + filter_fails.removeAll(dname); + } + ++added; + for (int i = 1; i < devs.size_s(); ++i) { + dname = dev_aliases.value(devs[i], devs[i]); + if (addFilter(e->name(), dname, sm) != 0) { + filter_fails.removeAll(dname); + ++added; + } else { + if (!filter_fails.contains(dname)) + filter_fails << dname; + } + } + PIDiagnostics * diag = diags_.value(pe, 0); + if (diag != 0) + diag->setDisconnectTimeout(e->getValue("disconnectTimeout", diag->disconnectTimeout())); + pe->setPayloadSize(e->getValue("payloadSize", pe->payloadSize())); + pe->setPacketSize(e->getValue("packetSize", pe->packetSize())); + pe->setTimeout(e->getValue("timeout", pe->timeout())); + pe->setHeader(PIByteArray::fromString(e->getValue("header", "").value())); + pe->setFooter(PIByteArray::fromString(e->getValue("footer", "").value())); + } + } + setDebug(pdebug); + piForeachC (PIString & f, filter_fails) + piCoutObj << "\"addFilter\" error: no such device \"" << f << "\"!"; + piForeachC (PIConfig::Entry * e, cb) { + PIString f(e->getValue("from").value()), t(e->getValue("to").value()); + addChannel(dev_aliases.value(f, f), dev_aliases.value(t, t)); + } + piForeachC (PIConfig::Entry * e, sb) { + PIStringList devs(e->value()); + PIConfig::Branch db(e->getValue("device").children()); + devs << e->getValue("device", "").value(); + piForeachC (PIConfig::Entry * e2, db) + devs << e2->value(); + devs.removeStrings(""); + if (devs.isEmpty()) continue; + float freq = e->getValue("frequency"); + piForeachC (PIString & d, devs) + addSender(e->name(), dev_aliases.value(d, d), freq); + PIByteArray fd(PIByteArray::fromString(e->getValue("fixedData").value())); + setSenderFixedData(e->name(), fd); + } + return true; +} + + +PIString PIConnection::makeConfig() const { + PIString ret; + ret << "[" << name() << "]\n"; + PIVector devs(boundedDevices()); + int dn(-1); + piForeachC (PIIODevice * d, devs) { + PIStringList dnl(deviceNames(d)); + if (dnl.isEmpty()) dnl << PIString::fromNumber(++dn); + piForeachC (PIString & dname, dnl) { + ret << "device." << dname << " = " << d->constructFullPath(); + if (d->mode() == PIIODevice::ReadOnly) ret << " (ro)"; + if (d->mode() == PIIODevice::WriteOnly) ret << " (wo)"; + ret << " #s\n"; + PIDiagnostics * diag = diags_.value(const_cast(d), 0); + if (diag != 0) + ret << "device." << dname << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n"; + } + } + piForeachC (PEPair & f, extractors) { + if (f.second == 0) continue; + if (f.second->extractor == 0) continue; + PIString prefix = "filter." + f.first; + for (int i = 0; i < f.second->devices.size_s(); ++i) + ret << prefix << ".device." << i << " = " << devPath(f.second->devices[i]) << " #s\n"; + PIDiagnostics * diag = diags_.value(f.second->extractor, 0); + if (diag != 0) + ret << prefix << ".disconnectTimeout = " << diag->disconnectTimeout() << " #f\n"; + ret << prefix << ".splitMode = "; + switch (f.second->extractor->splitMode()) { + case PIPacketExtractor::None: ret << "none"; break; + case PIPacketExtractor::Header: ret << "header"; break; + case PIPacketExtractor::Footer: ret << "footer"; break; + case PIPacketExtractor::HeaderAndFooter: ret << "header & footer"; break; + case PIPacketExtractor::Size: ret << "size"; break; + case PIPacketExtractor::Timeout: ret << "timeout"; break; + } + ret << " #s\n"; + ret << prefix << ".payloadSize = " << f.second->extractor->payloadSize() << " #n\n"; + ret << prefix << ".packetSize = " << f.second->extractor->packetSize() << " #n\n"; + ret << prefix << ".timeout = " << f.second->extractor->timeout() << " #f\n"; + ret << prefix << ".header = " << f.second->extractor->header().toString() << " #s\n"; + ret << prefix << ".footer = " << f.second->extractor->footer().toString() << " #s\n"; + } + dn = 0; + piForeachC (CPair & c, channels_) { + piForeachC (PIIODevice * d, c.second) { + PIString prefix = "channel." + PIString::fromNumber(dn); ++dn; + ret << prefix << ".from = " << devPath(c.first) << " #s\n"; + ret << prefix << ".to = " << devPath(d) << " #s\n"; + } + } + piForeachC (SPair & s, senders) { + if (s.second == 0) continue; + PIString prefix = "sender." + s.second->name(); + for (int i = 0; i < s.second->devices.size_s(); ++i) + ret << prefix << ".device." << i << " = " << devPath(s.second->devices[i]) << " #s\n"; + double int_ = s.second->int_; + if (int_ > 0.) + ret << prefix << ".frequency = " << (1000. / int_) << " #f\n"; + if (!s.second->sdata.isEmpty()) + ret << prefix << ".fixedData = " << s.second->sdata.toString() << " #s\n"; + } + ret << "[]\n"; + return ret; +} + + +PIIODevice * PIConnection::addDevice(const PIString & full_path, PIIODevice::DeviceMode mode, bool start) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + PIIODevice * dev = __device_pool__->addDevice(this, fp, mode, start); + if (dev) { + dev->setName(name() + ".device." + fp); + device_modes[dev] = mode; + __device_pool__->lock(); + if (diags_.value(dev, 0) == 0) { + PIDiagnostics * d = new PIDiagnostics(false); + diags_[dev] = d; + CONNECTU(d, qualityChanged, this, diagQualityChanged); + } + __device_pool__->unlock(); + } + return dev; +} + + +PIStringList PIConnection::deviceNames(const PIIODevice *dev) const { + PIStringList ret; + piForeachC (DNPair & s, device_names) + if (s.second == dev) + ret << s.first; + return ret; +} + + +bool PIConnection::removeDevice(const PIString & full_path) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + PIIODevice * dev = __device_pool__->device(fp); + if (dev == 0) return false; + PIStringList dntd(deviceNames(dev)); + piForeachC (PIString & n, dntd) + device_names.removeOne(n); + piForeachC (SPair & s, senders) { + if (s.second == 0) continue; + s.second->lock(); + s.second->devices.removeAll(dev); + s.second->unlock(); + } + device_modes.remove(dev); + piForeachC (PEPair & i, extractors) { + if (i.second == 0) continue; + i.second->devices.removeAll(dev); + } + bounded_extractors.remove(dev); + channels_.remove(dev); + for (PIMap >::iterator it = channels_.begin(); it != channels_.end(); ++it) + it.value().removeAll(dev); + __device_pool__->lock(); + if (diags_.value(dev, 0) != 0) + delete diags_.value(dev); + diags_.remove(dev); + __device_pool__->unlock(); + return __device_pool__->removeDevice(this, fp); +} + + +void PIConnection::removeAllDevices() { + device_names.clear(); + PIVector bdevs(__device_pool__->boundedDevices(this)); + __device_pool__->lock(); + piForeach (PIIODevice * d, bdevs) { + piForeachC (SPair & s, senders) { + if (s.second == 0) continue; + s.second->lock(); + s.second->devices.removeAll(d); + s.second->unlock(); + } + channels_.remove(d); + for (PIMap >::iterator it = channels_.begin(); it != channels_.end(); ++it) + it.value().removeAll(d); + if (diags_.value(d, 0) != 0) + delete diags_.value(d); + diags_.remove(d); + } + __device_pool__->unboundConnection(this); + __device_pool__->unlock(); + device_modes.clear(); + bounded_extractors.clear(); + piForeachC (PEPair & i, extractors) { + if (i.second == 0) continue; + i.second->devices.clear(); + } +} + + +PIIODevice * PIConnection::deviceByFullPath(const PIString & full_path) const { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + DevicePool::DeviceData * dd = __device_pool__->devices.value(fp); + if (dd == 0) return 0; + if (dd->dev == 0) return 0; + if (!dd->listeners.contains(const_cast(this))) return 0; + return dd->dev; +} + + +PIIODevice * PIConnection::deviceByName(const PIString & name) const { + return device_names.value(name, 0); +} + + +PIVector PIConnection::boundedDevices() const { + return __device_pool__->boundedDevices(this); +} + + +PIPacketExtractor * PIConnection::addFilter(const PIString & name_, const PIString & full_path, PIPacketExtractor::SplitMode mode) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + PIString fname_ = name_.trimmed(); + Extractor * e = extractors.value(fname_); + if (full_path.isEmpty()) return (e == 0 ? 0 : e->extractor); + PIIODevice * dev = deviceByFullPath(fp); + PIPacketExtractor * pe(0); + if (extractors.value(full_path) != 0) pe = extractors.value(full_path)->extractor; + if (pe != 0) dev = pe; + if (dev == 0) { + piCoutObj << "\"addFilter\" error: no such device \"" << full_path << "\"!"; + return 0; + } + if (e == 0) { + e = new Extractor(); + extractors[fname_] = e; + } + if (e->extractor == 0) { + e->extractor = new PIPacketExtractor(0, mode); + e->extractor->setName(fname_); + e->extractor->setThreadedReadData(new PIPair(this, fname_)); + e->extractor->setHeaderCheckSlot(filterValidateHeaderS); + e->extractor->setFooterCheckSlot(filterValidateFooterS); + e->extractor->setPayloadCheckSlot(filterValidatePayloadS); + __device_pool__->lock(); + if (diags_.value(e->extractor, 0) == 0) { + PIDiagnostics * d = new PIDiagnostics(false); + diags_[e->extractor] = d; + CONNECTU(d, qualityChanged, this, diagQualityChanged); + } + __device_pool__->unlock(); + CONNECT2(void, uchar * , int, e->extractor, packetReceived, this, packetExtractorReceived) + } + if (!e->devices.contains(dev)) { + bounded_extractors[dev] << e->extractor; + //if (PIString(dev->className()) == "PIPacketExtractor") dev->setThreadSafe(false); + e->devices << dev; + } + return e->extractor; +} + + +bool PIConnection::removeFilter(const PIString & name_, const PIString & full_path) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + Extractor * p = extractors.value(name_.trimmed()); + if (p == 0) return false; + bool ret = false; + for (int i = 0; i < p->devices.size_s(); ++i) { + if (devFPath(p->devices[i]) == fp || devFPath(p->devices[i]) == full_path) { + bounded_extractors[p->devices[i]].removeAll(p->extractor); + p->devices.remove(i); + --i; + ret = true; + } + } + if (p->devices.isEmpty()) { + unboundExtractor(p->extractor); + delete p; + } + return ret; +} + + +bool PIConnection::removeFilter(const PIString & name, const PIIODevice * dev) { + if (dev == 0) return false; + return removeFilter(name, devFPath(dev)); +} + + +bool PIConnection::removeFilter(const PIString & name_) { + Extractor * p = extractors.value(name_.trimmed()); + if (p == 0) return false; + unboundExtractor(p->extractor); + delete p; + return true; +} + + +void PIConnection::removeAllFilters() { + __device_pool__->lock(); + piForeachC (PEPair & i, extractors) { + if (i.second == 0) continue; + channels_.remove(i.second->extractor); + for (PIMap >::iterator it = channels_.begin(); it != channels_.end(); ++it) + it.value().removeAll(i.second->extractor); + if (diags_.value(i.second->extractor, 0) != 0) + delete diags_.value(i.second->extractor); + diags_.remove(i.second->extractor); + delete i.second; + } + extractors.clear(); + bounded_extractors.clear(); + __device_pool__->unlock(); +} + + +PIVector PIConnection::filters() const { + PIVector ret; + piForeachC (PEPair & i, extractors) + if (i.second != 0) + if (i.second->extractor != 0) ret << i.second->extractor; + return ret; +} + + +PIStringList PIConnection::filterNames() const { + PIStringList ret; + piForeachC (PEPair & i, extractors) + if (i.second != 0) + if (i.second->extractor != 0) ret << i.first; + return ret; +} + + +PIPacketExtractor * PIConnection::filter(const PIString & name_) const { + PIString fname_ = name_.trimmed(); + piForeachC (PEPair & i, extractors) + if (i.second != 0) + if (i.second->extractor != 0 && i.first == fname_) + return i.second->extractor; + return 0; +} + + +PIVector PIConnection::filterBoundedDevices(const PIString & name_) const { + PIVector ret; + Extractor * p = extractors.value(name_.trimmed()); + if (p == 0) return ret; + return p->devices; +} + + +bool PIConnection::addChannel(const PIString & name0, const PIString & name1) { + //piCout << "addChannel" << name0 << name1; + if (name0.isEmpty() || name1.isEmpty()) return false; + PIIODevice * dev0 = deviceByFullPath(name0), * dev1 = deviceByFullPath(name1); + PIPacketExtractor * pe0(0), * pe1(0); + if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor; + if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor; + if (pe0 != 0) dev0 = pe0; + if (pe1 != 0) dev1 = pe1; + if (dev0 == 0 || dev1 == 0) { + if (dev0 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name0 << "\"!"; + if (dev1 == 0) piCoutObj << "\"addChannel\" error: no such device \"" << name1 << "\"!"; + return false; + } + if (!channels_[dev0].contains(dev1)) + channels_[dev0] << dev1; + return true; +} + + +bool PIConnection::removeChannel(const PIString & name0, const PIString & name1) { + PIIODevice * dev0 = deviceByFullPath(name0), * dev1 = deviceByFullPath(name1); + PIPacketExtractor * pe0(0), * pe1(0); + if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor; + if (extractors.value(name1) != 0) pe1 = extractors.value(name1)->extractor; + if (pe0 != 0) dev0 = pe0; + if (pe1 != 0) dev1 = pe1; + if (dev0 == 0 || dev1 == 0) return false; + channels_[dev0].removeAll(dev1); + return true; +} + + +bool PIConnection::removeChannel(const PIString & name0) { + PIIODevice * dev0 = deviceByFullPath(name0); + PIPacketExtractor * pe0(0); + if (extractors.value(name0) != 0) pe0 = extractors.value(name0)->extractor; + if (pe0 != 0) dev0 = pe0; + if (dev0 == 0) return false; + channels_.remove(dev0); + for (PIMap >::iterator it = channels_.begin(); it != channels_.end(); ++it) + it.value().removeAll(dev0); + return true; +} + + +void PIConnection::removeAllChannels() { + channels_.clear(); +} + + +PIString PIConnection::devPath(const PIIODevice * d) const { + if (d == 0) return PIString(); + if (strcmp(d->className(), "PIPacketExtractor") == 0) return d->name(); + return d->constructFullPath(); +} + + +PIString PIConnection::devFPath(const PIIODevice * d) const { + if (d == 0) return PIString(); + if (d->isPropertyExists("__fullPath__")) return d->property("__fullPath__").toString(); + return d->name(); +} + + +PIVector > PIConnection::channels() const { + PIVector > ret; + piForeachC (CPair & i, channels_) { + PIString fp0(devFPath(i.first)); + piForeachC (PIIODevice * d, i.second) + ret << PIPair(fp0, devFPath(d)); + } + return ret; +} + + +void PIConnection::addSender(const PIString & name_, const PIString & full_path, float frequency, bool start_) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + PIString fname_ = name_.trimmed(); + if (fp.isEmpty() || frequency <= 0.) return; + Sender * s = senders.value(fname_); + PIIODevice * dev = deviceByFullPath(fp); + if (s == 0) { + s = new Sender(this); + s->setName(fname_); + s->int_ = 1000. / frequency; + senders[fname_] = s; + } + if (dev == 0) { + piCoutObj << "\"addSender\" error: no such device \"" << full_path << "\"!"; + return; + } + if (!s->isRunning() && start_) { + //piCoutObj << name_ << "start" << 1000. / frequency; + if (!__device_pool__->fake) s->start(s->int_); + } + s->lock(); + if (!s->devices.contains(dev)) + s->devices << dev; + s->unlock(); +} + + +bool PIConnection::removeSender(const PIString & name, const PIString & full_path) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + Sender * s = senders.value(name, 0); + PIIODevice * d = deviceByFullPath(fp); + if (s == 0 || d == 0) return false; + s->lock(); + bool ret = s->devices.contains(d); + if (ret) + s->devices.removeAll(d); + s->unlock(); + return ret; +} + + +bool PIConnection::removeSender(const PIString & name) { + Sender * s = senders.value(name, 0); + if (s == 0) return false; + delete s; + senders.remove(name); + return true; +} + + +bool PIConnection::setSenderFixedData(const PIString & name, const PIByteArray & data) { + Sender * s = senders.value(name, 0); + if (s == 0) return false; + s->lock(); + s->sdata = data; + s->unlock(); + return true; +} + + +bool PIConnection::clearSenderFixedData(const PIString & name) { + Sender * s = senders.value(name, 0); + if (s == 0) return false; + s->lock(); + s->sdata.clear(); + s->unlock(); + return true; +} + + +PIByteArray PIConnection::senderFixedData(const PIString & name) const { + Sender * s = senders.value(name, 0); + if (s == 0) return PIByteArray(); + return s->sdata; +} + + +float PIConnection::senderFrequency(const PIString & name) const { + Sender * s = senders.value(name, 0); + if (s == 0) return -1.f; + double i = s->interval(); + if (i == 0.) return 0.f; + return 1000. / s->interval(); +} + + +void PIConnection::removeAllSenders() { + piForeachC (SPair & s, senders) + if (s.second != 0) + delete s.second; + senders.clear(); +} + + +void PIConnection::startThreadedRead(const PIString & full_path) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + DevicePool::DeviceData * dd = __device_pool__->devices.value(fp, 0); + if (dd == 0) return; + if (dd->dev == 0) return; + if (dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return; + if (!__device_pool__->fake) dd->rthread->start(); + dd->started = true; +} + + +void PIConnection::startAllThreadedReads() { + piForeachC (DevicePool::DDPair & d, __device_pool__->devices) + startThreadedRead(d.first); +} + + +void PIConnection::startSender(const PIString & name) { + Sender * s = senders.value(name, 0); + if (s == 0) return; + if (!s->isRunning() && !__device_pool__->fake) + s->start(s->int_); +} + + +void PIConnection::startAllSenders() { + piForeachC (SPair & s, senders) { + if (s.second == 0) continue; + if (!s.second->isRunning() && !__device_pool__->fake) + s.second->start(s.second->int_); + } +} + + +void PIConnection::stopThreadedRead(const PIString & full_path) { + PIString fp(PIIODevice::normalizeFullPath(full_path)); + DevicePool::DeviceData * dd = __device_pool__->devices.value(fp, 0); + if (dd == 0) return; + if (dd->dev == 0) return; + if (!dd->started || dd->dev->mode() == PIIODevice::WriteOnly) return; + dd->rthread->stop(); + dd->started = false; +} + + +void PIConnection::stopAllThreadedReads() { + piForeachC (DevicePool::DDPair & d, __device_pool__->devices) + stopThreadedRead(d.first); +} + + +void PIConnection::stopSender(const PIString & name) { + Sender * s = senders.value(name, 0); + if (s == 0) return; + if (s->isRunning()) s->stop(); +} + + +void PIConnection::stopAllSenders() { + piForeachC (SPair & s, senders) { + if (s.second == 0) continue; + if (s.second->isRunning()) + s.second->stop(); + } +} + + +PIDiagnostics * PIConnection::diagnostic(const PIString & full_path_name) const { + PIIODevice * dev = deviceByFullPath(full_path_name); + if (dev == 0) dev = device_names.value(full_path_name, 0); + PIPacketExtractor * pe(0); + if (extractors.value(full_path_name) != 0) pe = extractors.value(full_path_name)->extractor; + if (pe != 0) dev = pe; + if (dev == 0) return 0; + return diags_.value(dev, 0); +} + + +int PIConnection::writeByFullPath(const PIString & full_path, const PIByteArray & data) { + PIString fp(full_path); + if (fp.endsWith(")")) + splitFullPathWithMode(fp, &fp, 0); + fp = PIIODevice::normalizeFullPath(fp); + PIIODevice * dev = __device_pool__->device(fp); + //piCout << "SEND" << full_path << fp; + return write(dev, data); +} + + +int PIConnection::writeByName(const PIString & name, const PIByteArray & data) { + PIIODevice * dev = deviceByName(name); + return write(dev, data); +} + + +int PIConnection::write(PIIODevice * dev, const PIByteArray & data) { + if (dev == 0) { + piCoutObj << "Null Device!"; + return -1; + } + if (!dev->canWrite()) { + piCoutObj << "Device \"" << dev->constructFullPath() << "\" can`t write!"; + return -1; + } + int ret = dev->write(data); + PIDiagnostics * diag = diags_.value(dev); + if (diag != 0 && ret > 0) diag->sended(ret); + return ret; +} + + +PIVector< PIConnection * > PIConnection::allConnections() { + return _connections; +} + + +PIVector< PIIODevice * > PIConnection::allDevices() { + return __device_pool__->boundedDevices(); +} + + +bool PIConnection::setFakeMode(bool yes) { + bool ret = isFakeMode(); + __device_pool__->fake = yes; + return ret; +} + + +bool PIConnection::isFakeMode() { + return __device_pool__->fake; +} + + + + +PIIODevice * PIConnection::DevicePool::addDevice(PIConnection * parent, const PIString & fp, PIIODevice::DeviceMode mode, bool start) { + DeviceData * dd = devices[fp]; + int pmode(0); + bool need_start = false; + if (dd == 0) { + dd = new DeviceData(); + devices[fp] = dd; + } + if (dd->dev == 0) { + //piCout << "new device" << fp; + dd->dev = PIIODevice::createFromFullPath(fp); + if (dd->dev == 0) { + piCoutObj << "Error: can`t create device \"" << fp << "\"!"; //:" << errorString(); + return 0; + } + dd->dev->setProperty("__fullPath__", fp); + } else + pmode = dd->dev->mode(); + if (!dd->listeners.contains(parent)) + dd->listeners << parent; + if (pmode == mode || pmode == PIIODevice::ReadWrite) + return dd->dev; + if ((mode & PIIODevice::ReadOnly) > 0) { + if (dd->rthread != 0) { + delete dd->rthread; + dd->rthread = 0; + dd->started = false; + } + dd->rthread = new PIThread(dd, threadReadDP); + dd->rthread->setName("__S__connection_" + fp + "_read_thread"); + need_start = true; + pmode |= PIIODevice::ReadOnly; + } + if ((mode & PIIODevice::WriteOnly) > 0) + pmode |= PIIODevice::WriteOnly; + if (!fake) { + dd->dev->close(); + dd->dev->open((PIIODevice::DeviceMode)pmode); + } + if (need_start && start) { + if (!fake) dd->rthread->start(); + dd->started = true; + } + return dd->dev; +} + + +bool PIConnection::DevicePool::removeDevice(PIConnection * parent, const PIString & fp) { + DeviceData * dd = devices.value(fp); + if (dd == 0) + return false; + if (dd->dev == 0) + return false; + bool ok = dd->listeners.contains(parent); + dd->listeners.removeAll(parent); + if (dd->listeners.isEmpty()) { + delete dd; + devices.remove(fp); + } + return ok; +} + + +void PIConnection::DevicePool::unboundConnection(PIConnection * parent) { + PIStringList rem; + piForeachC (DDPair & i, devices) { + if (i.second == 0) { + rem << i.first; + continue; + } + i.second->listeners.removeAll(parent); + if (i.second->listeners.isEmpty()) + rem << i.first; + } + piForeachC (PIString & i, rem) { + DeviceData * dd = devices.value(i); + if (dd == 0) + continue; + delete dd; + devices.remove(i); + } +} + + +PIIODevice * PIConnection::DevicePool::device(const PIString & fp) const { + DeviceData * dd = devices.value(fp); + if (dd == 0) return 0; + return dd->dev; +} + + +PIVector PIConnection::DevicePool::boundedConnections() const { + PIVector ret; + piForeachC (DDPair & i, devices) { + if (i.second == 0) + continue; + ret << i.second->listeners; + } + for (int i = 0; i < ret.size_s(); ++i) + for (int j = i + 1; j < ret.size_s(); ++j) + if (ret[i] == ret[j]) { + ret.remove(j); + --j; + } + return ret; +} + + +PIVector< PIIODevice * > PIConnection::DevicePool::boundedDevices() const { + PIVector ret; + piForeachC (DDPair & i, devices) { + if (i.second == 0) continue; + if (i.second->dev == 0) continue; + ret << i.second->dev; + } + return ret; +} + + +PIVector PIConnection::DevicePool::boundedDevices(const PIConnection * parent) const { + PIVector ret; + piForeachC (DDPair & i, devices) { + if (i.second == 0) continue; + if (i.second->dev == 0) continue; + if (i.second->listeners.contains(const_cast(parent))) + ret << i.second->dev; + } + return ret; +} + + +PIConnection::DevicePool::DeviceData::~DeviceData() { + if (rthread != 0) { + rthread->stop(); + delete rthread; + rthread = 0; + } + if (dev != 0) { + delete dev; + dev = 0; + } +} + + +void PIConnection::DevicePool::run() { + PIVector conns(PIConnection::allConnections()); + piForeach (PIConnection * c, conns) { + piForeachC (PIConnection::DPair & d, c->diags_) { + if (d.second == 0) continue; + d.second->tick(0, 1); + } + } +} + + +void PIConnection::DevicePool::threadReadDP(void * ddp) { + DeviceData * dd((DeviceData * )ddp); + if (dd->dev == 0) {piMSleep(100); return;} + PIByteArray ba; + ba = dd->dev->read(dd->dev->threadedReadBufferSize()); + if (ba.isEmpty()) {piMSleep(10); return;} + //piCout << "Readed from" << dd->dev->path() << Hex << ba; + __device_pool__->deviceReaded(dd, ba); +} + + +void PIConnection::DevicePool::deviceReaded(PIConnection::DevicePool::DeviceData * dd, const PIByteArray & data) { + PIString from = dd->dev->property("__fullPath__").toString(); + piForeach (PIConnection * ld, dd->listeners) + ld->rawReceived(dd->dev, from, data); +} + + +void PIConnection::splitFullPathWithMode(PIString fpwm, PIString * full_path, PIIODevice::DeviceMode * mode) { + PIIODevice::DeviceMode dm = PIIODevice::ReadWrite; + if (fpwm.find("(") > 0 && fpwm.find(")") > 0) { + PIString dms(fpwm.right(fpwm.length() - fpwm.find("(")).takeRange("(", ")").trim().toLowerCase().removeAll(" ")); + //piCout << dms; + if (dms == "r" || dms == "ro" || dms == "read" || dms == "readonly") + dm = PIIODevice::ReadOnly; + if (dms == "w" || dms == "wo" || dms == "write" || dms == "writeonly") + dm = PIIODevice::WriteOnly; + fpwm.cutRight(fpwm.length() - fpwm.find("(") + 1).trim(); + } + if (full_path) *full_path = fpwm; + if (mode) *mode = dm; +} + + +bool PIConnection::filterValidateHeaderS(void * c, uchar * src, uchar * rec, int size) { + PIPair * p((PIPair * )c); + return p->first->filterValidateHeader(p->second, src, rec, size); +} + + +bool PIConnection::filterValidateFooterS(void * c, uchar * src, uchar * rec, int size) { + PIPair * p((PIPair * )c); + return p->first->filterValidateFooter(p->second, src, rec, size); +} + + +bool PIConnection::filterValidatePayloadS(void * c, uchar * rec, int size) { + PIPair * p((PIPair * )c); + return p->first->filterValidatePayload(p->second, rec, size); +} + + +void PIConnection::rawReceived(PIIODevice * dev, const PIString & from, const PIByteArray & data) { + dataReceived(from, data); + dataReceivedEvent(from, data); + PIVector be(bounded_extractors.value(dev)); + //piCout << be; + piForeach (PIPacketExtractor * i, be) + i->threadedRead(const_cast(data.data()), data.size_s()); + PIVector chd(channels_.value(dev)); + piForeach (PIIODevice * d, chd) { + int ret = d->write(data); + PIDiagnostics * diag = diags_.value(d); + if (diag != 0 && ret > 0) diag->sended(ret); + } + PIDiagnostics * diag = diags_.value(dev); + if (diag != 0) diag->received(data.size_s()); +} + + +bool PIConnection::filterValidateHeader(const PIString & filter_name, uchar * src, uchar * rec, int size) { + for (int i = 0; i < size; ++i) + if (src[i] != rec[i]) + return false; + return true; +} + + +bool PIConnection::filterValidateFooter(const PIString & filter_name, uchar * src, uchar * rec, int size) { + for (int i = 0; i < size; ++i) + if (src[i] != rec[i]) + return false; + return true; +} + + +bool PIConnection::filterValidatePayload(const PIString & filter_name, uchar * rec, int size) { + return true; +} + + +PIByteArray PIConnection::senderData(const PIString & sender_name) { + return PIByteArray(); +} + + +PIConnection::Extractor::~Extractor() { + if (extractor != 0) { + if (extractor->threadedReadData() != 0) + delete (PIPair * )(extractor->threadedReadData()); + delete extractor; + extractor = 0; + } +} + + +void PIConnection::Sender::tick(void * , int) { + if (parent == 0) return; + PIByteArray data; + if (!sdata.isEmpty()) data = sdata; + else data = parent->senderData(name()); + if (data.isEmpty()) return; + //piCoutObj << "write"<write(data); + PIDiagnostics * diag = parent->diags_.value(d); + if (diag != 0 && ret > 0) diag->sended(ret); + } +} + + +void PIConnection::unboundExtractor(PIPacketExtractor * pe) { + if (pe == 0) return; + channels_.remove(pe); + for (PIMap >::iterator it = channels_.begin(); it != channels_.end(); ++it) + it.value().removeAll(pe); + bounded_extractors.remove(pe); + PIVector k = bounded_extractors.keys(); + piForeach (PIIODevice * i, k) { + PIVector & be(bounded_extractors[i]); + be.removeAll(pe); + if (be.isEmpty()) + bounded_extractors.remove(i); + } + __device_pool__->lock(); + if (diags_.value(pe, 0) != 0) + delete diags_.value(pe); + diags_.remove(pe); + extractors.remove(pe->name()); + __device_pool__->unlock(); +} + + +void PIConnection::packetExtractorReceived(uchar * data, int size) { + PIString from(emitter() == 0 ? "" : emitter()->name()); + packetReceived(from, PIByteArray(data, size)); + packetReceivedEvent(from, PIByteArray(data, size)); + PIIODevice * cd = (PIIODevice * )emitter(); + if (cd == 0) return; + PIVector be(bounded_extractors.value(cd)); + //piCout << be << (void*)data << size; + piForeach (PIPacketExtractor * i, be) + i->threadedRead(data, size); + PIVector chd(channels_.value(cd)); + piForeach (PIIODevice * d, chd) { + int ret = d->write(data, size); + PIDiagnostics * diag = diags_.value(d); + if (diag != 0) diag->sended(ret); + } + PIDiagnostics * diag = diags_.value(cd); + if (diag != 0) diag->received(size); +} + + +void PIConnection::diagQualityChanged(PIDiagnostics::Quality new_quality, PIDiagnostics::Quality old_quality) { + qualityChanged(diags_.key((PIDiagnostics*)emitter()), new_quality, old_quality); +} + + + +PIConnection::DevicePool * __device_pool__; + +bool __DevicePoolContainer__::inited_(false); + +__DevicePoolContainer__::__DevicePoolContainer__() { + if (inited_) return; + inited_ = true; + __device_pool__ = new PIConnection::DevicePool(); +} diff --git a/src/io/piconnection.h b/src/io/piconnection.h new file mode 100755 index 00000000..f4d94fc0 --- /dev/null +++ b/src/io/piconnection.h @@ -0,0 +1,417 @@ +/*! \file piconnection.h + * \brief Complex I/O point +*/ +/* + PIP - Platform Independent Primitives + Complex I/O point + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICONNECTION_H +#define PICONNECTION_H + +#include "pipacketextractor.h" +#include "pidiagnostics.h" + +class PIConfig; + +class PIP_EXPORT PIConnection: public PIObject +{ + PIOBJECT(PIConnection) +public: + + //! Constructs an empty connection + PIConnection(); + + //! Constructs connection with name "name" + PIConnection(const PIString & name); + + //! Constructs connection and configure it from config file "config" from section "name" + PIConnection(const PIString & config, const PIString & name); + + //! Constructs connection and configure it from config content "string" from section "name" + PIConnection(PIString * string, const PIString & name); + + ~PIConnection(); + + + /*! \brief Configure connection from config file "config" from section "name". Returns if configuration was successful + * \details \b Warning: all devices, filters and channels removed before configure! */ + bool configureFromConfig(const PIString & config, const PIString & name); + + /*! \brief Configure connection from config content "string" from section "name". Returns if configuration was successful + * \details \b Warning: all devices, filters and channels removed before configure! */ + bool configureFromString(PIString * string, const PIString & name); + + //! Returns config file section of current connection configuration + PIString makeConfig() const; + + + /*! \brief Add device with full path "full_path", open mode "mode" to Device pool and connection + * \details Returns pointer to device or null if device can not be created. If "start" is true, + * read thread is started immediately. Else, you can start read thread with functions \a startThreadedRead() + * or \a startAllThreadedReads(). By default, read thread doesn`t start */ + PIIODevice * addDevice(const PIString & full_path, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite, bool start = false); + + void setDeviceName(PIIODevice * dev, const PIString & name) {device_names[name] = dev;} + + PIStringList deviceNames(const PIIODevice * dev) const; + + /*! \brief Remove device with full path "full_path" from connection + * \details Returns if device was removed. If there is no connection bounded to this device, + * it will be removed from Device pool */ + bool removeDevice(const PIString & full_path); + + /*! \brief Remove all device from connection + * \details If there is no connection bounded to there devices, they removed from Device pool */ + void removeAllDevices(); + + //! Returns device with full path "full_path" or null if there is no such device + PIIODevice * deviceByFullPath(const PIString & full_path) const; + + //! Returns device with name "name" or null if there is no such device + PIIODevice * deviceByName(const PIString & name) const; + + //! Returns all devices bounded to this connection + PIVector boundedDevices() const; + + + /*! \brief Add filter with name "name" to device with full path "full_path_name" or filter "full_path_name" + * \details If there is no filter with name "name", connection create new with split mode "mode" and bound + * to it device "full_path_name" or filter "full_path_name". If filter with name "name" already exists, + * device "full_path_name" or filter "full_path_name" add to this filter. + * This function returns PIPacketExtractor * assosiated with this filter + * \n \b Attention! "mode" is altual olny if new filter was created! */ + PIPacketExtractor * addFilter(const PIString & name, const PIString & full_path_name, PIPacketExtractor::SplitMode mode = PIPacketExtractor::None); + + //! Add filter with name "name" to device "dev" + PIPacketExtractor * addFilter(const PIString & name, const PIIODevice * dev, PIPacketExtractor::SplitMode mode = PIPacketExtractor::None) {return addFilter(name, devFPath(dev), mode);} + + /*! \brief Remove from filter with name "name" device with full path "full_path_name" or filter "full_path_name" + * \details If there is no devices bounded to this filter, it will be removed. Returns if device was removed */ + bool removeFilter(const PIString & name, const PIString & full_path_name); + + //! Remove from filter with name "name" device or filter "dev" + bool removeFilter(const PIString & name, const PIIODevice * dev); + + //! Remove filter with name "name". Returns if filter was removed + bool removeFilter(const PIString & name); + + //! Remove all filters from connection + void removeAllFilters(); + + + //! Returns all filters of connection + PIVector filters() const; + + //! Returns all filter names of connection + PIStringList filterNames() const; + + //! Returns PIPacketExtractor * assosiated with filter "name" or null if there is no such filter + PIPacketExtractor * filter(const PIString & name) const; + + //! Returns all devices bounded to filter "name" + PIVector filterBoundedDevices(const PIString & name) const; + + + /*! \brief Add to connection channel from "name_from" to "name_to" + * \details "name_from" and "name_to" can be full pathes of devices or filter names. + * Returns \b false if there if no such device or filter, else create channel and returns \b true */ + bool addChannel(const PIString & name_from, const PIString & name_to); + + //! Add to connection channel from "name_from" to "dev_to" + bool addChannel(const PIString & name_from, const PIIODevice * dev_to) {return addChannel(name_from, devFPath(dev_to));} + + //! Add to connection channel from "dev_from" to "name_to" + bool addChannel(const PIIODevice * dev_from, const PIString & name_to) {return addChannel(devFPath(dev_from), name_to);} + + //! Add to connection channel from "dev_from" to "dev_to" + bool addChannel(const PIIODevice * dev_from, const PIIODevice * dev_to) {return addChannel(devFPath(dev_from), devFPath(dev_to));} + + /*! \brief Remove from connection channel from "name_from" to "name_to" + * \details "name_from" and "name_to" can be full pathes of devices or filter names. + * Returns \b false if there if no such device or filter, else remove channel and returns \b true */ + bool removeChannel(const PIString & name_from, const PIString & name_to); + + //! Remove from connection channel from "name_from" to "dev_to" + bool removeChannel(const PIString & name_from, const PIIODevice * dev_to) {return removeChannel(name_from, devFPath(dev_to));} + + //! Remove from connection channel from "dev_from" to "name_to" + bool removeChannel(const PIIODevice * dev_from, const PIString & name_to) {return removeChannel(devFPath(dev_from), name_to);} + + //! Remove from connection channel from "dev_from" to "dev_to" + bool removeChannel(const PIIODevice * dev_from, const PIIODevice * dev_to) {return removeChannel(devFPath(dev_from), devFPath(dev_to));} + + /*! \brief Remove from connection all channels from "name_from" + * \details "name_from" can be full path of device or filter name. + * Returns \b false if there if no such device or filter, else remove channels and returns \b true */ + bool removeChannel(const PIString & name_from); + + //! Remove from connection all channels from "dev_from" + bool removeChannel(const PIIODevice * dev_from) {return removeChannel(devFPath(dev_from));} + + //! Remove from connection all channels + void removeAllChannels(); + + //! Returns all channels of this connection as full pathes or filter names pair array (from, to) + PIVector > channels() const; + + + /*! \brief Add to connection sender with name "name" device with full path "full_path" + * \details If there is no sender with name "name", connection create new, bound + * to it device "full_path_name" and start sender timer with frequency "frequency". + * If sender with name "name" already exists, device "full_path_name" add to this sender + * If "start" is true, sender is started immediately. Else, you can start sender with + * functions \a startSender() + * \n \b Attention! "frequency" is actual olny if new sender was created! */ + void addSender(const PIString & name, const PIString & full_path, float frequency, bool start = false); + + //! Add to connection sender with name "name" device "dev" + void addSender(const PIString & name, const PIIODevice * dev, float frequency, bool start = false) {addSender(name, devFPath(dev), frequency, start);} + + /*! \brief Remove from sender with name "name" device with full path "full_path_name" + * \details If there is no devices bounded to this sender, it will be removed. Returns if sender was removed */ + bool removeSender(const PIString & name, const PIString & full_path); + + //! Remove from sender with name "name" device "dev" + bool removeSender(const PIString & name, const PIIODevice * dev) {return removeSender(name, devFPath(dev));} + + //! Remove sender with name "name", returns if sender was removed + bool removeSender(const PIString & name); + + //! Set sender "name" fixed send data "data", returns if sender exists + bool setSenderFixedData(const PIString & name, const PIByteArray & data); + + //! Remove sender "name" fixed send data, returns if sender exists + bool clearSenderFixedData(const PIString & name); + + //! Returns sender "name" fixed send data + PIByteArray senderFixedData(const PIString & name) const; + + //! Returns sender "name" timer frequency, -1 if there is no such sender, or 0 if sender is not started yet + float senderFrequency(const PIString & name) const; + + //! Remove from connection all senders + void removeAllSenders(); + + + //! Start read thread of device with full path "full_path" + void startThreadedRead(const PIString & full_path); + + //! Start read thread of device "dev" + void startThreadedRead(const PIIODevice * dev) {startThreadedRead(devFPath(dev));} + + //! Start read threads of all Device pool device + void startAllThreadedReads(); + + //! Start sender "name" timer + void startSender(const PIString & name); + + //! Start all senders timers + void startAllSenders(); + + //! Start all read threads and senders + void start() {startAllThreadedReads(); startAllSenders();} + + //! Stop read thread of device with full path "full_path" + void stopThreadedRead(const PIString & full_path); + + //! Stop read thread of device "dev" + void stopThreadedRead(const PIIODevice * dev) {stopThreadedRead(devFPath(dev));} + + //! Stop read threads of all Device pool device + void stopAllThreadedReads(); + + //! Stop sender "name" timer + void stopSender(const PIString & name); + + //! Stop all senders timers + void stopAllSenders(); + + //! Stop all read threads and senders + void stop() {stopAllThreadedReads(); stopAllSenders();} + + + //! Returns if there are no devices in this connection + bool isEmpty() const {return device_modes.isEmpty();} + + + //! Returns PIDiagnostics * assosiated with device with full path "full_path_name", name "full_path_name" or filter "full_path_name" + PIDiagnostics * diagnostic(const PIString & full_path_name) const; + + //! Returns PIDiagnostics * assosiated with device or filter "dev" + PIDiagnostics * diagnostic(const PIIODevice * dev) const {return diags_.value(const_cast(dev), 0);} + + + //! Write data "data" to device with full path "full_path" and returns result of \a write() function of device + int writeByFullPath(const PIString & full_path, const PIByteArray & data); + + //! Write data "data" to device with name "name" and returns result of \a write() function of device + int writeByName(const PIString & name, const PIByteArray & data); + + //! Write data "data" to device "dev" and returns result of \a write() function of device + int write(PIIODevice * dev, const PIByteArray & data); + + + //! Returns all connections in application + static PIVector allConnections(); + + //! Returns all devices in Device pool + static PIVector allDevices(); + + //! Set Device pool fake mode to \"yes\" and returns previous mode + static bool setFakeMode(bool yes); + + //! Returns if Device pool works in fake mode + static bool isFakeMode(); + + class DevicePool: public PIThread { + PIOBJECT_SUBCLASS(DevicePool, PIThread) + friend class PIConnection; + public: + DevicePool(): PIThread(true, 10) {setName("PIConnection::DevicePool"); needLockRun(true); fake = false;} + + PIIODevice * addDevice(PIConnection * parent, const PIString & fp, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite, bool start = true); + bool removeDevice(PIConnection * parent, const PIString & fp); + void unboundConnection(PIConnection * parent); + PIIODevice * device(const PIString & fp) const; + PIVector boundedConnections() const; + PIVector boundedDevices() const; + PIVector boundedDevices(const PIConnection * parent) const; + + protected: + struct DeviceData { + DeviceData(): dev(0), rthread(0), started(false) {} + ~DeviceData(); + PIIODevice * dev; + PIThread * rthread; + bool started; + PIVector listeners; + }; + + void run(); + + static void threadReadDP(void * ddp); + void deviceReaded(DeviceData * dd, const PIByteArray & data); + + typedef PIMap::value_type DDPair; + PIMap devices; + bool fake; + }; + + EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data) + EVENT2(packetReceivedEvent, const PIString &, from, const PIByteArray &, data) + EVENT3(qualityChanged, const PIIODevice * , dev, PIDiagnostics::Quality, new_quality, PIDiagnostics::Quality, old_quality) + + static void splitFullPathWithMode(PIString fpwm, PIString * full_path, PIIODevice::DeviceMode * mode); + +//! \events +//! \{ + + //! \fn void dataReceivedEvent(const PIString & from, const PIByteArray & data) + //! \brief Raise on data received from device with full path "from" + + //! \fn void packetReceivedEvent(const PIString & from, const PIByteArray & data) + //! \brief Raise on packet received from filter with name "from" + + //! \fn void qualityChanged(const PIIODevice * device, PIDiagnostics::Quality new_quality, PIDiagnostics::Quality old_quality) + //! \brief Raise on diagnostic quality of device "device" changed from "old_quality" to "new_quality" + +//! \} + +protected: + + //! Executes on data received from device with full path "from" + virtual void dataReceived(const PIString & from, const PIByteArray & data) {} + + //! Executes on packet received from filter with name "from" + virtual void packetReceived(const PIString & from, const PIByteArray & data) {} + + //! Validate header "rec" with source header "src" and size "size", executes from filter "filter_name" + virtual bool filterValidateHeader(const PIString & filter_name, uchar * src, uchar * rec, int size); + + //! Validate footer "rec" with source footer "src" and size "size", executes from filter "filter_name" + virtual bool filterValidateFooter(const PIString & filter_name, uchar * src, uchar * rec, int size); + + //! Validate payload "rec" with size "size", executes from filter "filter_name" + virtual bool filterValidatePayload(const PIString & filter_name, uchar * rec, int size); + + //! You should returns data for sender "sender_name" + virtual PIByteArray senderData(const PIString & sender_name); + +private: + static bool filterValidateHeaderS(void * c, uchar * src, uchar * rec, int size); + static bool filterValidateFooterS(void * c, uchar * src, uchar * rec, int size); + static bool filterValidatePayloadS(void * c, uchar * rec, int size); + bool configure(PIConfig & conf, const PIString & name_); + void rawReceived(PIIODevice * dev, const PIString & from, const PIByteArray & data); + void unboundExtractor(PIPacketExtractor * pe); + EVENT_HANDLER2(void, packetExtractorReceived, uchar * , data, int, size); + EVENT_HANDLER2(void, diagQualityChanged, PIDiagnostics::Quality, new_quality, PIDiagnostics::Quality, old_quality); + + PIString devPath(const PIIODevice * d) const; + PIString devFPath(const PIIODevice * d) const; + + struct Extractor { + Extractor(): extractor(0) {} + ~Extractor(); + PIPacketExtractor * extractor; + PIVector devices; + }; + + class Sender: public PITimer { + PIOBJECT(Sender) + public: + Sender(PIConnection * parent_ = 0): parent(parent_), int_(0.f) {needLockRun(true);} + ~Sender() {stop();} + PIConnection * parent; + PIVector devices; + PIByteArray sdata; + float int_; + void tick(void * , int); + }; + + typedef PIMap::value_type PEPair; + typedef PIMap::value_type SPair; + typedef PIMap::value_type DNPair; + typedef PIMap >::value_type BEPair; + typedef PIMap >::value_type CPair; + typedef PIMap::value_type DPair; + PIMap extractors; + PIMap senders; + PIMap device_names; + PIMap device_modes; + PIMap > bounded_extractors; + PIMap > channels_; + PIMap diags_; + + static PIVector _connections; + +}; + + +extern PIConnection::DevicePool * __device_pool__; + +class __DevicePoolContainer__ { +public: + __DevicePoolContainer__(); + static bool inited_; +}; + +static __DevicePoolContainer__ __device_pool_container__; + + +#endif // PICONNECTION_H diff --git a/src/io/pidatatransfer.cpp b/src/io/pidatatransfer.cpp new file mode 100644 index 00000000..2aabb616 --- /dev/null +++ b/src/io/pidatatransfer.cpp @@ -0,0 +1,374 @@ +#include "pidatatransfer.h" + +const uint PIBaseTransfer::signature = 0x54444950; + +PIBaseTransfer::PIBaseTransfer(): crc(standardCRC_16()) { + header.sig = signature; + header.session_id = 0; + packet_header_size = sizeof(PacketHeader); + part_header_size = sizeof(Part) + sizeof(PIByteArray); + is_sending = is_receiving = false; + break_ = true; + bytes_all = bytes_cur = 0; + timeout_ = 1.; + setPacketSize(4096); + srand(PISystemTime::current().toMilliseconds()); +} + + +PIBaseTransfer::~PIBaseTransfer() { + break_ = true; + session.clear(); + replies.clear(); +} + + +void PIBaseTransfer::stopSend() { + if (!is_sending) return; + break_ = true; +} + + +void PIBaseTransfer::stopReceive() { + if (!is_receiving) return; + break_ = true; + finish_receive(false); +} + + +void PIBaseTransfer::received(PIByteArray& data) { + if (data.size() < sizeof(PacketHeader)) return; + PacketHeader h; + memcpy(&h, data.data(), sizeof(PacketHeader)); + PacketType pt = (PacketType)h.type; +// piCoutObj << "receive" << h.session_id << h.type << h.id; + switch (pt) { + case pt_Unknown: + break; + case pt_Data: + if (h.session_id != header.session_id || !is_receiving) { + sendBreak(h.session_id); + return; + } else { + uint rcrc = h.crc; + uint ccrc = crc.calculate(data.data(sizeof(PacketHeader)), data.size_s() - sizeof(PacketHeader)); + if (rcrc != ccrc) { + header.id = h.id; + sendReply(pt_ReplyInvalid); + } else { + data >> h; + processData(h.id, data); + } + } + break; + case pt_ReplySuccess: + case pt_ReplyInvalid: + if (h.session_id != header.session_id) return; + if (is_sending) { + if (h.id >= 0 && h.id < replies.size()) + replies[h.id] = pt; + } + if (is_receiving && h.id == 0) { + if (checkSession() == 0 && pt == pt_ReplySuccess) finish_receive(true); + } + break; + case pt_Break: + break_ = true; + if (is_receiving) { + stopReceive(); + return; + } + if (is_sending) { + stopSend(); + return; + } + break; + case pt_Start: + if (is_sending) { + sendBreak(h.session_id); + return; + } + if (header.session_id != h.session_id && is_receiving) { + sendBreak(h.session_id); + return; + } + if (data.size() == sizeof(StartRequest) + sizeof(PacketHeader)) { + StartRequest sr; + memcpy(&sr, data.data(sizeof(PacketHeader)), sizeof(StartRequest)); + bytes_all = sr.size; + header.session_id = h.session_id; + header.id = 0; + state_string = "start request"; + session.clear(); + replies.clear(); + session.resize(sr.packets); + replies.resize(sr.packets + 1); + replies.fill(pt_Unknown); + is_receiving = true; + break_ = false; + state_string = "receiving"; + replies[0] = pt_ReplySuccess; + sendReply(pt_ReplySuccess); + } + break; + default: + break; + } +} + + +bool PIBaseTransfer::send_process() { + break_ = false; + is_sending = true; + startSend(); + replies.resize(session.size() + 1); + replies.fill(pt_Unknown); + PIByteArray ba; + if (!getStartRequest()) return finish_send(false); + for (int i = 0; i < session.size_s(); i++) { + ba = build_packet(i); + sendRequest(ba); + if (break_) return finish_send(false); + } +// piCoutObj << "correct errors"; + PITimeMeasurer tm; + int prev_chk = 0; + while (tm.elapsed_s() < timeout_) { + int chk = checkSession(); + if (chk != prev_chk) tm.reset(); + if (chk == 0) return finish_send(true); + if (chk > 0) { + ba = buildPacket(chk - 1); + sendRequest(ba); + } +// if (chk == -1) return finish_send(false); + if (break_) return finish_send(false); + prev_chk = chk; + piMSleep(1); + } + return finish_send(false); +} + + +int PIBaseTransfer::checkSession() { + int miss = 0; + for (int i = 1; i < replies.size_s(); i++) { + if (replies[i] != pt_ReplySuccess) miss++; + if (replies[i] == pt_ReplyInvalid) return i; + } + for (int i = 1; i < replies.size_s(); i++) { + if (replies[i] != pt_ReplySuccess) return i; + } + if (miss > 0) { + piCoutObj << "missing" << miss << "packets"; + return -miss; + } else return 0; +} + + +void PIBaseTransfer::buildSession(PIVector parts) { + state_string = "calculating files... "; + session.clear(); + header.session_id = rand(); + bytes_all = 0; + Part fi; + int fi_index, fi_prts; + PIVector lfi; + int min_size = packet_header_size + part_header_size; + int cur_size = min_size; + for (int i = 0; i < parts.size_s(); i++) { + state_string = "calculating files... " + PIString::fromNumber(i) + " of " + PIString::fromNumber(parts.size()); + fi.id = parts[i].id; + bytes_all += fi.size; +// fi.size = fi.entry.size; + fi.start = 0; + int rest = parts[i].size - (packet_size - cur_size); +// piCout << i << fi.entry << rest; + if (rest <= 0) { + fi.size = parts[i].size; + lfi << fi; + cur_size += fi.size + part_header_size; + } else { + fi.size = parts[i].size - rest; + fi_index = 1; + fi_prts = 1 + 1 + piMaxi(1, rest / (packet_size - min_size)); +// piCout << fi_prts; + lfi << fi; + session << lfi; + lfi.clear(); + cur_size = min_size; + llong fs = fi.size; + for (int j = 1; j < fi_prts; j++) { + fi_index++; + fi.start = fs; + fi.size = piMin(parts[i].size - fs, packet_size - min_size); + lfi << fi; + cur_size += fi.size + part_header_size; + if (fi_index != fi_prts) { + session << lfi; + lfi.clear(); + cur_size = min_size; + fs += fi.size; + } + } + } + if (packet_size - cur_size < min_size) { + session << lfi; + lfi.clear(); + cur_size = min_size; + } + } + if (cur_size > min_size) session << lfi; +} + + +void PIBaseTransfer::sendBreak(int session_id) { + uint psid = header.session_id; + header.session_id = session_id; + sendReply(pt_Break); + header.session_id = psid; +} + + +void PIBaseTransfer::sendReply(PacketType reply) { + header.type = reply; + PIByteArray ba; + ba << header; + sendRequest(ba); +} + + +bool PIBaseTransfer::getStartRequest() { + PITimeMeasurer tm; + header.type = pt_Start; + header.id = 0; + PIByteArray ba; + ba << header; + ba << (uint)session.size() << bytes_all; + state_string = "send request"; + for (int i = 0; i < 3; i++) { + tm.reset(); + sendRequest(ba); + while (tm.elapsed_s() < timeout_) { + if (break_) return false; + //piCoutObj << send_replyes[0]; + if (replies[0] == pt_ReplySuccess) { + state_string = "send permited!"; + return true; + } + piMSleep(10); + } + } + return false; +} + + +void PIBaseTransfer::processData(int id, PIByteArray & data) { +// piCoutObj << "received packet" << id << ", size" << data.size(); + if (id < 1 || id > replies.size_s()) return; + if (!session[id - 1].isEmpty()) { + header.id = id; + replies[id] = pt_ReplySuccess; + sendReply(pt_ReplySuccess); + if (checkSession() == 0) state_string = "receive ok"; + return; + } + Part fi; + PIByteArray ba, pheader; + pheader.resize(packet_header_size - sizeof(PacketHeader)); + if (!pheader.isEmpty()) { + memcpy(pheader.data(), data.data(), pheader.size()); + data.remove(0, pheader.size_s()); + } + while (!data.isEmpty()) { + ba.clear(); + data >> fi; + if (fi.size > 0) data >> ba; +// fi.fsize = ba.size(); + bytes_cur += fi.size; +// piCoutObj << "recv" << fi; + session[id - 1] << fi; + state_string = "receiving..."; + receivePart(fi, ba, pheader); + } + header.id = id; + replies[id] = pt_ReplySuccess; + if (checkSession() == 0) state_string = "receive ok"; + sendReply(pt_ReplySuccess); +} + + +PIByteArray PIBaseTransfer::build_packet(int id) { + PIByteArray ret; + PIByteArray ba; + header.id = id + 1; + header.type = pt_Data; + //piCoutObj << "Packet" << header.id; + //piCoutObj << "session id" << header.session_id; + ret << header; + ret << buildPacket(id); + /*for (int i = 0; i < session[id].size_s(); i++) { + EntryInfo fi = session[id][i]; +// piCoutObj << "send" << fi; + bytes_total_cur += fi.fsize; + ret << fi; + if (fi.entry.size > 0) { + PIString path = dir.absolutePath() + dir.separator + fi.entry.path; + if (work_file.path() != path || !work_file.isOpened()) { + if (!work_file.open(path, PIIODevice::ReadOnly)) { + break_ = true; + state_string = "ERROR! while open file " + fi.entry.path; + piCoutObj << state_string; + return ret; + } + } + work_file.seek(fi.fstart); + ba.resize(fi.fsize); + int rs = work_file.read(ba.data(), ba.size()); + if (rs != fi.fsize) { + break_ = true; + state_string = "ERROR! while read file " + fi.entry.path + " (must " + PIString::fromNumber(fi.fsize) + ", but read " + PIString::fromNumber(rs) + ")"; + piCoutObj << state_string; + return ret; + } + ret << ba; + } + } + EntryInfo cfile = session[id].back(); + state_string = "sending: " + cfile.entry.path; + bytes_file_all = cfile.entry.size; + bytes_file_cur = cfile.fstart; + uint scrc = crc.calculate(ret); + ret << scrc;*/ + //piCoutObj << "packet" << header.id << "send crc" << scrc; + return ret; +} + + +bool PIBaseTransfer::finish_send(bool ok) { + if (ok) state_string = "send done"; + else state_string = "send failed"; +// piCoutObj << state_string << PIString::readableSize(bytes_total_all); + is_sending = false; + bytes_all = bytes_cur = 0; + header.id = 0; + if (!ok) sendBreak(header.session_id); + else sendReply(pt_ReplySuccess); + finishSend(ok); + return ok; +} + + +void PIBaseTransfer::finish_receive(bool ok) { + if (ok) state_string = "receive done"; + else state_string = "receive failed"; +// piCoutObj << state_string << PIString::readableSize(bytes_total_all); + is_receiving = false; + bytes_all = bytes_cur = 0; + if (!ok) sendBreak(header.session_id); + finishReceive(ok); +} +PIByteArray PIDataTransfer::buildPacket(int id) { + ; +} + diff --git a/src/io/pidatatransfer.h b/src/io/pidatatransfer.h new file mode 100644 index 00000000..a56f619f --- /dev/null +++ b/src/io/pidatatransfer.h @@ -0,0 +1,116 @@ +#ifndef PIDATATRANSFER_H +#define PIDATATRANSFER_H + +#include "picrc.h" +#include "pitimer.h" + +class PIBaseTransfer : public PIObject +{ + PIOBJECT(PIBaseTransfer) +public: + PIBaseTransfer(); + ~PIBaseTransfer(); + + struct PacketHeader { + uint sig; + int type; // PacketType + uint session_id; + uint id; + uint crc; + bool check_sig() {return (sig == signature);} + }; + + struct Part { + Part(uint id_ = 0, ullong size_ = 0, ullong start_ = 0) : id(id_), size(size_), start(start_) {} + uint id; + ullong size; + ullong start; + }; + + virtual void stopSend(); + virtual void stopReceive(); + + virtual bool isSending() const {return is_sending;} + virtual bool isReceiving() const {return is_receiving;} + + void setPacketSize(int size) {packet_size = size;} + int packetSize() const {return packet_size;} + + void setTimeout(double sec) {timeout_ = sec;} + double timeout() const {return timeout_;} + + const PIString & stateString() const {return state_string;} + llong bytesAll() const {return bytes_all;} + llong bytesCur() const {return bytes_cur;} + const PIString * stateString_ptr() const {return &state_string;} + const llong * bytesAll_ptr() const {return &bytes_all;} + const llong * bytesCur_ptr() const {return &bytes_cur;} + + EVENT(startReceive) + EVENT1(finishReceive, bool, ok) + EVENT(startSend) + EVENT1(finishSend, bool, ok) + EVENT1(sendRequest, PIByteArray &, data) + EVENT_HANDLER1(void, received, PIByteArray &, data); + +protected: + uint packet_header_size, part_header_size; + bool break_, is_sending, is_receiving; + PIString state_string; + llong bytes_all, bytes_cur; + + void buildSession(PIVector parts); + virtual PIByteArray buildPacket(int id) = 0; + virtual void receivePart(Part fi, PIByteArray ba, PIByteArray header) = 0; + +private: + + enum PacketType {pt_Unknown, pt_Data, pt_ReplySuccess, pt_ReplyInvalid, pt_Break, pt_Start}; + + struct StartRequest { + uint packets; + ullong size; + }; + + + static const uint signature; + int packet_size; + double timeout_; + PIVector > session; + PIVector replies; + PacketHeader header; + CRC_16 crc; + + void processData(int id, PIByteArray &data); + PIByteArray build_packet(int id); + int checkSession(); + bool send_process(); + void sendBreak(int session_id); + void sendReply(PacketType reply); + bool getStartRequest(); + bool finish_send(bool ok); + void finish_receive(bool ok); +}; + +inline PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::PacketHeader & v) {s << v.sig << v.type << v.session_id << v.id; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIBaseTransfer::PacketHeader & v) {s >> v.sig >> v.type >> v.session_id >> v.id; return s;} + +inline PIByteArray & operator <<(PIByteArray & s, const PIBaseTransfer::Part & v) {s << v.id << v.size << v.start; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIBaseTransfer::Part & v) {s >> v.id >> v.size >> v.start; return s;} + + +class PIDataTransfer : public PIBaseTransfer +{ + PIOBJECT_SUBCLASS(PIDataTransfer, PIBaseTransfer) +public: + PIDataTransfer() {;} + ~PIDataTransfer() {;} + virtual PIByteArray buildPacket(int id); + virtual void receivePart(Part fi, PIByteArray ba, PIByteArray header) {;} + +private: + PIByteArray data; +}; + + +#endif // PIDATATRANSFER_H diff --git a/src/io/pidiagnostics.cpp b/src/io/pidiagnostics.cpp new file mode 100755 index 00000000..b21c01f3 --- /dev/null +++ b/src/io/pidiagnostics.cpp @@ -0,0 +1,166 @@ +/* + PIP - Platform Independent Primitives + Speed and quality in/out diagnostics + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pidiagnostics.h" + + +/** \class PIDiagnostics + * \brief Connection quality diagnostics + * \details + * \section PIDiagnostics_sec0 Synopsis + * This class provide abstract connection quality diagnostics and + * counting. You should create instance of %PIDiagnostics and on + * packet receive call function \a received(), on packet send call + * function \a sended(). %PIDiagnostics calculates correct, wrong + * and sended counters, packets per second, bytes per seconds, + * immediate and integral receive frequencies and receive/send speeds + * in human readable representation. There statistics are calculates + * one time per period, by default 1 second. To calculate them you + * should start %PIDiagnostics with function \a start() or pass \b true + * to constructor. + * */ + + +PIDiagnostics::PIDiagnostics(bool start_): PITimer() { + reset(); + if (start_) start(); +} + + +void PIDiagnostics::reset() { + setDisconnectTimeout(3.); + lock(); + qual = PIDiagnostics::Unknown; + speedIn = speedOut = PIString::readableSize(0) + "/s"; + ifreq = immediate_freq = integral_freq = 0.f; + cur_pckt = rec_once = 0; + wrong_count = receive_count = send_count = 0; + packets_in_sec = packets_out_sec = bytes_in_sec = bytes_out_sec = 0; + unlock(); +} + + +void PIDiagnostics::received(int size, bool correct) { + lock(); + rec_once = 1; + if (correct) { + float el = tm.elapsed_s(); + tm.reset(); + if (el > 0.f) immediate_freq = ifreq = 1.f / el; + else immediate_freq = ifreq = 0.f; + receive_count++; + } else { + immediate_freq = ifreq = 0.f; + wrong_count++; + } + addToHistory(history_rec, size, correct); + unlock(); +} + + +void PIDiagnostics::sended(int size) { + lock(); + send_count++; + addToHistory(history_send, size); + unlock(); +} + + +void PIDiagnostics::tick(void * data, int delimiter) { + lock(); + checkHistory(history_rec); + checkHistory(history_send); + PIDiagnostics::Quality diag; + immediate_freq = ifreq; + ifreq = 0.f; + int bps[2]; + int cpckt[2]; + bps[0] = bps[1] = 0; + cpckt[0] = cpckt[1] = 0; + packets_in_sec = packets_out_sec = 0; + piForeachC (Entry & e, history_rec) { + if (e.ok) { + bps[0] += e.bytes; + packets_in_sec++; + } + cpckt[e.ok ? 1 : 0]++; + } + piForeachC (Entry & e, history_send) { + bps[1] += e.bytes; + packets_out_sec++; + } + bytes_in_sec = bps[0] / disconn_; + bytes_out_sec = bps[1] / disconn_; + packets_in_sec /= disconn_; + packets_out_sec /= disconn_; + speedIn = PIString::readableSize(bytes_in_sec) + "/s"; + speedOut = PIString::readableSize(bytes_out_sec) + "/s"; + int arc = cpckt[0] + cpckt[1]; + float good_percents = 0.f; + if (arc > 0) good_percents = (float)cpckt[1] / arc * 100.f; + if (disconn_ > 0.) integral_freq = cpckt[1] / disconn_; + else integral_freq = 0.; + if (rec_once == 0) { + diag = PIDiagnostics::Unknown; + } else { + if (good_percents == 0.f) diag = PIDiagnostics::Failure; + else if (good_percents <= 20.f) diag = PIDiagnostics::Bad; + else if (good_percents > 20.f && good_percents <= 80.f) diag = PIDiagnostics::Average; + else diag = PIDiagnostics::Good; + } + if (diag != qual) { + qualityChanged(diag, qual); + qual = diag; + } + unlock(); +} + + +void PIDiagnostics::addToHistory(PIVector & hist, int bytes, bool ok) { + Entry e; + e.time = PISystemTime::current(true); + e.bytes = bytes; + e.ok = ok; + checkHistory(hist); + hist << e; +} + + +void PIDiagnostics::checkHistory(PIVector< PIDiagnostics::Entry > & hist) { + PISystemTime ctm = PISystemTime::current(true); + for (int i = 0; i < hist.size_s(); ++i) { + if ((ctm - hist[i].time).abs() > disconn_st) { + hist.remove(i); + --i; + } + } +} + + +void PIDiagnostics::propertyChanged(const PIString &) { + disconn_ = property("disconnectTimeout").toFloat(); + changeDisconnectTimeout(); +} + + +void PIDiagnostics::changeDisconnectTimeout() { + lock(); + disconn_st = PISystemTime::fromSeconds(disconn_); + unlock(); +} diff --git a/src/io/pidiagnostics.h b/src/io/pidiagnostics.h new file mode 100755 index 00000000..77f61b65 --- /dev/null +++ b/src/io/pidiagnostics.h @@ -0,0 +1,190 @@ +/*! \file pidiagnostics.h + * \brief Connection quality diagnostics +*/ +/* + PIP - Platform Independent Primitives + Speed and quality in/out diagnostics + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Bychkov Andrey wapmobil@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIDIAGNOSTICS_H +#define PIDIAGNOSTICS_H + +#include "pitimer.h" + + +class PIP_EXPORT PIDiagnostics: private PITimer +{ + PIOBJECT_SUBCLASS(PIDiagnostics, PITimer) + friend class PIConnection; +public: + + //! Constructs an empty diagnostics and if "strat_" start it + PIDiagnostics(bool start_ = true); + + virtual ~PIDiagnostics() {;} + + //! Connection quality + enum Quality { + Unknown /** Unknown, no one packet received yet */ = 1, + Failure /** No connection, no one correct packet received for last period */ = 2, + Bad /** Bad connection, correct packets received <= 20% */ = 3, + Average /** Average connection, correct packets received > 20% and <= 80% */ = 4, + Good /** Good connection, correct packets received > 80% */ = 5 + }; + + + //! Returns period of full disconnect in seconds and period of averaging frequency + float disconnectTimeout() const {return disconn_;} + + //! Returns period of full disconnect in seconds and period of averaging frequency + void setDisconnectTimeout(float s) {setProperty("disconnectTimeout", s); disconn_ = s; changeDisconnectTimeout();} + + + //! Returns immediate receive frequency, packets/s + float immediateFrequency() const {return immediate_freq;} + + //! Returns integral receive frequency for \a disconnectTimeout() seconds, packets/s + float integralFrequency() const {return integral_freq;} + + //! Returns correct received packets per second + ullong receiveCountPerSec() const {return packets_in_sec;} + + //! Returns sended packets per second + ullong sendCountPerSec() const {return packets_out_sec;} + + //! Returns correct received bytes per second + ullong receiveBytesPerSec() const {return bytes_in_sec;} + + //! Returns sended bytes per second + ullong sendBytesPerSec() const {return bytes_out_sec;} + + //! Returns overall correct received packets count + ullong receiveCount() const {return receive_count;} + + //! Returns overall wrong received packets count + ullong wrongCount() const {return wrong_count;} + + //! Returns overall sended packets count + ullong sendCount() const {return send_count;} + + //! Returns connection quality + PIDiagnostics::Quality quality() const {return qual;} + + //! Returns receive speed in format "n {B|kB|MB|GB|TB}/s" + PIString receiveSpeed() const {return speedIn;} + + //! Returns send speed in format "n {B|kB|MB|GB|TB}/s" + PIString sendSpeed() const {return speedOut;} + + + //! Returns immediate receive frequency pointer, packets/s. Useful for output to PIConsole + const float * immediateFrequency_ptr() const {return &immediate_freq;} + + //! Returns integral receive frequency pointer for period, packets/s. Useful for output to PIConsole + const float * integralFrequency_ptr() const {return &integral_freq;} + + //! Returns correct received packets per second pointer. Useful for output to PIConsole + const ullong * receiveCountPerSec_ptr() const {return &packets_in_sec;} + + //! Returns sended packets per second pointer. Useful for output to PIConsole + const ullong * sendCountPerSec_ptr() const {return &packets_out_sec;} + + //! Returns correct received bytes per second pointer. Useful for output to PIConsole + const ullong * receiveBytesPerSec_ptr() const {return &bytes_in_sec;} + + //! Returns sended bytes per second pointer. Useful for output to PIConsole + const ullong * sendBytesPerSec_ptr() const {return &bytes_out_sec;} + + //! Returns overall correct received packets count pointer. Useful for output to PIConsole + const ullong * receiveCount_ptr() const {return &receive_count;} + + //! Returns overall wrong received packets count pointer. Useful for output to PIConsole + const ullong * wrongCount_ptr() const {return &wrong_count;} + + //! Returns overall sended packets count pointer. Useful for output to PIConsole + const ullong * sendCount_ptr() const {return &send_count;} + + //! Returns connection quality pointer. Useful for output to PIConsole + const int * quality_ptr() const {return (int * )&qual;} + + //! Returns receive speed pointer in format "n {B|kB|MB|GB|TB}/s". Useful for output to PIConsole + const PIString * receiveSpeed_ptr() const {return &speedIn;} + + //! Returns send speed pointer in format "n {B|kB|MB|GB|TB}/s". Useful for output to PIConsole + const PIString * sendSpeed_ptr() const {return &speedOut;} + + EVENT_HANDLER0(void, start) {start(1000.); changeDisconnectTimeout();} + EVENT_HANDLER1(void, start, double, msecs) {if (msecs > 0.) {PITimer::start(msecs); changeDisconnectTimeout();}} + EVENT_HANDLER0(void, reset); + + EVENT_HANDLER1(void, received, int, size) {received(size, true);} + EVENT_HANDLER2(void, received, int, size, bool, correct); + EVENT_HANDLER1(void, sended, int, size); + + EVENT2(qualityChanged, PIDiagnostics::Quality, new_quality, PIDiagnostics::Quality, old_quality) + +//! \handlers +//! \{ + + //! \fn void start(double msecs = 1000.) + //! \brief Start diagnostics evaluations with period "msecs" milliseconds + + //! \fn void reset() + //! \brief Reset diagnostics counters + + //! \fn void received(int size, bool correct = true) + //! \brief Notify diagnostics about "correct" corected received packet + + //! \fn void sended(int size) + //! \brief Notify diagnostics about sended packet + +//! \} +//! \events +//! \{ + + //! \fn void qualityChanged(PIDiagnostics::Quality new_quality, PIDiagnostics::Quality old_quality) + //! \brief Raise on change receive quality from "old_quality" to "new_quality" + +//! \} + +private: + struct Entry { + Entry() {ok = true; bytes = 0;} + PISystemTime time; + bool ok; + int bytes; + }; + + void tick(void * data, int delimiter); + void addToHistory(PIVector & hist, int bytes, bool ok = true); + void checkHistory(PIVector & hist); + void propertyChanged(const PIString & ); + void changeDisconnectTimeout(); + + PIDiagnostics::Quality qual; + PIString speedIn, speedOut; + float ifreq, immediate_freq, integral_freq, disconn_; + PIVector history_rec, history_send; + PISystemTime disconn_st; + PITimeMeasurer tm; + char cur_pckt, rec_once; + ullong wrong_count, receive_count, send_count; + ullong packets_in_sec, packets_out_sec, bytes_in_sec, bytes_out_sec; + +}; + +#endif // PIDIAGNOSTICS_H diff --git a/src/io/pidir.cpp b/src/io/pidir.cpp new file mode 100755 index 00000000..faac351a --- /dev/null +++ b/src/io/pidir.cpp @@ -0,0 +1,380 @@ +/* + PIP - Platform Independent Primitives + Directory + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pidir.h" + +//#if !defined(ANDROID) +const PIChar PIDir::separator = '/'; +#ifdef QNX +# define _stat_struct_ struct stat +# define _stat_call_ stat +# define _stat_link_ lstat +#else +# define _stat_struct_ struct stat64 +# define _stat_call_ stat64 +# define _stat_link_ lstat64 +#endif +#ifndef WINDOWS +# ifdef ANDROID +# include +# else +# include +# endif +# include +#endif + + +/*! \class PIDir + * \brief Local directory + * + * \section PIDir_sec0 Synopsis + * This class provide access to local file. You can manipulate + * binary content or use this class as text stream. To binary + * access there are function \a read(), \a write(), and many + * \a writeBinary() functions. For write variables to file in + * their text representation threr are many "<<" operators. + * + */ + + +PIDir::PIDir(const PIString & dir) { + path_ = dir; + cleanPath(); +} + + +PIDir::PIDir(const PIFile & file) { + path_ = file.path(); + cleanPath(); + if (isExists()) return; + int pos = path_.findLast(separator); + path_.cutRight(path_.size_s() - pos); +} + + +bool PIDir::operator ==(const PIDir & d) const { + return d.absolutePath() == absolutePath(); +} + + +bool PIDir::isAbsolute() const { + if (path_.isEmpty()) return false; +#ifdef WINDOWS + if (path_.size_s() < 2) return false; + return (path_.mid(1, 2).contains(":")); +#else + return (path_[0] == separator); +#endif +} + + +PIString PIDir::absolutePath() const { + if (isAbsolute()) return path_; + return PIDir(PIDir::current().path_ + separator + path_).path_; +} + + +PIDir & PIDir::cleanPath() { + PIString p(path_); + if (p.size() == 0) { + path_ = "."; + return *this; + } + path_.replaceAll(PIString(separator) + PIString(separator), PIString(separator)); + bool is_abs = isAbsolute(); + PIStringList l = PIString(p).split(separator); +#ifdef WINDOWS + PIString letter; + if (is_abs) letter = l.take_front(); +#endif + l.removeAll("."); + l.removeAll(""); + for (int i = 0; i < l.size_s() - 1; ++i) { + if (l[i] != ".." && l[i + 1] == "..") { + l.remove(i, 2); + i -= 2; + if (i < -1) i = -1; + } + } + if (is_abs) + while (!l.isEmpty()) { + if (l.front() == "..") + l.pop_front(); + else + break; + } + path_ = l.join(separator); + if (is_abs) { + path_.prepend(separator); +#ifdef WINDOWS + path_.prepend(letter); +#endif + } + if (path_.isEmpty()) path_ = "."; + return *this; +} + + +PIString PIDir::relative(const PIString & path) const { + PIDir td(path); + PIStringList dl(absolutePath().split(separator)), pl(td.absolutePath().split(separator)), rl; + while (!dl.isEmpty() && !pl.isEmpty()) { + if (dl.front() != pl.front()) break; + dl.pop_front(); + pl.pop_front(); + } + for (int i = 0; i < dl.size_s(); ++i) + rl << ".."; + rl << pl; + if (rl.isEmpty()) return "."; + return rl.join(separator); +} + + +PIDir & PIDir::setDir(const PIString & path) { + path_ = path; + cleanPath(); + return *this; +} + + +PIDir & PIDir::cd(const PIString & path) { + if (path_.isEmpty()) return *this; + if (path_.back() != separator) path_ += separator; + path_ += path; + return cleanPath(); +} + + +bool PIDir::make(bool withParents) { + PIDir d = cleanedPath(); + PIString tp; + bool is_abs = isAbsolute(); + if (withParents) { + PIStringList l = d.path_.split(separator); + for (int i = l.size_s() - 1; i >= 0; --i) { + if (i > 1) tp = PIStringList(l).remove(i, l.size_s() - i).join(separator); + else { + tp = separator; + if (!is_abs) tp.push_front('.'); + } + //cout << tp << endl; + if (isExists(tp)) { + for (int j = i + 1; j <= l.size_s(); ++j) { + tp = PIStringList(l).remove(j, l.size_s() - j).join(separator); + //cout << tp << endl; + if (makeDir(tp)) continue; + else return false; + } + break; + }; + } + } else + if (makeDir(d.path_)) return true; + return false; +} + + +PIVector PIDir::entries() { + PIVector l; + if (!isExists()) return l; + PIString dp = absolutePath(); + PIString p(dp); + if (dp == ".") dp.clear(); + else if (!dp.endsWith(separator)) dp += separator; + //piCout << "entries from" << p; +#ifdef WINDOWS + WIN32_FIND_DATA fd; memset(&fd, 0, sizeof(fd)); + p += "\\*"; + void * hf = FindFirstFile((LPCTSTR)(p.data()), &fd); + if (!hf) return l; + do { + l << PIFile::fileInfo(dp + PIString(fd.cFileName)); + memset(&fd, 0, sizeof(fd)); + } while (FindNextFile(hf, &fd) != 0); + FindClose(hf); +#else + dirent ** list; + int cnt = scandir( +# ifndef QNX + p.data(), &list +# else + const_cast(p.data()), 0 +# endif + , 0, versionsort); + for (int i = 0; i < cnt; ++i) { + l << PIFile::fileInfo(dp + PIString(list[i]->d_name)); + delete list[i]; + } + delete list; +#endif + return l; +} + + +PIVector PIDir::allEntries() { + return allEntries(absolutePath()); +} + + + +bool PIDir::isExists(const PIString & path) { +#ifdef WINDOWS + DWORD ret = GetFileAttributes((LPCTSTR)(path.data())); + return (ret != 0xFFFFFFFF) && (ret & FILE_ATTRIBUTE_DIRECTORY); +#else + DIR * dir_ = opendir(path.data()); + if (dir_ == 0) return false; + closedir(dir_); +#endif + return true; +} + + +PIDir PIDir::current() { + char rc[1024]; +#ifdef WINDOWS + memset(rc, 0, 1024); + if (GetCurrentDirectory(1024, (LPTSTR)rc) == 0) return PIString(); + PIString ret(rc); + ret.replaceAll("\\", PIDir::separator); + return PIDir(ret); +#else + if (getcwd(rc, 1024) == 0) return PIString(); +#endif + return PIDir(rc); +} + + +PIDir PIDir::home() { + char * rc = 0; +#ifdef WINDOWS + rc = new char[1024]; + memset(rc, 0, 1024); + if (ExpandEnvironmentStrings((LPCTSTR)"%HOMEPATH%", (LPTSTR)rc, 1024) == 0) { + delete[] rc; + return PIDir(); + } + PIString s(rc); + s.replaceAll("\\", PIDir::separator); + delete[] rc; + return PIDir(s); +#else + rc = getenv("HOME"); + if (rc == 0) return PIDir(); + return PIDir(rc); +#endif +} + + +PIDir PIDir::temporary() { + char * rc = 0; +#ifdef WINDOWS + rc = new char[1024]; + memset(rc, 0, 1024); + int ret = GetTempPath(1024, (LPTSTR)rc); + if (ret == 0) { + delete[] rc; + return PIDir(); + } + PIString s(rc); + s.replaceAll("\\", PIDir::separator); + delete[] rc; + return PIDir(s); +#else + rc = tmpnam(0); + if (rc == 0) return PIDir(); + PIString s(rc); + return PIDir(s.left(s.findLast(PIDir::separator))); +#endif +} + + +PIVector PIDir::allEntries(const PIString &path) { + PIVector ret; + PIVector dirs; + PIDir root; + root.setDir(path); + PIVector cds = root.entries(); + piForeachC (PIFile::FileInfo & de, cds) { + //piCout << " open" << de.name(); + if (de.name() == "." || de.name() == "..") continue; + if (de.isSymbolicLink()) continue; /// TODO: resolve symlinks + if (de.isDir()) { + dirs.push_front(de); + PIVector td = PIDir(de.path).allEntries(); + for (int i = 0; i < td.size_s(); i++) { + if (td[i].isDir()) dirs.push_front(td[i]); + else ret << td[i]; + } + } else ret << de; + } + ret.insert(0, dirs); + return ret; +} + + +bool PIDir::make(const PIString & path, bool withParents) { + PIDir d(path); + if (d.isExists()) return true; + return d.make(withParents); +} + + +bool PIDir::setCurrent(const PIString & path) { +#ifdef WINDOWS + if (SetCurrentDirectory((LPCTSTR)(path.data())) != 0) return true; +#else + if (chdir(path.data()) == 0) return true; +#endif + printf("[PIDir] setCurrent(\"%s\") error: %s\n", path.data(), errorString().data()); + return false; +} + + +bool PIDir::makeDir(const PIString & path) { +#ifdef WINDOWS + if (CreateDirectory((LPCTSTR)(path.data()), NULL) != 0) return true; +#else + if (mkdir(path.data(), 16877) == 0) return true; +#endif + printf("[PIDir] makeDir(\"%s\") error: %s\n", path.data(), errorString().data()); + return false; +} + + +bool PIDir::removeDir(const PIString & path) { +#ifdef WINDOWS + if (RemoveDirectory((LPCTSTR)(path.data())) != 0) return true; +#else + if (rmdir(path.data()) == 0) return true; +#endif + printf("[PIDir] removeDir(\"%s\") error: %s\n", path.data(), errorString().data()); + return false; +} + + +bool PIDir::renameDir(const PIString & path, const PIString & new_name) { + if (::rename(path.data(), new_name.data()) == 0) return true; + printf("[PIDir] renameDir(\"%s\", \"%s\") error: %s\n", path.data(), new_name.data(), errorString().data()); + return false; +} + + +//#endif diff --git a/src/io/pidir.h b/src/io/pidir.h new file mode 100755 index 00000000..a5f3ced4 --- /dev/null +++ b/src/io/pidir.h @@ -0,0 +1,130 @@ +/*! \file pidir.h + * \brief Local directory +*/ +/* + PIP - Platform Independent Primitives + Directory + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIDIR_H +#define PIDIR_H + +#include "pifile.h" +//#if !defined(ANDROID) + +class PIP_EXPORT PIDir +{ +public: + + //! Constructs directory with path "path" + PIDir(const PIString & dir = PIString()); + + //! Constructs directory with "file" directory path "path" + PIDir(const PIFile & file); + + + //! Returns if this directory is exists + bool isExists() const {return PIDir::isExists(path_);} + + //! Returns if path of this directory is absolute + bool isAbsolute() const; + + //! Returns if path of this directory is relative + bool isRelative() const {return !isAbsolute();} + + + //! Returns path of this directory + const PIString & path() const {return path_;} + + //! Returns absolute path of this directory + PIString absolutePath() const; + + /** \brief Simplify path of this directory + * \details This function remove repeatedly separators and + * resolve ".." in path. E.g. "/home/.//peri4/src/../.." will + * become "/home" \n This function returns reference to this %PIDir */ + PIDir & cleanPath(); + + //! Returns %PIDir with simplified path of this directory + PIDir cleanedPath() const {PIDir d(path_); d.cleanPath(); return d;} + + //! Returns relative to this directory path "path" + PIString relative(const PIString & path) const; + + //! Set this directory path to simplified "path" + PIDir & setDir(const PIString & path); + + //! Set this directory path as current for application + bool setCurrent() {return PIDir::setCurrent(path_);} + + + /** \brief Returns this directory content + * \details Scan this directory and returns all directories + * and files in one list, sorted alphabetically. This list + * contains also "." and ".." members. + * \attention This function doesn`t scan content of inner + * directories! */ + PIVector entries(); + + /** \brief Returns all this directory content + * \details Scan this directory recursively and returns all + * directories and files in one list, sorted alphabetically. + * This list doesn`t contains "." and ".." members. + * Files placed after directories in this list */ + PIVector allEntries(); + + bool make(bool withParents = true); + bool remove() {return PIDir::remove(path_);} + bool rename(const PIString & new_name) {if (!PIDir::rename(path_, new_name)) return false; path_ = new_name; return true;} + PIDir & cd(const PIString & path); + PIDir & up() {return cd("..");} + + bool operator ==(const PIDir & d) const; + bool operator !=(const PIDir & d) const {return !((*this) == d);} + + static const PIChar separator; + + static PIDir current(); + static PIDir home(); + static PIDir temporary(); + static PIVector allEntries(const PIString & path); + static bool isExists(const PIString & path); + static bool make(const PIString & path, bool withParents = true); + static bool remove(const PIString & path) {return removeDir(path);} + static bool rename(const PIString & path, const PIString & new_name) {return PIDir::renameDir(path, new_name);} + static bool setCurrent(const PIString & path); + static bool setCurrent(const PIDir & dir) {return setCurrent(dir.path_);} + +private: + static bool makeDir(const PIString & path); + static bool removeDir(const PIString & path); + static bool renameDir(const PIString & path, const PIString & new_name); + + PIString path_; + +}; + + +inline bool operator <(const PIFile::FileInfo & v0, const PIFile::FileInfo & v1) {return (v0.path < v1.path);} +inline bool operator >(const PIFile::FileInfo & v0, const PIFile::FileInfo & v1) {return (v0.path > v1.path);} +inline bool operator ==(const PIFile::FileInfo & v0, const PIFile::FileInfo & v1) {return (v0.path == v1.path);} +inline bool operator !=(const PIFile::FileInfo & v0, const PIFile::FileInfo & v1) {return (v0.path != v1.path);} + +inline PICout operator <<(PICout s, const PIDir & v) {s.setControl(0, true); s << "PIDir(\"" << v.path() << "\")"; s.restoreControl(); return s;} + + +#endif // PIDIR_H diff --git a/src/io/piethernet.cpp b/src/io/piethernet.cpp new file mode 100755 index 00000000..b12c40cc --- /dev/null +++ b/src/io/piethernet.cpp @@ -0,0 +1,989 @@ +/* + PIP - Platform Independent Primitives + Ethernet, UDP/TCP Broadcast/Multicast + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piethernet.h" +#include "piconfig.h" +#ifdef QNX +# include +# include +# include +#endif +#ifdef WINDOWS +# include +# define ip_mreqn ip_mreq +# define imr_address imr_interface +#endif + + +/** \class PIEthernet + * \brief Ethernet device + * \details + * \section PIEthernet_sec0 Synopsis + * %PIEthernet designed to work with IPv4 network via two protocols: + * UDP and TCP. This class allow you send and receive packets to/from + * another computer through network. Also it supports broadcast and + * multicast extensions. + * + * \section PIEthernet_sec1 IPv4 + * + * + * \section PIEthernet_sec2 UDP + * User Datagram Protocol + * + * \section PIEthernet_sec3 TCP + * Transmission Control Protocol + * + * */ + +REGISTER_DEVICE(PIEthernet); + + +PIEthernet::PIEthernet(): PIIODevice("", ReadWrite) { + construct(); + setType(UDP); + setParameters(PIEthernet::ReuseAddress | PIEthernet::MulticastLoop); + //if (type_ != UDP) init(); +} + + +PIEthernet::PIEthernet(PIEthernet::Type type_, const PIString & ip_port, const PIFlags params_): PIIODevice(ip_port, ReadWrite) { + construct(); + parseAddress(ip_port, &ip_, &port_); + setType(type_); + setParameters(params_); + if (type_ != UDP) init(); +} + + +PIEthernet::PIEthernet(int sock_, PIString ip_port): PIIODevice("", ReadWrite) { + construct(); + parseAddress(ip_port, &ip_s, &port_s); + sock = sock_; + init_ = opened_ = connected_ = true; + setParameters(PIEthernet::ReuseAddress | PIEthernet::MulticastLoop); + setType(TCP_Client, false); + setPath(ip_port); +} + + +PIEthernet::~PIEthernet() { + piMonitor.ethernets--; + stop(); + closeDevice(); +} + + +void PIEthernet::construct() { + piMonitor.ethernets++; + connected_ = connecting_ = listen_threaded = server_bounded = false; + port_ = port_s = port_r = 0; + sock = sock_s = -1; + setReadTimeout(10000.); + setWriteTimeout(10000.); + setTTL(64); + setMulticastTTL(1); + server_thread_.setData(this); + server_thread_.setName("__S__server_thread"); + setThreadedReadBufferSize(65536); + setPriority(piHigh); +} + + +bool PIEthernet::init() { + //cout << "init " << type_ << endl; + if (sock_s == sock) + sock_s = -1; + closeSocket(sock); + closeSocket(sock_s); + int st = 0, pr = 0; + if (type() == UDP) { + st = SOCK_DGRAM; + pr = IPPROTO_UDP; + } else { + st = SOCK_STREAM; + pr = IPPROTO_TCP; + } + PIFlags params = parameters(); + sock = socket(AF_INET, st, pr); + if (params[SeparateSockets]) + sock_s = socket(AF_INET, st, pr); + else + sock_s = sock; + if (sock == -1 || sock_s == -1) { + piCoutObj << "Can`t create socket, " << ethErrorString(); + return false; + } + if (params[PIEthernet::ReuseAddress]) ethSetsockoptBool(sock, SOL_SOCKET, SO_REUSEADDR); + if (params[PIEthernet::Broadcast]) ethSetsockoptBool(sock, SOL_SOCKET, SO_BROADCAST); + applyTimeouts(); + applyOptInt(IPPROTO_IP, IP_TTL, TTL()); + //cout << "inited " << sock << ": bc = " << params << endl; + //fcntl(sock, F_SETFL, 0/*O_NONBLOCK*/); + return true; +} + + +void PIEthernet::parseAddress(const PIString & ipp, PIString * ip, int * port) { + if (ip != 0) *ip = ipp.left(ipp.find(":")); + if (port != 0) *port = ipp.right(ipp.length() - ipp.find(":") - 1).toInt(); +} + + +bool PIEthernet::openDevice() { + if (connected_) return true; + init(); + if (sock == -1 || path().isEmpty()) return false; + parseAddress(path(), &ip_, &port_); + if (type() == TCP_Client) + connecting_ = true; + if (type() != UDP || mode() == PIIODevice::WriteOnly) + return true; + memset(&addr_, 0, sizeof(addr_)); + addr_.sin_family = AF_INET; + addr_.sin_port = htons(port_); + PIFlags params = parameters(); + if (params[PIEthernet::Broadcast]) addr_.sin_addr.s_addr = INADDR_ANY; + else addr_.sin_addr.s_addr = inet_addr(ip_.data()); +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + //piCout << "bind to" << (params[PIEthernet::Broadcast] ? "255.255.255.255" : ip_) << ":" << port_ << " ..."; + int tries = 0; + while ((bind(sock, (sockaddr * )&addr_, sizeof(addr_)) == -1) && (tries < 10)) { + init(); + tries++; + } + if (tries == 10) { + piCoutObj << "Can`t bind to " << ip_ << ":" << port_ << ", " << ethErrorString(); + return false; + } + opened_ = true; + while (!mcast_queue.isEmpty()) + joinMulticastGroup(mcast_queue.dequeue()); + //cout << "!" << endl; + applyTimeouts(); + applyOptInt(IPPROTO_IP, IP_TTL, TTL()); + port_r = 0; + ip_r.clear(); + return true; +} + + +bool PIEthernet::closeDevice() { + //cout << "close\n"; + if (server_thread_.isRunning()) { + server_thread_.stop(); + if (!server_thread_.waitForFinish(100)) + server_thread_.terminate(); + } + if (sock_s == sock) + sock_s = -1; + closeSocket(sock); + closeSocket(sock_s); + piForeach (PIEthernet * i, clients_) + delete i; + clients_.clear(); + if (connected_) disconnected(false); + connected_ = false; + return true; +} + + +void PIEthernet::closeSocket(int & sd) { + if (sd != -1) + ethClosesocket(sd); + sd = -1; +} + + +void PIEthernet::applyTimeouts() { + if (sock < 0) return; + double rtm = readTimeout(), wtm = writeTimeout(); + applyTimeout(sock, SO_RCVTIMEO, rtm); + applyTimeout(sock, SO_SNDTIMEO, wtm); + if (sock_s != sock && sock_s != -1) { + applyTimeout(sock_s, SO_RCVTIMEO, rtm); + applyTimeout(sock_s, SO_SNDTIMEO, wtm); + } +} + + +void PIEthernet::applyTimeout(int fd, int opt, double ms) { + if (fd == 0) return; + double s = ms / 1000.; + timeval tm; + tm.tv_sec = piFloord(s); s -= tm.tv_sec; + tm.tv_usec = s * 1000000.; + //piCoutObj << "setReadIsBlocking" << yes; + ethSetsockopt(fd, SOL_SOCKET, opt, &tm, sizeof(tm)); +} + + +void PIEthernet::applyOptInt(int level, int opt, int val) { + if (sock < 0) return; + ethSetsockoptInt(sock, level, opt, val); + if (sock_s != sock && sock_s != -1) + ethSetsockoptInt(sock_s, level, opt, val); +} + + +void PIEthernet::setParameter(PIEthernet::Parameters parameter, bool on) { + PIFlags cp = (PIFlags)(property("parameters").toInt()); + cp.setFlag(parameter, on); + setParameters(cp); +} + + +bool PIEthernet::joinMulticastGroup(const PIString & group) { + if (sock == -1) init(); + if (sock == -1) return false; + if (type() != UDP) { + piCoutObj << "Only UDP sockets can join multicast groups"; + return false; + } + if (!opened_) { + if (mcast_queue.contains(group)) + return false; + mcast_queue.enqueue(group); + if (!mcast_groups.contains(group)) mcast_groups << group; + return true; + } + PIFlags params = parameters(); +#ifndef QNX + if (!params[Broadcast]) + ;//piCoutObj << "Warning: \"Broadcast\" parameter not set, \"joinMulticastGroup(\"" << group << "\")\" may be useless!"; + parseAddress(path(), &ip_, &port_); + struct ip_mreqn mreq; + memset(&mreq, 0, sizeof(mreq)); +#ifdef LINUX + //mreq.imr_address.s_addr = INADDR_ANY; + /*PIEthernet::InterfaceList il = interfaces(); + const PIEthernet::Interface * ci = il.getByAddress(ip_); + if (ci != 0) mreq.imr_ifindex = ci->index;*/ +#endif + if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; + else mreq.imr_address.s_addr = inet_addr(ip_.data()); +/*#ifndef WINDOWS + PIEthernet::InterfaceList il = interfaces(); + const PIEthernet::Interface * ci = il.getByAddress(ip_); + if (ci != 0) mreq.imr_ifindex = ci->index; +#endif*/ + //piCout << "join group" << group << "ip" << ip_ << "with index" << mreq.imr_ifindex << "socket" << sock; + mreq.imr_multiaddr.s_addr = inet_addr(group.data()); + if (ethSetsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) { + piCoutObj << "Can`t join multicast group " << group << ", " << ethErrorString(); + return false; + } + if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP); + applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL()); + if (!mcast_groups.contains(group)) mcast_groups << group; +#endif + return true; +} + + +bool PIEthernet::leaveMulticastGroup(const PIString & group) { + if (sock == -1) init(); + if (sock == -1) return false; + if (type() != UDP) { + piCoutObj << "Only UDP sockets can leave multicast groups"; + return false; + } + PIFlags params = parameters(); +#ifndef QNX + /// TODO windows + parseAddress(path(), &ip_, &port_); + struct ip_mreqn mreq; + memset(&mreq, 0, sizeof(mreq)); + if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY; + else mreq.imr_address.s_addr = inet_addr(ip_.data()); + mreq.imr_multiaddr.s_addr = inet_addr(group.data()); + if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { + piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString(); + return false; + } + mcast_groups.removeAll(group); +#endif + return true; +} + + +bool PIEthernet::connect() { + connecting_ = true; + return true; + /*if (sock == -1) return false; + memset(&addr_, 0, sizeof(addr_)); + parseAddress(path_, &ip_, &port_); + addr_.sin_port = htons(port_); + addr_.sin_addr.s_addr = inet_addr(ip_.data()); + addr_.sin_family = AF_INET; +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + //piCoutObj << "connect to " << ip << ":" << port_; + connected_ = (::connect(sock, (sockaddr * )&addr_, sizeof(addr_)) == 0); + if (!connected_) + piCoutObj << "Can`t connect to " << ip_ << ":" << port_ << ", " << ethErrorString(); + opened_ = connected_; + if (connected_) connected(); + return connected_;*/ +} + + +bool PIEthernet::listen(bool threaded) { + if (sock == -1) init(); + if (sock == -1) return false; + if (threaded) { + if (server_thread_.isRunning()) { + if (!server_bounded) return true; + server_thread_.stop(); + if (!server_thread_.waitForFinish(100)) + server_thread_.terminate(); + } + listen_threaded = true; + server_bounded = false; + server_thread_.start(server_func); + return true; + } + listen_threaded = server_bounded = false; + parseAddress(path(), &ip_, &port_); + memset(&addr_, 0, sizeof(addr_)); + addr_.sin_port = htons(port_); + addr_.sin_addr.s_addr = inet_addr(ip_.data()); + addr_.sin_family = AF_INET; +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + opened_ = false; + int tries = 0; + while ((bind(sock, (sockaddr * )&addr_, sizeof(addr_)) == -1) && (tries < 10)) { + init(); + tries++; + } + if (tries == 10) { + piCoutObj << "Can`t bind to " << ip_ << ":" << port_ << ", " << ethErrorString(); + return false; + } + if (::listen(sock, 64) == -1) { + piCoutObj << "Can`t listen on "<< ip_ << ":" << port_ << ", " << ethErrorString(); + return false; + } + opened_ = server_bounded = true; + //piCoutObj << "listen on " << ip_ << ":" << port_; + server_thread_.start(server_func); + return true; +} + + +int PIEthernet::read(void * read_to, int max_size) { + //cout << "read " << sock << endl; + if (sock == -1) init(); + if (sock == -1 || read_to == 0) return -1; + int rs = 0, s = 0, lerr = 0; + sockaddr_in client_addr; + socklen_t slen = sizeof(client_addr); + //piCoutObj << "read from " << ip_ << ":" << port_ << endl; + switch (type()) { + case TCP_SingleTCP: + ::listen(sock, 64); + s = accept(sock, (sockaddr * )&client_addr, &slen); + if (s == -1) { + //piCoutObj << "Can`t accept new connection, " << ethErrorString(); + msleep(1); + return -1; + } + rs = ethRecv(s, read_to, max_size); + closeSocket(s); + return rs; + case TCP_Client: + if (connecting_) { + memset(&addr_, 0, sizeof(addr_)); + parseAddress(path(), &ip_, &port_); + addr_.sin_port = htons(port_); + addr_.sin_addr.s_addr = inet_addr(ip_.data()); + addr_.sin_family = AF_INET; +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + //piCoutObj << "connect to " << ip_ << ":" << port_ << "..."; + connected_ = (::connect(sock, (sockaddr * )&addr_, sizeof(addr_)) == 0); + //piCoutObj << "connect to " << ip_ << ":" << port_ << connected_; + if (!connected_) + piCoutObj << "Can`t connect to " << ip_ << ":" << port_ << ", " << ethErrorString(); + opened_ = connected_; + if (connected_) { + connecting_ = false; + connected(); + } else + piMSleep(10); + //piCout << "connected to" << path(); + } + if (!connected_) return -1; + errorClear(); + rs = ethRecv(sock, read_to, max_size); + //piCoutObj << "readed" << rs; + if (rs <= 0) { + lerr = ethErrorCore(); +#ifdef WINDOWS + if (lerr == WSAEWOULDBLOCK || /*lerr == NO_ERROR ||*/ lerr == WSAETIMEDOUT) { +#else + if (lerr == EAGAIN || lerr == EWOULDBLOCK) { +#endif + //piCoutObj << errorString(); + piMSleep(10); + return -1; + } + if (connected_) { + init(); + disconnected(rs < 0); + } + connected_ = false; + //piCoutObj << "eth" << ip_ << "disconnected"; + } + if (rs > 0) received(read_to, rs); + return rs; + case UDP: + memset(&raddr_, 0, sizeof(raddr_)); + rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&raddr_); + //piCout << "eth" << path() << "read return" << rs << errorString(); + if (rs > 0) { + port_r = ntohs(raddr_.sin_port); + ip_r = inet_ntoa(raddr_.sin_addr); + //piCout << "received from" << lastReadAddress(); + received(read_to, rs); + } + return rs; + //return ::read(sock, read_to, max_size); + default: break; + //return ::read(sock, (char * )read_to, max_size); + } + return -1; +} + + +int PIEthernet::write(const void * data, int max_size) { + if (sock == -1) init(); + if (sock == -1 || !isWriteable()) { + //piCoutObj << "Can`t send to uninitialized socket"; + return -1; + } + //piCoutObj << "sending to " << ip_s << ":" << port_s << " " << max_size << " bytes"; + int ret = 0; + switch (type()) { + case TCP_SingleTCP: + memset(&addr_, 0, sizeof(addr_)); + addr_.sin_port = htons(port_s); + addr_.sin_addr.s_addr = inet_addr(ip_s.data()); + addr_.sin_family = AF_INET; +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + //piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "..."; + if (::connect(sock, (sockaddr * )&addr_, sizeof(addr_)) != 0) { + //piCoutObj << "Can`t connect to " << ip_s << ":" << port_s << ", " << ethErrorString(); + msleep(1); + return -1; + } + //piCoutObj << "ok, write SingleTCP" << int(data) << max_size << "bytes ..."; + ret = ::send(sock, (const char *)data, max_size, 0); + //piCoutObj << "ok, ret" << ret; + closeSocket(sock); + init(); + return ret; + case UDP: + saddr_.sin_port = htons(port_s); + /*if (params[PIEthernet::Broadcast]) saddr_.sin_addr.s_addr = INADDR_BROADCAST; + else*/ saddr_.sin_addr.s_addr = inet_addr(ip_s.data()); + saddr_.sin_family = AF_INET; + //piCout << "[PIEth] write to" << ip_s << ":" << port_s << "socket" << sock_s << max_size << "bytes ..."; + return ethSendto(sock_s, data, max_size, 0, (sockaddr * )&saddr_, sizeof(saddr_)); + //piCout << "[PIEth] write to" << ip_s << ":" << port_s << "ok"; + case TCP_Client: + if (connecting_) { + memset(&addr_, 0, sizeof(addr_)); + parseAddress(path(), &ip_, &port_); + addr_.sin_port = htons(port_); + addr_.sin_addr.s_addr = inet_addr(ip_.data()); + addr_.sin_family = AF_INET; +#ifdef QNX + addr_.sin_len = sizeof(addr_); +#endif + //piCoutObj << "connect to " << ip << ":" << port_; + connected_ = (::connect(sock, (sockaddr * )&addr_, sizeof(addr_)) == 0); + if (!connected_) + piCoutObj << "Can`t connect to " << ip_ << ":" << port_ << ", " << ethErrorString(); + opened_ = connected_; + if (connected_) { + connecting_ = false; + connected(); + } + } + if (!connected_) return -1; + ret = ::send(sock, (const char *)data, max_size, 0); + if (ret < 0) { + connected_ = false; { + init(); + disconnected(true); + } + } + return ret; + default: break; + //return ::read(sock, read_to, max_size); + } + return -1; +} + +void PIEthernet::server_func(void * eth) { + PIEthernet * ce = (PIEthernet * )eth; + if (ce->listen_threaded) { + if (!ce->server_bounded) { + if (!ce->listen(false)) { + ce->listen_threaded = true; + piMSleep(100); + return; + } + } + } + sockaddr_in client_addr; + socklen_t slen = sizeof(client_addr); + int s = accept(ce->sock, (sockaddr * )&client_addr, &slen); + if (s == -1) { + if (ce->debug()) piCout << "[PIEthernet] Can`t accept new connection, " << ethErrorString(); + piMSleep(10); + return; + } + PIString ip(inet_ntoa(client_addr.sin_addr)); + ip += ":" + PIString::fromNumber(htons(client_addr.sin_port)); + ce->clients_ << new PIEthernet(s, ip); + ce->newConnection(ce->clients_.back()); + //cout << "connected " << ip << endl; + //char d[256]; + //cout << " recv " << recv(s, d, 256, 0) << endl; + //cout << recv(ce->clients_.back()->sock, d, 256, 0) << endl; + +} + + +bool PIEthernet::configureDevice(const void * e_main, const void * e_parent) { + PIConfig::Entry * em = (PIConfig::Entry * )e_main; + PIConfig::Entry * ep = (PIConfig::Entry * )e_parent; + setReadIP(readDeviceSetting("ip", readIP(), em, ep)); + setReadPort(readDeviceSetting("port", readPort(), em, ep)); + setParameter(PIEthernet::Broadcast, readDeviceSetting("broadcast", isParameterSet(PIEthernet::Broadcast), em, ep)); + setParameter(PIEthernet::ReuseAddress, readDeviceSetting("reuseAddress", isParameterSet(PIEthernet::ReuseAddress), em, ep)); + return true; +} + + +void PIEthernet::propertyChanged(const PIString & name) { + if (name.endsWith("Timeout")) applyTimeouts(); + if (name == "TTL") applyOptInt(IPPROTO_IP, IP_TTL, TTL()); + if (name == "MulticastTTL") applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL()); +} + + +PIString PIEthernet::constructFullPath() const { + PIString ret(fullPathPrefix() + "://"); + ret << (type() == PIEthernet::UDP ? "UDP" : "TCP") << ":" << readIP() << ":" << readPort(); + if (type() == PIEthernet::UDP) { + ret << ":" << sendIP() << ":" << sendPort(); + piForeachC (PIString & m, multicastGroups()) + ret << ":mcast:" << m; + } + return ret; +} + + +void PIEthernet::configureFromFullPath(const PIString & full_path) { + PIStringList pl = full_path.split(":"); + bool mcast = false; + for (int i = 0; i < pl.size_s(); ++i) { + PIString p(pl[i]); + switch (i) { + case 0: + p = p.toLowerCase(); + if (p == "udp") setType(UDP); + if (p == "tcp") setType(TCP_Client); + break; + case 1: setReadIP(p); setSendIP(p); break; + case 2: setReadPort(p.toInt()); setSendPort(p.toInt()); break; + case 3: setSendIP(p); break; + case 4: setSendPort(p.toInt()); break; + } + if (i <= 4) continue; + if (i % 2 == 1) {if (p.toLowerCase() == "mcast") mcast = true;} + else {if (mcast) {joinMulticastGroup(p); mcast = false;}} + } +} + + +PIEthernet::InterfaceList PIEthernet::interfaces() { + PIEthernet::InterfaceList il; + Interface ci; + ci.index = -1; + ci.mtu = 1500; +#ifdef WINDOWS + PIP_ADAPTER_INFO pAdapterInfo, pAdapter = 0; + int ret = 0; + ulong ulOutBufLen = sizeof(IP_ADAPTER_INFO); + pAdapterInfo = (IP_ADAPTER_INFO * ) HeapAlloc(GetProcessHeap(), 0, (sizeof (IP_ADAPTER_INFO))); + if (pAdapterInfo == 0) { + piCout << "[PIEthernet] Error allocating memory needed to call GetAdaptersinfo"; + return il; + } + if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { + HeapFree(GetProcessHeap(), 0, (pAdapterInfo)); + pAdapterInfo = (IP_ADAPTER_INFO *) HeapAlloc(GetProcessHeap(), 0, (ulOutBufLen)); + if (pAdapterInfo == 0) { + piCout << "[PIEthernet] Error allocating memory needed to call GetAdaptersinfo"; + return il; + } + } + if ((ret = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { + pAdapter = pAdapterInfo; + while (pAdapter) { + ci.name = PIString(pAdapter->AdapterName); + ci.index = pAdapter->Index; + ci.address = PIString(pAdapter->IpAddressList.IpAddress.String); + if (ci.address == "0.0.0.0") { + pAdapter = pAdapter->Next; + continue; + } + ci.mac = macFromBytes(PIByteArray(pAdapter->Address, pAdapter->AddressLength)); + ci.netmask = PIString(pAdapter->IpAddressList.IpMask.String); + ci.flags = PIEthernet::ifActive | PIEthernet::ifRunning; + //if (ret->ifa_flags & IFF_BROADCAST) ci.flags |= PIEthernet::ifBroadcast; + //if (ret->ifa_flags & IFF_MULTICAST) ci.flags |= PIEthernet::ifMulticast; + if (pAdapter->Type == MIB_IF_TYPE_PPP) ci.flags |= PIEthernet::ifPTP; + if (pAdapter->Type == MIB_IF_TYPE_LOOPBACK) ci.flags |= PIEthernet::ifLoopback; + ci.broadcast.clear(); + ci.ptp.clear(); + /*if (ci.flags[PIEthernet::ifBroadcast]) + ci.broadcast = getSockAddr(ret->ifa_broadaddr); + if (ci.flags[PIEthernet::ifPTP]) + ci.ptp = getSockAddr(ret->ifa_dstaddr);*/ + il << ci; + pAdapter = pAdapter->Next; + } + } else + piCout << "[PIEthernet] GetAdaptersInfo failed with error: " << ret; + if (pAdapterInfo) + HeapFree(GetProcessHeap(), 0, (pAdapterInfo)); +#else +/*# ifdef QNX + PIStringList il, sl; + PIProcess proc; + proc.setGrabOutput(true); + proc.exec(ifconfigPath.c_str(), "-l"); + if (!proc.waitForFinish(1000)) return sl; + PIString out(proc.readOutput()); + il = out.split(" "); + il.removeAll(""); + piForeachC (PIString & i, il) { + proc.exec(ifconfigPath.c_str(), i); + if (!proc.waitForFinish(1000)) return il; + sl << i.trimmed(); + out = proc.readOutput(); + int al = out.length(); + al = (al - out.replaceAll("alias", "").length()) / 5; + for (int j = 0; j < al; ++j) + sl << i.trimmed() + ":" + PIString::fromNumber(j); + } + return sl; +# else + PIStringList sl; + PIProcess proc; + proc.setGrabOutput(true); + proc.exec(ifconfigPath.c_str(), "-s"); + if (!proc.waitForFinish(1000)) return sl; + PIString out(proc.readOutput()); + out.cutLeft(out.find('\n') + 1); + while (!out.isEmpty()) { + sl << out.left(out.find(' ')); + out.cutLeft(out.find('\n') + 1); + } + return sl; +# endif*/ +# ifdef ANDROID + struct ifconf ifc; + int s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + ifc.ifc_len = 256; + ifc.ifc_buf = new char[ifc.ifc_len]; + if (ioctl(s, SIOCGIFCONF, &ifc) < 0) { + piCout << "[PIEthernet] Can`t get interfaces:" << errorString(); + delete ifc.ifc_buf; + return il; + } + int icnt = ifc.ifc_len / sizeof(ifreq); + PIStringList inl; + struct ifreq ir; + for (int i = 0; i < icnt; ++i) { + PIString in(ifc.ifc_req[i].ifr_name); + if (in.isEmpty()) continue; + ci.name = in; + strcpy(ir.ifr_name, in.data()); + if (ioctl(s, SIOCGIFHWADDR, &ir) == 0) + ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6)); + if (ioctl(s, SIOCGIFADDR, &ir) >= 0) + ci.address = getSockAddr(&ir.ifr_addr); + if (ioctl(s, SIOCGIFNETMASK, &ir) >= 0) + ci.netmask = getSockAddr(&ir.ifr_addr); + ioctl(s, SIOCGIFMTU, &ci.mtu); + il << ci; + } + delete ifc.ifc_buf; +# else + struct ifaddrs * ret; + int s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + if (getifaddrs(&ret) == 0) { + while (ret != 0) { + if (ret->ifa_addr == 0) { + ret = ret->ifa_next; + continue; + } + if (ret->ifa_addr->sa_family != AF_INET) { + ret = ret->ifa_next; + continue; + } + ci.name = PIString(ret->ifa_name); + ci.address = getSockAddr(ret->ifa_addr); + ci.netmask = getSockAddr(ret->ifa_netmask); + ci.mac.clear(); +# ifdef QNX + int fd = ::open((PIString("/dev/io-net/") + ci.name).data(), O_RDONLY); + if (fd != 0) { + nic_config_t nic; + devctl(fd, DCMD_IO_NET_GET_CONFIG, &nic, sizeof(nic), 0); + ::close(fd); + ci.mac = macFromBytes(PIByteArray(nic.permanent_address, 6)); + } +# else +# ifdef MAC_OS + PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether"; + FILE * fp = popen(req.data(), "r"); + if (fp != 0) { + char in[256]; + if (fgets(in, 256, fp) != 0) { + req = PIString(in).trim(); + ci.mac = req.cutLeft(req.find(" ") + 1).trim().toUpperCase(); + } + pclose(fp); + } +# else + if (s != -1) { + struct ifreq ir; + strcpy(ir.ifr_name, ret->ifa_name); + if (ioctl(s, SIOCGIFHWADDR, &ir) == 0) { + ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6)); + ci.mtu = ir.ifr_mtu; + } + } +# endif +# endif + ci.flags = 0; + if (ret->ifa_flags & IFF_UP) ci.flags |= PIEthernet::ifActive; + if (ret->ifa_flags & IFF_RUNNING) ci.flags |= PIEthernet::ifRunning; + if (ret->ifa_flags & IFF_BROADCAST) ci.flags |= PIEthernet::ifBroadcast; + if (ret->ifa_flags & IFF_MULTICAST) ci.flags |= PIEthernet::ifMulticast; + if (ret->ifa_flags & IFF_LOOPBACK) ci.flags |= PIEthernet::ifLoopback; + if (ret->ifa_flags & IFF_POINTOPOINT) ci.flags |= PIEthernet::ifPTP; + ci.broadcast.clear(); + ci.ptp.clear(); + if (ci.flags[PIEthernet::ifBroadcast]) + ci.broadcast = getSockAddr(ret->ifa_broadaddr); + if (ci.flags[PIEthernet::ifPTP]) + ci.ptp = getSockAddr(ret->ifa_dstaddr); + ci.index = if_nametoindex(ret->ifa_name); + il << ci; + ret = ret->ifa_next; + } + freeifaddrs(ret); + } else + piCout << "[PIEthernet] Can`t get interfaces:" << errorString(); + if (s != -1) ::close(s); +# endif +#endif + return il; +} + + +PIString PIEthernet::interfaceAddress(const PIString & interface_) { +#ifdef WINDOWS + piCout << "[PIEthernet] Not implemented on Windows, use \"PIEthernet::allAddresses\" or \"PIEthernet::interfaces\" instead"; + return PIString(); +#else + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); + strcpy(ifr.ifr_name, interface_.data()); + int s = socket(AF_INET, SOCK_DGRAM, 0); + ioctl(s, SIOCGIFADDR, &ifr); + ::close(s); + struct sockaddr_in * sa = (struct sockaddr_in * )&ifr.ifr_addr; + return PIString(inet_ntoa(sa->sin_addr)); +#endif + +} + + +PIStringList PIEthernet::allAddresses() { +/*#ifdef WINDOWS + PIStringList al; + PIString ca; + PIP_ADAPTER_INFO pAdapterInfo, pAdapter = 0; + int ret = 0; + ulong ulOutBufLen = sizeof(IP_ADAPTER_INFO); + pAdapterInfo = (IP_ADAPTER_INFO * ) HeapAlloc(GetProcessHeap(), 0, (sizeof (IP_ADAPTER_INFO))); + if (pAdapterInfo == 0) { + piCout << "[PIEthernet] Error allocating memory needed to call GetAdaptersinfo"; + return PIStringList(); + } + if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { + HeapFree(GetProcessHeap(), 0, (pAdapterInfo)); + pAdapterInfo = (IP_ADAPTER_INFO *) HeapAlloc(GetProcessHeap(), 0, (ulOutBufLen)); + if (pAdapterInfo == 0) { + piCout << "[PIEthernet] Error allocating memory needed to call GetAdaptersinfo"; + return PIStringList(); + } + } + if ((ret = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { + pAdapter = pAdapterInfo; + while (pAdapter) { + ca = PIString(pAdapter->IpAddressList.IpAddress.String); + if (ca != "0.0.0.0") al << ca; + pAdapter = pAdapter->Next; + } + } else + piCout << "[PIEthernet] GetAdaptersInfo failed with error: " << ret; + if (pAdapterInfo) + HeapFree(GetProcessHeap(), 0, (pAdapterInfo)); + return al; +#else*/ + PIEthernet::InterfaceList il = interfaces(); + PIStringList al; + piForeachC (PIEthernet::Interface & i, il) + al << i.address; + return al.removeStrings("0.0.0.0"); +//#endif +} + + +// System wrap + + +int PIEthernet::ethErrorCore() { +#ifdef WINDOWS + return WSAGetLastError(); +#else + return errno; +#endif + +} + + +PIString PIEthernet::ethErrorString() { +#ifdef WINDOWS + char * msg; + int err = WSAGetLastError(); + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msg, 0, NULL); + return "code " + PIString::fromNumber(err) + " - " + PIString(msg); +#else + return errorString(); +#endif +} + + +int PIEthernet::ethRecv(int sock, void * buf, int size, int flags) { + if (sock < 0) return -1; + return recv(sock, +#ifdef WINDOWS + (char*) +#endif + buf, size, flags); +} + + +int PIEthernet::ethRecvfrom(int sock, void * buf, int size, int flags, sockaddr * addr) { + if (sock < 0) return -1; +#ifdef QNX + return recv(sock, buf, size, flags); +#else + socklen_t len = sizeof(sockaddr); + return recvfrom(sock, +# ifdef WINDOWS + (char*) +# endif + buf, size, flags, addr, &len); +#endif +} + + +int PIEthernet::ethSendto(int sock, const void * buf, int size, int flags, sockaddr * addr, int addr_len) { + if (sock < 0) return -1; + return sendto(sock, +#ifdef WINDOWS + (const char*) +#endif + buf, size, flags, addr, addr_len); +} + + +void PIEthernet::ethClosesocket(int sock) { + if (sock < 0) return; +#ifdef WINDOWS + shutdown(sock, SD_BOTH); + closesocket(sock); +#else + shutdown(sock, SHUT_RDWR); + ::close(sock); +#endif +} + + +int PIEthernet::ethSetsockopt(int sock, int level, int optname, const void * optval, int optlen) { + if (sock < 0) return -1; + return setsockopt(sock, level, optname, +#ifdef WINDOWS + (char*) +#endif + optval, optlen); +} + + +int PIEthernet::ethSetsockoptInt(int sock, int level, int optname, int value) { + if (sock < 0) return -1; +#ifdef WINDOWS + DWORD +#else + int +#endif + so = value; + return ethSetsockopt(sock, level, optname, &so, sizeof(so)); +} + + +int PIEthernet::ethSetsockoptBool(int sock, int level, int optname, bool value) { + if (sock < 0) return -1; +#ifdef WINDOWS + BOOL +#else + int +#endif + so = (value ? 1 : 0); + return ethSetsockopt(sock, level, optname, &so, sizeof(so)); +} diff --git a/src/io/piethernet.h b/src/io/piethernet.h new file mode 100755 index 00000000..daee7cbf --- /dev/null +++ b/src/io/piethernet.h @@ -0,0 +1,424 @@ +/*! \file piethernet.h + * \brief Ethernet device +*/ +/* + PIP - Platform Independent Primitives + Ethernet, UDP/TCP Broadcast/Multicast + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIETHERNET_H +#define PIETHERNET_H + +#include "pitimer.h" +#include "piiodevice.h" +#include "piprocess.h" + +class PIP_EXPORT PIEthernet: public PIIODevice +{ + PIIODEVICE(PIEthernet) + friend class PIPeer; +public: + + //! Contructs UDP %PIEthernet with empty read address + PIEthernet(); + + //! \brief Type of %PIEthernet + enum PIP_EXPORT Type { + UDP /** UDP - User Datagram Protocol */ , + TCP_Client /** TCP client - allow connection to TCP server */ , + TCP_Server /** TCP server - receive connections from TCP clients */ , + TCP_SingleTCP + }; + + //! \brief Parameters of %PIEthernet + enum PIP_EXPORT Parameters { + ReuseAddress /** Rebind address if there is already binded. Enabled by default */ = 0x1, + Broadcast /** Broadcast send. Disabled by default */ = 0x2, + SeparateSockets /** If this parameter is set, %PIEthernet will initialize two different sockets, + for receive and send, instead of single one. Disabled by default */ = 0x4, + MulticastLoop /** Enable receiving multicast packets from same host. Enabled by default */ = 0x8 + }; + + //! Contructs %PIEthernet with type "type", read address "ip_port" and parameters "params" + PIEthernet(Type type, const PIString & ip_port = PIString(), const PIFlags params = 0); + + virtual ~PIEthernet(); + + + //! Set read address + void setReadAddress(const PIString & ip, int port) {setPath(ip + ":" + PIString::fromNumber(port));} + + //! Set read address in format "i.i.i.i:p" + void setReadAddress(const PIString & ip_port) {setPath(ip_port);} + + //! Set read IP + void setReadIP(const PIString & ip) {parseAddress(path(), &ip_, &port_); setPath(ip + ":" + PIString::fromNumber(port_));} + + //! Set read port + void setReadPort(int port) {parseAddress(path(), &ip_, &port_); setPath(ip_ + ":" + PIString::fromNumber(port));} + + + //! Set send address + void setSendAddress(const PIString & ip, int port) {ip_s = ip; port_s = port;} + + //! Set send address in format "i.i.i.i:p" + void setSendAddress(const PIString & ip_port) {parseAddress(ip_port, &ip_s, &port_s);} + + //! Set send IP + void setSendIP(const PIString & ip) {ip_s = ip;} + + //! Set send port + void setSendPort(int port) {port_s = port;} + + + //! Returns read address in format "i.i.i.i:p" + PIString readAddress() const {return path();} + + //! Returns read IP + PIString readIP() const {parseAddress(path(), &ip_, &port_); return ip_;} + + //! Returns read port + int readPort() const {parseAddress(path(), &ip_, &port_); return port_;} + + + //! Returns send address in format "i.i.i.i:p" + PIString sendAddress() const {return ip_s + ":" + PIString::fromNumber(port_s);} + + //! Returns send IP + PIString sendIP() const {return ip_s;} + + //! Returns send port + int sendPort() const {return port_s;} + + + //! Returns address of last received UDP packet in format "i.i.i.i:p" + PIString lastReadAddress() const {return ip_r + ":" + PIString::fromNumber(port_r);} + + //! Returns IP of last received UDP packet + PIString lastReadIP() const {return ip_r;} + + //! Returns port of last received UDP packet + int lastReadPort() const {return port_r;} + + + //! Set parameters to "parameters_". You should to reopen %PIEthernet to apply them + void setParameters(PIFlags parameters_) {setProperty("parameters", (int)parameters_);} + + //! Set parameter "parameter" to state "on". You should to reopen %PIEthernet to apply this + void setParameter(PIEthernet::Parameters parameter, bool on = true); + + //! Returns if parameter "parameter" is set + bool isParameterSet(PIEthernet::Parameters parameter) const {return ((PIFlags)(property("parameters").toInt()))[parameter];} + + //! Returns parameters + PIFlags parameters() const {return (PIFlags)(property("parameters").toInt());} + + //PIByteArray macAddress() {if (!init_) init(); struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); memcpy(ifr.ifr_name, "eth0", 5); ioctl(sock, SIOCSIFHWADDR, &ifr); return PIByteArray(&ifr.ifr_hwaddr.sa_data, 6);} + + //! Returns %PIEthernet type + Type type() const {return (Type)(property("type").toInt());} + + //! Returns read timeout + double readTimeout() const {return property("readTimeout").toDouble();} + + //! Returns write timeout + double writeTimeout() const {return property("writeTimeout").toDouble();} + + //! Set timeout for read + void setReadTimeout(double ms) {setProperty("readTimeout", ms);} + + //! Set timeout for write + void setWriteTimeout(double ms) {setProperty("writeTimeout", ms);} + + + //! Returns TTL (Time To Live) + int TTL() const {return property("TTL").toInt();} + + //! Returns multicast TTL (Time To Live) + int multicastTTL() const {return property("MulticastTTL").toInt();} + + //! Set TTL (Time To Live), default is 64 + void setTTL(int ttl) {setProperty("TTL", ttl);} + + //! Set multicast TTL (Time To Live), default is 1 + void setMulticastTTL(int ttl) {setProperty("MulticastTTL", ttl);} + + + //! Join to multicast group with address "group". Use only for UDP + bool joinMulticastGroup(const PIString & group); + + //! Leave multicast group with address "group". Use only for UDP + bool leaveMulticastGroup(const PIString & group); + + //! Returns joined multicast groups. Use only for UDP + const PIStringList & multicastGroups() const {return mcast_groups;} + + + //! Connect to TCP server with address \a readAddress(). Use only for TCP_Client + bool connect(); + + //! Connect to TCP server with address "ip":"port". Use only for TCP_Client + bool connect(const PIString & ip, int port) {setPath(ip + ":" + PIString::fromNumber(port)); return connect();} + + //! Connect to TCP server with address "ip_port". Use only for TCP_Client + bool connect(const PIString & ip_port) {setPath(ip_port); return connect();} + + //! Returns if %PIEthernet connected to TCP server. Use only for TCP_Client + bool isConnected() const {return connected_;} + + + //! Start listen for incoming TCP connections on address \a readAddress(). Use only for TCP_Server + bool listen(bool threaded = false); + + //! Start listen for incoming TCP connections on address "ip":"port". Use only for TCP_Server + bool listen(const PIString & ip, int port, bool threaded = false) {setReadAddress(ip, port); return listen(threaded);} + + //! Start listen for incoming TCP connections on address "ip_port". Use only for TCP_Server + bool listen(const PIString & ip_port, bool threaded = false) {setReadAddress(ip_port); return listen(threaded);} + + PIEthernet * client(int index) {return clients_[index];} + int clientsCount() const {return clients_.size_s();} + PIVector clients() const {return clients_;} + + + //! Send data "data" with size "size" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client + bool send(const void * data, int size, bool threaded = false) {if (threaded) {writeThreaded(data, size); return true;} return (write(data, size) == size);} + + //! Send data "data" with size "size" to address "ip":"port" + bool send(const PIString & ip, int port, const void * data, int size, bool threaded = false) {ip_s = ip; port_s = port; if (threaded) {writeThreaded(data, size); return true;} return send(data, size);} + + //! Send data "data" with size "size" to address "ip_port" + bool send(const PIString & ip_port, const void * data, int size, bool threaded = false) {parseAddress(ip_port, &ip_s, &port_s); if (threaded) {writeThreaded(data, size); return true;} return send(data, size);} + + //! Send data "data" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client + bool send(const PIByteArray & data, bool threaded = false) {if (threaded) {writeThreaded(data); return true;} return (write(data) == data.size_s());} + + //! Send data "data" to address "ip":"port" for UDP + bool send(const PIString & ip, int port, const PIByteArray & data, bool threaded = false) {ip_s = ip; port_s = port; if (threaded) {writeThreaded(data); return true;} return send(data);} + + //! Send data "data" to address "ip_port" for UDP + bool send(const PIString & ip_port, const PIByteArray & data, bool threaded = false) {parseAddress(ip_port, &ip_s, &port_s); if (threaded) {writeThreaded(data); return true;} return (write(data) == data.size_s());} + + + //! Wait for some data and read it to "read_to" + int read(void * read_to, int max_size); + + //! Send data "read_to" with size "max_size" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client + int write(const void * data, int max_size); + + //! Send data "data" to address \a sendAddress() for UDP or \a readAddress() for TCP_Client + int write(const PIByteArray & data) {return write(data.data(), data.size_s());} + + virtual bool canWrite() const {return mode() & WriteOnly;} + + PIString constructFullPath() const; + + EVENT1(newConnection, PIEthernet * , client) + EVENT0(connected) + EVENT1(disconnected, bool, withError) + + + //! Flags of network interface + enum PIP_EXPORT InterfaceFlag { + ifActive /** Is active */ = 0x1, + ifRunning /** Is running */ = 0x2, + ifBroadcast /** Support broadcast */ = 0x4, + ifMulticast /** Support multicast */ = 0x8, + ifLoopback /** Is loopback */ = 0x10, + ifPTP /** Is point-to-point */ = 0x20 + }; + + //! %PIFlags of network interface flags + typedef PIFlags InterfaceFlags; + + + //! Network interface descriptor + struct PIP_EXPORT Interface { + + //! System index + int index; + + //! MTU + int mtu; + + //! System name + PIString name; + + //! MAC address in format "hh:hh:hh:hh:hh:hh" or empty if there is no MAC address + PIString mac; + + //! IP address in format "i.i.i.i" or empty if there is no IP address + PIString address; + + //! Netmask of IP address in format "i.i.i.i" or empty if there is no netmask + PIString netmask; + + //! Broadcast address in format "i.i.i.i" or empty if there is no broadcast address + PIString broadcast; + + //! Point-to-point address or empty if there is no point-to-point address + PIString ptp; + + //! Flags of interface + InterfaceFlags flags; + + //! Returns if interface is active + bool isActive() const {return flags[PIEthernet::ifActive];} + + //! Returns if interface is running + bool isRunning() const {return flags[PIEthernet::ifRunning];} + + //! Returns if interface support broadcast + bool isBroadcast() const {return flags[PIEthernet::ifBroadcast];} + + //! Returns if interface support multicast + bool isMulticast() const {return flags[PIEthernet::ifMulticast];} + + //! Returns if interface is loopback + bool isLoopback() const {return flags[PIEthernet::ifLoopback];} + + //! Returns if interface is point-to-point + bool isPTP() const {return flags[PIEthernet::ifPTP];} + }; + + + //! Array of \a Interface with some features + class PIP_EXPORT InterfaceList: public PIVector { + public: + InterfaceList(): PIVector() {} + + //! Get interface with system index "index" or 0 if there is no one + const Interface * getByIndex(int index) const {for (int i = 0; i < size_s(); ++i) if ((*this)[i].index == index) return &((*this)[i]); return 0;} + + //! Get interface with system name "name" or 0 if there is no one + const Interface * getByName(const PIString & name) const {for (int i = 0; i < size_s(); ++i) if ((*this)[i].name == name) return &((*this)[i]); return 0;} + + //! Get interface with IP address "address" or 0 if there is no one + const Interface * getByAddress(const PIString & address) const {for (int i = 0; i < size_s(); ++i) if ((*this)[i].address == address) return &((*this)[i]); return 0;} + + //! Get loopback interface or 0 if there is no one + const Interface * getLoopback() const {for (int i = 0; i < size_s(); ++i) if ((*this)[i].isLoopback()) return &((*this)[i]); return 0;} + }; + + + //! Returns all system network interfaces + static InterfaceList interfaces(); + + static PIString interfaceAddress(const PIString & interface_); + + //! Returns all system network IP addresses + static PIStringList allAddresses(); + + static void parseAddress(const PIString & ipp, PIString * ip, int * port); + static PIString macFromBytes(const PIByteArray & mac) {PIString r; for (int i = 0; i < mac.size_s(); ++i) {r += PIString::fromNumber(mac[i], 16).expandLeftTo(2, '0'); if (i < mac.size_s() - 1) r += ":";} return r;} + static PIByteArray macToBytes(const PIString & mac) {PIByteArray r; PIStringList sl = mac.split(":"); piForeachC (PIString & i, sl) r << uchar(i.toInt(16)); return r;} + static PIString applyMask(const PIString & ip, const PIString & mask) {struct in_addr ia; ia.s_addr = inet_addr(ip.data()) & inet_addr(mask.data()); return PIString(inet_ntoa(ia));} + static PIString getBroadcast(const PIString & ip, const PIString & mask) {struct in_addr ia; ia.s_addr = inet_addr(ip.data()) | ~inet_addr(mask.data()); return PIString(inet_ntoa(ia));} + +//! \events +//! \{ + + //! \fn void newConnection(PIEthernet * client) + //! \brief Raise on new TCP connection received + + //! \fn void connected() + //! \brief Raise if succesfull TCP connection + + //! \fn void disconnected(bool withError) + //! \brief Raise if TCP connection was closed + +//! \} +//! \ioparams +//! \{ +#ifdef DOXYGEN + //! \brief read ip, default "" + string ip; + + //! \brief read port, default 0 + int port; + + //! \brief ethernet parameters + int parameters; + + //! \brief read timeout, default 1000 ms + double readTimeout; + + //! \brief write timeout, default 1000 ms + double writeTimeout; + + //! \brief time-to-live, default 64 + int TTL; + + //! \brief time-to-live for multicast, default 1 + int multicastTTL; +#endif +//! \} + +protected: + PIEthernet(int sock, PIString ip_port); + + void propertyChanged(const PIString & name); + + PIString fullPathPrefix() const {return "eth";} + void configureFromFullPath(const PIString & full_path); + bool configureDevice(const void * e_main, const void * e_parent = 0); + + //! Executes when any read function was successful. Default implementation does nothing + virtual void received(const void * data, int size) {;} + + void construct(); + bool init(); + bool openDevice(); + bool closeDevice(); + void closeSocket(int & sd); + void applyTimeouts(); + void applyTimeout(int fd, int opt, double ms); + void applyOptInt(int level, int opt, int val); +#ifndef WINDOWS + static PIString getSockAddr(sockaddr * s) {return s == 0 ? PIString() : PIString(inet_ntoa(((sockaddr_in*)s)->sin_addr));} +#endif + + + int sock, sock_s, wrote; + mutable int port_, port_s, port_c, port_r; + bool connected_, connecting_, listen_threaded, server_bounded; + sockaddr_in addr_, saddr_, raddr_; + mutable PIString ip_, ip_s, ip_c, ip_r; + PIThread server_thread_; + PIVector clients_; + PIQueue mcast_queue; + PIStringList mcast_groups; + +private: + static void server_func(void * eth); + void setType(Type t, bool reopen = true) {setProperty("type", (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}} + + inline static int ethErrorCore(); + inline static PIString ethErrorString(); + inline static int ethRecv(int sock, void * buf, int size, int flags = 0); + inline static int ethRecvfrom(int sock, void * buf, int size, int flags, sockaddr * addr); + inline static int ethSendto(int sock, const void * buf, int size, int flags, sockaddr * addr, int addr_len); + inline static void ethClosesocket(int sock); + inline static int ethSetsockopt(int sock, int level, int optname, const void * optval, int optlen); + inline static int ethSetsockoptInt(int sock, int level, int optname, int value = 1); + inline static int ethSetsockoptBool(int sock, int level, int optname, bool value = true); + +}; + +inline bool operator <(const PIEthernet::Interface & v0, const PIEthernet::Interface & v1) {return (v0.name < v1.name);} + +#endif // PIETHERNET_H diff --git a/src/io/pifile.cpp b/src/io/pifile.cpp new file mode 100755 index 00000000..7e9c134b --- /dev/null +++ b/src/io/pifile.cpp @@ -0,0 +1,317 @@ +/* + PIP - Platform Independent Primitives + File + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pifile.h" +#include "pidir.h" +#ifdef WINDOWS +# undef S_IFDIR +# undef S_IFREG +# undef S_IFLNK +# undef S_IFBLK +# undef S_IFCHR +# undef S_IFSOCK +# define S_IFDIR 0x01 +# define S_IFREG 0x02 +# define S_IFLNK 0x04 +# define S_IFBLK 0x08 +# define S_IFCHR 0x10 +# define S_IFSOCK 0x20 +#endif +#define S_IFHDN 0x40 +#ifdef QNX +# define _stat_struct_ struct stat +# define _stat_call_ stat +# define _stat_link_ lstat +#else +# define _stat_struct_ struct stat64 +# define _stat_call_ stat64 +# define _stat_link_ lstat64 +#endif + + +/*! \class PIFile + * \brief Local file + * + * \section PIFile_sec0 Synopsis + * This class provide access to local file. You can manipulate + * binary content or use this class as text stream. To binary + * access there are function \a read(), \a write(), and many + * \a writeBinary() functions. For write variables to file in + * their text representation threr are many "<<" operators. + * + * \section PIFile_sec1 Position + * Each opened file has a read/write position - logical position + * in the file content you read from or you write to. You can + * find out current position with function \a pos(). Function + * \a seek(llong position) move position to position "position", + * \a seekToBegin() move position to the begin of file, + * \a seekToEnd() move position to the end of file. + * + */ + +REGISTER_DEVICE(PIFile); + + +PIString PIFile::FileInfo::name() const { + if (path.isEmpty()) return PIString(); + return path.mid(path.findLast(PIDir::separator) + 1); +} + + +PIString PIFile::FileInfo::baseName() const { + if (path.isEmpty()) return PIString(); + PIString n = name(), e = extension(); + if (e.isEmpty()) return n; + return n.cutRight(e.size_s() + 1); +} + + +PIString PIFile::FileInfo::extension() const { + PIString n = name(); + if (n.isEmpty()) return PIString(); + while (n.startsWith(".")) + n.pop_front(); + if (n.isEmpty()) return PIString(); + int i = n.find("."); + if (i < 0) return PIString(); + return n.mid(i + 1); +} + + +PIString PIFile::FileInfo::dir() const { + if (path.isEmpty()) return PIString(); + PIString ret = path.mid(0, path.findLast(PIDir::separator)); + if (ret.isEmpty()) ret = PIDir::separator; + return ret; +} + + + + +PIFile::PIFile(): PIIODevice() { + setPrecision(5); +} + + +PIFile::PIFile(const PIString & path, PIIODevice::DeviceMode mode): PIIODevice(path, mode) { + setPrecision(5); + if (!path.isEmpty()) + openDevice(); +} + + +bool PIFile::openDevice() { + close(); + PIString p = path(); + if (p.isEmpty()) return false; + //piCout << "fopen " << path_.data() << ": " << strType(mode_).data() << fd; + if ((mode_ & PIIODevice::WriteOnly) == PIIODevice::WriteOnly) { + if (!isExists(p)) { + FILE * fd = fopen(p.data(), "w"); + if (fd != 0) fclose(fd); + } + } + fd = fopen(p.data(), strType(mode_).data()); + opened_ = (fd != 0); +#ifndef WINDOWS + if (opened_) fcntl(fileno(fd), F_SETFL, O_NONBLOCK); +#endif + seekToBegin(); + //piCout << "open file" << fd << opened_; + return opened_; +} + + +bool PIFile::closeDevice() { + //piCout << "close file" << fd << opened_; + if (!opened_ || fd == 0) return true; + bool cs = (fclose(fd) == 0); + if (cs) fd = 0; + //piCout << "closed file" << fd << opened_; + return cs; +} + + +PIString PIFile::readLine() { + PIString str; + if (!opened_) return str; + int cc, cp = 0; + while (!isEnd() && cp < 4095) { + cc = fgetc(fd); + if (char(cc) == '\n' || cc == EOF) break; + str.push_back(char(cc)); + } + //cout << "readline: " << str << endl; + return str; +} + + +llong PIFile::readAll(void * data) { + llong cp = pos(), s = size(), i = -1; + seekToBegin(); + if (s < 0) { + while (!isEnd()) + read(&(((char*)data)[++i]), 1); + } else + read((char * )data, s); + seek(cp); + return s; +} + + +PIByteArray PIFile::readAll(bool forceRead) { + PIByteArray a; + llong cp = pos(); + if (forceRead) { + seekToBegin(); + while (!isEnd()) + a.push_back(readChar()); + seek(cp); + return a; + } + llong s = size(); + if (s < 0) return a; + a.resize(s); + s = readAll(a.data()); + seek(cp); + if (s >= 0) a.resize(s); + return a; +} + + +llong PIFile::size() const { + if (!opened_) return -1; + llong s, cp = pos(); + fseek(fd, 0, SEEK_END); clearerr(fd); + s = pos(); + fseek(fd, cp, SEEK_SET); clearerr(fd); + return s; +} + + +void PIFile::resize(llong new_size, uchar fill_) { + llong ds = new_size - size(); + if (ds == 0) return; + if (ds > 0) { + uchar * buff = new uchar[ds]; + memset(buff, fill_, ds); + write(buff, ds); + delete[] buff; + return; + } + if (new_size == 0) { + clear(); + return; + } + piCoutObj << "Downsize is not supported yet :-("; +} + + + +bool PIFile::isExists(const PIString & path) { + FILE * f = fopen(PIString(path).data(), "r"); + bool ok = (f != 0); + if (ok) fclose(f); + return ok; +} + + +PIString PIFile::constructFullPath() const { + return fullPathPrefix() + "://" + path(); +} + + +void PIFile::configureFromFullPath(const PIString & full_path) { + setPath(full_path); +} + + +PIString PIFile::strType(const PIIODevice::DeviceMode type) { + switch (type) { + case PIIODevice::ReadOnly: return "rb"; + case PIIODevice::ReadWrite: + case PIIODevice::WriteOnly: return "r+b"; + } + return "rb"; +} + + +PIFile::FileInfo PIFile::fileInfo(const PIString & path) { + FileInfo ret; + if (path.isEmpty()) return ret; + ret.path = path; + PIString n = ret.name(); + //piCout << "open" << path; +#ifdef WINDOWS + DWORD attr = GetFileAttributes((LPCTSTR)(path.data())); + if (attr == 0xFFFFFFFF) return ret; + HANDLE hFile = 0; + if ((attr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { + hFile = CreateFile(path.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + } else { + hFile = CreateFile(path.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + } + if (!hFile) return ret; + BY_HANDLE_FILE_INFORMATION fi; + memset(&fi, 0, sizeof(fi)); + if (GetFileInformationByHandle(hFile, &fi) != 0) { + LARGE_INTEGER filesize; + filesize.LowPart = filesize.HighPart = 0; + if (fi.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ret.flags |= FileInfo::Hidden; + if (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ret.flags |= FileInfo::Dir; + else { + ret.flags |= FileInfo::File; + filesize.LowPart = fi.nFileSizeLow; + filesize.HighPart = fi.nFileSizeHigh; + } + PIString ext = ret.extension(); + ret.perm_user = FileInfo::Permissions(true, (attr & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY, ext == "bat" || ext == "exe"); + ret.perm_group = ret.perm_other = ret.perm_user; + ret.size = filesize.QuadPart; + ret.time_access = PIDateTime(fi.ftLastAccessTime); + ret.time_modification = PIDateTime(fi.ftLastWriteTime); + } + CloseHandle(hFile); +#else + _stat_struct_ fs; + memset(&fs, 0, sizeof(fs)); + _stat_call_(path.data(), &fs); + int mode = fs.st_mode; + ret.size = fs.st_size; + ret.id_user = fs.st_uid; + ret.id_group = fs.st_gid; + ret.time_access = PIDateTime::fromSystemTime(PISystemTime(fs.st_atim.tv_sec, fs.st_atim.tv_nsec)); + ret.time_modification = PIDateTime::fromSystemTime(PISystemTime(fs.st_mtim.tv_sec, fs.st_mtim.tv_nsec)); + ret.perm_user = FileInfo::Permissions((mode & S_IRUSR) == S_IRUSR, (mode & S_IWUSR) == S_IWUSR, (mode & S_IXUSR) == S_IXUSR); + ret.perm_group = FileInfo::Permissions((mode & S_IRGRP) == S_IRGRP, (mode & S_IWGRP) == S_IWGRP, (mode & S_IXGRP) == S_IXGRP); + ret.perm_other = FileInfo::Permissions((mode & S_IROTH) == S_IROTH, (mode & S_IWOTH) == S_IWOTH, (mode & S_IXOTH) == S_IXOTH); + memset(&fs, 0, sizeof(fs)); + _stat_link_(path.data(), &fs); + mode &= ~S_IFLNK; + mode |= S_IFLNK & fs.st_mode; + if (n.startsWith(".")) mode |= S_IFHDN; + if ((mode & S_IFDIR) == S_IFDIR) ret.flags |= FileInfo::Dir; + if ((mode & S_IFREG) == S_IFREG) ret.flags |= FileInfo::File; + if ((mode & S_IFLNK) == S_IFLNK) ret.flags |= FileInfo::SymbolicLink; + if ((mode & S_IFHDN) == S_IFHDN) ret.flags |= FileInfo::Hidden; +#endif + if (n == ".") ret.flags = FileInfo::Dir | FileInfo::Dot; + if (n == "..") ret.flags = FileInfo::Dir | FileInfo::DotDot; + return ret; +} diff --git a/src/io/pifile.h b/src/io/pifile.h new file mode 100755 index 00000000..9e1c8565 --- /dev/null +++ b/src/io/pifile.h @@ -0,0 +1,309 @@ +/*! \file pifile.h + * \brief Local file +*/ +/* + PIP - Platform Independent Primitives + File + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIFILE_H +#define PIFILE_H + +#include "piiodevice.h" +#include + +class PIP_EXPORT PIFile: public PIIODevice +{ + PIIODEVICE(PIFile) +public: + + //! Constructs an empty file + PIFile(); + + struct FileInfo { + FileInfo() {size = 0; id_group = id_user = 0;} + + enum Flag { + File = 0x01, + Dir = 0x02, + Dot = 0x04, + DotDot = 0x08, + SymbolicLink = 0x10, + Hidden = 0x20 + }; + typedef PIFlags Flags; + struct Permissions { + Permissions(uchar r = 0): raw(r) {} + Permissions(bool r, bool w, bool e): raw(0) {read = w; write = w; exec = e;} + PIString toString() const {return PIString(read ? "r" : "-") + PIString(write ? "w" : "-") + PIString(exec ? "x" : "-");} + union { + uchar raw; + struct { + uchar read : 1; + uchar write: 1; + uchar exec : 1; + }; + }; + }; + + PIString path; + llong size; + PIDateTime time_access; + PIDateTime time_modification; + Flags flags; + uint id_user; + uint id_group; + Permissions perm_user; + Permissions perm_group; + Permissions perm_other; + + PIString name() const; + PIString baseName() const; + PIString extension() const; + PIString dir() const; + bool isDir() const {return flags[Dir];} + bool isFile() const {return flags[File];} + bool isSymbolicLink() const {return flags[SymbolicLink];} + bool isHidden() const {return flags[Hidden];} + }; + + //! Constructs a file with path "path" nad open mode "type" + PIFile(const PIString & path, DeviceMode mode = ReadWrite); + + ~PIFile() {close();} + + //PIFile & operator =(const PIFile & f) {path_ = f.path_; type_ = f.type_; return *this;} + + + //! Immediate write all buffered data to disk + void flush() {if (opened_) fflush(fd);} + + //! Move read/write position to "position" + void seek(llong position) {if (!opened_) return; fseek(fd, position, SEEK_SET); clearerr(fd);} + + //! Move read/write position to the begin of the file + void seekToBegin() {if (!opened_) return; fseek(fd, 0, SEEK_SET); clearerr(fd);} + + //! Move read/write position to the end of the file + void seekToEnd() {if (!opened_) return; fseek(fd, 0, SEEK_END); clearerr(fd);} + + //! Move read/write position to text line number "line" + void seekToLine(llong line) {if (!opened_) return; seekToBegin(); piForTimes (line) readLine(); clearerr(fd);} // line 0 - begin of file + //void fill(char c) {stream.fill(c);} + + //! Read one char and return it + char readChar() {return (char)fgetc(fd);} + + //! Read one text line and return it + PIString readLine(); + + //! Read all file content to "data" and return readed bytes count. Position leaved unchanged + llong readAll(void * data); + + //! Read all file content to byte array and return it. Position leaved unchanged + PIByteArray readAll(bool forceRead = false); + + + //! Set file path to "path" and reopen file if need + void setPath(const PIString & path) {PIIODevice::setPath(path); if (opened_) openDevice();} + + //! Returns file size + llong size() const; + + //! Returns read/write position + llong pos() const {if (!opened_) return -1; return ftell(fd);} + + //! Returns if position is at the end of file + bool isEnd() const {if (!opened_) return true; return (feof(fd) || ferror(fd));} + + //! Returns if file is empty + bool isEmpty() const {return (size() <= 0);} + + //! Returns FileInfo of current file + FileInfo fileInfo() const {return fileInfo(path());} + + + //! Returns float numbers write precision + int precision() const {return prec_;} + + //! Set float numbers write precision to "prec_" digits + void setPrecision(int prec) {prec_ = prec; if (prec_ >= 0) prec_str = "." + itos(prec_); else prec_str = "";} + + + //! Read from file to "read_to" no more than "max_size" and return readed bytes count + int read(void * read_to, int max_size) {if (!canRead() || fd == 0) return -1; return fread(read_to, 1, max_size, fd);} + + //! Write to file "data" with size "max_size" and return written bytes count + int write(const void * data, int max_size) {if (!canWrite() || fd == 0) return -1; return fwrite(data, 1, max_size, fd);} + + PIFile & writeToBinLog(ushort id, const void * data, int size) {if (!isWriteable() || fd == 0) return *this; writeBinary(id).writeBinary((ushort)size); write(data, size); flush(); return *this;} + + + //! Write to file binary content of "v" + PIFile & writeBinary(const char v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const short v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const int v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const long v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const llong v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const uchar v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const ushort v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const uint v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const ulong v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const ullong v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const float v) {write(&v, sizeof(v)); return *this;} + //! Write to file binary content of "v" + PIFile & writeBinary(const double v) {write(&v, sizeof(v)); return *this;} + + PIFile & operator =(const PIFile & f) {PIIODevice::setPath(f.path()); mode_ = f.mode_; return *this;} + + //! Write to file text representation of "v" + PIFile & operator <<(const char v) {if (canWrite() && fd != 0) write(&v, 1); return *this;} + //PIFile & operator <<(const string & v) {write(v.c_str(), v.size()); return *this;} + //! Write to file string "v" + PIFile & operator <<(const PIString & v) {if (canWrite() && fd != 0) write(v.data(), v.lengthAscii()); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(const PIByteArray & v) {if (canWrite() && fd != 0) write(v.data(), v.size()); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(short v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%hd", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(int v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%d", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(long v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%ld", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(llong v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%lld", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(uchar v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%u", int(v)); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(ushort v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%hu", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(uint v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%u", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(ulong v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%lu", v); return *this;} + //! Write to file text representation of "v" + PIFile & operator <<(ullong v) {if (canWrite() && fd != 0) ret = fprintf(fd, "%llu", v); return *this;} + //! Write to file text representation of "v" with precision \a precision() + PIFile & operator <<(float v) {if (canWrite() && fd != 0) ret = fprintf(fd, ("%" + prec_str + "f").c_str(), v); return *this;} + //! Write to file text representation of "v" with precision \a precision() + PIFile & operator <<(double v) {if (canWrite() && fd != 0) ret = fprintf(fd, ("%" + prec_str + "lf").c_str(), v); return *this;} + + + //! Read from file text representation of "v" + PIFile & operator >>(char & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%hhn", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(short & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%hn", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(int & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%n", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(long & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%ln", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(llong & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%lln", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(uchar & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%hhn", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(ushort & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%hn", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(uint & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%n", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(ulong & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%ln", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(ullong & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%lln", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(float & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%f", &v); return *this;} + //! Read from file text representation of "v" + PIFile & operator >>(double & v) {if (canRead() && fd != 0) ret = fscanf(fd, "%lf", &v); return *this;} + + PIString constructFullPath() const; + + EVENT_HANDLER(void, clear) {close(); fd = fopen(path().data(), "w"); if (fd != 0) fclose(fd); fd = 0; opened_ = false; open();} + EVENT_HANDLER0(void, remove) {close(); std::remove(path().data());} + EVENT_HANDLER1(void, resize, llong, new_size) {resize(new_size, 0);} + EVENT_HANDLER2(void, resize, llong, new_size, uchar, fill); + + + //! Returns not opened temporary file with open mode "mode" + static PIFile openTemporary(PIIODevice::DeviceMode mode = PIIODevice::ReadWrite) {return PIFile(PIString(tmpnam(0)), mode);} + + //! Returns if file with path "path" does exists + static bool isExists(const PIString & path); + + //! Remove file with path "path" and returns if remove was successful + static bool remove(const PIString & path) {return std::remove(path.data()) == 0;} + + //! Rename file with path "from" to path "to" and returns if rename was successful + static bool rename(const PIString & from, const PIString & to) {return ::rename(from.data(), to.data()) == 0;} + + //! Returns FileInfo of file or dir with path "path" + static FileInfo fileInfo(const PIString & path); + +//! \handlers +//! \{ + + //! \fn void clear() + //! \brief Clear content of file + + //! \fn void resize(llong new_size) + //! \brief Resize file to "new_size" with "fill" filling + + //! \fn void resize(llong new_size, uchar fill) + //! \brief Resize file to "new_size" with "fill" filling + + //! \fn void remove() + //! \brief Remove file + +//! \} +//! \ioparams +//! \{ +#ifdef DOXYGEN +#endif +//! \} + +protected: + PIString fullPathPrefix() const {return "file";} + void configureFromFullPath(const PIString & full_path); + bool openDevice(); + bool closeDevice(); + +private: + PIString strType(const PIIODevice::DeviceMode type); + + FILE * fd; + int ret, prec_; + string prec_str; + +}; + +inline PICout operator <<(PICout s, const PIFile::FileInfo & v) { + s.setControl(0, true); + s << "FileInfo(\"" << v.path << "\", " << PIString::readableSize(v.size) << ", " + << v.perm_user.toString() << " " << v.perm_group.toString() << " " << v.perm_other.toString() << ", " + << v.time_access.toString() << ", " << v.time_modification.toString() + << ", 0x" << Hex << v.flags << ")"; + s.restoreControl(); + return s; +} + +#endif // PIFILE_H diff --git a/src/io/pifiletransfer.cpp b/src/io/pifiletransfer.cpp new file mode 100644 index 00000000..7dbd919c --- /dev/null +++ b/src/io/pifiletransfer.cpp @@ -0,0 +1,470 @@ +#include "pifiletransfer.h" + +const char PIFileTransfer::sign[] = {'P', 'F', 'T'}; + +PIFileTransfer::PIFileTransfer(): crc(standardCRC_16()) { + for (uint i = 0; i < sizeof(sign); i++) + header.sig[i] = sign[i]; + header.version = PIFILETRANSFER_VERSION; + header.session_id = 0; + dir = PIDir::current(); + fileinfo_size = sizeof(EntryInfo) + sizeof(PIByteArray) + 100; + min_packet_size = sizeof(PacketHeader) + sizeof(uint) + fileinfo_size; + is_sending = is_receiving = false; + bytes_file_all = bytes_file_cur = bytes_total_all = bytes_total_cur = 0; + timeout_ = 1.; + setPacketSize(4096); + srand(PISystemTime::current().toMilliseconds()); +} + + +PIFileTransfer::~PIFileTransfer() { + break_ = true; + session.clear(); + replies.clear(); +} + + +bool PIFileTransfer::send(const PIString & file) { + return sendFiles(PIVector() << PIFile::fileInfo(file)); +} + + +bool PIFileTransfer::send(PIVector entries) { + PIVector allEntries; + for (int i = 0; i < entries.size_s(); i++) { + allEntries << entries[i]; + if (entries[i].isDir()) + allEntries << PIDir::allEntries(dir.absolutePath() + dir.separator + entries[i].path); + } + return sendFiles(allEntries); +} + + +void PIFileTransfer::stopSend() { + if (!is_sending) return; + break_ = true; +} + + +void PIFileTransfer::stopReceive() { + if (!is_receiving) return; + break_ = true; + finish_receive(false); +} + + +void PIFileTransfer::received(PIByteArray & ba) { + if (ba.size() < sizeof(PacketHeader)) return; + PacketHeader h; + memcpy(&h, ba.data(), sizeof(PacketHeader)); + PacketType pt = (PacketType)h.type; +// piCoutObj << "receive" << h.session_id << h.type << h.id; + switch (pt) { + case pt_Data: + if (h.session_id != header.session_id || !is_receiving) { + sendBreak(h.session_id); + return; + } else { + uint rcrc = *(uint *)(ba.data(ba.size_s() - sizeof(uint))); + uint ccrc = crc.calculate(ba.data(), ba.size_s() - sizeof(uint)); + if (rcrc != ccrc) { + header.id = h.id; + sendReply(Invalid); + } else { + ba >> h; + ba.resize(ba.size_s() - sizeof(uint)); + processData(h.id, ba); + } + } + break; + case pt_Reply: + if (h.session_id != header.session_id) return; + ba >> h; + if (ba.size() == sizeof(int)) { + int rci; + ba >> rci; + ReplyCode rc = (ReplyCode)rci; +// piCoutObj << "reply received" << rci; + if (rc == Break) { + break_ = true; + if (is_receiving) { + stopReceive(); + return; + } + if (is_sending) { + stopSend(); + return; + } + } + if (is_sending) { + if (h.id >= 0 && h.id < replies.size()) + replies[h.id] = rc; + } + if (is_receiving && h.id == 0) { + if (checkSession() == 0) finish_receive(true); + } + } + break; + case pt_SendRequest: + if (is_sending) { + sendBreak(h.session_id); + return; + } + if (header.session_id != h.session_id && is_receiving) { + sendBreak(h.session_id); + return; + } + ba >> h; + if (ba.size() != sizeof(uint) + sizeof(llong)) return; + uint pcts; + ba >> pcts; + bytes_file_all = pcts; + ba >> bytes_total_all; + header.session_id = h.session_id; + header.id = 0; + bool ok = true; + state_string = "receive request"; + receiveRequest(&ok); + if (ok) { + session.clear(); + replies.clear(); + session.resize(pcts); + replies.resize(pcts + 1); + replies.fill(Unknown); + is_receiving = true; + state_string = "receiving"; + replies[0] = Success; + sendReply(Success); + } else { + sendReply(Invalid); + state_string = "wait user permit"; + } + break; + } +} + + +bool PIFileTransfer::sendFiles(PIVector files) { + PIStringList names; + for(int i=0; i 0) { + ba = buildPacket(chk - 1); + sendRequest(ba); + } +// if (chk == -1) return finish_send(false); + if (break_) return finish_send(false); + prev_chk = chk; + piMSleep(1); + } + return finish_send(false);; +} + + +int PIFileTransfer::checkSession() { + int miss = 0; + for (int i = 1; i < replies.size_s(); i++) { + if ((ReplyCode)replies[i] != Success) miss++; + if ((ReplyCode)replies[i] == Invalid) return i; + } + for (int i = 1; i < replies.size_s(); i++) { + if ((ReplyCode)replies[i] == Unknown) return i; + } + if (miss > 0) { + piCoutObj << "missing" << miss << "packets"; + return -miss; + } else return 0; +} + + +void PIFileTransfer::buildSession(PIVector files) { + state_string = "calculating files..."; + session.clear(); + header.session_id = rand(); + bytes_file_cur = 0; + bytes_file_all = files.size(); + bytes_total_all = bytes_total_cur = 0; +// PIMap sizes; +// for (int i=0; i indexes = sizes.values(); + EntryInfo fi; + PIVector lfi; + int cur_size = min_packet_size; + for (int i = 0; i < files.size_s(); i++) { + bytes_file_cur = i; + fi.entry = files[i]; + bytes_total_all += fi.entry.size; +// fi.size = fi.entry.size; + fi.fstart = 0; + fi.part_index = 1; + int rest = fi.entry.size - (max_packet_size - cur_size); +// piCout << i << fi.entry << rest; + if (rest <= 0) { + fi.parts = 1; + fi.fsize = fi.entry.size; + lfi << fi; + cur_size += fi.fsize + fileinfo_size; + } else { + fi.fsize = fi.entry.size - rest; + fi.parts = 1 + 1 + piMaxi(1, rest / (max_packet_size - min_packet_size)); +// piCout << fi.parts; + lfi << fi; + session << lfi; + lfi.clear(); + cur_size = min_packet_size; + llong fs = fi.fsize; + for (uint j = 1; j < fi.parts; j++) { + fi.part_index++; + fi.fstart = fs; + fi.fsize = piMinll(fi.entry.size - fs, max_packet_size - min_packet_size); + lfi << fi; + cur_size += fi.fsize + sizeof(PIByteArray); + if (fi.part_index != fi.parts) { + session << lfi; + lfi.clear(); + cur_size = min_packet_size; + fs += fi.fsize; + } + } + } + if (max_packet_size - cur_size < min_packet_size) { + session << lfi; + lfi.clear(); + cur_size = min_packet_size; + } + } + if (cur_size > min_packet_size) session << lfi; +} + + +void PIFileTransfer::sendBreak(int session_id) { + uint psid = header.session_id; + header.session_id = session_id; + sendReply(Break); + header.session_id = psid; +} + + +void PIFileTransfer::sendReply(PIFileTransfer::ReplyCode reply) { +// if (is_send_result) header.type = pt_SendResult; +// else + header.type = pt_Reply; + PIByteArray ba; + ba << header << (int)reply; + sendRequest(ba); +} + + +bool PIFileTransfer::getSendRequest() { + PITimeMeasurer tm; + header.type = pt_SendRequest; + header.id = 0; + PIByteArray ba; + ba << header; + ba << (uint)session.size() << bytes_total_all; + state_string = "send request"; + for (int i = 0; i < 3; i++) { + tm.reset(); + sendRequest(ba); + while (tm.elapsed_s() < timeout_) { + if (break_) return false; + //piCoutObj << send_replyes[0]; + if (replies[0] == Success) { + state_string = "send permited!"; + return true; + } + if (replies[0] == Invalid) { + state_string = "waiting for permit"; + tm.reset(); + } + piMSleep(10); + } + } + return false; +} + + +void PIFileTransfer::processData(int id, PIByteArray & data) { +// piCoutObj << "received packet" << id << ", size" << data.size(); + if (id < 1 || id > replies.size_s()) return; + if (!session[id - 1].isEmpty()) { + header.id = id; + replies[id] = Success; + sendReply(Success); + if (checkSession() == 0) state_string = "receive ok"; + return; + } + EntryInfo fi; + PIByteArray ba; + while (!data.isEmpty()) { + ba.clear(); + data >> fi; + if (fi.entry.size > 0) data >> ba; + fi.fsize = ba.size(); + bytes_total_cur += fi.fsize; + bytes_file_all = fi.entry.size; + bytes_file_cur = fi.fstart; +// piCoutObj << "recv" << fi; + session[id - 1] << fi; + state_string = "receiving " + fi.entry.path; + PIString path = dir.absolutePath() + dir.separator + fi.entry.path; + if (fi.entry.isDir()) { +// piCoutObj << "make dir" << fi.entry.path; + if (!PIDir::make(path, false)) { + state_string = "ERROR! while create directory " + path; + piCoutObj << state_string; + finish_receive(false); + return; + } + } + if (fi.entry.isFile()) { + if (work_file.path() != path || !work_file.isOpened()) { + work_file.close(); + if (!work_file.open(path, PIIODevice::ReadWrite)) { + state_string = "ERROR! while open file " + path; + piCoutObj << state_string; + finish_receive(false); + return; + } + if (work_file.size() > fi.entry.size) { + piCoutObj << "*** error size" << work_file.size() << fi.entry.size; + work_file.clear(); + work_file.resize(fi.entry.size); + piCoutObj << "*** correct size" << work_file.size() << fi.entry.size; + } + } +// piCoutObj << "write file" << path << work_file.path() << work_file.size() << fi.entry.size << work_file.pos() << fi.fstart << fi.fsize; + if (work_file.size() < fi.fstart) { +// piCoutObj << "error pos size" << work_file.pos() << fi.fstart; + work_file.resize(fi.fstart); +// piCoutObj << "correct pos size" << work_file.pos() << fi.fstart; + } + if (work_file.size() > fi.entry.size) { + piCoutObj << "!!! error size" << work_file.size() << fi.entry.size; + work_file.clear(); + work_file.resize(fi.entry.size); + piCoutObj << "!!! correct size" << work_file.size() << fi.entry.size; + } +// if (fi.fstart != work_file.pos()) piCoutObj << "error pos" << work_file.pos() << fi.fstart; + work_file.seek(fi.fstart); + int rs = work_file.write(ba.data(), ba.size()); + if (rs != fi.fsize) { + state_string = "ERROR! while read file " + fi.entry.path + " (must " + PIString::fromNumber(fi.fsize) + ", but read " + PIString::fromNumber(rs) + ")"; + piCoutObj << state_string; + finish_receive(false); + return; + } + } + } + header.id = id; + replies[id] = Success; + if (checkSession() == 0) state_string = "receive ok"; + sendReply(Success); +} + + +PIByteArray PIFileTransfer::buildPacket(int id) { + PIByteArray ret; + PIByteArray ba; + header.id = id + 1; + header.type = pt_Data; + //piCoutObj << "Packet" << header.id; + //piCoutObj << "session id" << header.session_id; + ret << header; + for (int i = 0; i < session[id].size_s(); i++) { + EntryInfo fi = session[id][i]; +// piCoutObj << "send" << fi; + bytes_total_cur += fi.fsize; + ret << fi; + if (fi.entry.size > 0) { + PIString path = dir.absolutePath() + dir.separator + fi.entry.path; + if (work_file.path() != path || !work_file.isOpened()) { + if (!work_file.open(path, PIIODevice::ReadOnly)) { + break_ = true; + state_string = "ERROR! while open file " + fi.entry.path; + piCoutObj << state_string; + return ret; + } + } + work_file.seek(fi.fstart); + ba.resize(fi.fsize); + int rs = work_file.read(ba.data(), ba.size()); + if (rs != fi.fsize) { + break_ = true; + state_string = "ERROR! while read file " + fi.entry.path + " (must " + PIString::fromNumber(fi.fsize) + ", but read " + PIString::fromNumber(rs) + ")"; + piCoutObj << state_string; + return ret; + } + ret << ba; + } + } + EntryInfo cfile = session[id].back(); + state_string = "sending: " + cfile.entry.path; + bytes_file_all = cfile.entry.size; + bytes_file_cur = cfile.fstart; + uint scrc = crc.calculate(ret); + ret << scrc; + //piCoutObj << "packet" << header.id << "send crc" << scrc; + return ret; +} + + +bool PIFileTransfer::finish_send(bool ok) { + if (ok) state_string = "send done"; + else state_string = "send failed"; +// piCoutObj << state_string << PIString::readableSize(bytes_total_all); + is_sending = false; + work_file.close(); + work_file.setPath(""); + bytes_file_all = bytes_file_cur = 0; + bytes_total_all = bytes_total_cur = 0; + header.id = 0; + if (!ok) sendBreak(header.session_id); + else sendReply(Success); + finishSend(ok); + return ok; +} + + +void PIFileTransfer::finish_receive(bool ok) { + if (ok) state_string = "receive done"; + else state_string = "receive failed"; +// piCoutObj << state_string << PIString::readableSize(bytes_total_all); + is_receiving = false; + work_file.close(); + work_file.setPath(""); + bytes_file_all = bytes_file_cur = 0; + bytes_total_all = bytes_total_cur = 0; + if (!ok) sendBreak(header.session_id); + finishReceive(ok); +} + diff --git a/src/io/pifiletransfer.h b/src/io/pifiletransfer.h new file mode 100644 index 00000000..1e8d1bb8 --- /dev/null +++ b/src/io/pifiletransfer.h @@ -0,0 +1,138 @@ +#ifndef PIFILETRANSFER_H +#define PIFILETRANSFER_H + +#include "pidir.h" +#include "picrc.h" + +#define PIFILETRANSFER_VERSION 1 + +class PIFileTransfer : public PIObject +{ + PIOBJECT(PIFileTransfer) +public: + PIFileTransfer(); + ~PIFileTransfer(); + + enum ReplyCode {Unknown = 0, Success, Invalid, Break}; + enum PacketType {pt_Data = 1, pt_Reply, pt_SendRequest};//, pt_SendResult}; + + + struct PacketHeader { + union { + struct { + char sig[3]; // PFT + uchar version; + }; + uint raw_sig; + }; + int type; // PacketType + uint session_id; + uint id; + bool check_sig() { + if (sig[0] != sign[0] || sig[1] != sign[1] || sig[2] != sign[2] || version != PIFILETRANSFER_VERSION) return false; + return true; + } +// uint crc; + }; + + struct PartHeader { + uint id; + uint total_size; + uint part_start; + uint part_size; + }; + + struct EntryInfo { + EntryInfo() { + fstart = fsize = 0; + parts = part_index = 0; + } + PIFile::FileInfo entry; + llong fstart; + llong fsize; + uint parts; + uint part_index; + }; + + //bool send(const PIFile & file); + bool send(const PIString & file); +// bool send(const PIStringList &files); + bool send(PIFile::FileInfo entry) {return send(PIVector() << entry);} + bool send(PIVector entries); + + void stopSend(); + void stopReceive(); + + bool isSending() const {return is_sending;} + bool isReceiving() const {return is_receiving;} + + void setPacketSize(int size) {max_packet_size = size;} + int packetSize() const {return max_packet_size;} + + void setTimeout(double sec) {timeout_ = sec;} + double timeout() const {return timeout_;} + + void setDirectory(const PIDir &d) {dir = d;} + void setDirectory(const PIString &path) {dir.setDir(path);} + PIDir directory() const {return dir;} + + const PIString & stateString() const {return state_string;} + llong bytesTotalAll() const {return bytes_total_all;} + llong bytesTotalCur() const {return bytes_total_cur;} + llong bytesFileAll() const {return bytes_file_all;} + llong bytesFileCur() const {return bytes_file_cur;} + const PIString * stateString_ptr() const {return &state_string;} + const llong * bytesTotalAll_ptr() const {return &bytes_total_all;} + const llong * bytesTotalCur_ptr() const {return &bytes_total_cur;} + const llong * bytesFileAll_ptr() const {return &bytes_file_all;} + const llong * bytesFileCur_ptr() const {return &bytes_file_cur;} + + EVENT(startReceive) + EVENT1(receiveRequest, bool *, ok) + EVENT1(finishReceive, bool, ok) + EVENT(startSend) + EVENT1(finishSend, bool, ok) + + EVENT1(sendRequest, PIByteArray &, data) + EVENT_HANDLER1(void, received, PIByteArray &, data); + +private: + static const char sign[]; + int max_packet_size, min_packet_size, fileinfo_size; + bool break_, is_sending, is_receiving; + double timeout_; + + PIVector > session; + PIVector replies; + PIString state_string; + llong bytes_total_all, bytes_total_cur, bytes_file_all, bytes_file_cur; + PacketHeader header; + PIDir dir; + PIFile work_file; + CRC_16 crc; + + bool sendFiles(PIVector files); + int checkSession(); + void buildSession(PIVector files); + void sendBreak(int session_id); + void sendReply(ReplyCode reply); + bool getSendRequest(); + void processData(int id, PIByteArray &data); + PIByteArray buildPacket(int id); + bool finish_send(bool ok); + void finish_receive(bool ok); +}; + +inline PIByteArray & operator <<(PIByteArray & s, const PIFileTransfer::PacketHeader & v) {s << v.raw_sig << v.type << v.session_id << v.id; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIFileTransfer::PacketHeader & v) {s >> v.raw_sig >> v.type >> v.session_id >> v.id; return s;} + +inline PIByteArray & operator <<(PIByteArray & s, const PIFileTransfer::PartHeader & v) {s << v.id << v.total_size << v.part_start << v.part_size; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIFileTransfer::PartHeader & v) {s >> v.id >> v.total_size >> v.part_start >> v.part_size; return s;} + +inline PIByteArray & operator <<(PIByteArray & s, const PIFileTransfer::EntryInfo & v) {s << v.entry.path << v.entry.size << v.entry.time_modification << v.entry.time_access << int(v.entry.flags) + << v.entry.id_user << v.entry.id_group << v.fstart; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIFileTransfer::EntryInfo & v) {s >> v.entry.path >> v.entry.size >> v.entry.time_modification >> v.entry.time_access >> (int&)(v.entry.flags) + >> v.entry.id_user >> v.entry.id_group >> v.fstart; return s;} +inline PICout operator <<(PICout s, const PIFileTransfer::EntryInfo & v) {s.setControl(0, true); s << "FileInfo(\"" << v.entry.path << "\", " << PIString::fromNumber(v.entry.flags, 16) << PIString::readableSize(v.entry.size) << " b | " << PIString::readableSize(v.fsize) << " b)"; s.restoreControl(); return s;} + +#endif // PIFILETRANSFER_H diff --git a/src/io/piiodevice.cpp b/src/io/piiodevice.cpp new file mode 100755 index 00000000..51d0571b --- /dev/null +++ b/src/io/piiodevice.cpp @@ -0,0 +1,315 @@ +/* + PIP - Platform Independent Primitives + Abstract input/output device + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piiodevice.h" +#include "piconfig.h" + + +/*! \class PIIODevice + * \brief Base class for input/output classes + * + * \section PIIODevice_sec0 Synopsis + * This class provide open/close logic, threaded read/write and virtual input/output + * functions \a read() and \a write(). You should implement pure virtual + * function \a openDevice() in your subclass. + * + * \section PIIODevice_sec1 Open and close + * PIIODevice have boolean variable indicated open status. Returns of functions + * \a openDevice() and \a closeDevice() change this variable. + * + * \section PIIODevice_sec2 Threaded read + * PIIODevice based on PIThread, so it`s overload \a run() to exec \a read() + * in background thread. If read is successful virtual function \a threadedRead() + * is executed. Default implementation of this function execute external static + * function set by \a setThreadedReadSlot() with data set by \a setThreadedReadData(). + * Extrenal static function should have format \n + * bool func_name(void * Threaded_read_data, uchar * readed_data, int readed_size)\n + * Threaded read starts with function \a startThreadedRead(). + * + * \section PIIODevice_sec3 Threaded write + * PIIODevice aggregate another PIThread to perform a threaded write by function + * \a writeThreaded(). This function add task to internal queue and return + * queue entry ID. You should start write thread by function \a startThreadedWrite. + * On successful write event \a threadedWriteEvent is raised with two arguments - + * task ID and written bytes count. + * + * \section PIIODevice_sec4 Internal buffer + * PIIODevice have internal buffer for threaded read, and \a threadedRead() function + * receive pointer to this buffer in first argument. You can adjust size of this buffer + * by function \a setThreadedReadBufferSize() \n + * Default size of this buffer is 4096 bytes. + * + * \section PIIODevice_sec5 Reopen + * When threaded read is begin its call \a open() if device is closed. While threaded + * read running PIIODevice check if device opened every read and if not call \a open() + * every reopen timeout if reopen enabled. Reopen timeout is set by \a setReopenTimeout(), + * reopen enable is set by \a setReopenEnabled(). + * + * \section PIIODevice_sec6 Configuration + * This is virtual function \a configureDevice() which executes when \a configure() + * executes. This function takes two arguments: "e_main" and "e_parent" as void*. There + * are pointers to PIConfig::Entry entries of section "section" and their parent. If + * there is no parent "e_parent" = 0. Function \a configure() set three parameters of + * device: "reopenEnabled", "reopenTimeout" and "threadedReadBufferSize", then execute + * function \a configureDevice(). + * \n Each ancestor of %PIIODevice reimlements \a configureDevice() function to be able + * to be confured from configuration file. This parameters described at section + * "Configurable parameters" in the class reference. \n Usage example: + * \snippet piiodevice.cpp configure + * Implementation example: + * \snippet piiodevice.cpp configureDevice + * + * \section PIIODevice_sec7 Creating devices by unambiguous string + * There are some virtual functions to describe child class without its declaration. + * \n \a fullPathPrefix() should returns unique prefix of device + * \n \a constructFullPath() should returns full unambiguous string, contains prefix and all device parameters + * \n \a configureFromFullPath() provide configuring device from full unambiguous string without prefix and "://" + * \n Macro PIIODEVICE should be used instead of PIOBJECT + * \n Macro REGISTER_DEVICE should be used after definition of class, i.e. at the last line of *.cpp file + * \n \n If custom I/O device corresponds there rules, it can be returned by function \a createFromFullPath(). + * \n Each PIP I/O device has custom unambiguous string description: + * * PIFile: "file://" + * * PIBinaryLog: "binlog://[:][:]" + * * PISerial: "ser://:[:][:][:]" + * * PIEthernet: UDP "eth://UDP::::[:)>]" + * * PIEthernet: TCP "eth://TCP::" + * * PIUSB: "usb://:[:][:][:]" + * \n \n Examples: + * * PIFile: "file://../text.txt" + * * PIBinaryLog: "binlog://../logs/:mylog_:1" + * * PISerial: "ser:///dev/ttyUSB0:9600:8:N:1", equivalent "ser:///dev/ttyUSB0:9600" + * * PIEthernet: "eth://TCP:127.0.0.1:16666", "eth://UDP:192.168.0.5:16666:192.168.0.6:16667:mcast:234.0.2.1:mcast:234.0.2.2" + * * PIUSB: "usb://0bb4:0c86:1:1:2" + * \n \n + * So, custom I/O device can be created with next call: + * \code{cpp} + * // creatring devices + * PISerial * ser = (PISerial * )PIIODevice::createFromFullPath("ser://COM1:115200"); + * PIEthernet * eth = (PIEthernet * )PIIODevice::createFromFullPath("eth://UDP:127.0.0.1:4001:127.0.0.1:4002"); + * // examine devices + * piCout << ser << ser->properties(); + * piCout << eth << eth->properties(); + * \endcode + * + * \section PIIODevice_ex0 Example + * \snippet piiodevice.cpp 0 + */ + + +PIIODevice::PIIODevice(): PIThread() { + mode_ = ReadOnly; + _init(); + setPath(PIString()); +} + + +/*! \brief Constructs a PIIODevice with path and mode + * \param path path to device + * \param type mode for open */ +PIIODevice::PIIODevice(const PIString & path, PIIODevice::DeviceMode mode): PIThread() { + mode_ = mode; + _init(); + setPath(path); +} + + +PIIODevice::~PIIODevice() { + stop(); + if (opened_) { + closeDevice(); + if (!opened_) + closed(); + } +} + + +void PIIODevice::_init() { + opened_ = init_ = thread_started_ = false; + raise_threaded_read_ = true; + ret_func_ = 0; + ret_data_ = 0; + tri = 0; + setReopenEnabled(true); + setReopenTimeout(1000); + setThreadedReadBufferSize(4096); + timer.setName("__S__reopen_timer"); + write_thread.setName("__S__write_thread"); + CONNECT2(void, void * , int, &timer, tickEvent, this, check_start); + CONNECT(void, &write_thread, started, this, write_func); +} + + +void PIIODevice::check_start(void * data, int delim) { + //cout << "check " << tread_started_ << endl; + if (open()) { + thread_started_ = true; + timer.stop(); + } +} + + +void PIIODevice::write_func() { + while (!write_thread.isStopping()) { + while (!write_queue.isEmpty()) { + if (write_thread.isStopping()) return; + write_thread.lock(); + PIPair item(write_queue.dequeue()); + write_thread.unlock(); + int ret = write(item.first); + threadedWriteEvent(item.second, ret); + } + msleep(1); + } +} + + +void PIIODevice::terminate() { + thread_started_ = false; + if (!isInitialized()) return; + if (isRunning()) { + stop(); + PIThread::terminate(); + } +} + + +void PIIODevice::begin() { + //cout << " begin\n"; + thread_started_ = false; + if (!opened_) { + if (open()) { + thread_started_ = true; + //cout << " open && ok\n"; + return; + } + } else { + thread_started_ = true; + //cout << " ok\n"; + return; + } + //init(); + if (!timer.isRunning() && isReopenEnabled()) timer.start(reopenTimeout()); +} + + +void PIIODevice::run() { + if (!isReadable()) { + //cout << "not readable\n"; + PIThread::stop(); + return; + } + if (!thread_started_) { + msleep(5); + //cout << "not started\n"; + return; + } + readed_ = read(buffer_tr.data(), buffer_tr.size_s()); + if (readed_ <= 0) { + msleep(10); + //cout << readed_ << ", " << errno << ", " << errorString() << endl; + return; + } + //piCoutObj << "readed" << readed_;// << ", " << errno << ", " << errorString(); + threadedRead(buffer_tr.data(), readed_); + if (raise_threaded_read_) threadedReadEvent(buffer_tr.data(), readed_); +} + + +PIByteArray PIIODevice::readForTime(double timeout_ms) { + PIByteArray str; + if (timeout_ms <= 0.) return str; + int ret; + uchar * td = new uchar[threadedReadBufferSize()]; + tm.reset(); + while (tm.elapsed_m() < timeout_ms) { + ret = read(td, threadedReadBufferSize()); + if (ret <= 0) msleep(1); + else str.append(td, ret); + } + delete td; + return str; +} + + +ullong PIIODevice::writeThreaded(const PIByteArray & data) { + write_thread.lock(); + write_queue.enqueue(PIPair(data, tri)); + ++tri; + write_thread.unlock(); + return tri - 1; +} + + +bool PIIODevice::configure(const PIString & config_file, const PIString & section, bool parent_section) { + PIConfig conf(config_file, PIIODevice::ReadOnly); + if (!conf.isOpened()) return false; + bool ex = true; + PIConfig::Entry em; + if (section.isEmpty()) em = conf.rootEntry(); + else em = conf.getValue(section, PIString(), &ex); + if (!ex) return false; + PIConfig::Entry * ep = 0; + if (parent_section) ep = em.parent(); + if (ep != 0) { + setReopenEnabled(ep->getValue("reopenEnabled", isReopenEnabled(), &ex)); + if (!ex) setReopenEnabled(em.getValue("reopenEnabled", isReopenEnabled())); + setReopenTimeout(ep->getValue("reopenTimeout", reopenTimeout(), &ex)); + if (!ex) setReopenTimeout(em.getValue("reopenTimeout", reopenTimeout())); + setThreadedReadBufferSize(ep->getValue("threadedReadBufferSize", int(buffer_tr.size_s()), &ex)); + if (!ex) setThreadedReadBufferSize(em.getValue("threadedReadBufferSize", int(buffer_tr.size_s()))); + } else { + setReopenEnabled(em.getValue("reopenEnabled", isReopenEnabled())); + setReopenTimeout(em.getValue("reopenTimeout", reopenTimeout())); + setThreadedReadBufferSize(em.getValue("threadedReadBufferSize", int(buffer_tr.size_s()))); + } + return configureDevice(&em, ep); +} + + +PIIODevice * PIIODevice::createFromFullPath(const PIString & full_path) { + PIString prefix = full_path.left(full_path.find(":")); + if (prefix.isEmpty()) return 0; + PIVector rd(PICollection::groupElements("__PIIODevices__")); + piForeachC (PIObject * d, rd) { + if (prefix == ((const PIIODevice * )d)->fullPathPrefix()) { + PIIODevice * nd = ((const PIIODevice * )d)->copy(); + if (nd) nd->configureFromFullPath(full_path.mid(prefix.length() + 3)); + return nd; + } + } + return 0; +} + + +PIString PIIODevice::normalizeFullPath(const PIString & full_path) { + static PIMutex nfp_mutex; + static PIMap nfp_cache; + PIMutexLocker nfp_ml(nfp_mutex); + PIString ret = nfp_cache.value(full_path); + if (!ret.isEmpty()) + return ret; + //piCout << "normalizeFullPath" << full_path; + PIIODevice * d = createFromFullPath(full_path); + //piCout << "normalizeFullPath" << d; + if (d == 0) return PIString(); + ret = d->constructFullPath(); + delete d; + nfp_cache[full_path] = ret; + return ret; +} diff --git a/src/io/piiodevice.h b/src/io/piiodevice.h new file mode 100755 index 00000000..985ebb42 --- /dev/null +++ b/src/io/piiodevice.h @@ -0,0 +1,333 @@ +/*! \file piiodevice.h + * \brief Abstract input/output device +*/ +/* + PIP - Platform Independent Primitives + Abstract input/output device + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIIODEVICE_H +#define PIIODEVICE_H + +#include "piinit.h" +#include "picollection.h" +#include "pivariant.h" +#include "pitimer.h" + +// function executed from threaded read, pass ThreadedReadData, readedData, sizeOfData +typedef bool (*ReadRetFunc)(void * , uchar * , int ); + +#ifdef DOXYGEN + +//! \relatesalso PIIODevice \brief Use this macro to enable automatic creation instances of your class with \a createFromFullPath() function +# define REGISTER_DEVICE(class) + +//! \relatesalso PIIODevice \brief Use this macro instead of PIOBJECT when describe your own PIIODevice +# define PIIODEVICE(class) + +#else + +# define REGISTER_DEVICE(class) ADD_NEW_TO_COLLECTION_WITH_NAME(__PIIODevices__, class, __S__collection_##class##__) +# define PIIODEVICE(class) PIOBJECT_SUBCLASS(class, PIIODevice) PIIODevice * copy() const {return new class();} + +#endif + +class PIP_EXPORT PIIODevice: public PIThread +{ + PIOBJECT_SUBCLASS(PIIODevice, PIThread) +public: + + //! Constructs a empty PIIODevice + PIIODevice(); + + //! \brief Open modes for PIIODevice + enum DeviceMode { + ReadOnly /*! Device can only read */ = 0x01, + WriteOnly /*! Device can only write */ = 0x02, + ReadWrite /*! Device can both read and write */ = 0x03 + }; + + PIIODevice(const PIString & path, DeviceMode mode = ReadWrite); + virtual ~PIIODevice(); + + //! Current open mode of device + DeviceMode mode() const {return mode_;} + + //! Current path of device + PIString path() const {return property("path").toString();} + + //! Set path of device + void setPath(const PIString & path) {setProperty("path", path);} + + //! Return \b true if mode is ReadOnly or ReadWrite + bool isReadable() const {return (mode_ & ReadOnly);} + + //! Return \b true if mode is WriteOnly or ReadWrite + bool isWriteable() const {return (mode_ & WriteOnly);} + + bool isInitialized() const {return init_;} + + //! Return \b true if device is successfully opened + bool isOpened() const {return opened_;} + + //! Return \b true if device is closed + bool isClosed() const {return !opened_;} + + //! Return \b true if device can read \b now + virtual bool canRead() const {return opened_ && (mode_ & ReadOnly);} + + //! Return \b true if device can write \b now + virtual bool canWrite() const {return opened_ && (mode_ & WriteOnly);} + + + //! Set execution of \a open enabled while threaded read on closed device + void setReopenEnabled(bool yes = true) {setProperty("reopenEnabled", yes);} + + //! Set timeout in milliseconds between \a open tryings if reopen is enabled + void setReopenTimeout(int msecs) {setProperty("reopenTimeout", msecs);} + + + //! Return reopen enable + bool isReopenEnabled() const {return property("reopenEnabled").toBool();} + + //! Return reopen timeout + int reopenTimeout() {return property("reopenTimeout").toInt();} + + + /** \brief Set "threaded read slot" + * \details Set external static function of threaded read that will be executed + * at every successful threaded read. Function should have format + * "bool func(void * data, uchar * readed, int size)" */ + void setThreadedReadSlot(ReadRetFunc func) {ret_func_ = func;} + + //! Set custom data that will be passed to "threaded read slot" + void setThreadedReadData(void * d) {ret_data_ = d;} + + /** \brief Set size of threaded read buffer + * \details Default size is 4096 bytes. If your device can read at single read + * more than 4096 bytes you should use this function to adjust buffer size */ + void setThreadedReadBufferSize(int new_size) {buffer_tr.resize(new_size);} + + //! Return size of threaded read buffer + int threadedReadBufferSize() const {return buffer_tr.size_s();} + + //! Return content of threaded read buffer + const uchar * threadedReadBuffer() const {return buffer_tr.data();} + + //! Return custom data that will be passed to "threaded read slot" + void * threadedReadData() const {return ret_data_;} + + + //! Return \b true if threaded read is started + bool isThreadedRead() const {return isRunning();} + + //! Start threaded read + void startThreadedRead() {if (!isRunning()) PIThread::start();} + + //! Start threaded read and assign "threaded read slot" to "func" + void startThreadedRead(ReadRetFunc func) {ret_func_ = func; if (!isRunning()) PIThread::start();} + + //! Stop threaded read + void stopThreadedRead() {PIThread::terminate();} + + + //! Return \b true if threaded write is started + bool isThreadedWrite() const {return write_thread.isRunning();} + + //! Start threaded write + void startThreadedWrite() {if (!write_thread.isRunning()) write_thread.startOnce();} + + //! Stop threaded write + void stopThreadedWrite() {write_thread.terminate();} + + //! Clear threaded write task queue + void clearThreadedWriteQueue() {write_thread.lock(); write_queue.clear(); write_thread.unlock();} + + + //! Start both threaded read and threaded write + void start() {startThreadedRead(); startThreadedWrite();} + + //! Stop both threaded read and threaded write and if "wait" block until both threads are stop + void stop(bool wait = false) {stopThreadedRead(); stopThreadedWrite(); if (wait) while (write_thread.isRunning() || isRunning()) msleep(1);} + + + //! Reimplement this function to read from your device + virtual int read(void * read_to, int max_size) {piCoutObj << "\"read\" is not implemented!"; return -2;} + + //! Reimplement this function to write to your device + virtual int write(const void * data, int max_size) {piCoutObj << "\"write\" is not implemented!"; return -2;} + + + //! Read from device maximum "max_size" bytes and return them as PIByteArray + PIByteArray read(int max_size) {buffer_in.resize(max_size); int ret = read(buffer_in.data(), max_size); if (ret < 0) return PIByteArray(); return buffer_in.resized(ret);} + + //! Read from device for "timeout_ms" milliseconds and return readed data as PIByteArray. Timeout should to be greater than 0 + PIByteArray readForTime(double timeout_ms); + + //! Write "data" to device + int write(const PIByteArray & data) {return write(data.data(), data.size_s());} + + + //! Add task to threaded write queue and return task ID + ullong writeThreaded(const void * data, int max_size) {return writeThreaded(PIByteArray(data, uint(max_size)));} + + //! Add task to threaded write queue and return task ID + ullong writeThreaded(const PIByteArray & data); + + + //! Configure device from section "section" of file "config_file", if "parent_section" parent section also will be read + bool configure(const PIString & config_file, const PIString & section, bool parent_section = false); + + + //! Reimplement to construct full unambiguous string prefix. \ref PIIODevice_sec7 + virtual PIString fullPathPrefix() const {return PIString();} + + //! Reimplement to construct full unambiguous string, describes this device, default returns \a fullPathPrefix() + "://" + \a path() + virtual PIString constructFullPath() const {return fullPathPrefix() + "://" + path();} + + //! \brief Try to determine suitable device, create new one, configure it with \a configureFromFullPath() and returns it. + //! \details To function \a configureFromFullPath() "full_path" passed without \a fullPathPrefix() + "://". + //! See \ref PIIODevice_sec7 + static PIIODevice * createFromFullPath(const PIString & full_path); + + static PIString normalizeFullPath(const PIString & full_path); + + + EVENT_HANDLER(bool, open) {if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} + EVENT_HANDLER1(bool, open, const PIString &, _path) {setPath(_path); if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} + EVENT_HANDLER1(bool, open, const DeviceMode &, _mode) {mode_ = _mode; if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} + EVENT_HANDLER2(bool, open, const PIString &, _path, const DeviceMode &, _mode) {setPath(_path); mode_ = _mode; if (!init_) init(); opened_ = openDevice(); if (opened_) opened(); return opened_;} + EVENT_HANDLER(bool, close) {opened_ = !closeDevice(); if (!opened_) closed(); return !opened_;} + EVENT_HANDLER(bool, initialize) {init_ = init(); return init_;} + + EVENT_VHANDLER(void, flush) {;} + + EVENT(opened) + EVENT(closed) + EVENT2(threadedReadEvent, uchar * , readed, int, size) + EVENT2(threadedWriteEvent, ullong, id, int, written_size) + +//! \handlers +//! \{ + + //! \fn bool open() + //! \brief Open device + + //! \fn bool open(const PIString & path) + //! \brief Open device with path "path" + + //! \fn bool open(const DeviceMode & mode) + //! \brief Open device with mode "mode" + + //! \fn bool open(const PIString & path, const DeviceMode & mode) + //! \brief Open device with path "path" and mode "mode" + + //! \fn bool close() + //! \brief Close device + + //! \fn bool initialize() + //! \brief Initialize device + +//! \} +//! \vhandlers +//! \{ + + //! \fn void flush() + //! \brief Immediate write all buffers + +//! \} +//! \events +//! \{ + + //! \fn void opened() + //! \brief Raise if succesfull open + + //! \fn void closed() + //! \brief Raise if succesfull close + + //! \fn void threadedReadEvent(uchar * readed, int size) + //! \brief Raise if read thread succesfull read some data + + //! \fn void threadedWriteEvent(ullong id, int written_size) + //! \brief Raise if write thread succesfull write some data of task with ID "id" + +//! \} +//! \ioparams +//! \{ +#ifdef DOXYGEN + //! \brief setReopenEnabled, default "true" + bool reopenEnabled; + + //! \brief setReopenTimeout in ms, default 1000 + int reopenTimeout; + + //! \brief setThreadedReadBufferSize in bytes, default 4096 + int threadedReadBufferSize; +#endif +//! \} + +protected: + + //! Function executed before first \a openDevice() or from constructor + virtual bool init() {return true;} + + //! Reimplement to configure device from entries "e_main" and "e_parent", cast arguments to \a PIConfig::Entry* + virtual bool configureDevice(const void * e_main, const void * e_parent = 0) {return true;} + + //! Reimplement to open device, return value will be set to "opened_" variable + virtual bool openDevice() = 0; // use path_, type_, opened_, init_ variables + + //! Reimplement to close device, inverse return value will be set to "opened_" variable + virtual bool closeDevice() {return true;} // use path_, type_, opened_, init_ variables + + //! Function executed when thread read some data, default implementation execute external slot "ret_func_" + virtual bool threadedRead(uchar * readed, int size) {if (ret_func_ != 0) return ret_func_(ret_data_, readed, size); return true;} + + + //! Reimplement to configure your device with parameters of full unambiguous string. Default implementation does nothing + virtual void configureFromFullPath(const PIString & full_path) {;} + + + void terminate(); + + + DeviceMode mode_; + ReadRetFunc ret_func_; + bool init_, opened_, thread_started_, raise_threaded_read_; + void * ret_data_; + +private: + EVENT_HANDLER2(void, check_start, void * , data, int, delim); + EVENT_HANDLER(void, write_func); + + virtual PIIODevice * copy() const {return 0;} + void _init(); + void begin(); + void run(); + void end() {terminate();} + + PITimer timer; + PITimeMeasurer tm; + PIThread write_thread; + PIByteArray buffer_in, buffer_tr; + PIQueue > write_queue; + ullong tri; + int readed_; + +}; + +#endif // PIIODEVICE_H diff --git a/src/io/piiostring.cpp b/src/io/piiostring.cpp new file mode 100644 index 00000000..00dd5f8e --- /dev/null +++ b/src/io/piiostring.cpp @@ -0,0 +1,106 @@ +/* + PIP - Platform Independent Primitives + PIIODevice wrapper around PIString + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piiostring.h" + + +/*! \class PIIOString + * \brief PIIODevice wrapper around PIString + * + * \section PIIOString_sec0 Synopsis + * This class sllow you to use PIString as PIIODevice and pass it to, e.g. PIConfig + */ + +//REGISTER_DEVICE(PIIOString); + + +PIIOString::PIIOString(PIString * string, PIIODevice::DeviceMode mode_) { + open(string, mode_); +} + + +PIIOString::PIIOString(const PIString & string) { + open(string); +} + + +PIIOString::~PIIOString() { +} + + +bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode_) { + str = string; + return PIIODevice::open(mode_); +} + + +bool PIIOString::open(const PIString & string) { + str = const_cast(&string); + return PIIODevice::open(PIIODevice::ReadOnly); +} + + +PIString PIIOString::readLine() { + if (!canRead() || !str) return PIString(); + int np = pos; + while (++np < str->size_s()) + if ((*str)[np] == '\n') + break; + PIString ret = str->mid(pos, np - pos); + pos = piMini(np + 1, str->size_s()); + return ret; +} + + +int PIIOString::read(void * read_to, int max_size) { + if (!canRead() || !str) return -1; + PIString rs = str->mid(pos, max_size); + pos += max_size; + if (pos > str->size_s()) pos = str->size_s(); + int ret = rs.lengthAscii(); + memcpy(read_to, rs.data(), rs.lengthAscii()); + return ret; +} + + +int PIIOString::write(const void * data, int max_size) { + if (!canWrite() || !str) return -1; + //piCout << "write" << data; + if (pos > str->size_s()) pos = str->size_s(); + PIString rs = PIString((const char *)data); + if (rs.size_s() > max_size) rs.resize(max_size); + str->insert(pos, rs); + pos += rs.size_s(); + return rs.lengthAscii(); +} + + +int PIIOString::writeString(const PIString & string) { + if (!canWrite() || !str) return -1; + if (pos > str->size_s()) pos = str->size_s(); + str->insert(pos, string); + pos += string.size_s(); + return string.lengthAscii(); +} + + +bool PIIOString::openDevice() { + pos = 0; + return (str != 0); +} diff --git a/src/io/piiostring.h b/src/io/piiostring.h new file mode 100644 index 00000000..845a5af8 --- /dev/null +++ b/src/io/piiostring.h @@ -0,0 +1,86 @@ +/*! \file piiostring.h + * \brief PIIODevice wrapper around PIString +*/ +/* + PIP - Platform Independent Primitives + PIIODevice wrapper around PIString + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIIOSTRING_H +#define PIIOSTRING_H + +#include "piiodevice.h" + + +class PIP_EXPORT PIIOString: public PIIODevice +{ + PIIODEVICE(PIIOString) +public: + + //! Contructs %PIIOString with \"string\" content and \"mode\" open mode + PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + //! Contructs %PIIOString with \"string\" content only for read + PIIOString(const PIString & string); + + ~PIIOString(); + + + //! Returns content + PIString * string() const {return str;} + + //! Clear content string + void clear() {if (str) str->clear(); pos = 0;} + + //! Open \"string\" content with \"mode\" open mode + bool open(PIString * string, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); + + //! Open \"string\" content only for read + bool open(const PIString & string); + + //! Returns if position is at the end of content + bool isEnd() const {if (!str) return true; return pos >= str->size_s();} + + + //! Move read/write position to \"position\" + void seek(llong position) {pos = position;} + + //! Move read/write position to the begin of the string + void seekToBegin() {if (str) pos = 0;} + + //! Move read/write position to the end of the string + void seekToEnd() {if (str) pos = str->size_s();} + + + //! Read one text line and return it + PIString readLine(); + + int read(void * read_to, int max_size); + int write(const void * data, int max_size); + + //! Insert string \"string\" into content at current position + int writeString(const PIString & string); + +protected: + bool openDevice(); + + ssize_t pos; + PIString * str; + +}; + +#endif // PIIOSTRING_H diff --git a/src/io/pimultiprotocol.cpp b/src/io/pimultiprotocol.cpp new file mode 100755 index 00000000..422263cf --- /dev/null +++ b/src/io/pimultiprotocol.cpp @@ -0,0 +1,21 @@ +/* + PIP - Platform Independent Primitives + Multiprotocol + Copyright (C) 2012 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pimultiprotocol.h" + diff --git a/src/io/pimultiprotocol.h b/src/io/pimultiprotocol.h new file mode 100755 index 00000000..d7bc65d8 --- /dev/null +++ b/src/io/pimultiprotocol.h @@ -0,0 +1,93 @@ +/* + PIP - Platform Independent Primitives + Multiprotocol + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMULTIPROTOCOL_H +#define PIMULTIPROTOCOL_H + +#include "piprotocol.h" + +class PIMultiProtocol: public PIMultiProtocolBase +{ +public: + PIMultiProtocol() {;} + virtual ~PIMultiProtocol() {clear();} + + void addProtocol(PIProtocol & prot) {prots.push_back(&prot); prot.setMultiProtocolOwner(this); prot.new_mp_prot = false;} + void addProtocol(PIProtocol * prot) {prots.push_back(prot); prot->setMultiProtocolOwner(this); prot->new_mp_prot = false;} + void addProtocol(const PIString & config, const PIString & name, void * recHeaderPtr = 0, int recHeaderSize = 0, + void * recDataPtr = 0, int recDataSize = 0, void * sendDataPtr = 0, int sendDataSize = 0) {; + prots.push_back(new PIProtocol(config, name, recHeaderPtr, recHeaderSize, recDataPtr, recDataSize, sendDataPtr, sendDataSize)); + prots.back()->setMultiProtocolOwner(this); + prots.back()->new_mp_prot = true; + } + PIProtocol * protocol(const PIString & name) {piForeach (PIProtocol * i, prots) if (i->name() == name) return i; return 0;} + PIProtocol * protocol(const int index) {return prots[index];} + PIProtocol * operator [](const int index) {return prots[index];} + + void startSend() {piForeach (PIProtocol * i, prots) i->startSend();} + void startReceive() {piForeach (PIProtocol * i, prots) i->startReceive();} + void start() {piForeach (PIProtocol * i, prots) i->start();} + + void stopSend() {piForeach (PIProtocol * i, prots) i->stopSend();} + void stopReceive() {piForeach (PIProtocol * i, prots) i->stopReceive();} + void stop() {piForeach (PIProtocol * i, prots) i->stop();} + + PIProtocol::Quality worseQuality() const {PIProtocol::Quality cq = PIProtocol::Good; piForeachC (PIProtocol * i, prots) if (cq > i->quality()) cq = i->quality(); return cq;} + PIProtocol::Quality bestQuality() const {PIProtocol::Quality cq = PIProtocol::Unknown; piForeachC (PIProtocol * i, prots) if (cq < i->quality()) cq = i->quality(); return cq;} + + int count() const {return prots.size_s();} + void clear() {stop(); piForeach (PIProtocol * i, prots) if (i->new_mp_prot) delete i; prots.clear();} + +private: + PIVector prots; + +}; + +class PIRepeater: public PIMultiProtocol { +public: + PIRepeater(const PIString & config, const PIString & name_) { + PIConfig conf(config, PIIODevice::ReadOnly); + if (!conf.isOpened()) { + piCoutObj << "[PIRepeater \"" << name_ << "\"] Can`t open \"" << config << "\"!"; + return; + } + PIConfig::Entry & b(conf.getValue(name_)); + if (b.childCount() != 2) { + piCoutObj << "[PIRepeater \"" << name_ << "\"] \"" << config << "\" should consist 2 nodes!"; + return; + } + addProtocol(config, b.child(0)->fullName()); + addProtocol(config, b.child(1)->fullName()); + start(); + } + + PIString firstChannelName() {if (count() == 2) return protocol(0)->receiverDeviceName() + " -> " + protocol(1)->senderDeviceName(); return "Config error";} + PIString secondChannelName() {if (count() == 2) return protocol(1)->receiverDeviceName() + " -> " + protocol(0)->senderDeviceName(); return "Config error";} + + ullong receiveCount() {if (count() == 2) return protocol(0)->receiveCount(); return 0;} + const ullong * receiveCount_ptr() {if (count() == 2) return protocol(0)->receiveCount_ptr(); return 0;} + ullong sendCount() {if (count() == 2) return protocol(0)->sendCount(); return 0;} + const ullong * sendCount_ptr() {if (count() == 2) return protocol(0)->sendCount_ptr(); return 0;} + +private: + void received(PIProtocol * prot, bool , uchar * data, int size) {if (prot == protocol(0)) protocol(1)->send(data, size); else protocol(0)->send(data, size);} + +}; + +#endif // PIMULTIPROTOCOL_H diff --git a/src/io/pipacketextractor.cpp b/src/io/pipacketextractor.cpp new file mode 100755 index 00000000..64d7d083 --- /dev/null +++ b/src/io/pipacketextractor.cpp @@ -0,0 +1,301 @@ +/* + PIP - Platform Independent Primitives + Packets extractor + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pipacketextractor.h" + + +/** \class PIPacketExtractor + * \brief Packets extractor + * \details + * \section PIPacketExtractor_main Synopsis + * This class implements packet recognition by various algorithms and custom + * validating from data stream. Stream is formed from child %PIIODevice + * passed from contructor or with function \a setDevice(). + * + * \section PIPacketExtractor_work Principle of work + * %PIPacketExtractor works with child %PIIODevice. \a read and \a write + * functions directly call child device functions. You should start threaded + * read of \b extractor (not child device) to proper work. Extractor read data + * from child device, try to detect packet from readed data and raise + * \a packetReceived() event on success. + * + * \section PIPacketExtractor_algorithms Algorithms + * There are 6 algorithms: \n + * * PIPacketExtractor::None \n + * Packet is successfully received on every read without any validation. \n \n + * * PIPacketExtractor::Header \n + * Wait for at least \a header() bytes + \a payloadSize(), then validate + * header with virtual function \a validateHeader() and if it fail, shifts + * for next 1 byte. If header is successfully validated check payload with + * function \a validatePayload() and if it fail, shifts for next 1 byte. If + * all validations were successful raise \a packetReceived() event. \n \n + * * PIPacketExtractor::Footer \n + * This algorithm similar to previous, but instead of \a header() first validate + * \a footer() at after \a payloadSize() bytes with function \a validateFooter(). \n \n + * * PIPacketExtractor::HeaderAndFooter \n + * Wait for at least \a header() bytes + \a footer() bytes, then validate + * header with virtual function \a validateHeader() and if it fail, shifts + * for next 1 byte. If header is successfully validated check footer with + * function \a validateFooter() and if it fail, shifts footer position for + * next 1 byte. Then validate payload and if it fail, search header again, + * starts from next byte of previous header. If all validations were successful + * raise \a packetReceived() event. \n \n + * * PIPacketExtractor::Size \n + * Wait for at least \a packetSize() bytes, then validate packet with function + * \a validatePayload() and if it fail, shifts for next 1 byte. If validating + * was successfull raise \a packetReceived() event. \n \n + * * PIPacketExtractor::Timeout \n + * Wait for first read, then read for \a timeout() milliseconds and raise + * \a packetReceived() event. \n + * + * \section PIPacketExtractor_control Control validating + * There are three parameters: + * * header content + * * header size + * * payload size + * + * Extractor can detect packet with compare your header with readed data. + * It is default implementation of function \a packetHeaderValidate(). + * If header validating passed, function \a packetValidate() will be called. + * If either of this function return \b false extractor shifts by one byte + * and takes next header. If both functions returns \b true extractor shifts + * by whole packet size. + * \image html packet_detection.png + * + * */ + +REGISTER_DEVICE(PIPacketExtractor); + + +PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::SplitMode mode) { + init_(); + setDevice(device_); + setSplitMode(mode); +} + + +void PIPacketExtractor::init_() { + ret_func_header = ret_func_footer = 0; + setPayloadSize(0); + setTimeout(100); + setThreadedReadBufferSize(65536); + setBufferSize(65536); + setDevice(0); + setPacketSize(0); + setSplitMode(None); + allReaded = addSize = curInd = missed = missed_packets = footerInd = 0; + header_found = false; +} + + +void PIPacketExtractor::propertyChanged(const PIString &) { + packetSize_ = property("packetSize").toInt(); + mode_ = (SplitMode)(property("splitMode").toInt()); + dataSize = property("payloadSize").toInt(); + src_header = property("header").toByteArray(); + src_footer = property("footer").toByteArray(); + packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize(); +} + + +void PIPacketExtractor::setDevice(PIIODevice * device_) { + dev = device_; + if (dev == 0) return; +} + + +void PIPacketExtractor::setPayloadSize(int size) { + setProperty("payloadSize", size); + dataSize = size; + packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize(); +} + + +void PIPacketExtractor::setHeader(const PIByteArray & data) { + setProperty("header", data); + src_header = data; + packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize(); +} + + +void PIPacketExtractor::setFooter(const PIByteArray & data) { + setProperty("footer", data); + src_footer = data; + packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize(); +} + + +bool PIPacketExtractor::threadedRead(uchar * readed, int size_) { + //piCoutObj << "readed" << size_; + int ss; + switch (mode_) { + case PIPacketExtractor::None: + if (validatePayload(readed, size_)) + packetReceived(readed, size_); + break; + case PIPacketExtractor::Header: + tmpbuf.append(readed, size_); + ss = src_header.size_s() + dataSize; + while (tmpbuf.size_s() >= ss) { + while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) { + tmpbuf.pop_front(); + ++missed; + if (tmpbuf.size_s() < ss) return true; + } + while (!validatePayload(tmpbuf.data(src_header.size_s()), dataSize)) { + tmpbuf.pop_front(); + ++missed; + if (tmpbuf.size_s() < ss) return true; + } + packetReceived(tmpbuf.data(), ss); + tmpbuf.remove(0, ss); + } + break; + case PIPacketExtractor::Footer: + /*memcpy(buffer.data(allReaded), readed, size_); + allReaded += size_; + footer_ = (mode_ == PIPacketExtractor::Footer); + while (allReaded >= packetSize_hf + addSize && allReaded > 0) { + if (!src_header.isEmpty()) { + if (allReaded + curInd >= buffer_size) { + memcpy(sbuffer.data(), buffer.data(), buffer_size); + memcpy(buffer.data(), sbuffer.data(buffer_size - packetSize_hf), allReaded); + allReaded = packetSize_hf; + addSize = curInd = 0; + } + bool brk = false; + while (!validateHeader((uchar * )(footer_ ? src_footer.data() : src_header.data()), buffer.data(curInd + (footer_ ? dataSize : 0)), footer_ ? src_footer.size_s() : src_header.size_s())) { + ++curInd; ++missed; + if (packetSize_hf > 0) missed_packets = missed / packetSize_hf; + if (curInd > addSize) { + addSize += packetSize_hf; + brk = true; + break; + } + } + if (brk) continue; + //memcpy(mheader.data(), buffer.data(curInd + (footer_ ? dataSize : 0)), src_header.size_s()); + if (!src_header.isEmpty()) memcpy(src_header.data(), buffer.data(curInd), src_header.size_s()); + if (!validatePayload(buffer.data(curInd + src_header.size_s()), dataSize)) { + ++curInd; ++missed; + if (packetSize_hf > 0) missed_packets = missed / packetSize_hf; + continue; + } + packetReceived(buffer.data(curInd), packetSize_hf); + memcpy(sbuffer.data(), buffer.data(), allReaded); + memcpy(buffer.data(), sbuffer.data(packetSize_hf + curInd), allReaded); + allReaded -= packetSize_hf + curInd; + curInd = addSize = 0; + } else { + if (dataSize == 0) { + if (validatePayload(buffer.data(), size_)) + packetReceived(buffer.data(), size_); + memcpy(sbuffer.data(), buffer.data(), allReaded); + memcpy(buffer.data(), sbuffer.data(size_), allReaded); + allReaded -= size_; + } else { + if (validatePayload(buffer.data(), dataSize)) + packetReceived(buffer.data(), dataSize); + memcpy(sbuffer.data(), buffer.data(), allReaded); + memcpy(buffer.data(), sbuffer.data(packetSize_hf), allReaded); + allReaded -= packetSize_hf; + } + } + }*/ + tmpbuf.append(readed, size_); + ss = src_footer.size_s() + dataSize; + while (tmpbuf.size_s() >= ss) { + while (!validateFooter(src_footer.data(), tmpbuf.data(dataSize), src_footer.size_s())) { + tmpbuf.pop_front(); + ++missed; + if (tmpbuf.size_s() < ss) return true; + } + while (!validatePayload(tmpbuf.data(), dataSize)) { + tmpbuf.pop_front(); + ++missed; + if (tmpbuf.size_s() < ss) return true; + } + packetReceived(tmpbuf.data(), ss); + tmpbuf.remove(0, ss); + } + break; + case PIPacketExtractor::HeaderAndFooter: + tmpbuf.append(readed, size_); + ss = src_header.size_s() + src_footer.size_s(); + while (tmpbuf.size_s() >= ss) { + if (!header_found) { + if (tmpbuf.size_s() < ss) return true; + while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) { + tmpbuf.pop_front(); + ++missed; + if (tmpbuf.size_s() < ss) return true; + } + header_found = true; + footerInd = src_header.size_s(); + } else { + if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true; + while (!validateFooter(src_footer.data(), tmpbuf.data(footerInd), src_footer.size_s())) { + ++footerInd; + if (tmpbuf.size_s() < footerInd + src_footer.size_s()) return true; + } + //piCout << "footer found at" << footerInd; + header_found = false; + if (!validatePayload(tmpbuf.data(src_header.size_s()), footerInd - src_header.size_s())) { + tmpbuf.pop_front(); + ++missed; + continue; + } + packetReceived(tmpbuf.data(), footerInd + src_footer.size_s()); + tmpbuf.remove(0, footerInd + src_footer.size_s()); + footerInd = src_header.size_s(); + } + } + break; + case PIPacketExtractor::Size: + tmpbuf.append(readed, size_); + if (packetSize_ <= 0) { + tmpbuf.clear(); + return true; + } + while (tmpbuf.size_s() >= packetSize_) { + if (!validatePayload(tmpbuf.data(), packetSize_)) { + tmpbuf.pop_front(); + ++missed; + missed_packets = missed / packetSize_; + continue; + } + packetReceived(tmpbuf.data(), packetSize_); + tmpbuf.remove(0, packetSize_); + } + break; + case PIPacketExtractor::Timeout: + memcpy(buffer.data(), readed, size_); + trbuf = dev->readForTime(time_); + memcpy(buffer.data(size_), trbuf.data(), trbuf.size()); + if (size_ + trbuf.size() > 0) + packetReceived(buffer.data(), size_ + trbuf.size()); + break; + }; + return true; +} + + +PIString PIPacketExtractor::constructFullPath() const { + return fullPathPrefix() + "://"; +} diff --git a/src/io/pipacketextractor.h b/src/io/pipacketextractor.h new file mode 100755 index 00000000..e9b0c0d4 --- /dev/null +++ b/src/io/pipacketextractor.h @@ -0,0 +1,187 @@ +/*! \file pipacketextractor.h + * \brief Packets extractor +*/ +/* + PIP - Platform Independent Primitives + Packets extractor + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifndef PIPACKETEXTRACTOR_H +#define PIPACKETEXTRACTOR_H + +#include "piiodevice.h" + +// Pass data, recHeaderPtr, received_data, recHeaderSize. Return true if packet is correct nor return false. +typedef bool (*PacketExtractorCheckFunc)(void * , uchar * , uchar * , int ); + +class PIP_EXPORT PIPacketExtractor: public PIIODevice +{ + PIIODEVICE(PIPacketExtractor) + friend class PIConnection; +public: + + //! Extract algorithms + enum SplitMode { + None /** No data processing */ , + Header /** Detect packets with \a header() and following \a payloadSize() */ , + Footer /** Detect packets with \a footer() and leading \a payloadSize() */ , + HeaderAndFooter /** Detect packets with \a header() and \a footer() without \a payloadSize() */ , + Size /** Detect packets with \a packetSize() */ , + Timeout /** Wait for first read, then read for \a timeout() milliseconds */ + }; + + //! Contructs extractor with child device "device_" and extract algorithm "mode" + PIPacketExtractor(PIIODevice * device_ = 0, SplitMode mode = None); + + virtual ~PIPacketExtractor() {stop();} + + + //! Returns child %device + PIIODevice * device() {return dev;} + + //! Set child %device to "device_" + void setDevice(PIIODevice * device_); + + + //! Returns buffer size + int bufferSize() const {return buffer_size;} + + //! Set buffer size to "new_size" bytes, should be at least greater than whole packet size + void setBufferSize(int new_size) {buffer_size = new_size; buffer.resize(buffer_size); sbuffer.resize(buffer_size); memset(buffer.data(), 0, buffer.size()); memset(sbuffer.data(), 0, sbuffer.size());} + + void setHeaderCheckSlot(PacketExtractorCheckFunc f) {ret_func_header = f;} + void setFooterCheckSlot(PacketExtractorCheckFunc f) {ret_func_footer = f;} + void setPayloadCheckSlot(ReadRetFunc f) {ret_func_ = f;} + + + //! Set extract algorithm + void setSplitMode(SplitMode mode) {setProperty("splitMode", int(mode)); mode_ = mode;} + + //! Set payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms + void setPayloadSize(int size); + + //! Set header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms + void setHeader(const PIByteArray & data); + + //! Set footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms + void setFooter(const PIByteArray & data); + + //! Set packet size, used for PIPacketExtractor::Size algorithm + void setPacketSize(int size) {setProperty("packetSize", size); packetSize_ = size;} + + //! Set timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm + void setTimeout(double msecs) {setProperty("timeout", msecs); time_ = msecs;} + + + //! Returns current extract algorithm + SplitMode splitMode() const {return (SplitMode)(property("splitMode").toInt());} + + //! Returns current payload size, used for PIPacketExtractor::Header and PIPacketExtractor::Footer algorithms + int payloadSize() const {return property("payloadSize").toInt();} + + //! Returns current header data, used for PIPacketExtractor::Header and PIPacketExtractor::HeaderAndFooter algorithms + PIByteArray header() const {return src_header;} + + //! Returns current footer data, used for PIPacketExtractor::Footer and PIPacketExtractor::HeaderAndFooter algorithms + PIByteArray footer() const {return src_footer;} + + //! Returns current packet size, used for PIPacketExtractor::Size algorithm + int packetSize() const {return property("packetSize").toInt();} + + //! Returns current timeout in milliseconds, used for PIPacketExtractor::Timeout algorithm + double timeout() const {return property("timeout").toDouble();} + + + //! Returns missed by validating functions bytes count + ullong missedBytes() const {return missed;} + + // //! Returns missed by validating functions packets count, = missedBytes() / packetSize + ullong missedPackets() const {/*if (packetSize_hf == 0) return missed; return missed / packetSize_hf*/; return missed_packets;} + + //! Returns pointer to \a missedBytes() count. Useful for output to PIConsole + const ullong * missedBytes_ptr() const {return &missed;} + + // //! Returns pointer to \a missedPackets() count. Useful for output to PIConsole + const ullong * missedPackets_ptr() const {return &missed_packets;} + + + // //! Returns last successfully validated header as byte array + PIByteArray lastHeader() {return mheader;} + + + //! Directly call \a read() function of child %device + int read(void * read_to, int max_size) {if (dev == 0) return -1; return dev->read(read_to, max_size);} + + //! Directly call \a write() function of child %device + int write(const void * data, int max_size) {if (dev == 0) return -1; return dev->write(data, max_size);} + + PIString constructFullPath() const; + + EVENT2(packetReceived, uchar * , data, int, size) + +//! \events +//! \{ + + //! \fn void packetReceived(uchar * data, int size) + //! \brief Raise on successfull \a packetValidate() function + +//! \} + +protected: + + /** \brief Function to validate header + * \param src Your header content + * \param rec Received header + * \param size Header size + * \details Default implementation returns by-byte "src" with "rec" compare result */ + virtual bool validateHeader(uchar * src, uchar * rec, int size) {if (ret_func_header != 0) return ret_func_header(ret_data_, src, rec, size); for (int i = 0; i < size; ++i) if (src[i] != rec[i]) return false; return true;} + + /** \brief Function to validate footer + * \param src Your footer content + * \param rec Received footer + * \param size Footer size + * \details Default implementation returns by-byte "src" with "rec" compare result */ + virtual bool validateFooter(uchar * src, uchar * rec, int size) {if (ret_func_footer != 0) return ret_func_footer(ret_data_, src, rec, size); for (int i = 0; i < size; ++i) if (src[i] != rec[i]) return false; return true;} + + /** \brief Function to validate payload + * \param rec Received payload + * \param size payload size + * \details Default implementation returns \b true */ + virtual bool validatePayload(uchar * rec, int size) {if (ret_func_ != 0) return ret_func_(ret_data_, rec, size); return true;} + +private: + void init_(); + void propertyChanged(const PIString & ); + bool threadedRead(uchar * readed, int size); + PIString fullPathPrefix() const {return "pckext";} + bool openDevice() {if (dev == 0) return false; return dev->open();} + + PIIODevice * dev; + PIByteArray mheader, buffer, sbuffer, tmpbuf, src_header, src_footer, trbuf; + PacketExtractorCheckFunc ret_func_header, ret_func_footer; + SplitMode mode_; + void * data; + int buffer_size, dataSize, packetSize_hf, allReaded, addSize, curInd, footerInd, packetSize_; + double time_; + bool header_found; + ullong missed, missed_packets; + + +}; + +#endif // PIPACKETEXTRACTOR_H diff --git a/src/io/pipeer.cpp b/src/io/pipeer.cpp new file mode 100755 index 00000000..19376f7e --- /dev/null +++ b/src/io/pipeer.cpp @@ -0,0 +1,632 @@ +/* + PIP - Platform Independent Primitives + Peer - named I/O ethernet node + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pipeer.h" + +#define _PIPEER_MSG_SIZE 8192 +#define _PIPEER_MULTICAST_TTL 4 +#define _PIPEER_MULTICAST_IP "232.13.3.12" +#define _PIPEER_LOOPBACK_PORT_S 13313 +#define _PIPEER_LOOPBACK_PORT_E (13313+32) +#define _PIPEER_MULTICAST_PORT 13360 +#define _PIPEER_BROADCAST_PORT 13361 +#define _PIPEER_TRAFFIC_PORT_S 13400 +#define _PIPEER_TRAFFIC_PORT_E 14000 + + +PIPeer::PeerInfo::Address::Address(const PIString & a, const PIString & m): address(a), netmask(m) { + ping = -1.; + wait_ping = false; + last_ping = PISystemTime::current(true); +} + + +int PIPeer::PeerInfo::ping() const { + int ret = -1; + piForeachC (Address & a, addresses) + if (a.ping > 0.) + ret = piMaxi(ret, piRoundd(a.ping)); + return ret; +} + + +PIPeer::PIPeer(const PIString & name_): PIObject() { + setName(name_); + self_info.name = name_; + self_info.dist = 0; + self_info.time = PISystemTime::current(); + //joinMulticastGroup("239.240.241.242"); + srand(uint(PISystemTime::current(true).toMicroseconds())); + //id_ = self_info.name + "_" + PIString::fromNumber(rand()); + CONNECTU(&timer, tickEvent, this, timerEvent); + PIStringList sl = PIEthernet::allAddresses(); + initEths(sl); + sl.removeAll("127.0.0.1"); + initMBcasts(sl); + sendSelfInfo(); + timer.addDelimiter(5); + timer.start(200); +} + + +PIPeer::~PIPeer() { + piForeach (PIEthernet * i, eths_traffic) { + i->stopThreadedRead(); + delete i; + } + eths_traffic.clear(); + piForeach (PIEthernet * i, eths_mcast) + i->stopThreadedRead(); + piForeach (PIEthernet * i, eths_bcast) + i->stopThreadedRead(); + eth_send.stopThreadedRead(); + eth_lo.stopThreadedRead(); + sendSelfRemove(); + destroyMBcasts(); +} + + +void PIPeer::timerEvent(void * data, int delim) { + switch (delim) { + case 5: // 1 s + syncPeers(); + break; + } + //send("broadcast", 9); +} + + +void PIPeer::initEths(PIStringList al) { + PIEthernet * ce; + PIEthernet::InterfaceList il = PIEthernet::interfaces(); + const PIEthernet::Interface * cint = 0; + piForeachC (PIString & a, al) { + ce = new PIEthernet(); + ce->setDebug(false); + ce->setName("__S__PIPeer_traffic_eth_rec_" + a); + ce->setParameters(0); + ce->setThreadSafe(true); + bool ok = false; + for (int p = _PIPEER_TRAFFIC_PORT_S; p < _PIPEER_TRAFFIC_PORT_E; ++p) { + ce->setReadAddress(a, p); + if (ce->open()) { + eths_traffic << ce; + cint = il.getByAddress(a); + self_info.addresses << PeerInfo::Address(ce->path(), cint == 0 ? "255.255.255.0" : cint->netmask); + CONNECTU(ce, threadedReadEvent, this, dataRead); + ce->startThreadedRead(); + //piCout << "dc binded to" << ce->path(); + //piCout << "add eth" << ta; + ok = true; + break; + } + } + if (!ok) delete ce; + } + eth_send.setDebug(false); + eth_send.setName("__S__PIPeer_traffic_eth_send"); + eth_send.setParameters(0); +} + + +void PIPeer::initMBcasts(PIStringList al) { + destroyMBcasts(); + PIEthernet * ce; + PIEthernet::InterfaceList il = PIEthernet::interfaces(); + const PIEthernet::Interface * cint; + PIString nm; + al << _PIPEER_MULTICAST_IP; + piForeachC (PIString & a, al) { + piCout << "mcast try" << a; + ce = new PIEthernet(); + ce->setDebug(false); + ce->setName("__S__PIPeer_mcast_eth_" + a); + ce->setParameters(0); + ce->setSendAddress(_PIPEER_MULTICAST_IP, _PIPEER_MULTICAST_PORT); + ce->setReadAddress(a, _PIPEER_MULTICAST_PORT); + ce->setMulticastTTL(_PIPEER_MULTICAST_TTL); + ce->joinMulticastGroup(_PIPEER_MULTICAST_IP); + eths_mcast << ce; + CONNECTU(ce, threadedReadEvent, this, mbcastRead); + ce->startThreadedRead(); + } + piForeachC (PIString & a, al) { + ce = new PIEthernet(); + ce->setDebug(false); + ce->setName("__S__PIPeer_bcast_eth_" + a); + ce->setParameters(PIEthernet::Broadcast); + cint = il.getByAddress(a); + nm = (cint == 0) ? "255.255.255.0" : cint->netmask; + ce->setSendAddress(PIEthernet::getBroadcast(a, nm), _PIPEER_BROADCAST_PORT); + ce->setReadAddress(a, _PIPEER_BROADCAST_PORT); + //piCout << "mc BC try" << a << nm << ce->sendIP(); + piCout << "bcast try" << a << nm; + eths_bcast << ce; + CONNECTU(ce, threadedReadEvent, this, mbcastRead); + ce->startThreadedRead(); + } + eth_lo.setDebug(false); + eth_lo.setName("__S__PIPeer_eth_loopback"); + eth_lo.setParameters(0); + cint = il.getByAddress("127.0.0.1"); + for (int p = _PIPEER_LOOPBACK_PORT_S; p <= _PIPEER_LOOPBACK_PORT_E; ++p) { + eth_lo.setReadAddress("127.0.0.1", p); + if (eth_lo.open()) { + eth_lo.setSendIP("127.0.0.1"); + CONNECTU(ð_lo, threadedReadEvent, this, mbcastRead); + eth_lo.startThreadedRead(); + piCout << "lo binded to" << eth_lo.readAddress(); + //piCout << "add eth" << ta; + break; + } + } + if (eths_mcast.isEmpty()) piCoutObj << "Warning! Can`t find suitable network interface for multicast receive, check for exists at least one interface with multicasting enabled!"; + if (eths_bcast.isEmpty()) piCoutObj << "Warning! Can`t find suitable network interface for broadcast receive, check for exists at least one interface with broadcasting enabled!"; +} + + +void PIPeer::destroyMBcasts() { + piForeach (PIEthernet * i, eths_mcast) { + i->leaveMulticastGroup(_PIPEER_MULTICAST_IP); + delete i; + } + piForeach (PIEthernet * i, eths_bcast) + delete i; + eth_lo.stop(); + eth_lo.close(); + eths_mcast.clear(); + eths_bcast.clear(); +} + + +PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) { + if (!addresses_map.contains(to)) return 0; + //piCout << "*** search quickest peer" << to; + PIVector tp = addresses_map[to]; + PeerInfo * dp = 0; + int mping = 0x7FFFFFFF; + for (int i = 0; i < tp.size_s(); ++i) { + if (mping > tp[i]->ping()) { + mping = tp[i]->ping(); + dp = tp[i]; + } + } + //piCout << "*** search quickest peer: found" << dp->name; + return dp; +} + + +bool PIPeer::send(const PIString & to, const void * data, int size) { + PeerInfo * dp = quickestPeer(to); + if (dp == 0) { + //piCoutObj << "Can`t find peer \"" << to << "\"!"; + return false; + } + PIByteArray ba; + ba << int(4) << self_info.name << to << int(0) << size; + PIByteArray fmsg(data, size), cmsg; + int msg_count = (size - 1) / _PIPEER_MSG_SIZE + 1; + //piCout << "[PIPeer] send" << size << "bytes in" << msg_count << "packets ..."; + for (int i = 0; i < msg_count; ++i) { + int csize = (i == msg_count - 1) ? ((size - 1) % _PIPEER_MSG_SIZE + 1) : _PIPEER_MSG_SIZE; + cmsg = ba; + cmsg << msg_count << i; + cmsg.append(fmsg.data(i * _PIPEER_MSG_SIZE), csize); + if (!sendToNeighbour(dp, cmsg)) return false; + } + //piCout << "[PIPeer] send" << size << "bytes ok"; + return true; +} + + +bool PIPeer::dataRead(uchar * readed, int size) { + if (size < 16) return true; + PIByteArray ba(readed, size), sba; + int type, cnt, rec_size; + PIString from, to; + ba >> type; + PIMutexLocker locker(eth_mutex); + //piCout << "[PIPeer \"" + name_ + "\"] Received packet" << type; + if (type == 5) { // ping + PIString addr; + PISystemTime time, ptime, ctime = PISystemTime::current(true); + ba >> to >> from >> addr >> time; + if (to == self_info.name) { // ping echo + piForeach (PeerInfo & p, peers) { + if (!p.isNeighbour()) continue; + if (p.name != from) continue; + piForeach (PeerInfo::Address & a, p.addresses) { + if (a.address != addr) continue; + if (a.last_ping >= time) piBreak; + ptime = ctime - time; + a.last_ping = time; + a.wait_ping = false; + if (a.ping < 0) a.ping = ptime.toMilliseconds(); + else a.ping = 0.6 * a.ping + 0.4 * ptime.toMilliseconds(); + piCout << "*** ping echo" << p.name << a.address << a.ping; + return true; + } + } + return true; + } + // send ping back + piForeachC (PeerInfo & p, peers) { + if (!p.isNeighbour()) continue; + if (p.name != to) continue; + sba = PIByteArray(readed, size); + //piCout << "ping from" << to << addr << ", send back to" << p.name; + piForeachC (PeerInfo::Address & a, p.addresses) { + if (eth_send.send(a.address, sba)) + diag_s.received(sba.size_s()); + } + return true; + } + //PIEthernet * eth = (PIEthernet*)emitter(); + //()->send(); + return true; + } + if (type != 4) return true; + diag_d.received(size); + ba >> from >> to >> cnt >> rec_size; + //piCout << "[PIPeer \"" + name_ + "\"] Received packet" << /*type << from << to << cnt <<*/ rec_size; + if (type == 4) { // data packet + if (to == self_info.name) { // my packet + int msg_count, cmsg; + ba >> msg_count >> cmsg; + //piCout << "[PIPeer \"" + name_ + "\"] Received packet" << type << from << to << cnt << rec_size << msg_count << cmsg; + if (cmsg == 0 && msg_count == 1) { + dataReceived(from, ba); + dataReceivedEvent(from, ba); + return true; + } + PeerInfo * fp = const_cast(getPeerByName(from)); + if (fp == 0) return true; + PeerData & pd(fp->_data); + if (cmsg == 0) { + //piCout << "[PIPeer \"" + name_ + "\"] Packet clear" << rec_size; + pd.clear(); + pd.msg_count = msg_count; + } + //piCout << "[PIPeer \"" + name_ + "\"] Packet add" << cmsg << ba.size_s(); + pd.addData(ba); + if (pd.isFullReceived()) { + dataReceived(from, pd.data); + dataReceivedEvent(from, pd.data); + //piCout << "[PIPeer \"" + name_ + "\"] Packet received" << pd.data.size_s(); + } + return true; + } + PeerInfo * dp = quickestPeer(to); + if (dp == 0) { + //piCoutObj << "Can`t find peer \"" << to << "\"!"; + return true; + } + cnt++; + if (cnt > 100 || from == dp->name) return true; + sba << type << from << to << cnt << rec_size; + sba.append(ba); + //piCoutObj << "Translate data packet" << type << from << to << cnt << rec_size; + sendToNeighbour(dp, sba); + } + return true; +} + + +bool PIPeer::mbcastRead(uchar * data, int size) { + if (size < 8) return true; + int type, dist; + PIByteArray ba(data, size); + ba >> type; + if (type <= 0 || type >= 4) return true; + PeerInfo pi; + const PeerInfo * rpi = 0; + PIVector rpeers; + ba >> pi.name; + //piCout << "read type" << type << "from" << pi.name; + if (pi.name == self_info.name) return true; + PIMutexLocker locker(mc_mutex); + diag_s.received(size); + //piCout << "analyz ..."; + switch (type) { + case 1: // new peer + //piCout << "new peer packet ..."; + if (hasPeer(pi.name)) break; + ba >> pi; + pi.sync = 0; + if (pi.dist == 0) { + pi.addNeighbour(self_info.name); + self_info.addNeighbour(pi.name); + } + peers << pi; + piCoutObj << "new peer \"" << pi.name << "\"" << " dist " << pi.dist; + pi.dist++; + sendSelfInfo(); + sendPeerInfo(pi); + findNearestAddresses(); + peerConnected(pi.name); + peerConnectedEvent(pi.name); + //piCout << "new peer packet ok"; + break; + case 2: // remove peer + //piCout << "remove peer packet ..." << pi.name; + rpi = getPeerByName(pi.name); + if (!rpi) break; + dist = rpi->dist; + addToRemoved(*rpi); + removePeer(pi.name); + piCoutObj << "remove peer \"" << pi.name << "\""; + if (dist == 0) + self_info.removeNeighbour(pi.name); + sendPeerRemove(pi.name); + findNearestAddresses(); + peerDisconnected(pi.name); + peerDisconnectedEvent(pi.name); + //piCout << "remove peer packet ok"; + break; + case 3: // sync peers + //piCout << "sync packet ..."; + ba >> pi >> rpeers; + rpeers << pi; + //piCoutObj << "rec sync " << rpeers.size_s() << " peers"; + piForeach (PeerInfo & rpeer, rpeers) { + //piCout << " to sync " << rpeer.name; + if (rpeer.name == self_info.name) continue; + bool exist = false; + piForeach (PeerInfo & peer, peers) { + if (peer.name == rpeer.name) exist = true; + if (exist && isPeerRecent(peer, rpeer)) { + //piCout << "synced " << peer.name; + for (int z = 0; z < rpeer.addresses.size_s(); ++z) { + PeerInfo::Address & ra(rpeer.addresses[z]); + for (int k = 0; k < peer.addresses.size_s(); ++k) { + PeerInfo::Address & a(peer.addresses[k]); + if (ra.address == a.address) { + ra.ping = a.ping; + ra.wait_ping = a.wait_ping; + ra.last_ping = a.last_ping; + piBreak; + } + } + } + peer.addresses = rpeer.addresses; + peer.cnt = rpeer.cnt; + peer.time = rpeer.time; + peer.addNeighbours(rpeer.neighbours); + rpeer.neighbours = peer.neighbours; + if (peer.name == pi.name) peer.sync = 0; + piBreak; + } + } + if (exist || isRemoved(rpeer)) continue; + rpeer.dist++; + peers << rpeer; + findNearestAddresses(); + peerConnected(rpeer.name); + peerConnectedEvent(rpeer.name); + } + //piCout << "***"; + //piCout << self_info.name << self_info.neighbours; + piForeach (PeerInfo & i, peers) { + if (i.dist == 0) { + self_info.addNeighbour(i.name); + i.addNeighbour(self_info.name); + } + //piCout << i.name << i.neighbours; + } + //piCoutObj << "after sync " << peers.size_s() << " peers"; + break; + } + return true; +} + + +bool PIPeer::sendToNeighbour(PIPeer::PeerInfo * peer, const PIByteArray & ba) { + //if (peer->_neth == 0) return false; + piCout << "[PIPeer] sendToNeighbour" << peer->name << peer->_naddress << ba.size_s() << "bytes ..."; + //bool ok = peer->_neth->send(peer->_naddress, ba.data(), ba.size_s()); + bool ok = eth_send.send(peer->_naddress, ba); + //piCout << "[PIPeer] sendToNeighbour" << (ok ? "ok" : "fail"); + if (ok) diag_d.sended(ba.size_s()); + return ok; +} + + +void PIPeer::sendMBcast(const PIByteArray & ba) { + //piCout << "sendMBcast" << ba.size() << "bytes ..."; + piForeach (PIEthernet * e, eths_mcast) { + //errorClear(); + //piCout << "send to" << e->path() << e->sendAddress();// << e->send(ba); + //piCout << PIEthernet::ethErrorString(); + if (e->isOpened()) + if (e->send(ba)) + diag_s.sended(ba.size_s()); + } + piForeach (PIEthernet * e, eths_bcast) { + //errorClear(); + //piCout << "send to" << e->path() << e->sendAddress();// << e->send(ba); + //piCout << PIEthernet::ethErrorString(); + if (e->isOpened()) + if (e->send(ba)) + diag_s.sended(ba.size_s()); + } + for (int p = _PIPEER_LOOPBACK_PORT_S; p <= _PIPEER_LOOPBACK_PORT_E; ++p) { + eth_lo.setSendPort(p); + if (eth_lo.send(ba)) + diag_s.sended(ba.size_s()); + } + //piCout << "send muticast ok"; +} + + +void PIPeer::sendPeerInfo(const PeerInfo & info) { + PIByteArray ba; + ba << int(1) << info.name << info; + sendMBcast(ba); +} + + +void PIPeer::sendPeerRemove(const PIString & peer) { + PIByteArray ba; + ba << int(2) << peer; + sendMBcast(ba); +} + + +void PIPeer::pingNeighbours() { + PIByteArray ba, sba; + ba << int(5) << self_info.name; + //piCout << "pingNeighbours" << peers.size(); + piForeach (PeerInfo & p, peers) { + //piCout << " ping neighbour" << p.name; + if (!p.isNeighbour()) continue; + piForeach (PeerInfo::Address & a, p.addresses) { + //piCout << " address" << a.address << a.wait_ping; + if (a.wait_ping) continue; + a.wait_ping = true; + sba = ba; + sba << p.name << a.address << PISystemTime::current(true); + //piCout << "ping" << p.name << a.address << a.last_ping; + if (eth_send.send(a.address, sba)) + diag_s.sended(sba.size_s()); + } + } +} + + +void PIPeer::syncPeers() { + //piCout << "[PIPeer \"" + self_info.name + "\"] sync " << peers.size_s() << " peers"; + PIMutexLocker locker(eth_mutex); + PIString pn; + bool change = false; + for (uint i = 0; i < peers.size(); ++i) { + PeerInfo & cp(peers[i]); + if (cp.sync > 3 && cp.dist == 0) { + pn = cp.name; + //piCoutObj << "sync: remove " << pn; + addToRemoved(cp); + peers.remove(i); + sendPeerRemove(pn); + --i; + piForeach (PeerInfo & p, peers) + p.removeNeighbour(pn); + self_info.removeNeighbour(pn); + peerDisconnected(pn); + peerDisconnectedEvent(pn); + change = true; + continue; + } + cp.sync++; + } + pingNeighbours(); + if (change) findNearestAddresses(); + self_info.cnt++; + self_info.time = PISystemTime::current(); + PIByteArray ba; + ba << int(3) << self_info.name << self_info << peers; + sendMBcast(ba); +} + + +void PIPeer::findNearestAddresses() { + //piCout << "[PIPeer \"" + name_ + "\"] findNearestAddresses"; + addresses_map.clear(); + int max_dist = -1; + static PIMap peers_; + peers_.clear(); + self_info._nuses.resize(self_info.neighbours.size()); + self_info._nuses.fill(0); + self_info._first = &self_info; + peers_[self_info.name] = &self_info; + piForeach (PeerInfo & i, peers) { + i._nuses.resize(i.neighbours.size()); + i._nuses.fill(0); + i._first = 0; + peers_[i.name] = &i; + if (max_dist < i.dist) + max_dist = i.dist; + if (i.dist > 0) continue; + i._naddress.clear(); + i._neth = 0; + PIString mma, ma; + bool af = false; + for (int mi = 0; mi < self_info.addresses.size_s(); ++mi) { + PeerInfo::Address & a(self_info.addresses[mi]); + if (af) break; + ma = a.address; + //mma = m.left(m.findLast(".")); + mma = PIEthernet::applyMask(a.address, a.netmask); + for (int ii = 0; ii < i.addresses.size_s(); ++ii) { + PeerInfo::Address & r(i.addresses[ii]); + if (!r.isAvailable()) continue; + if (mma == PIEthernet::applyMask(r.address, r.netmask)) { + i._naddress = r.address; + //piCout << "_naddress" << i.name << "=" << r; + af = true; + break; + } + } + } + if (!af) continue; + //piCout << " peer" << i.name << ma; + piForeach (PIEthernet * e, eths_traffic) + if (e->readAddress() == ma) { + i._neth = e; + break; + } + //piCout << i.name << i._naddress; + } + PIVector cwave, nwave; + PeerInfo * npeer; + cwave << &self_info; + for (int d = 0; d <= max_dist; ++d) { + if (cwave.isEmpty()) break; + nwave.clear(); + piForeach (PeerInfo * p, cwave) { + int ns = p->neighbours.size_s(); + for (int n = 0; n < ns; ++n) { + if (p->_nuses[n] >= ns) continue; + p->_nuses[n]++; + npeer = peers_[p->neighbours[n]]; + if (npeer == 0) continue; + if (d == 0) npeer->_first = npeer; + else { + if (d == 1) npeer->_first = p; + else npeer->_first = p->_first; + } + nwave << npeer; + } + } + cwave = nwave; + //piCout << "wave" << d; + for (int i = 0; i < cwave.size_s(); ++i) { + //piCout << " peer" << cwave[i]->name << Hex << (uint)(cwave[i]->_first); + if (cwave[i]->_first == 0) {cwave.remove(i); --i; continue;} + if (addresses_map.contains(cwave[i]->name)) {cwave.remove(i); --i; continue;} + } + for (int i = 0; i < cwave.size_s(); ++i) { + PIVector & pl(addresses_map[cwave[i]->name]); + if (!pl.contains(cwave[i]->_first)) + pl << cwave[i]->_first; + } + } + /*piCout << " ** addresses map **"; + piForeachC (napair & i, addresses_map) + piCout << i.first << i.second; + piCout << " ** addresses map end **";*/ +} diff --git a/src/io/pipeer.h b/src/io/pipeer.h new file mode 100755 index 00000000..3cf11895 --- /dev/null +++ b/src/io/pipeer.h @@ -0,0 +1,185 @@ +/*! \file pipeer.h + * \brief Peering net node +*/ +/* + PIP - Platform Independent Primitives + Peer - named I/O ethernet node, forming self-organized peering network + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIPEER_H +#define PIPEER_H + +#include "piethernet.h" +#include "pidiagnostics.h" + +class PIP_EXPORT PIPeer: public PIObject +{ + PIOBJECT(PIPeer) +private: + struct PeerData { + PeerData() {msg_count = msg_rec = 0;} + void clear() {msg_count = msg_rec = 0; data.clear();} + bool isEmpty() const {return msg_count == 0;} + bool isFullReceived() const {return msg_count == msg_rec;} + void addData(const PIByteArray & ba) {data.append(ba); msg_rec++;} + void setData(const PIByteArray & ba) {data = ba; msg_rec = 0; msg_count = (data.size_s() - 1) / 4096 + 1;} + PIByteArray data; + int msg_count; + int msg_rec; + }; + +public: + PIPeer(const PIString & name); + virtual ~PIPeer(); + + class PeerInfo { + friend class PIPeer; + friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v); + friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v); + public: + PeerInfo() {dist = sync = cnt = 0; _neth = 0; _first = 0;} + + struct Address { + Address(const PIString & a = PIString(), const PIString & m = "255.255.255.0"); + bool isAvailable() const {return ping > 0;} + //inline const Address & operator =(const Address & v) {address = v.address; netmask = v.netmask; piCout << "!!!!!!!!!" << last_ping; return *this;} + PIString address; + PIString netmask; + double ping; // ms + bool wait_ping; + PISystemTime last_ping; + }; + + PIString name; + PIVector

addresses; + int dist; + + bool isNeighbour() const {return dist == 0;} + int ping() const; + + protected: + void addNeighbour(const PIString & n) {if (!neighbours.contains(n)) neighbours << n;} + void addNeighbours(const PIStringList & l) {piForeachC (PIString & n, l) if (!neighbours.contains(n)) neighbours << n;} + void removeNeighbour(const PIString & n) {neighbours.removeAll(n);} + + PIString nearest_address; + PIStringList neighbours; + int sync, cnt; + PISystemTime time; + PIString _naddress; + PIEthernet * _neth; + PIVector _nuses; + PeerInfo * _first; + PeerData _data; + + }; + + friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v); + friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v); + + bool send(const PIString & to, const PIByteArray & data) {return send(to, data.data(), data.size_s());} + bool send(const PIString & to, const PIString & data) {return send(to, data.data(), data.size_s());} + bool send(const PIString & to, const void * data, int size); + bool send(const PeerInfo & to, const PIByteArray & data) {return send(to.name, data.data(), data.size_s());} + bool send(const PeerInfo & to, const PIString & data) {return send(to.name, data.data(), data.size_s());} + bool send(const PeerInfo & to, const void * data, int size) {return send(to.name, data, size);} + bool send(const PeerInfo * to, const PIByteArray & data) {if (to == 0) return false; return send(to->name, data.data(), data.size_s());} + bool send(const PeerInfo * to, const PIString & data) {if (to == 0) return false; return send(to->name, data.data(), data.size_s());} + bool send(const PeerInfo * to, const void * data, int size) {if (to == 0) return false; return send(to->name, data, size);} + void sendToAll(const PIByteArray & data) {piForeachC (PeerInfo & i, peers) send(i.name, data.data(), data.size_s());} + void sendToAll(const PIString & data) {piForeachC (PeerInfo & i, peers) send(i.name, data.data(), data.size_s());} + void sendToAll(const void * data, int size) {piForeachC (PeerInfo & i, peers) send(i.name, data, size);} + + bool isMulticastReceive() const {return !eths_mcast.isEmpty();} + bool isBroadcastReceive() const {return !eths_bcast.isEmpty();} + + PIDiagnostics & diagnosticService() {return diag_s;} + PIDiagnostics & diagnosticData() {return diag_d;} + + const PIVector & allPeers() const {return peers;} + bool isPeerExists(const PIString & name) const {return getPeerByName(name) != 0;} + + const PeerInfo * getPeerByName(const PIString & name) const {piForeachC (PeerInfo & i, peers) if (i.name == name) return &i; return 0;} + + void lock() {mc_mutex.lock();} + void unlock() {mc_mutex.unlock();} + + EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data); + EVENT1(peerConnectedEvent, const PIString &, name); + EVENT1(peerDisconnectedEvent, const PIString &, name); + +protected: + virtual void dataReceived(const PIString & from, const PIByteArray & data) {;} + virtual void peerConnected(const PIString & name) {;} + virtual void peerDisconnected(const PIString & name) {;} + + EVENT_HANDLER2(bool, dataRead, uchar *, readed, int, size); + EVENT_HANDLER2(bool, mbcastRead, uchar *, readed, int, size); + +private: + EVENT_HANDLER2(void, timerEvent, void * , data, int, delim); + + bool hasPeer(const PIString & name) {piForeachC (PeerInfo & i, peers) if (i.name == name) return true; return false;} + bool removePeer(const PIString & name) {for (uint i = 0; i < peers.size(); ++i) if (peers[i].name == name) {peers.remove(i); return true;} return false;} + + void sendPeerInfo(const PeerInfo & info); + void sendPeerRemove(const PIString & peer); + void sendSelfInfo() {sendPeerInfo(self_info);} + void sendSelfRemove() {sendPeerRemove(self_info.name);} + void syncPeers(); + void findNearestAddresses(); + void initEths(PIStringList al); + void initMBcasts(PIStringList al); + void destroyMBcasts(); + void sendMBcast(const PIByteArray & ba); + void pingNeighbours(); + void addToRemoved(const PeerInfo & pi) {removed[pi.name] = PIPair(pi.cnt, pi.time);} + bool isRemoved(const PeerInfo & pi) const {return (removed.value(pi.name) == PIPair(pi.cnt, pi.time));} + + PeerInfo * quickestPeer(const PIString & to); + bool sendToNeighbour(PeerInfo * peer, const PIByteArray & ba); + inline static bool isPeerRecent(const PeerInfo & my, const PeerInfo & income) {return (my.cnt < income.cnt) || (my.time < income.time);} + + // 1 - new peer, 2 - remove peer, 3 - sync peers, 4 - data, 5 - ping + // Data packet: 4, from, to, ticks, data_size, data + + typedef PIPair > napair; + + PIVector eths_traffic, eths_mcast, eths_bcast; + PIEthernet eth_send, eth_lo; + PITimer timer; + PIMutex mc_mutex, eth_mutex; + + PeerInfo self_info; + PIVector peers; + PIMap > addresses_map; // map {"to" = list of nearest peers} + PIMap > removed; + PIDiagnostics diag_s, diag_d; + //PIString id_; + +}; + +inline PICout operator <<(PICout c, const PIPeer::PeerInfo::Address & v) {c.space(); c << "PeerAddress(" << v.address << ", " << v.netmask << ", " << v.ping << ")"; return c;} +inline PICout operator <<(PICout c, const PIPeer::PeerInfo & v) {c.space(); c << "PeerInfo(" << v.name << ", " << v.dist << ", " << v.addresses << ")"; return c;} + +inline PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo::Address & v) {s << v.address << v.netmask << v.ping; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo::Address & v) {s >> v.address >> v.netmask >> v.ping; return s;} + +inline PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v) {s << v.name << v.addresses << v.dist << v.neighbours << v.cnt << v.time; return s;} +inline PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v) {s >> v.name >> v.addresses >> v.dist >> v.neighbours >> v.cnt >> v.time; return s;} + +#endif // PIPEER_H diff --git a/src/io/piprotocol.cpp b/src/io/piprotocol.cpp new file mode 100755 index 00000000..df3be9bb --- /dev/null +++ b/src/io/piprotocol.cpp @@ -0,0 +1,792 @@ +/* + PIP - Platform Independent Primitives + Protocol, input/output channel (COM, UDP) + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Bychkov Andrey wapmobil@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piprotocol.h" + + +/** \class PIProtocol + * \brief + * \details + * \section PIProtocol_sec0 Synopsis + * + * + * + * */ + + +PIProtocol::PIProtocol(const PIString & config, const PIString & name_, void * recHeaderPtr, int recHeaderSize, void * recDataPtr, int recDataSize, void * sendDataPtr_, int sendDataSize_): PIObject() { + init(); + protName = name_; + PIObject::setName(name_); + PIConfig conf(config, PIIODevice::ReadOnly); + if (!conf.isOpened()) { + piCoutObj << "Can`t open \"" << config << "\"!"; + devReceiverState = devSenderState = "Config error"; + return; + } + PIConfig::Entry & b(conf.getValue(name_)), + & rb(b.getValue("receiver")), + & sb(b.getValue("sender")); + + init_receiver(b, rb, config); + init_sender(b, sb, config); + + headerPtr = (uchar * )recHeaderPtr; + headerSize = recHeaderSize; + dataPtr = (uchar * )recDataPtr; + dataSize = recDataSize; + sendDataPtr = (uchar * )sendDataPtr_; + sendDataSize = sendDataSize_; + packet_ext->setHeader(PIByteArray(recHeaderPtr, recHeaderSize)); + packet_ext->setPayloadSize(recDataSize); + packet_ext->setPacketSize(recDataSize); + packet_ext->setSplitMode(PIPacketExtractor::Header); + bool null_h = (recHeaderPtr == 0 || recHeaderSize == 0), null_d = (recDataPtr == 0 || recDataSize == 0); + if (null_h && null_d) packet_ext->setSplitMode(PIPacketExtractor::None); + else { + if (null_h) packet_ext->setSplitMode(PIPacketExtractor::Size); + } +} + + +PIProtocol::~PIProtocol() { + //cout << "prot " << protName << " delete\n"; + if (history_write_rec) { + if (history_file_rec.isEmpty()) { + history_file_rec.close(); + history_file_rec.remove(); + } + history_file_rec.close(); + } + if (history_write_send) { + if (history_file_send.isEmpty()) { + history_file_send.close(); + history_file_send.remove(); + } + history_file_send.close(); + } + delete diagTimer; + delete sendTimer; + delete secTimer; + delete packet_ext; + if (eth != 0) delete eth; + if (ser != 0) delete ser; +} + + +void PIProtocol::init() { + packet_ext = new PIPacketExtractor(0, PIPacketExtractor::None); + packet_ext->setThreadedReadData(this); + packet_ext->setThreadedReadSlot(receiveEvent); + packet_ext->setHeaderCheckSlot(headerValidateEvent); + packet_ext->setName("__S__PIProtocol::packet_ext"); + work = new_mp_prot = history_write_rec = history_write_send = false; + eth = 0; + ser = 0; + ret_func = 0; + mp_owner = 0; + net_diag = PIProtocol::Unknown; + cur_pckt = 0; + packets[0] = packets[1] = pckt_cnt = pckt_cnt_max = 0; + diagTimer = 0; + timeout_ = 3.f; + sendTimer = new PITimer(sendEvent, this); + diagTimer = new PITimer(diagEvent, this); + secTimer = new PITimer(secEvent, this); + sendTimer->setName("__S__PIProtocol::sendTimer"); + diagTimer->setName("__S__PIProtocol::diagTimer"); + secTimer->setName("__S__PIProtocol::secTimer"); + wrong_count = receive_count = send_count = missed_count = 0; + packets_in_sec = packets_out_sec = bytes_in_sec = bytes_out_sec = 0; + immediate_freq = integral_freq = ifreq = 0.f; + headerPtr = dataPtr = sendDataPtr = 0; + headerSize = dataSize = sendDataSize = 0; + type_rec = type_send = PIProtocol::None; + devSenderState = devReceiverState = "Unknown"; + devSenderName = devReceiverName = "no device"; + history_rsize_rec = history_rsize_send = "no file"; + history_file_rec.setName("__S__PIProtocol::history_file_rec"); + history_file_send.setName("__S__PIProtocol::history_file_send"); + secTimer->start(1000.); + /*addEvent("receiver started"); + addEvent("receiver stopped"); + addEvent("sender started"); + addEvent("sender stopped"); + addEvent("received"); + addEvent("quality changed"); + addEventHandler(HANDLER(PIProtocol, startReceive)); + addEventHandler(HANDLER(PIProtocol, startSend)); + addEventHandler(HANDLER(PIProtocol, start)); + addEventHandler(HANDLER(PIProtocol, stopReceive)); + addEventHandler(HANDLER(PIProtocol, stopSend)); + addEventHandler(HANDLER(PIProtocol, stop));*/ +} + + +void PIProtocol::init_sender(PIConfig::Entry & b, PIConfig::Entry & sb, const PIString & config) { + int ps, gps; + bool ok, gok, flag, gflag, has_dev = false; + float freq, gfreq; + PIFlags pp(0); + PIString dev, gdev; + + if (sb.isEntryExists("ip") && sb.isEntryExists("device")) { + piCoutObj << "Ambiguous sender type in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + dev = sb.getValue("ip", "", &ok); + gdev = b.getValue("ip", "", &gok); + has_dev = false; + if (ok || gok) { + if (gok && !ok) dev = gdev; + if (gok && ok && (dev != gdev)) { + piCoutObj << "Ambiguous sender type in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + ps = sb.getValue("port", 0, &ok); + gps = b.getValue("port", 0, &gok); + if (ok || gok) { + if (gok && !ok) ps = gps; + if (gok && ok && (ps != gps)) { + piCoutObj << "Ambiguous send port in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + type_send = PIProtocol::Ethernet; + if (eth == 0) eth = new PIEthernet(); + eth->setName("__S__PIProtocol::eth"); + setSenderAddress(dev, ps); + //setReceiverAddress(dev, ps); + has_dev = true; + flag = sb.getValue("reconnectEnabled", true, &ok); + gflag = b.getValue("reconnectEnabled", true, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous \"reconnectEnabled\" flag in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + eth->setReopenEnabled(flag); + } + freq = sb.getValue("reconnectTimeout", 1., &ok); + gfreq = b.getValue("reconnectTimeout", 1., &gok); + if (ok || gok) { + if (gok && !ok) freq = gfreq; + if (gok && ok && (freq != gfreq)) { + piCoutObj << "Ambiguous \"reconnectTimeout\" value in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + eth->setReopenTimeout(freq * 1000); + } + /*if (sendDataPtr_ == 0) + piCoutObj << "Warning: null send data pointer!"; + if (sendDataSize_ == 0) + piCoutObj << "Warning: null send data size!";*/ + } else { + piCoutObj << "Can`t find \"" << name() << ".sender.port\" or \"" << name() << ".port\" in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + } + dev = sb.getValue("device", "", &ok); + gdev = b.getValue("device", "", &gok); + if (ok || gok) { + if (gok && !ok) dev = gdev; + if (gok && ok && (dev != gdev)) { + piCoutObj << "Ambiguous sender type in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + ps = sb.getValue("speed", 0, &ok); + gps = b.getValue("speed", 0, &gok); + if (ok || gok) { + if (gok && !ok) ps = gps; + if (gok && ok && (ps != gps)) { + piCoutObj << "Ambiguous send \"speed\" in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + flag = sb.getValue("parity", false, &ok); + gflag = b.getValue("parity", false, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous send \"parity\" in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + pp.setFlag(PISerial::ParityControl, flag); + } + flag = sb.getValue("twoStopBits", false, &ok); + gflag = b.getValue("twoStopBits", false, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous send \"twoStopBits\" parity in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + pp.setFlag(PISerial::TwoStopBits, flag); + } + } else { + piCoutObj << "Can`t find \"" << name() << ".sender.speed\" or \"" << name() << ".speed\" in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + type_send = PIProtocol::Serial; + if (ser == 0) ser = new PISerial(dev); + ser->setName("__S__PIProtocol::ser"); + setSenderDevice(dev, (PISerial::Speed)ps); + ser->setOutSpeed((PISerial::Speed)ps); + ser->setParameters(pp); + has_dev = true; + /*if (sendDataPtr_ == 0) + piCoutObj << "Warning: null send data pointer!"; + if (sendDataSize_ == 0) + piCoutObj << "Warning: null send data size!";*/ + } + history_write_send = sb.getValue("writeHistory", false, &ok); + bool ghist = b.getValue("writeHistory", false, &gok); + if (ok || gok) { + if (gok && !ok) history_write_send = ghist; + if (gok && ok && (history_write_send != ghist)) { + piCoutObj << "Ambiguous sender history in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + if (history_write_send) { + history_path_send = sb.getValue("historyFile", "./history_" + protName + "_send_" + + PIDate::current().toString("__dd_mm_yyyy_") + + PITime::current().toString("_hh_mm_ss_")).value(); + history_id_send = sb.getValue("historyID", 0, &ok); + if (!ok) { + history_id_send = ushort(protName.toByteArray().checksumPlain32()) + 1; + piCoutObj << "Warning: no sender history ID defined, write with ID = " << history_id_send; + } + history_file_send.open(history_path_send, PIIODevice::WriteOnly); + } + } + freq = sb.getValue("frequency", -1.f, &ok); + gfreq = b.getValue("frequency", -1.f, &gok); + if (gok && !ok) freq = gfreq; + if (gok && ok && (freq != gfreq)) { + piCoutObj << "Ambiguous sender frequency in \"" << config << "\"!"; + devSenderState = "Config error"; + return; + } + if (freq > 0.f && !has_dev) + piCoutObj << "Warning: no sender device and not null send frequency!"; + setSenderFrequency(freq); +} + + +void PIProtocol::init_receiver(PIConfig::Entry & b, PIConfig::Entry & rb, const PIString & config) { + int ps, gps; + bool ok, gok, flag, gflag, has_dev = false; + float freq, gfreq; + PIFlags pp(0); + PIString dev, gdev; + + if (rb.isEntryExists("ip") && rb.isEntryExists("device")) { + piCoutObj << "Ambiguous receiver type in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + dev = rb.getValue("ip", "", &ok); + gdev = b.getValue("ip", "", &gok); + if (ok || gok) { + if (gok && !ok) dev = gdev; + if (gok && ok && (dev != gdev)) { + piCoutObj << "Ambiguous receiver type in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + ps = rb.getValue("port", 0, &ok); + gps = b.getValue("port", 0, &gok); + if (ok || gok) { + if (gok && !ok) ps = gps; + if (gok && ok && (ps != gps)) { + piCoutObj << "Ambiguous receive port in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + type_rec = PIProtocol::Ethernet; + eth = new PIEthernet(); + eth->setName("__S__PIProtocol::eth"); + packet_ext->setDevice(eth); + //setSenderAddress(dev, ps); + setReceiverAddress(dev, ps); + has_dev = true; + flag = rb.getValue("reconnectEnabled", true, &ok); + gflag = b.getValue("reconnectEnabled", true, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous \"reconnectEnabled\" flag in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + eth->setReopenEnabled(flag); + } + freq = rb.getValue("reconnectTimeout", 1., &ok); + gfreq = b.getValue("reconnectTimeout", 1., &gok); + if (ok || gok) { + if (gok && !ok) freq = gfreq; + if (gok && ok && (freq != gfreq)) { + piCoutObj << "Ambiguous \"reconnectTimeout\" value in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + eth->setReopenTimeout(freq * 1000); + } + /*if (recDataPtr == 0) + piCoutObj << "Warning: null receive data pointer!"; + if (recDataSize == 0) + piCoutObj << "Warning: null receive data size!";*/ + } else { + piCoutObj << "Can`t find \"" << name() << ".receiver.port\" or \"" << name() << ".port\" in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + } + dev = rb.getValue("device", "", &ok); + gdev = b.getValue("device", "", &gok); + if (ok || gok) { + if (gok && !ok) dev = gdev; + if (gok && ok && (dev != gdev)) { + piCoutObj << "Ambiguous receiver type in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + ps = rb.getValue("speed", 0, &ok); + gps = b.getValue("speed", 0, &gok); + if (ok || gok) { + if (gok && !ok) ps = gps; + if (gok && ok && (ps != gps)) { + piCoutObj << "Ambiguous receive \"speed\" in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + flag = rb.getValue("parity", false, &ok); + gflag = b.getValue("parity", false, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous receive \"parity\" in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + pp.setFlag(PISerial::ParityControl, flag); + } + flag = rb.getValue("twoStopBits", false, &ok); + gflag = b.getValue("twoStopBits", false, &gok); + if (ok || gok) { + if (gok && !ok) flag = gflag; + if (gok && ok && (flag != gflag)) { + piCoutObj << "Ambiguous receive \"twoStopBits\" parity in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + pp.setFlag(PISerial::TwoStopBits, flag); + } + type_rec = PIProtocol::Serial; + type_send = PIProtocol::Serial; + ser = new PISerial(dev); + ser->setName("__S__PIProtocol::ser"); + packet_ext->setDevice(ser); + //setSenderDevice(dev, (PISerial::Speed)ps); + setReceiverDevice(dev, (PISerial::Speed)ps); + ser->setInSpeed((PISerial::Speed)ps); + ser->setParameters(pp); + ps = rb.getValue("vtime", 1, &ok); + gps = b.getValue("vtime", 1, &gok); + if (ok || gok) { + if (gok && !ok) ps = gps; + if (gok && ok && (ps != gps)) { + piCoutObj << "Ambiguous receive \"vtime\" in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + ser->setVTime(ps); + } + has_dev = true; + /*if (recDataPtr == 0) + piCoutObj << "Warning: null receive data pointer!"; + if (recDataSize == 0) + piCoutObj << "Warning: null receive data size!";*/ + } else { + piCoutObj << "Can`t find \"" << name() << ".receiver.speed\" or \"" << name() << ".speed\" in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + } + history_write_rec = rb.getValue("writeHistory", false, &ok); + bool ghist = b.getValue("writeHistory", false, &gok); + if (ok || gok) { + if (gok && !ok) history_write_rec = ghist; + if (gok && ok && (history_write_rec != ghist)) { + piCoutObj << "Ambiguous receiver history in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + if (history_write_rec) { + history_path_rec = rb.getValue("historyFile", "./history_" + protName + "_rec_" + + PIDate::current().toString("__dd_mm_yyyy_") + + PITime::current().toString("_hh_mm_ss_")).value(); + history_id_rec = rb.getValue("historyID", 0, &ok); + if (!ok) { + history_id_rec = ushort(protName.toByteArray().checksumPlain32()); + piCoutObj << "Warning: no receiver history ID defined, write with ID = " << history_id_rec; + } + history_file_rec.open(history_path_rec, PIIODevice::WriteOnly); + } + } + freq = rb.getValue("frequency", -1.f, &ok); + gfreq = b.getValue("frequency", -1.f, &gok); + if (gok && !ok) freq = gfreq; + if (gok && ok && (freq != gfreq)) { + piCoutObj << "Ambiguous expected frequency in \"" << config << "\"!"; + devReceiverState = "Config error"; + return; + } + if (freq > 0.f && !has_dev) + piCoutObj << "Warning: no receiver device and not null expected frequency!"; + float tm = b.getValue("disconnectTimeout", 3.f); + if (tm <= 0.f) + piCoutObj << "Warning: diconnect timeout <= 0 s!"; + timeout_ = (tm < 0.f) ? 0.f : tm; + setExpectedFrequency(freq); +} + + +void PIProtocol::setReceiverDevice(const PIString & device, PISerial::Speed speed, bool force) { + if (force) { + type_send = type_rec = PIProtocol::Serial; + if (ser == 0) { + ser = new PISerial(); + ser->setName("__S__PIProtocol::ser"); + packet_ext->setDevice(ser); + } + } + if (type_rec == PIProtocol::Serial && ser != 0) { + ser->setDevice(device); + ser->setSpeed(speed); + devReceiverName = device; + devSenderName = device; + } +} + + +void PIProtocol::setReceiverAddress(const PIString & ip, int port, bool force) { + if (force) { + type_rec = PIProtocol::Ethernet; + if (eth == 0) { + eth = new PIEthernet(); + eth->setName("__S__PIProtocol::eth"); + packet_ext->setDevice(eth); + } + } + if (type_rec == PIProtocol::Ethernet && eth != 0) { + eth->setReadAddress(ip, port); + if (ip.trimmed().isEmpty()) devReceiverName = "no ip"; + else devReceiverName = ip + ":" + PIString::fromNumber(port); + } +} + + +void PIProtocol::setSenderDevice(const PIString & device, PISerial::Speed speed, bool force) { + if (force) { + type_send = type_rec = PIProtocol::Serial; + if (ser == 0) ser = new PISerial(); + ser->setName("__S__PIProtocol::ser"); + } + if (type_send == PIProtocol::Serial && ser != 0) { + ser->setDevice(device); + ser->setSpeed(speed); + ser->open(); + devSenderName = device; + } +} + + +void PIProtocol::setSenderAddress(const PIString & ip, int port, bool force) { + if (force) { + type_send = PIProtocol::Ethernet; + if (eth == 0) eth = new PIEthernet(); + eth->setName("__S__PIProtocol::eth"); + } + if (type_send == PIProtocol::Ethernet && eth != 0) { + eth->setSendAddress(ip, port); + if (ip.isEmpty()) devSenderName = "no ip"; + else devSenderName = ip + ":" + PIString::fromNumber(port); + } +} + + +void PIProtocol::setSenderIP(const PIString & ip, bool force) { + if (force) { + type_send = PIProtocol::Ethernet; + if (eth == 0) eth = new PIEthernet(); + } + if (type_send == PIProtocol::Ethernet && eth != 0) { + eth->setSendIP(ip); + if (ip.isEmpty()) devSenderName = "no ip"; + else devSenderName = ip + ":" + PIString::fromNumber(eth->sendPort()); + } +} + + +void PIProtocol::setSenderPort(int port, bool force) { + if (force) { + type_send = PIProtocol::Ethernet; + if (eth == 0) eth = new PIEthernet(); + eth->setName("__S__PIProtocol::eth"); + } + if (type_send == PIProtocol::Ethernet && eth != 0) { + eth->setSendPort(port); + if (eth->sendIP().isEmpty()) devSenderName = "no ip"; + else devSenderName = eth->sendIP() + ":" + PIString::fromNumber(port); + } +} + + +void PIProtocol::setExpectedFrequency(float frequency) { + exp_freq = frequency; + changeDisconnectTimeout(); +} + + +void PIProtocol::changeDisconnectTimeout() { + pckt_cnt_max = int(round(timeout_ * exp_freq)); + if (pckt_cnt_max < 3) pckt_cnt_max = 3; + last_packets.resize(pckt_cnt_max); +} + + +void PIProtocol::startReceive(float exp_frequency) { + if (exp_frequency > 0.f) exp_freq = exp_frequency; + //if (type_rec == PIProtocol::Serial) ser->start(); + //if (type_rec == PIProtocol::Ethernet) eth->start(); + packet_ext->startThreadedRead(); + msleep(1); + check_state(); + if (exp_freq <= 0.f) return; + setExpectedFrequency(exp_freq); + diagTimer->start(1000. / exp_freq); + diag_tm.reset(); + receiverStarted(); +} + + +void PIProtocol::startSend(float frequency) { + //cout << "** start send " << send_freq << ", " << frequency << endl; + if (frequency > 0.f) send_freq = frequency; + msleep(1); + check_state(); + if (send_freq <= 0.f) return; + sendTimer->start(1000. / send_freq); + diag_tm.reset(); + senderStarted(); +} + + +void PIProtocol::stopReceive() { + //if (type_rec == PIProtocol::Serial) ser->stop(); + //if (type_rec == PIProtocol::Ethernet) eth->stop(); + packet_ext->stop(); + diagTimer->stop(); + receiverStopped(); +} + + +bool PIProtocol::receiveEvent(void * t, uchar * data, int size) { + PIProtocol * p = (PIProtocol * )t; + if (!p->receive(data, size)) return false; + p->work = true; + //p->lock(); + if (p->validate()) { + if (p->history_write_rec) { + p->history_file_rec.writeToBinLog(p->history_id_rec, data, size); + p->history_rsize_rec.setReadableSize(p->history_file_rec.pos()); + } + p->received(true); + //p->unlock(); + p->ifreq = p->diag_tm.elapsed_m(); + if (p->ifreq > 0.) p->ifreq = 1000. / p->ifreq; + p->diag_tm.reset(); + p->receive_count++; + p->packets_in_sec++; + p->bytes_in_sec += size; + p->cur_pckt = 1; + if (p->ret_func != 0) p->ret_func(p); + if (p->mp_owner != 0) PIMultiProtocolBase::receiveEvent(p->mp_owner, p, true, data, size); + return true; + } + p->received(false); + //p->unlock(); + p->wrong_count++; + if (p->mp_owner != 0) PIMultiProtocolBase::receiveEvent(p->mp_owner, p, false, data, size); + return false; +} + + +void PIProtocol::diagEvent(void * t, int) { + PIProtocol * p = (PIProtocol * )t; + p->calc_freq(); + p->calc_diag(); + p->check_state(); + if (p->ser != 0) p->missed_count = p->packet_ext->missedPackets(); +} + + +void PIProtocol::secEvent(void * t, int ) { + PIProtocol * p = (PIProtocol * )t; + p->speedIn = PIString::readableSize(p->bytes_in_sec) + "/s"; + p->speedOut = PIString::readableSize(p->bytes_out_sec) + "/s"; + p->bytes_in_sec = p->bytes_out_sec = p->packets_in_sec = p->packets_out_sec = 0; + if (p->ser != 0) p->missed_count = p->packet_ext->missedPackets(); +} + + +void PIProtocol::calc_diag() { + PIProtocol::Quality diag; + if (!work) { + diag = PIProtocol::Unknown; + return; + } + if (pckt_cnt < pckt_cnt_max) { + last_packets[pckt_cnt] = cur_pckt; + pckt_cnt++; + } else { + packets[(int)last_packets.back()]--; + if (!last_packets.isEmpty()) last_packets.pop_back(); + last_packets.push_front(cur_pckt); + } + packets[(int)cur_pckt]++; + cur_pckt = 0; + float good_percents; + good_percents = (float)packets[1] / pckt_cnt * 100.f; + if (good_percents == 0.f) diag = PIProtocol::Failure; + else if (good_percents <= 20.f) diag = PIProtocol::Bad; + else if (good_percents > 20.f && good_percents <= 80.f) diag = PIProtocol::Average; + else diag = PIProtocol::Good; + if (diag != net_diag) { + qualityChanged(diag, net_diag); + net_diag = diag; + } +} + + +void PIProtocol::calc_freq() { + float tf;// = float(1000.f / diagTimer->elapsed_m()); + tf = immediate_freq = ifreq; + ifreq = 0.f; + if (last_freq.size_s() >= pckt_cnt_max && last_freq.size_s() > 0) last_freq.pop_front(); + last_freq.push_back(tf); + tf = last_freq[0]; + for (uint i = 1; i < last_freq.size(); ++i) + tf += last_freq[i]; + integral_freq = tf / last_freq.size(); +} + + +void PIProtocol::check_state() { + if (type_rec == PIProtocol::Serial) { + if (ser != 0) { + if (ser->isOpened()) devReceiverState = "Opened"; + else devReceiverState = "Not opened"; + } + else devReceiverState = "Not exists"; + } + if (type_rec == PIProtocol::Ethernet) { + if (eth != 0) { + if (eth->isOpened()) devReceiverState = "Opened"; + else devReceiverState = "Not opened"; + } + else devReceiverState = "Not exists"; + } + if (type_send == PIProtocol::Serial) { + if (ser != 0) { + if (ser->isOpened()) devSenderState = "Opened"; + else devSenderState = "Not opened"; + } + else devSenderState = "Not exists"; + } + if (type_send == PIProtocol::Ethernet) { + if (eth != 0) { + if (eth->isOpened()) devSenderState = "Opened"; + else devSenderState = "Not opened"; + } + else devSenderState = "Not exists"; + } +} + + +void PIProtocol::send(const void * data, int size, bool direct) { + if (!direct) { + if (data == 0 || size == 0) return; + if (!aboutSend()) return; + } + if (history_write_send) { + history_file_send.writeToBinLog(history_id_send, data, size); + history_rsize_send.setReadableSize(history_file_send.pos()); + } + if (type_send == PIProtocol::Serial) + if (ser->send(data, size)) { + send_count++; + packets_out_sec++; + bytes_out_sec += size; + } + if (type_send == PIProtocol::Ethernet) + if (eth->send(data, size)) { + send_count++; + packets_out_sec++; + bytes_out_sec += size; + } +} + + +void PIProtocol::send() { + //lock(); + //memcpy(packet, sendDataPtr, sendDataSize); + //unlock(); + //cout << "**send" << endl; + if (!aboutSend()) return; + if (sendDataPtr == 0 || sendDataSize == 0) return; + if (history_write_send) { + history_file_send.writeToBinLog(history_id_send, sendDataPtr, sendDataSize); + history_rsize_send.setReadableSize(history_file_send.pos()); + } + if (type_send == PIProtocol::Serial) + if (ser->send(sendDataPtr, sendDataSize)) { + send_count++; + packets_out_sec++; + bytes_out_sec += sendDataSize; + } + if (type_send == PIProtocol::Ethernet) + if (eth->send(sendDataPtr, sendDataSize)) { + send_count++; + packets_out_sec++; + bytes_out_sec += sendDataSize; + } +} diff --git a/src/io/piprotocol.h b/src/io/piprotocol.h new file mode 100755 index 00000000..5900e106 --- /dev/null +++ b/src/io/piprotocol.h @@ -0,0 +1,249 @@ +/*! \file piprotocol.h + * \brief Highly configurable from file I/O channel +*/ +/* + PIP - Platform Independent Primitives + Protocol, input/output channel (COM, UDP) + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Bychkov Andrey wapmobil@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIPROTOCOL_H +#define PIPROTOCOL_H + +#include "piserial.h" +#include "piethernet.h" +#include "pipacketextractor.h" +#include "pitimer.h" +#include "piconfig.h" +#include "math.h" + +class PIProtocol; + +class PIP_EXPORT PIMultiProtocolBase: protected PIObject +{ + PIOBJECT(PIMultiProtocolBase) + friend class PIProtocol; +public: + PIMultiProtocolBase() {;} + virtual ~PIMultiProtocolBase() {;} + +protected: + virtual void received(PIProtocol * prot, bool corrected, uchar * data, int size) {;} + +private: + static void receiveEvent(PIMultiProtocolBase * p, PIProtocol * prot, bool corrected, uchar * data, int size) {p->mutex_receive.lock(); p->received(prot, corrected, data, size); p->mutex_receive.unlock();} + + PIMutex mutex_receive; + +}; + +typedef void (*ReceiveFunc)(void * ); + +/// events: +/// void receiverStarted() +/// void receiverStopped() +/// void senderStarted() +/// void senderStopped() +/// void received(bool validate_is_ok) +/// void qualityChanged(PIProtocol::Quality old_quality, PIProtocol::Quality new_quality) +/// +/// handlers: +/// void startReceive(float exp_frequency = -1.f) +/// void stopReceive() +/// void startSend(float frequency = -1.f) +/// void stopSend() +/// void start() +/// void stop() +/// void send() +/// void send(const void * data, int size, bool direct = false) +class PIP_EXPORT PIProtocol: public PIObject +{ + PIOBJECT(PIProtocol) + friend class PIMultiProtocolBase; + friend class PIMultiProtocol; + enum Type {None, Serial, Ethernet}; +public: + + //! Contructs an empty unconfigured protocol + PIProtocol(): PIObject() {init();} + + //! Contructs protocol configured from file "config", config file section "name" + PIProtocol(const PIString & config, const PIString & name, void * recHeaderPtr = 0, int recHeaderSize = 0, + void * recDataPtr = 0, int recDataSize = 0, void * sendDataPtr = 0, int sendDataSize = 0); // from config + + virtual ~PIProtocol(); + + //! Connection quality + enum Quality { + Unknown /** Unknown, no one packet received yet */ = 1, + Failure /** No connection, no one correct packet received for last period */ = 2, + Bad /** Bad connection, correct packets received <= 20% */ = 3, + Average /** Average connection, correct packets received > 20% and <= 80% */ = 4, + Good /** Good connection, correct packets received > 80% */ = 5 + }; + + EVENT_HANDLER0(void, startReceive) {startReceive(-1.f);} + EVENT_HANDLER1(void, startReceive, float, exp_frequency); // if "frequency = -1" used last passed value + EVENT_HANDLER0(void, stopReceive); + void setExpectedFrequency(float frequency); // for connection quality diagnostic + void setReceiverDevice(const PIString & device, PISerial::Speed speed, bool force = false); // for Serial + void setReceiverData(void * dataPtr, int dataSize) {this->dataPtr = (uchar * )dataPtr; this->dataSize = dataSize; packet_ext->setHeader(PIByteArray(headerPtr, headerSize)); packet_ext->setPayloadSize(dataSize); packet_ext->setPacketSize(dataSize);} + void setReceiverDataHeader(void * headerPtr, int headerSize) {this->headerPtr = (uchar * )headerPtr; this->headerSize = headerSize; packet_ext->setHeader(PIByteArray(headerPtr, headerSize)); packet_ext->setPayloadSize(dataSize); packet_ext->setPacketSize(dataSize);} + void setReceiverAddress(const PIString & ip, int port, bool force = false); // for Ethernet + void setReceiverParameters(PIFlags parameters) {if (type_rec == PIProtocol::Serial || type_send == PIProtocol::Serial) ser->setParameters(parameters);} // for Serial + void setReceiveSlot(ReceiveFunc slot) {ret_func = slot;} + float expectedFrequency() const {return exp_freq;} + + EVENT_HANDLER0(void, startSend) {startSend(-1.f);} // if "frequency = -1" used last passed value + EVENT_HANDLER1(void, startSend, float, frequency); // if "frequency = -1" used last passed value + EVENT_HANDLER0(void, stopSend) {sendTimer->stop(); senderStopped();} + void setSenderFrequency(float frequency) {send_freq = frequency;} + void setSenderDevice(const PIString & device, PISerial::Speed speed, bool force = false); // for Serial + void setSenderData(void * dataPtr, int dataSize) {sendDataPtr = (uchar * )dataPtr; sendDataSize = dataSize;} + void setSenderAddress(const PIString & ip, int port, bool force = false); // for Ethernet + void setSenderIP(const PIString & ip, bool force = false); // for Ethernet + void setSenderPort(int port, bool force = false); // for Ethernet + void setSenderParameters(PIFlags parameters) {if (type_send == PIProtocol::Serial) ser->setParameters(parameters);} // for Serial + float senderFrequency() const {return send_freq;} + + EVENT_HANDLER0(void, start) {startReceive(); startSend();} + EVENT_HANDLER0(void, stop) {stopReceive(); stopSend();} + EVENT_HANDLER0(void, send); + EVENT_HANDLER2(void, send, const void *, data, int, size) {send(data, size, false);} + EVENT_HANDLER3(void, send, const void *, data, int, size, bool, direct); + + void setName(const PIString & name) {protName = name; PIObject::setName(name);} + PIString name() const {return protName;} + void setDisconnectTimeout(float timeout) {timeout_ = timeout; changeDisconnectTimeout();} + float disconnectTimeout() const {return timeout_;} + const float * disconnectTimeout_ptr() const {return &timeout_;} + float immediateFrequency() const {return immediate_freq;} + float integralFrequency() const {return integral_freq;} + const float * immediateFrequency_ptr() const {return &immediate_freq;} + const float * integralFrequency_ptr() const {return &integral_freq;} + ullong receiveCountPerSec() const {return packets_in_sec;} + const ullong * receiveCountPerSec_ptr() const {return &packets_in_sec;} + ullong sendCountPerSec() const {return packets_out_sec;} + const ullong * sendCountPerSec_ptr() const {return &packets_out_sec;} + ullong receiveBytesPerSec() const {return bytes_in_sec;} + const ullong * receiveBytesPerSec_ptr() const {return &bytes_in_sec;} + ullong sendBytesPerSec() const {return bytes_out_sec;} + const ullong * sendBytesPerSec_ptr() const {return &bytes_out_sec;} + ullong receiveCount() const {return receive_count;} + const ullong * receiveCount_ptr() const {return &receive_count;} + ullong wrongCount() const {return wrong_count;} + const ullong * wrongCount_ptr() const {return &wrong_count;} + ullong sendCount() const {return send_count;} + const ullong * sendCount_ptr() const {return &send_count;} + ullong missedCount() const {return missed_count;} + const ullong * missedCount_ptr() const {return &missed_count;} + PIProtocol::Quality quality() const {return net_diag;} // receive quality + const int * quality_ptr() const {return (int * )&net_diag;} // receive quality pointer + PIString receiverDeviceName() const {return devReceiverName;} + PIString senderDeviceName() const {return devSenderName;} + PIString receiverDeviceState() const {return devReceiverState;} + const PIString * receiverDeviceState_ptr() const {return &devReceiverState;} + PIString senderDeviceState() const {return devSenderState;} + const PIString * senderDeviceState_ptr() const {return &devSenderState;} + PIString receiveSpeed() const {return speedIn;} + const PIString * receiveSpeed_ptr() const {return &speedIn;} + PIString sendSpeed() const {return speedOut;} + const PIString * sendSpeed_ptr() const {return &speedOut;} + PIString receiverHistorySize() const {return history_rsize_rec;} + const PIString * receiverHistorySize_ptr() const {return &history_rsize_rec;} + PIString senderHistorySize() const {return history_rsize_send;} + const PIString * senderHistorySize_ptr() const {return &history_rsize_send;} + bool writeReceiverHistory() const {return history_write_rec;} + const bool * writeReceiverHistory_ptr() const {return &history_write_rec;} + bool writeSenderHistory() const {return history_write_send;} + const bool * writeSenderHistory_ptr() const {return &history_write_send;} + + void * receiveData() {return dataPtr;} + void * sendData() {return sendDataPtr;} + + PIPacketExtractor * packetExtractor() {return packet_ext;} + PIByteArray lastHeader() {return packet_ext->lastHeader();} + + EVENT0(receiverStarted) + EVENT0(receiverStopped) + EVENT0(senderStarted) + EVENT0(senderStopped) + EVENT1(received, bool, validate_is_ok) + EVENT2(qualityChanged, PIProtocol::Quality, new_quality, PIProtocol::Quality, old_quality) + +protected: + virtual bool receive(uchar * data, int size) {if (dataPtr != 0) memcpy(dataPtr, data, size); return true;} // executed when raw data received, break if 'false' return + virtual bool validate() {return true;} // function for validate algorithm and save data from dataPtr to external struct + virtual bool headerValidate(uchar * src, uchar * rec, int size) {for (int i = 0; i < size; ++i) if (src[i] != rec[i]) return false; return true;} // function for validate header (COM-port and headerSize > 0) + virtual uint checksum_i(void * data, int size) { // function for checksum (uint) + uint c = 0; + for (int i = 0; i < size; ++i) + c += ((uchar*)data)[i]; + return ~(c + 1); + } + virtual uchar checksum_c(void * data, int size) { // function for checksum (uchar) + uchar c = 0; + for (int i = 0; i < size; ++i) + c += ((uchar*)data)[i]; + return ~(c + 1); + } + virtual bool aboutSend() {return true;} // executed before send data, if return 'false' then data is not sending + + void init(); + void init_sender(PIConfig::Entry & b, PIConfig::Entry & sb, const PIString & config); + void init_receiver(PIConfig::Entry & b, PIConfig::Entry & rb, const PIString & config); + void check_state(); + void calc_freq(); + void calc_diag(); + + PISerial * ser; + PIEthernet * eth; + uint dataSize, headerSize, sendDataSize; + uchar * dataPtr, * headerPtr, * sendDataPtr; + +private: + static void sendEvent(void * e, int) {((PIProtocol * )e)->send();} + static bool receiveEvent(void * t, uchar * data, int size); + static bool headerValidateEvent(void * t, uchar * src, uchar * rec, int size) {return ((PIProtocol * )t)->headerValidate(src, rec, size);} + static void diagEvent(void * t, int); + static void secEvent(void * t, int); + + void setMultiProtocolOwner(PIMultiProtocolBase * mp) {mp_owner = mp;} + PIMultiProtocolBase * multiProtocolOwner() const {return mp_owner;} + void changeDisconnectTimeout(); + + ReceiveFunc ret_func; + PIPacketExtractor * packet_ext; + PITimer * diagTimer, * sendTimer, * secTimer; + PITimeMeasurer diag_tm; + PIMultiProtocolBase * mp_owner; + PIProtocol::Type type_send, type_rec; + PIProtocol::Quality net_diag; + PIDeque last_freq; + PIDeque last_packets; + PIString protName, devReceiverName, devReceiverState, devSenderName, devSenderState, speedIn, speedOut; + PIString history_path_rec, history_path_send, history_rsize_rec, history_rsize_send; + PIFile history_file_rec, history_file_send; + ushort history_id_rec, history_id_send; + bool work, new_mp_prot, history_write_rec, history_write_send; + float exp_freq, send_freq, ifreq, immediate_freq, integral_freq, timeout_; + int packets[2], pckt_cnt, pckt_cnt_max; + char cur_pckt; + ullong wrong_count, receive_count, send_count, missed_count, packets_in_sec, packets_out_sec, bytes_in_sec, bytes_out_sec; + +}; + +#endif // PIPROTOCOL_H diff --git a/src/io/piserial.cpp b/src/io/piserial.cpp new file mode 100755 index 00000000..50355682 --- /dev/null +++ b/src/io/piserial.cpp @@ -0,0 +1,664 @@ +/* + PIP - Platform Independent Primitives + COM + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Bychkov Andrey wapmobil@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piserial.h" +#include "piconfig.h" +#include "pidir.h" + + +/*! \class PISerial + * \brief Serial device + * + * \section PISerial_sec0 Synopsis + * This class provide access to serial device, e.g. COM port. It can read, + * write, wait for write. There are several read and write functions. + * + * + */ + +REGISTER_DEVICE(PISerial); + + +PISerial::PISerial(): PIIODevice("", ReadWrite) { + _init(); +} + + +PISerial::PISerial(const PIString & device_, PISerial::Speed speed_, PIFlags params_): PIIODevice(device_, ReadWrite) { + _init(); + setPath(device_); + setSpeed(speed_); + setParameters(params_); +} + + +PISerial::~PISerial() { + piMonitor.serials--; +} + + +void PISerial::_init() { + fd = -1; + piMonitor.serials++; + setPriority(piHigh); + block_read = true; + vtime = 1; +#ifdef WINDOWS + block_write = true; + hCom = 0; +#endif + setParameters(0); + setSpeed(S115200); + setDataBitsCount(8); + //init(); +} + + +void PISerial::setParameter(PISerial::Parameters parameter, bool on) { + PIFlags cp = (PIFlags)(property("parameters").toInt()); + cp.setFlag(parameter, on); + setParameters(cp); +} + + +bool PISerial::isParameterSet(PISerial::Parameters parameter) const { + PIFlags cp = (PIFlags)(property("parameters").toInt()); + return cp[parameter]; +} + + +bool PISerial::setPin(int number, bool on) { + switch (number) { + case 1: return setCAR(on); break; + case 2: return setSR(on); break; + case 3: return setST(on); break; + case 4: return setDTR(on); break; + case 5: + piCoutObj << "Pin number 5 is ground"; + return false; + case 6: return setDSR(on); break; + case 7: return setRTS(on); break; + case 8: return setCTS(on); break; + case 9: return setRNG(on); break; + default: + piCoutObj << "Pin number " << number << " doesn`t exists!"; + return false; + } + return false; +} + + +bool PISerial::isPin(int number) const { + switch (number) { + case 1: return isCAR(); break; + case 2: return isSR(); break; + case 3: return isST(); break; + case 4: return isDTR(); break; + case 5: return false; + case 6: return isDSR(); break; + case 7: return isRTS(); break; + case 8: return isCTS(); break; + case 9: return isRNG(); break; + default: + piCoutObj << "Pin number " << number << " doesn`t exists!"; + return false; + } + return false; +} + + +bool PISerial::setBit(int bit, bool on, const PIString & bname) { +#ifndef WINDOWS + if (fd < 0) { + piCoutObj << "setBit" << bname << " error: \"" << path() << "\" is not opened!"; + return false; + } + if (ioctl(fd, on ? TIOCMBIS : TIOCMBIC, &bit) < 0) { + piCoutObj << "setBit" << bname << " error: " << errorString(); + return false; + } + return true; +#else + piCoutObj << "setBit" << bname << " doesn`t implemented on Windows, sorry :-("; + return false; +#endif +} + + +bool PISerial::isBit(int bit, const PIString & bname) const { +#ifndef WINDOWS + if (fd < 0) { + piCoutObj << "isBit" << bname << " error: \"" << path() << "\" is not opened!"; + return false; + } + int ret = 0; + if (ioctl(fd, TIOCMGET, &ret) < 0) + piCoutObj << "isBit" << bname << " error: " << errorString(); + return ret & bit; +#else + piCoutObj << "isBit" << bname << " doesn`t implemented on Windows, sorry :-("; + return false; +#endif +} + + +bool PISerial::closeDevice() { + if (!isInitialized()) return true; + if (isRunning()) { + stop(); + PIThread::terminate(); + } + if (fd != -1) { +#ifdef WINDOWS + SetCommState(hCom, &sdesc); + SetCommMask(hCom, mask); + CloseHandle(hCom); + hCom = 0; +#else + tcsetattr(fd, TCSANOW, &sdesc); + ::close(fd); +#endif + fd = -1; + } + return true; +} + + +int PISerial::convertSpeed(PISerial::Speed speed) { + switch (speed) { + case S50: return B50; + case S75: return B75; + case S110: return B110; + case S300: return B300; + case S600: return B600; + case S1200: return B1200; + case S2400: return B2400; + case S4800: return B4800; + case S9600: return B9600; + case S19200: return B19200; + case S38400: return B38400; + case S57600: return B57600; + case S115200: return B115200; + case S1500000: return B1500000; + case S2000000: return B2000000; + case S2500000: return B2500000; + case S3000000: return B3000000; + case S3500000: return B3500000; + case S4000000: return B4000000; + default: break; + } + return B115200; +} + + +/** \brief Advanced read function +* \details Read to pointer "read_to" no more than "max_size" and no longer +* than "timeout_ms" milliseconds. If "timeout_ms" < 0 function will be +* wait forever until "max_size" will be readed. If size <= 0 function +* immediate returns \b false. For read data with unknown size use function +* \a readData(). +* \returns \b True if readed bytes count = "max_size", else \b false +* \sa \a readData() */ +bool PISerial::read(void * data, int size, double timeout_ms) { + if (data == 0 || size <= 0) return false; + int ret, all = 0; + if (timeout_ms > 0.) { + setReadIsBlocking(false); + all = read(data, 1); + tm_.reset(); + while (all < size && tm_.elapsed_m() < timeout_ms) { + ret = read(&((uchar * )data)[all], size - all); + if (ret > 0) all += ret; + else msleep(1); + } + received(data, all); + return (all == size); + } else { + setReadIsBlocking(true); + all = read(data, 1); + while (all < size) { + ret = read(&((uchar * )data)[all], size - all); + if (ret > 0) all += ret; + } + received(data, all); + return (all == size); + } + return false; +} + + +/** \brief Advanced read function +* \details Read all or no more than "size" and no longer than +* "timeout_ms" milliseconds. If "timeout_ms" < 0 function will be +* wait forever until "size" will be readed. If "size" <= 0 +* function will be read all until "timeout_ms" elaped. \n If size <= 0 +* and "timeout_ms" <= 0 function immediate returns empty string. +* \n This function similar to \a readData() but returns data as string. +* \sa \a readData() */ +PIString PISerial::read(int size, double timeout_ms) { + PIString str; + if (size <= 0 && timeout_ms <= 0.) return str; + int ret, all = 0; + uchar td[1024]; + if (timeout_ms > 0.) { + setReadIsBlocking(false); + tm_.reset(); + if (size <= 0) { + while (tm_.elapsed_m() < timeout_ms) { + ret = read(td, 1024); + if (ret <= 0) msleep(1); + else str << PIString((char*)td, ret); + } + } else { + while (all < size && tm_.elapsed_m() < timeout_ms) { + ret = read(td, size - all); + if (ret <= 0) msleep(1); + else { + str << PIString((char*)td, ret); + all += ret; + } + } + } + } else { + setReadIsBlocking(true); + all = read(td, 1); + str << PIString((char*)td, all); + while (all < size) { + ret = read(td, size - all); + if (ret <= 0) msleep(1); + else { + str << PIString((char*)td, ret); + all += ret; + } + } + } + received(str.data(), str.size_s()); + return str; +} + + +/** \brief Advanced read function +* \details Read all or no more than "size" and no longer than +* "timeout_ms" milliseconds. If "timeout_ms" < 0 function will be +* wait forever until "size" will be readed. If "size" <= 0 +* function will be read all until "timeout_ms" elaped. \n If size <= 0 +* and "timeout_ms" <= 0 function immediate returns empty byte array. +* \n This function similar to \a read() but returns data as byte array. +* \sa \a read() */ +PIByteArray PISerial::readData(int size, double timeout_ms) { + PIByteArray str; + if (size <= 0 && timeout_ms <= 0.) return str; + int ret, all = 0; + uchar td[1024]; + if (timeout_ms > 0.) { + setReadIsBlocking(false); + tm_.reset(); + if (size <= 0) { + while (tm_.elapsed_m() < timeout_ms) { + ret = read(td, 1024); + if (ret <= 0) msleep(1); + else str.append(td, ret); + } + } else { + while (all < size && tm_.elapsed_m() < timeout_ms) { + ret = read(td, size - all); + if (ret <= 0) msleep(1); + else { + str.append(td, ret); + all += ret; + } + } + } + } else { + setReadIsBlocking(true); + all = read(td, 1); + str.append(td, all); + while (all < size) { + ret = read(td, size - all); + if (ret <= 0) msleep(1); + else { + str.append(td, ret); + all += ret; + } + } + } + received(str.data(), str.size_s()); + return str; +} + + +bool PISerial::openDevice() { + //piCout << "ser open" << path(); + if (path().isEmpty()) return false; +#ifdef WINDOWS + DWORD ds = 0, sm = 0; + if (isReadable()) {ds |= GENERIC_READ; sm |= FILE_SHARE_READ;} + if (isWriteable()) {ds |= GENERIC_WRITE; sm |= FILE_SHARE_WRITE;} + PIString wp = "//./" + path(); + hCom = CreateFileA(wp.data(), ds, sm, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0); + if (hCom == INVALID_HANDLE_VALUE) { + piCoutObj << "Unable to open \"" << path() << "\""; + fd = -1; + return false; + } + fd = 0; +#else + int om = 0; + switch (mode()) { + case PIIODevice::ReadOnly: om = O_RDONLY; break; + case PIIODevice::WriteOnly: om = O_WRONLY; break; + case PIIODevice::ReadWrite: om = O_RDWR; break; + } + //cout << "init ser " << path_ << " mode " << om << " param " << params << endl; + fd = ::open(path().data(), O_NOCTTY | om); + if (fd == -1) { + piCoutObj << "Unable to open \"" << path() << "\""; + return false; + } + tcgetattr(fd, &desc); + sdesc = desc; + //piCoutObj << "Initialized " << path_; +#endif + applySettings(); + return true; +} + + +void PISerial::applySettings() { +#ifdef WINDOWS + if (fd == -1) return; + COMMTIMEOUTS times; + times.ReadIntervalTimeout = block_read ? vtime : MAXDWORD; + times.ReadTotalTimeoutConstant = block_read ? 0 : 1; + times.ReadTotalTimeoutMultiplier = block_read ? 0 : MAXDWORD; + times.WriteTotalTimeoutConstant = 0; + times.WriteTotalTimeoutMultiplier = block_write ? 0 : 1; + if (SetCommTimeouts(hCom, ×) == -1) + piCoutObj << "Unable to set timeouts for \"" << path() << "\""; + GetCommMask(hCom, &mask); + SetCommMask(hCom, EV_RXCHAR); + GetCommState(hCom, &sdesc); + desc = sdesc; + desc.DCBlength = sizeof(desc); + desc.BaudRate = convertSpeed(outSpeed()); + if (dataBitsCount() >= 5 && dataBitsCount() <= 8) + desc.ByteSize = dataBitsCount(); + else + desc.ByteSize = 8; + PIFlags params = parameters(); + if (params[PISerial::ParityControl]) { + desc.fParity = 1; + desc.Parity = params[PISerial::ParityOdd] ? 1 : 2; + } + desc.StopBits = params[PISerial::TwoStopBits] ? TWOSTOPBITS : ONESTOPBIT; + if (SetCommState(hCom, &desc) == -1) { + piCoutObj << "Unable to set comm state for \"" << path() << "\""; + return; + } +#else + if (fd == -1) return; + tcgetattr(fd, &desc); + desc.c_oflag = desc.c_lflag = desc.c_cflag = 0; + desc.c_iflag = IGNBRK; + desc.c_cflag = CLOCAL | HUPCL; + switch (dataBitsCount()) { + case 5: desc.c_cflag |= (CSIZE & CS5); break; + case 6: desc.c_cflag |= (CSIZE & CS6); break; + case 7: desc.c_cflag |= (CSIZE & CS7); break; + case 8: default: desc.c_cflag |= (CSIZE & CS8); break; + }; + if (isReadable()) desc.c_cflag |= CREAD; + PIFlags params = parameters(); + if (params[PISerial::TwoStopBits]) desc.c_cflag |= CSTOPB; + if (params[PISerial::ParityControl]) { + desc.c_iflag |= INPCK; + desc.c_cflag |= PARENB; + if (params[PISerial::ParityOdd]) desc.c_cflag |= PARODD; + } + desc.c_cc[VMIN] = 1; + desc.c_cc[VTIME] = vtime; + + cfsetispeed(&desc, convertSpeed(inSpeed())); + cfsetospeed(&desc, convertSpeed(outSpeed())); + + tcflush(fd, TCIOFLUSH); + fcntl(fd, F_SETFL, block_read ? 0 : O_NONBLOCK); + + if(tcsetattr(fd, TCSANOW, &desc) < 0) { + piCoutObj << "Can`t set attributes for \"" << path() << "\""; + return; + } +#endif +} + + +void PISerial::setReadIsBlocking(bool yes) { + block_read = yes; +#ifdef WINDOWS + COMMTIMEOUTS times; + times.ReadIntervalTimeout = block_read ? vtime : MAXDWORD; + times.ReadTotalTimeoutConstant = block_read ? 0 : 1; + times.ReadTotalTimeoutMultiplier = block_read ? 0 : MAXDWORD; + times.WriteTotalTimeoutConstant = 0; + times.WriteTotalTimeoutMultiplier = block_write ? 0 : 1; + if (isOpened()) SetCommTimeouts(hCom, ×); +#else + if (isOpened()) fcntl(fd, F_SETFL, yes ? 0 : O_NONBLOCK); +#endif +} + + +/** \brief Basic read function +* \details Read to pointer "read_to" no more than "max_size". If read is +* set to blocking this function will be wait at least one byte. +* \returns Readed bytes count +* \sa \a readData() */ +int PISerial::read(void * read_to, int max_size) { +#ifdef WINDOWS + if (!canRead()) return -1; + WaitCommEvent(hCom, 0, 0); + ReadFile(hCom, read_to, max_size, &readed, 0); + return readed; +#else + if (!canRead()) return -1; + return ::read(fd, read_to, max_size); +#endif +} + + +int PISerial::write(const void * data, int max_size, bool wait) { + //piCoutObj << "send " << max_size << ": " << PIString((char*)data, max_size); + if (fd == -1 || !canWrite()) { + //piCoutObj << "Can`t write to uninitialized COM"; + return -1; + } +#ifdef WINDOWS + if (block_write != wait) { + block_write = wait; + setReadIsBlocking(block_read); + } + DWORD wrote; + WriteFile(hCom, data, max_size, &wrote, 0); +#else + int wrote; + wrote = ::write(fd, data, max_size); + if (wait) tcdrain(fd); +#endif + return (int)wrote; + //piCoutObj << "Error while sending"; + //piCoutObj << "Wrote " << wrote << " bytes in " << path_; +} + + +bool PISerial::configureDevice(const void * e_main, const void * e_parent) { + PIConfig::Entry * em = (PIConfig::Entry * )e_main; + PIConfig::Entry * ep = (PIConfig::Entry * )e_parent; + setDevice(readDeviceSetting("device", device(), em, ep)); + setSpeed((PISerial::Speed)(readDeviceSetting("speed", (int)outSpeed(), em, ep))); + setDataBitsCount(readDeviceSetting("dataBitsCount", dataBitsCount(), em, ep)); + setParameter(PISerial::ParityControl, readDeviceSetting("parityControl", isParameterSet(PISerial::ParityControl), em, ep)); + setParameter(PISerial::ParityOdd, readDeviceSetting("parityOdd", isParameterSet(PISerial::ParityOdd), em, ep)); + setParameter(PISerial::TwoStopBits, readDeviceSetting("twoStopBits", isParameterSet(PISerial::TwoStopBits), em, ep)); + return true; +} + + +PIString PISerial::constructFullPath() const { + PIString ret(fullPathPrefix() + "://"); + ret << path() << ":" << int(inSpeed()) << ":" << dataBitsCount(); + if (parameters()[ParityControl]) { + if (parameters()[ParityOdd]) ret << ":O"; + else ret << ":E"; + } else ret << ":N"; + if (parameters()[TwoStopBits]) ret << ":2"; + else ret << ":1"; + return ret; +} + + +void PISerial::configureFromFullPath(const PIString & full_path) { + PIStringList pl = full_path.split(":"); + for (int i = 0; i < pl.size_s(); ++i) { + PIString p(pl[i]); + switch (i) { + case 0: setPath(p); break; + case 1: setSpeed((Speed)(p.toInt())); break; + case 2: setDataBitsCount(p.toInt()); break; + case 3: + p = p.toLowerCase(); + if (p != "n") setParameter(ParityControl); + if (p == "o") setParameter(ParityOdd); + break; + case 4: if (p.toInt() == 2) setParameter(TwoStopBits); break; + } + } +} + + +PIVector PISerial::availableSpeeds() { + PIVector spds; + spds << 50 << 75 << 110 << 300 << 600 << 1200 << 2400 << 4800 << + 9600 << 19200 << 38400 << 57600 << 115200 << 1500000 << + 2000000 << 2500000 << 3000000 << 3500000 << 4000000; + return spds; +} + + +PIStringList PISerial::availableDevices(bool test) { + PIStringList dl; +#ifdef WINDOWS + HKEY key = 0; + RegOpenKey(HKEY_LOCAL_MACHINE, (LPCTSTR)"HARDWARE\\DEVICEMAP\\SERIALCOMM", &key); + if (key != 0) { + char name[1024], data[1024]; + DWORD name_len = 1024, data_len = 1024, type = 0, index = 0; + LONG ret; + while ((ret = RegEnumValue(key, index, (LPTSTR)name, &name_len, NULL, &type, (uchar * )data, &data_len)) != ERROR_NO_MORE_ITEMS) { + dl << PIString(data); + index++; + } + RegCloseKey(key); + } +#else +# ifndef ANDROID + PIStringList prefixes; +# ifdef QNX + prefixes << "ser"; +# else + prefixes << "ttyS" << "ttyO" << "ttyUSB" << "ttyACM" << "ttyGS" + << "ttyMI" << "ttymxc" << "ttyAMA" << "rfcomm" << "ircomm"; +# ifdef FREE_BSD + prefixes << "cu"; +# endif + PIFile file_prefixes("/proc/tty/drivers", PIIODevice::ReadOnly); + if (file_prefixes.open()) { + PIString fc = file_prefixes.readAll(true), line, cpref; + PIStringList words; + file_prefixes.close(); + while (!fc.isEmpty()) { + words.clear(); + line = fc.takeLine(); + if (line.isEmpty()) break; + while (!line.isEmpty()) + words << line.takeWord(); + if (words.size_s() < 2) break; + if (words.back() != "serial") continue; + cpref = words[1]; + int li = cpref.findLast("/"); + if (li > 0) cpref.cutLeft(li + 1); + prefixes << cpref; + } + prefixes.removeDuplicates(); + } +# endif + PIDir dir("/dev"); + PIVector de = dir.entries(); + piForeachC (PIFile::FileInfo & e, de) { // TODO changes in FileInfo + piForeachC (PIString & p, prefixes) { + if (e.path.left(p.size_s()) != p) continue; + dl << "/dev/" + e.path; + } + } +# endif +#endif + if (test) { + for (int i = 0; i < dl.size_s(); ++i) { +#ifdef WINDOWS + void * hCom = CreateFileA(dl[i].data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0); + if (hCom == INVALID_HANDLE_VALUE) { +#else + int fd = ::open(dl[i].data(), O_NOCTTY | O_RDONLY); + if (fd == -1) { +#endif + dl.remove(i); + --i; + continue; + } + int void_ = 0; + bool rok = true; +#ifdef WINDOWS + /*COMMTIMEOUTS times; + times.ReadIntervalTimeout = MAXDWORD; + times.ReadTotalTimeoutConstant = 0; + times.ReadTotalTimeoutMultiplier = 0; + times.WriteTotalTimeoutConstant = 1; + times.WriteTotalTimeoutMultiplier = 0; + SetCommTimeouts(hCom, ×); + if (ReadFile(hCom, &void_, 1, &readed_, 0) == 0) + rok = GetLastError() == ;*/ +#else + fcntl(fd, F_SETFL, O_NONBLOCK); + if (::read(fd, &void_, 1) == -1) + rok = errno != EIO; + +#endif + if (!rok) { + dl.remove(i); + --i; + continue; + } +#ifdef WINDOWS + CloseHandle(hCom); +#else + ::close(fd); +#endif + } + } + return dl; +} diff --git a/src/io/piserial.h b/src/io/piserial.h new file mode 100755 index 00000000..773141f4 --- /dev/null +++ b/src/io/piserial.h @@ -0,0 +1,310 @@ +/*! \file piserial.h + * \brief Serial device +*/ +/* + PIP - Platform Independent Primitives + COM + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Bychkov Andrey wapmobil@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISERIAL_H +#define PISERIAL_H + +#include "pitimer.h" +#include "piiodevice.h" +#ifndef WINDOWS +# include +# include +# include +# ifndef B50 +# define B50 0000001 +# endif +# ifndef B75 +# define B75 0000002 +# endif +# ifndef B1500000 +# define B1500000 0010012 +# endif +# ifndef B2000000 +# define B2000000 0010013 +# endif +# ifndef B2500000 +# define B2500000 0010014 +# endif +# ifndef B3000000 +# define B3000000 0010015 +# endif +# ifndef B3500000 +# define B3500000 0010016 +# endif +# ifndef B4000000 +# define B4000000 0010017 +# endif +#else +# define TIOCM_LE 1 +# define TIOCM_DTR 4 +# define TIOCM_RTS 7 +# define TIOCM_CTS 8 +# define TIOCM_ST 3 +# define TIOCM_SR 2 +# define TIOCM_CAR 1 +# define TIOCM_RNG 9 +# define TIOCM_DSR 6 +# define B50 50 +# define B75 75 +# define B110 110 +# define B300 300 +# define B600 600 +# define B1200 1200 +# define B2400 2400 +# define B4800 4800 +# define B9600 9600 +# define B14400 14400 +# define B19200 19200 +# define B38400 38400 +# define B57600 57600 +# define B115200 115200 +# define B128000 128000 +# define B256000 256000 +# define B1500000 1500000 +# define B2000000 2000000 +# define B2500000 2500000 +# define B3000000 3000000 +# define B3500000 3500000 +# define B4000000 4000000 +#endif +#ifndef CRTSCTS +# define CRTSCTS 020000000000 +#endif + + +class PIP_EXPORT PISerial: public PIIODevice +{ + PIIODEVICE(PISerial) +public: + + //! Contructs an empty %PISerial + PISerial(); + + //! \brief Parameters of PISerial + enum Parameters { + ParityControl /*! Enable parity check and generate */ = 0x1, + ParityOdd /*! Parity is odd instead of even */ = 0x2, + TwoStopBits /*! Two stop bits instead of one */ = 0x4 + }; + + //! \brief Speed of PISerial + enum Speed { + S50 /*! 50 baud */ = 50, + S75 /*! 75 baud */ = 75, + S110 /*! 110 baud */ = 110, + S300 /*! 300 baud */ = 300, + S600 /*! 600 baud */ = 600, + S1200 /*! 1200 baud */ = 1200, + S2400 /*! 2400 baud */ = 2400, + S4800 /*! 4800 baud */ = 4800, + S9600 /*! 9600 baud */ = 9600, + S19200 /*! 19200 baud */ = 19200, + S38400 /*! 38400 baud */ = 38400, + S57600 /*! 57600 baud */ = 57600, + S115200 /*! 115200 baud */ = 115200, + S1500000 = 1500000, // Linux only + S2000000 = 2000000, // Linux only + S2500000 = 2500000, // Linux only + S3000000 = 3000000, // Linux only + S3500000 = 3500000, // Linux only + S4000000 = 4000000 // Linux only + }; + + //! Contructs %PISerial with device name "device", speed "speed" and parameters "params" + PISerial(const PIString & device, PISerial::Speed speed = S115200, PIFlags params = 0); + + ~PISerial(); + + + //! Set both input and output speed to "speed" + void setSpeed(PISerial::Speed speed) {setProperty("outSpeed", (int)speed); setProperty("inSpeed", (int)speed); applySettings();} + + //! Set output speed to "speed" + void setOutSpeed(PISerial::Speed speed) {setProperty("outSpeed", (int)speed); applySettings();} + + //! Set input speed to "speed" + void setInSpeed(PISerial::Speed speed) {setProperty("inSpeed", (int)speed); applySettings();} + + //! Set device name to "dev" + void setDevice(const PIString & dev) {setPath(dev); if (isOpened()) {close(); open();};} + + + //! Set parameters to "parameters_" + void setParameters(PIFlags parameters_) {setProperty("parameters", (int)parameters_); applySettings();} + + //! Set parameter "parameter" to "on" state + void setParameter(PISerial::Parameters parameter, bool on = true); + + //! Returns if parameter "parameter" is set + bool isParameterSet(PISerial::Parameters parameter) const; + + //! Returns parameters + PIFlags parameters() const {return (PIFlags)(property("parameters").toInt());} + + + //! Set data bits count. Valid range is from 5 to 8, befault is 8 + void setDataBitsCount(int bits) {setProperty("dataBitsCount", bits); applySettings();} + + //! Returns data bits count + int dataBitsCount() const {return property("dataBitsCount").toInt();} + + + //! Set pin number "number" to logic level "on". Valid numbers are 4 (DTR) and 7 (RTS) + bool setPin(int number, bool on); + + //! Returns pin number "number" logic level. Valid numbers range is from 1 to 9 + bool isPin(int number) const; + + bool setLE(bool on) {return setBit(TIOCM_LE, on, "LE");} // useless function, just formally + bool setDTR(bool on) {return setBit(TIOCM_DTR, on, "DTR");} + bool setRTS(bool on) {return setBit(TIOCM_RTS, on, "RTS");} + bool setCTS(bool on) {return setBit(TIOCM_CTS, on, "CTS");} // useless function, just formally + bool setST(bool on) {return setBit(TIOCM_ST, on, "ST");} // useless function, just formally + bool setSR(bool on) {return setBit(TIOCM_SR, on, "SR");} // useless function, just formally + bool setCAR(bool on) {return setBit(TIOCM_CAR, on, "CAR");} // useless function, just formally + bool setRNG(bool on) {return setBit(TIOCM_RNG, on, "RNG");} // useless function, just formally + bool setDSR(bool on) {return setBit(TIOCM_DSR, on, "DSR");} // useless function, just formally + + bool isLE() const {return isBit(TIOCM_LE, "LE");} + bool isDTR() const {return isBit(TIOCM_DTR, "DTR");} + bool isRTS() const {return isBit(TIOCM_RTS, "RTS");} + bool isCTS() const {return isBit(TIOCM_CTS, "CTS");} + bool isST() const {return isBit(TIOCM_ST, "ST");} + bool isSR() const {return isBit(TIOCM_SR, "SR");} + bool isCAR() const {return isBit(TIOCM_CAR, "CAR");} + bool isRNG() const {return isBit(TIOCM_RNG, "RNG");} + bool isDSR() const {return isBit(TIOCM_DSR, "DSR");} + + void setVTime(int t) {vtime = t; applySettings();} + + + //! Set read is blocking for function read(void * read_to, int max_size) + void setReadIsBlocking(bool yes); + + + //! Returns device name + PIString device() const {return path();} + + //! Returns output speed + PISerial::Speed outSpeed() const {return (PISerial::Speed)(property("outSpeed").toInt());} + + //! Returns input speed + PISerial::Speed inSpeed() const {return (PISerial::Speed)(property("inSpeed").toInt());} + + int VTime() const {return vtime;} + + + //! Discard all buffered input and output data + void flush() { +#ifndef WINDOWS + if (fd != -1) tcflush(fd, TCIOFLUSH); +#endif + } + + int read(void * read_to, int max_size); + bool read(void * read_to, int max_size, double timeout_ms); + PIString read(int size = -1, double timeout_ms = 1000.); + PIByteArray readData(int size = -1, double timeout_ms = 1000.); + + + //! \brief Write to device data "data" with maximum size "max_size" and wait for data written if "wait" is \b true. + //! \returns sended bytes count + int write(const void * data, int max_size, bool wait = false); + + //! \brief Write to device data "data" with maximum size "size" and wait for data written if "wait" is \b true. + //! \returns \b true if sended bytes count = "size" + bool send(const void * data, int size, bool wait = false) {return (write(data, size, wait) == size);} + + //! \brief Write to device string "data" and wait for data written if "wait" is \b true. + //! \returns \b true if sended bytes count = size of string + bool send(const PIString & data, bool wait = false) {return (write(data.data(), data.lengthAscii(), wait) == data.size_s());} + + //! \brief Write to device byte array "data" and wait for data written if "wait" is \b true. + //! \returns \b true if sended bytes count = size of string + bool send(const PIByteArray & data, bool wait = false) {return (write(data.data(), data.size_s(), wait) == data.size_s());} + + PIString constructFullPath() const; + + + //! \brief Returns all available speeds for serial devices + static PIVector availableSpeeds(); + + //! \brief Returns all available system devices. If "test" each device will be tried to open + static PIStringList availableDevices(bool test = false); + +//! \ioparams +//! \{ +#ifdef DOXYGEN + //! \brief device, default "" + string device; + + //! \brief input/output speed, default 115200 + int speed; + + //! \brief dataBitsCount, default 8 + int dataBitsCount; + + //! \brief parityControl, default false + bool parityControl; + + //! \brief parityOdd, default false + bool parityOdd; + + //! \brief twoStopBits, default false + bool twoStopBits; +#endif +//! \} + +protected: + PIString fullPathPrefix() const {return "ser";} + void configureFromFullPath(const PIString & full_path); + bool configureDevice(const void * e_main, const void * e_parent = 0); + int write(const void * data, int max_size) {return write(data, max_size, true);} + + //! Executes when any read function was successful. Default implementation does nothing + virtual void received(const void * data, int size) {;} + + void _init(); + void applySettings(); + int convertSpeed(PISerial::Speed speed); + bool setBit(int bit, bool on, const PIString & bname); + bool isBit(int bit, const PIString & bname) const; + + bool openDevice(); + bool closeDevice(); + +#ifdef WINDOWS + DCB desc, sdesc; + void * hCom; + DWORD readed, mask; + bool block_write; +#else + termios desc, sdesc; + uint readed; +#endif + int fd, vtime; + bool block_read; + PITimeMeasurer tm_; + +}; + +#endif // PISERIAL_H diff --git a/src/io/piusb.cpp b/src/io/piusb.cpp new file mode 100755 index 00000000..d1f6decb --- /dev/null +++ b/src/io/piusb.cpp @@ -0,0 +1,410 @@ +#include "piusb.h" +#include "piconfig.h" + +#ifdef PIP_USB +# ifdef WINDOWS +# include +# else +# include +# endif +#endif + +REGISTER_DEVICE(PIUSB); + + +PIUSB::PIUSB(ushort vid, ushort pid): PIIODevice("", ReadWrite) { + vid_ = vid; + pid_ = pid; + intefrace_ = 0; + hdev = 0; + interface_claimed = -1; + setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, "0") + ":" + PIString::fromNumber(pid_, 16).expandLeftTo(4, "0")); + setDeviceNumber(1); + setTimeoutRead(1000); + setTimeoutWrite(1000); +} + + +void PIUSB::Endpoint::parse() { + direction = Write; + transfer_type = Control; + synchronisation_type = NoSynchonisation; + usage_type = DataEndpoint; + direction = (Direction)((address >> 7) & 1); + transfer_type = (TransferType)(attributes & 3); + if (transfer_type == Isochronous) { + synchronisation_type = (SynchronisationType)((attributes >> 2) & 3); + usage_type = (UsageType)((attributes >> 4) & 3); + } +} + + +PIUSB::Endpoint PIUSB::getEndpointByAddress(uchar address) { + piForeachC (Endpoint & i, eps) + if (i.address == address) + return i; + return Endpoint(); +} + + +PIVector PIUSB::endpointsRead() { + PIVector ret; + piForeachC (Endpoint & i, eps) + if (i.direction == Endpoint::Read) + ret << i; + return ret; +} + + +PIVector PIUSB::endpointsWrite() { + PIVector ret; + piForeachC (Endpoint & i, eps) + if (i.direction == Endpoint::Write) + ret << i; + return ret; +} + + +bool PIUSB::setConfiguration(uchar value) { +#ifdef PIP_USB + if (hdev == 0) return false; + bool found = false; + piForeachC (Configuration & c, desc_.configurations) + if (c.value_to_select == value) {found = true; conf_ = c; break;} + if (!found) { + piCoutObj << "Can`t find configuration with \"value_to_select\" =" << value; + return false; + } + if (interface_claimed >= 0) + usb_release_interface(hdev, interface_claimed); + interface_claimed = -1; + return setInterface(conf_.interfaces.front().value_to_select); +#else + return false; +#endif +} + + +bool PIUSB::setInterface(uchar value) { +#ifdef PIP_USB + if (hdev == 0) return false; + bool found = false; + piForeachC (Interface & i, conf_.interfaces) + if (i.value_to_select == value) {found = true; iface_ = i; break;} + if (!found) { + piCoutObj << "Can`t find interface with \"value_to_select\" =" << value; + return false; + } + if (interface_claimed >= 0) + usb_release_interface(hdev, interface_claimed); + interface_claimed = -1; + if (usb_claim_interface(hdev, iface_.value_to_select) < 0) { + piCoutObj << "Error: Cant`t claim interface!"; + return false; + } + eps.clear(); + eps = iface_.endpoints; + ep_read = ep_write = Endpoint(); + for (int i = 0; i < eps.size_s(); ++i) { + if (eps[i].direction == Endpoint::Read && ep_read.isNull()) + ep_read = eps[i]; + if (eps[i].direction == Endpoint::Write && ep_write.isNull()) + ep_write = eps[i]; + } + interface_claimed = value; + return true; +#else + return false; +#endif +} + + +bool PIUSB::configureDevice(const void * e_main, const void * e_parent) { +#ifdef PIP_USB + PIConfig::Entry * em = (PIConfig::Entry * )e_main; + PIConfig::Entry * ep = (PIConfig::Entry * )e_parent; + PIString vp = readDeviceSetting("device", "", em, ep); + ushort v, p; + if (vp.isEmpty()) { + v = readDeviceSetting("vid", vendorID(), em, ep); + p = readDeviceSetting("pid", productID(), em, ep); + } else { + v = vp.left(vp.find(":")).toInt(16); + p = vp.right(vp.length() - vp.find(":") - 1).toInt(16); + } + setVendorID(v); + setProductID(p); + setDeviceNumber(readDeviceSetting("deviceNumber", deviceNumber(), em, ep)); + setConfiguration(readDeviceSetting("configuration", currentConfiguration().value_to_select, em, ep)); + setInterface(readDeviceSetting("interface", currentInterface().value_to_select, em, ep)); + setEndpointRead(Endpoint(readDeviceSetting("endpointRead", endpointRead().address, em, ep))); + setEndpointWrite(Endpoint(readDeviceSetting("endpointWrite", endpointWrite().address, em, ep))); + return true; +#else + return false; +#endif +} + + +bool PIUSB::openDevice() { +#ifdef PIP_USB + if (path().size_s() >= 8) { + vid_ = path().left(4).toInt(16); + pid_ = path().right(4).toInt(16); + } + if (hdev != 0) closeDevice(); + hdev = 0; + interface_claimed = -1; + ep_write = ep_read = Endpoint(); + usb_init(); + //usb_set_debug(4); + if (usb_find_busses() < 0) { + piCoutObj << "Error: Cant`t find busses!"; + return false; + } + if (usb_find_devices() < 0) { + piCoutObj << "Error: Cant`t find devices!"; + return false; + } + + //piCoutObj << "Search for device ... " << flush; + int cur_num = 1; + bool found = false; + struct usb_device * dev; + struct usb_bus * bus; + for (bus = usb_get_busses(); bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + if (dev->descriptor.idVendor == vid_ && dev->descriptor.idProduct == pid_) { + if (cur_num == deviceNumber()) { + struct usb_device_descriptor & dd(dev->descriptor); + desc_.usb_spec_number = dd.bcdUSB; + desc_.device_class = dd.bDeviceClass; + desc_.device_subclass = dd.bDeviceSubClass; + desc_.device_protocol = dd.bDeviceProtocol; + desc_.max_packet_size = dd.bMaxPacketSize0; + desc_.id_vendor = dd.idVendor; + desc_.id_product = dd.idProduct; + desc_.id_device_release = dd.bcdDevice; + desc_.index_manufacturer = dd.iManufacturer; + desc_.index_product = dd.iProduct; + desc_.index_serial = dd.iSerialNumber; + desc_.configurations.clear(); + for (int c = 0; c < dd.bNumConfigurations; ++c) { + desc_.configurations << Configuration(); + Configuration & conf(desc_.configurations.back()); + struct usb_config_descriptor & dc(dev->config[c]); + conf.index = c; + conf.value_to_select = dc.bConfigurationValue; + conf.attributes = dc.bmAttributes; + conf.max_power = ushort(dc.MaxPower) * 2; + conf.self_powered = (conf.attributes >> 6) & 1; + conf.remote_wakeup = (conf.attributes >> 5) & 1; + conf.interfaces.clear(); + for (int i = 0; i < dc.bNumInterfaces; ++i) { + conf.interfaces << Interface(); + Interface & infc(conf.interfaces.back()); + struct usb_interface_descriptor * di(dc.interface[c].altsetting); + infc.index = i; + infc.value_to_select = di->bAlternateSetting; + infc.class_code = di->bInterfaceClass; + infc.subclass_code = di->bInterfaceSubClass; + infc.protocol_code = di->bInterfaceProtocol; + infc.endpoints.clear(); + for (int e = 0; e < di->bNumEndpoints; ++e) { + infc.endpoints << Endpoint(di->endpoint[e].bEndpointAddress, + di->endpoint[e].bmAttributes, + di->endpoint[e].wMaxPacketSize); + } + } + } + if (!desc_.configurations.isEmpty()) + conf_ = desc_.configurations.front(); + + struct usb_interface_descriptor * is = dev->config->interface->altsetting; + int epn = is->bNumEndpoints; + eps.clear(); + for (int i = 0; i < epn; ++i) { + eps << Endpoint(is->endpoint[i].bEndpointAddress, + is->endpoint[i].bmAttributes, + is->endpoint[i].wMaxPacketSize); + if (eps.back().direction == Endpoint::Write && (eps.back().address == ep_write.address || ep_write.address == 0)) ep_write = eps.back(); + if (eps.back().direction == Endpoint::Read && (eps.back().address == ep_read.address || ep_read.address == 0)) ep_read = eps.back(); + } + + //piCoutObj << "Device found at address:" << "Bus: " << dev->bus->dirname << ", Device: " << dev->filename; + found = true; + break; + } else cur_num++; + } + } + if (found) break; + } + if (!found) { + piCoutObj << "Error: Cant`t find device!"; + return false; + } + //piCoutObj << "Open ... " << flush; + hdev = usb_open(dev); + if (hdev == 0) { + piCoutObj << "Error: Cant`t open device:" << usb_strerror(); + return false; + }// else piCoutObj << "ok"; + //usb_reset(hdev); + + //usb_set_configuration(hdev, 1); + //usb_set_altinterface(hdev, 0); + +# ifndef WINDOWS + char tbuff[256]; + //piCoutObj << "Check for bounded driver ... " << flush; + if (usb_get_driver_np(hdev, intefrace_, tbuff, sizeof(tbuff) - 1) >= 0) { + //piCoutObj << "yes" << "Found driver: " << tbuff; + //piCoutObj << "Detach driver ... " << flush; + if (usb_detach_kernel_driver_np(hdev, intefrace_)< 0) { + piCoutObj << "Error: Cant`t detach bounded driver!"; + return false; + }// else piCoutObj << "ok"; + }// else piCoutObj << "no"; +# endif + + //piCoutObj << "Claim interface ... " << flush; + if (usb_claim_interface(hdev, intefrace_) < 0) { + piCoutObj << "Error: Cant`t claim interface:" << usb_strerror(); + return false; + } // else piCoutObj << "ok"; + interface_claimed = intefrace_; + + return true; +#else + return false; +#endif +} + + +bool PIUSB::closeDevice() { +#ifdef PIP_USB + if (hdev == 0) return true; + //usb_reset(hdev); + usb_release_interface(hdev, intefrace_); + usb_close(hdev); + hdev = 0; + interface_claimed = -1; + return true; +#else + return false; +#endif +} + + +int PIUSB::read(void * read_to, int max_size) { +#ifdef PIP_USB + if (!opened_ || ep_read.isNull()) return -1; + switch (ep_read.transfer_type) { + case Endpoint::Bulk: /*piCoutObj << "bulk read" << max_size;*/ return usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r); break; + case Endpoint::Interrupt: return usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r); break; + default: break; + } + return -1; +#else + return -1; +#endif +} + + +int PIUSB::write(const void * data, int max_size) { +#ifdef PIP_USB + if (!opened_ || ep_write.isNull()) return -1; + switch (ep_read.transfer_type) { + case Endpoint::Bulk: /*piCoutObj << "bulk write" << max_size;*/ return usb_bulk_write(hdev, ep_write.address, (char * )const_cast(data), max_size, timeout_w); break; + case Endpoint::Interrupt: return usb_interrupt_write(hdev, ep_read.address, (char * )data, max_size, timeout_w); break; + default: break; + } + return -1; +#else + return -1; +#endif +} + + +int PIUSB::controlWrite(const void * data, int max_size) { +#ifdef PIP_USB + if (!opened_) return -1; + //return usb_control_msg(hdev, ); + return -1; +#else + return -1; +#endif +} + + +void PIUSB::flush() { +#ifdef PIP_USB + if (!opened_) return; + if (!ep_read.isNull()) usb_resetep(hdev, ep_read.address); + if (!ep_write.isNull()) usb_resetep(hdev, ep_write.address); +#endif +} + + +PICout operator<<(PICout s, const PIUSB::Endpoint & v) { + s.setControl(0, true); + s << NewLine << "{" << NewLine; + if (v.isNull()) + s << " " << "Null Endpoint"; + else { + s << " " << "Address: " << v.address << NewLine; + s << " " << "Attributes: " << v.attributes << NewLine; + s << " " << "Direction: " << (v.direction == PIUSB::Endpoint::Write ? "Write" : "Read") << NewLine; + s << " " << "Transfer Type: "; + switch (v.transfer_type) { + case PIUSB::Endpoint::Control: s << "Control" << NewLine; break; + case PIUSB::Endpoint::Bulk: s << "Bulk" << NewLine; break; + case PIUSB::Endpoint::Interrupt: s << "Interrupt" << NewLine; break; + case PIUSB::Endpoint::Isochronous: s << "Isochronous" << NewLine; break; + default: break; + } + if (v.transfer_type == PIUSB::Endpoint::Isochronous) { + s << " " << "Synchronisation Type: "; + switch (v.synchronisation_type) { + case PIUSB::Endpoint::NoSynchonisation: s << "No Synchonisation" << NewLine; break; + case PIUSB::Endpoint::Asynchronous: s << "Asynchronous" << NewLine; break; + case PIUSB::Endpoint::Adaptive: s << "Adaptive" << NewLine; break; + case PIUSB::Endpoint::Synchronous: s << "Synchronous" << NewLine; break; + default: break; + } + s << " " << "Usage Type: "; + switch (v.usage_type) { + case PIUSB::Endpoint::DataEndpoint: s << "Data Endpoint" << NewLine; break; + case PIUSB::Endpoint::FeedbackEndpoint: s << "Feedback Endpoint" << NewLine; break; + case PIUSB::Endpoint::ExplicitFeedbackDataEndpoint: s << "Explicit Feedback Data Endpoint" << NewLine; break; + default: break; + } + } + s << " " << "Max Packet Size: " << v.max_packet_size << NewLine; + } + s << "}" << NewLine; + s.restoreControl(); + return s; +} + + +PIString PIUSB::constructFullPath() const { + PIString ret(fullPathPrefix() + "://"); + ret << PIString::fromNumber(vendorID(), 16).toLowerCase() << ":" << PIString::fromNumber(productID(), 16).toLowerCase() << ":" << deviceNumber() << ":" << endpointRead().address << ":" << endpointWrite().address; + return ret; +} + + +void PIUSB::configureFromFullPath(const PIString & full_path) { + PIStringList pl = full_path.split(":"); + for (int i = 0; i < pl.size_s(); ++i) { + PIString p(pl[i]); + switch (i) { + case 0: setVendorID(p.toUShort(16)); break; + case 1: setProductID(p.toUShort(16)); break; + case 2: setDeviceNumber(p.toInt()); break; + case 3: setEndpointRead(Endpoint(p.toInt())); break; + case 4: setEndpointWrite(Endpoint(p.toInt())); break; + } + } +} diff --git a/src/io/piusb.h b/src/io/piusb.h new file mode 100755 index 00000000..437c1b5b --- /dev/null +++ b/src/io/piusb.h @@ -0,0 +1,153 @@ +/*! \file piusb.h + * \brief USB device +*/ +/* + PIP - Platform Independent Primitives + USB, based on libusb + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIUSB_H +#define PIUSB_H + +#include "piiodevice.h" + +struct usb_dev_handle; + +class PIP_EXPORT PIUSB: public PIIODevice +{ + PIIODEVICE(PIUSB) +public: + PIUSB(ushort vid = 0, ushort pid = 0); + + struct Endpoint { + Endpoint(uchar a = 0, uchar at = 0, ushort mps = 0) {address = a; attributes = at; max_packet_size = mps; parse();} + + enum Direction {Write = 0, Read = 1}; + enum TransferType {Control = 0, Isochronous = 1, Bulk = 2, Interrupt = 3}; + enum SynchronisationType {NoSynchonisation= 0, Asynchronous = 2, Adaptive = 1, Synchronous = 3}; + enum UsageType {DataEndpoint = 0, FeedbackEndpoint = 2, ExplicitFeedbackDataEndpoint = 1}; + + void parse(); + bool isNull() const {return address == 0;} + + uchar address; + uchar attributes; + ushort max_packet_size; + Direction direction; + TransferType transfer_type; + SynchronisationType synchronisation_type; + UsageType usage_type; + }; + + struct Interface { + Interface() {index = value_to_select = class_code = subclass_code = protocol_code = 0;} + uchar index; + uchar value_to_select; + ushort class_code; + ushort subclass_code; + ushort protocol_code; + PIVector endpoints; + }; + + struct Configuration { + Configuration() {index = value_to_select = attributes = max_power = 0; self_powered = remote_wakeup = false;} + uchar index; + uchar value_to_select; + uchar attributes; + ushort max_power; // mA + bool self_powered; + bool remote_wakeup; + PIVector interfaces; + }; + + struct Descriptor { + Descriptor() {memset(this, 0, sizeof(Descriptor));} + ushort usb_spec_number; + uchar device_class; + uchar device_subclass; + uchar device_protocol; + uchar max_packet_size; + ushort id_vendor; + ushort id_product; + ushort id_device_release; + uchar index_manufacturer; + uchar index_product; + uchar index_serial; + PIVector configurations; + }; + + const PIUSB::Descriptor & currentDescriptor() const {return desc_;} + const PIUSB::Configuration & currentConfiguration() const {return conf_;} + const PIUSB::Interface & currentInterface() const {return iface_;} + + ushort vendorID() const {return vid_;} + ushort productID() const {return pid_;} + + int deviceNumber() const {return property("deviceNumber").toInt();} + int timeoutRead() const {return property("timeoutRead").toInt();} + int timeoutWrite() const {return property("timeoutWrite").toInt();} + const PIUSB::Endpoint & endpointRead() const {return ep_read;} + const PIUSB::Endpoint & endpointWrite() const {return ep_write;} + + const PIVector & endpoints() const {return eps;} + PIVector endpointsRead(); + PIVector endpointsWrite(); + PIUSB::Endpoint getEndpointByAddress(uchar address); + + void setVendorID(ushort vid) {vid_ = vid; setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, "0") + ":" + PIString::fromNumber(pid_, 16).expandLeftTo(4, "0"));} + void setProductID(ushort pid) {pid_ = pid; setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, "0") + ":" + PIString::fromNumber(pid_, 16).expandLeftTo(4, "0"));} + + bool setConfiguration(uchar value); + bool setInterface(uchar value); + + void setEndpointRead(const PIUSB::Endpoint & ep) {ep_read = ep;} + void setEndpointWrite(const PIUSB::Endpoint & ep) {ep_write = ep;} + void setDeviceNumber(int dn) {setProperty("deviceNumber", dn);} + void setTimeoutRead(int t) {setProperty("timeoutRead", t);} + void setTimeoutWrite(int t) {setProperty("timeoutWrite", t);} + + int read(void * read_to, int max_size); + int write(const void * data, int max_size); + int controlWrite(const void * data, int max_size); + + void flush(); + + PIString constructFullPath() const; + +protected: + PIString fullPathPrefix() const {return "usb";} + void configureFromFullPath(const PIString & full_path); + bool configureDevice(const void * e_main, const void * e_parent = 0); + //bool init(); + bool openDevice(); + bool closeDevice(); + + PIVector eps; + ushort vid_, pid_; + int intefrace_, timeout_r, timeout_w; + int interface_claimed; + PIUSB::Endpoint ep_read, ep_write; + Descriptor desc_; + Configuration conf_; + Interface iface_; + usb_dev_handle * hdev; + +}; + +PICout operator <<(PICout s, const PIUSB::Endpoint & v); + +#endif // PIUSB_H diff --git a/src/math/picrc.h b/src/math/picrc.h new file mode 100755 index 00000000..7f179893 --- /dev/null +++ b/src/math/picrc.h @@ -0,0 +1,244 @@ +/*! \file picrc.h + * \brief CRC checksum calculator +*/ +/* + PIP - Platform Independent Primitives + CRC checksum calculator + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICRC_H +#define PICRC_H + +#include "pistring.h" + +template +class PIP_EXPORT uint_cl { +public: + uint_cl() {for (int i = 0; i < L / 8; ++i) data_[i] = 0;} + uint_cl(const uint_cl & v) {for (int i = 0; i < L / 8; ++i) data_[i] = v.data_[i];} + uint_cl(uchar v) {for (int i = 0; i < L / 8; ++i) data_[i] = (i == 0 ? v : 0);} + uint_cl(char v) {for (int i = 0; i < L / 8; ++i) data_[i] = (i == 0 ? v : 0);} + uint_cl(ushort v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(short v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(uint v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(int v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(ulong v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(long v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(ullong v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + uint_cl(llong v) {int l = piMin(L / 8, sizeof(v)); memcpy(data_, &v, l); for (int i = l; i < L / 8; ++i) data_[i] = 0;} + + operator bool() {for (int i = 0; i < L / 8; ++i) if (data_[i] > 0) return true; return false;} + operator char() {return (char)data_[0];} + operator short() {short t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator int() {int t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator long() {long t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator llong() {llong t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator uchar() {return data_[0];} + operator ushort() {ushort t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator uint() {uint t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator ulong() {ulong t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + operator ullong() {ullong t(0); int l = piMin(L / 8, sizeof(t)); memcpy(&t, data_, l); return t;} + + uint_cl operator +(const uint_cl & v) { + uint_cl t; + uint cv; + bool ov = false; + for (int i = 0; i < L / 8; ++i) { + cv = v.data_[i] + data_[i]; + if (ov) ++cv; + ov = cv > 255; + t.data_[i] = ov ? cv - 256 : cv; + } + return t; + } + + uint_cl operator &(const uint_cl & v) const {uint_cl t; for (int i = 0; i < L / 8; ++i) t.data_[i] = v.data_[i] & data_[i]; return t;} + uint_cl operator &(const uchar & v) const {return *this & uint_cl(v);} + uint_cl operator &(const ushort & v) const {return *this & uint_cl(v);} + uint_cl operator &(const uint & v) const {return *this & uint_cl(v);} + uint_cl operator &(const ulong & v) const {return *this & uint_cl(v);} + uint_cl operator &(const ullong & v) const {return *this & uint_cl(v);} + uint_cl operator &(const char & v) const {return *this & uint_cl(v);} + uint_cl operator &(const short & v) const {return *this & uint_cl(v);} + uint_cl operator &(const int & v) const {return *this & uint_cl(v);} + uint_cl operator &(const long & v) const {return *this & uint_cl(v);} + uint_cl operator &(const llong & v) const {return *this & uint_cl(v);} + + uint_cl operator |(const uint_cl & v) const {uint_cl t; for (int i = 0; i < L / 8; ++i) t.data_[i] = v.data_[i] | data_[i]; return t;} + uint_cl operator |(const uchar & v) const {return *this | uint_cl(v);} + uint_cl operator |(const ushort & v) const {return *this | uint_cl(v);} + uint_cl operator |(const uint & v) const {return *this | uint_cl(v);} + uint_cl operator |(const ulong & v) const {return *this | uint_cl(v);} + uint_cl operator |(const ullong & v) const {return *this | uint_cl(v);} + uint_cl operator |(const char & v) const {return *this | uint_cl(v);} + uint_cl operator |(const short & v) const {return *this | uint_cl(v);} + uint_cl operator |(const int & v) const {return *this | uint_cl(v);} + uint_cl operator |(const long & v) const {return *this | uint_cl(v);} + uint_cl operator |(const llong & v) const {return *this | uint_cl(v);} + + uint_cl operator ^(const uint_cl & v) const {uint_cl t; for (int i = 0; i < L / 8; ++i) t.data_[i] = v.data_[i] ^ data_[i]; return t;} + uint_cl operator ^(const uchar & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const ushort & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const uint & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const ulong & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const ullong & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const char & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const short & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const int & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const long & v) const {return *this ^ uint_cl(v);} + uint_cl operator ^(const llong & v) const {return *this ^ uint_cl(v);} + + bool operator <(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) {if (v.data_[i] > data_[i]) return true; if (v.data_[i] < data_[i]) return false;} return false;} + bool operator <=(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) {if (v.data_[i] > data_[i]) return true; if (v.data_[i] < data_[i]) return false;} return true;} + bool operator >(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) {if (v.data_[i] < data_[i]) return true; if (v.data_[i] > data_[i]) return false;} return false;} + bool operator >=(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) {if (v.data_[i] < data_[i]) return true; if (v.data_[i] > data_[i]) return false;} return true;} + bool operator ==(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) if (v.data_[i] != data_[i]) return false; return true;} + bool operator !=(const uint_cl & v) const {for (int i = 0; i < L / 8; ++i) if (v.data_[i] != data_[i]) return true; return false;} + bool operator <=(const uint_cl<8> & v1) {return (*(uchar*)data()) <= (*(uchar*)v1.data());} + + uint_cl operator >>(const int & c) const { + uint_cl t; + int l = L - c; + bool bit; + if (l <= 0) return t; + for (int i = 0; i < l; ++i) { + bit = 1 & (data_[(i + c) / 8] >> ((i + c) % 8)); + if (bit) t.data_[i / 8] |= (1 << (i % 8)); + else t.data_[i / 8] &= ~(1 << (i % 8)); + } + return t; + } + uint_cl operator >>(const uint & c) const {return (*this << (int)c);} + uint_cl operator <<(const int & c) const { + uint_cl t; + int l = L - c; + bool bit; + if (l <= 0) return t; + for (int i = c; i < L; ++i) { + bit = 1 & (data_[(i - c) / 8] >> ((i - c) % 8)); + if (bit) t.data_[i / 8] |= (1 << (i % 8)); + else t.data_[i / 8] &= ~(1 << (i % 8)); + } + return t; + } + uint_cl operator <<(const uint & c) const {return (*this >> (int)c);} + + uint_cl & inverse() const {for (int i = 0; i < L / 8; ++i) data_[i] = ~data_[i]; return *this;} + uint_cl inversed() const {uint_cl t(*this); for (int i = 0; i < L / 8; ++i) t.data_[i] = ~t.data_[i]; return t;} + uint_cl reversed() const { + uint_cl t; + bool bit; + for (int i = 0; i < L; ++i) { + bit = 1 & (data_[(L - i - 1) / 8] >> ((L - i - 1) % 8)); + if (bit) t.data_[i / 8] |= (1 << (i % 8)); + else t.data_[i / 8] &= ~(1 << (i % 8)); + } + return t; + } + + const uchar * data() const {return data_;} + uchar * data() {return data_;} + uint length() const {return L / 8;} + +private: + uchar data_[L / 8]; + +}; + +template +inline std::ostream & operator <<(std::ostream & s, const uint_cl & v) {std::ios::fmtflags f = s.flags(); s << std::hex; for (uint i = 0; i < v.length(); ++i) {s << int(v.data()[i]); if (v.data()[i] < 0x10) s << '0'; s << ' ';} s.flags(f); return s;} + +inline uchar reverseByte(uchar b) { + uchar ret = 0; + bool bit; + for (int i = 0; i < 8; ++i) { + bit = 1 & (b >> (7 - i)); + if (bit) ret |= (1 << i); + } + return ret; +} + +template > +class PIP_EXPORT PICRC { +public: + PICRC(const N & poly = N()) {poly_ = poly; reverse_poly = true; init_ = inversed(N(0)); out_ = inversed(N(0)); reverse_before_xor = reverse_data = false; initTable();} + PICRC(const N & poly, bool reverse_poly_, const N & initial, const N & out_xor) {poly_ = poly; reverse_poly = reverse_poly_; init_ = initial; out_ = out_xor; reverse_before_xor = reverse_data = false; initTable();} + + void setInitial(const N & v) {init_ = v;} + void setOutXor(const N & v) {out_ = v;} + void setReversePolynome(bool yes) {reverse_poly = yes; initTable();} + void setReverseOutBeforeXOR(bool yes) {reverse_before_xor = yes;} + void setReverseDataBytes(bool yes) {reverse_data = yes;} + + void initTable() { + N tmp, pol = reverse_poly ? reversed(poly_) : poly_; + //cout << std::hex << "poly " << (uint)N(poly_) << " -> " << (uint)N(pol) << endl; + for (int i = 0; i < 256; ++i) { + tmp = uchar(i); + for (int j = 0; j < 8; ++j) + tmp = ((tmp & 1) ? ((tmp >> 1) ^ pol) : (tmp >> 1)); + table[i] = tmp; + } + + } + + N calculate(const void * data, int size) { + N crc = init_; + uchar * data_ = (uchar * )data, cb; + //cout << "process " << size << endl; + uchar nTemp; + for (int i = 0; i < size; ++i) { + cb = data_[i]; + if (reverse_data) cb = reverseByte(cb); + nTemp = cb ^ uchar(crc); + crc = crc >> 8; + crc = crc ^ table[nTemp]; + } + if (reverse_before_xor) crc = reversed(crc); + return crc ^ out_; + + } + N calculate(const PIByteArray & d) {return calculate(d.data(), d.size());} + N calculate(const char * str) {string s(str); return calculate((void * )s.data(), s.size());} + +private: + inline N reversed(const N & v) {return v.reversed();} + inline N inversed(const N & v) {return v.inversed();} + + N table[256]; + N poly_, init_, out_; + bool reverse_poly, reverse_before_xor, reverse_data; + +}; + +template <> inline uchar PICRC<8, uchar>::reversed(const uchar & v) {return reverseByte(v);} +template <> inline ushort PICRC<16, ushort>::reversed(const ushort & v) {return uint_cl<16>(v).reversed();} +template <> inline uint PICRC<32, uint>::reversed(const uint & v) {return uint_cl<32>(v).reversed();} +template <> inline uchar PICRC<8, uchar>::inversed(const uchar & v) {return ~v;} +template <> inline ushort PICRC<16, ushort>::inversed(const ushort & v) {return ~v;} +template <> inline uint PICRC<32, uint>::inversed(const uint & v) {return ~v;} + +typedef PICRC<32, uint> CRC_32; +typedef PICRC<24> CRC_24; +typedef PICRC<16, ushort> CRC_16; +typedef PICRC<8, uchar> CRC_8; + +inline CRC_32 standardCRC_32() {return CRC_32(0x04C11DB7, true, 0xFFFFFFFF, 0xFFFFFFFF);} +inline CRC_16 standardCRC_16() {return CRC_16(0x8005, true, 0x0, 0x0);} +inline CRC_8 standardCRC_8() {return CRC_8(0xD5, true, 0x0, 0x0);} + +#endif // CRC_H diff --git a/src/math/pievaluator.cpp b/src/math/pievaluator.cpp new file mode 100755 index 00000000..2bbdfb9d --- /dev/null +++ b/src/math/pievaluator.cpp @@ -0,0 +1,1254 @@ +/* + PIP - Platform Independent Primitives + Evaluator designed for stream computing + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pievaluator.h" + + +/*! \class PIEvaluator + * \brief This class provide mathematical evaluations of custom expression + * + * \section PIEvaluator_sec0 Synopsis + * %PIEvaluator developed for stream evaluations of once set expression. + * It`s create internal list of instructions on function \a check() and + * executes very fast on function \a evaluate(). Once given expression + * can be evaluated any times with different variable values. Evaluator + * supports many common mathematic functions described below. Also it`s + * automatic puts unnecessarily signs and bracets. Processed expression + * can be obtains with function \a expression(). If there is an error + * in expression you can get it with function \a error(). Last evaluated + * result you can get with function \a lastResult(). + * \section PIEvaluator_sec1 Using + * First you should set your variables with function \a setVariable(). + * Next give your expression with function \a check() and check for error + * with functions \a isCorrect() and \a error(). If expression is correct + * you can get processed expression with function \a expression() and + * evaluate it with function \a evaluate(). You can change variable values + * without rechecking expression. + * + * \section PIEvaluator_sec2 Functions + * %PIEvaluator supports arithmetical operations with complex numbers, this + * is their list in priority order: + * * ^ (power) + * * * (multiply) + * * / (divide) + * * % (residue) + * * + (add) + * * - (subtract) + * + * In addition there are compare and logical operations: + * * == (equal) + * * != (not equal) + * * > (greater) + * * < (smaller) + * * >= (greater or equal) + * * <= (smaller or equal) + * * && (and) + * * || (or) + * + * Compare and logical functions works with real operators part and returns 0 or 1. + * + * Mathematical functions: + * * sin(x) - sine + * * cos(x) - cosine + * * tg(x) - tangent + * * ctg(x) - cotangent + * * arcsin(x) - arcsine + * * arccos(x) - arccosine + * * arctg(x) -arccotangent + * * arcctg(x) - arctangent + * * sh(x) - hyperbolical sine + * * ch(x) - hyperbolical cosine + * * th(x) - hyperbolical tangent + * * cth(x) - hyperbolical cotangent + * * sqr(x) - square + * * sqrt(x) - square root + * * abs(x) - absolute value + * * sign(x) - sign of real part (-1 or 1) + * * exp(x) - exponent + * * pow(x, p) - x in power p + * * ln(x) - natural logarithm + * * lg(x) - decimal logarithm + * * log(x, b) - logarithm of x with base b + * * im(x) - imaginary part of complex number + * * re(x) - real part of complex number + * * arg(x) - argument of complex number + * * len(x) - length of complex number + * * conj(x) - length of complex number + * * rad(x) - convert degrees to radians + * * deg(x) - convert radians to degrees + * * j0(x) - Bessel function first kind order 0 + * * j1(x) - Bessel function first kind order 1 + * * jn(x, n) - Bessel function first kind order n + * * y0(x) - Bessel function second kind order 0 + * * y1(x) - Bessel function second kind order 1 + * * yn(x, n) - Bessel function second kind order n + * * random(s, f) - regular random number in range [s, f] + * * min(x0, x1, ...) - minimum of x0, x1, ... + * * max(x0, x1, ...) - maximum of x0, x1, ... + * * clamp(x, a, b) - trim x on range [a, b] + * * step(x, s) - 0 if x < s, else 1 + * * mix(x, a, b) - interpolate between a and b linear for x (a * (1 - x) + b * x) + * + * There are some built-in constans: + * * i (imaginary 1) + * * e + * * pi + * + * All trigonometric functions takes angle in radians. + * + * \section PIEvaluator_sec3 Example + * \snippet pievaluator.cpp main + */ + + +PIEvaluatorContent::PIEvaluatorContent() { + addFunction("arcsin", 1); + addFunction("arccos", 1); + addFunction("arctg", 1); + addFunction("arcctg", 1); + addFunction("random", 2); + addFunction("sin", 1); + addFunction("cos", 1); + addFunction("ctg", 1); + addFunction("tg", 1); + addFunction("exp", 1); + addFunction("cth", 1); + addFunction("sh", 1); + addFunction("ch", 1); + addFunction("th", 1); + addFunction("sqrt", 1); + addFunction("sqr", 1); + addFunction("pow", 2); + addFunction("abs", 1); + addFunction("ln", 1); + addFunction("lg", 1); + addFunction("log", 2); + addFunction("im", 1); + addFunction("re", 1); + addFunction("arg", 1); + addFunction("len", 1); + addFunction("conj", 1); + addFunction("sign", 1); + addFunction("rad", 1); + addFunction("deg", 1); + addFunction("j0", 1); + addFunction("j1", 1); + addFunction("jn", 2); + addFunction("y0", 1); + addFunction("y1", 1); + addFunction("yn", 2); + addFunction("min", -2); // (x0,x1,...) + addFunction("max", -2); // (x0,x1,...) + addFunction("clamp", 3); // (x,a,b) = x < a ? a : (x > b ? b : x) + addFunction("step", 2); // (x,s) = x >= s ? 1. : 0. (1 if 'x' >= 's', else 0) + addFunction("mix", 3); // (x,a,b) = a*(1.-x) + b*x (interpolate between 'a' and 'b' linear for 'x') + addFunction("defined", 1); + clearCustomVariables(); + //addVariable("n", 0.); + //addVariable("x1", 123); +} + + +bool PIEvaluatorContent::setVariableValue(int index, complexd new_value) { + if (index < 0 || index >= variables.size_s()) return false; + variables[index].value = new_value; + return true; +} + + +bool PIEvaluatorContent::setVariableName(int index, const PIString & new_name) { + if (index < 0 || index >= variables.size_s()) return false; + variables[index].name = new_name; + return true; +} + + +void PIEvaluatorContent::clearCustomVariables() { + variables.clear(); + addVariable("i", complexd_i); + addVariable("pi", atan(1.) * 4.); + addVariable("e", exp(1.)); + cv_count = variables.size(); +} + + +void PIEvaluatorContent::sortVariables() { + //PIEvaluatorTypes::Variable tv; + for (uint i = 0; i < variables.size(); i++) { + for (uint j = variables.size() - 1; j > i; j--) { + if (variables[j].name.length() <= variables[i].name.length()) continue; + piSwap(variables[i], variables[j]); + } + } + /* + * qDebug() << "---"; + * for (int i = 0; i < variables.size(); i++) { + * qDebug() << variables[i].name; + } + */ +} + + +PIEvaluatorTypes::BaseFunctions PIEvaluatorContent::getBaseFunction(const PIString & name) { + if (name == "sin") return PIEvaluatorTypes::bfSin; + if (name == "cos") return PIEvaluatorTypes::bfCos; + if (name == "tg") return PIEvaluatorTypes::bfTg; + if (name == "ctg") return PIEvaluatorTypes::bfCtg; + if (name == "arcsin") return PIEvaluatorTypes::bfArcsin; + if (name == "arccos") return PIEvaluatorTypes::bfArccos; + if (name == "arctg") return PIEvaluatorTypes::bfArctg; + if (name == "arcctg") return PIEvaluatorTypes::bfArcctg; + if (name == "exp") return PIEvaluatorTypes::bfExp; + if (name == "random") return PIEvaluatorTypes::bfRandom; + if (name == "sh") return PIEvaluatorTypes::bfSh; + if (name == "ch") return PIEvaluatorTypes::bfCh; + if (name == "th") return PIEvaluatorTypes::bfTh; + if (name == "cth") return PIEvaluatorTypes::bfCth; + if (name == "sqrt") return PIEvaluatorTypes::bfSqrt; + if (name == "sqr") return PIEvaluatorTypes::bfSqr; + if (name == "pow") return PIEvaluatorTypes::bfPow; + if (name == "abs") return PIEvaluatorTypes::bfAbs; + if (name == "ln") return PIEvaluatorTypes::bfLn; + if (name == "lg") return PIEvaluatorTypes::bfLg; + if (name == "log") return PIEvaluatorTypes::bfLog; + if (name == "im") return PIEvaluatorTypes::bfIm; + if (name == "re") return PIEvaluatorTypes::bfRe; + if (name == "arg") return PIEvaluatorTypes::bfArg; + if (name == "len") return PIEvaluatorTypes::bfLen; + if (name == "conj") return PIEvaluatorTypes::bfConj; + if (name == "sign") return PIEvaluatorTypes::bfSign; + if (name == "rad") return PIEvaluatorTypes::bfRad; + if (name == "deg") return PIEvaluatorTypes::bfDeg; + if (name == "j0") return PIEvaluatorTypes::bfJ0; + if (name == "j1") return PIEvaluatorTypes::bfJ1; + if (name == "jn") return PIEvaluatorTypes::bfJN; + if (name == "y0") return PIEvaluatorTypes::bfY0; + if (name == "y1") return PIEvaluatorTypes::bfY1; + if (name == "yn") return PIEvaluatorTypes::bfYN; + if (name == "min") return PIEvaluatorTypes::bfMin; + if (name == "max") return PIEvaluatorTypes::bfMax; + if (name == "clamp") return PIEvaluatorTypes::bfClamp; + if (name == "step") return PIEvaluatorTypes::bfStep; + if (name == "mix") return PIEvaluatorTypes::bfMix; + if (name == "defined") return PIEvaluatorTypes::bfDefined; + return PIEvaluatorTypes::bfUnknown; +} + +const PIString & PIEvaluator::prepare(const PIString & string) { + currentString = string.trimmed(); + if (currentString.isEmpty()) currentString = "0"; + replaceOperators(); + removeSpaces(); + checkBrackets(); + while (fillElements()) checkBrackets(); + while (setSignes()) fillElements(); + removeJunk(); + findUnknownVariables(); + return currentString; +} + + +void PIEvaluator::removeSpaces() { + PIString tmps = currentString; + for (int i = 0; i < tmps.length(); i++) { + if (tmps[i] == ' ' || tmps[i] == '\t') { + tmps.remove(i, 1); + i--; + } + } + currentString = tmps; +} + + +void PIEvaluator::removeJunk() { + PIChar cc; + bool junk = true; + int bcnt; + while (junk) { + if (currentString.left(1) != "(" || currentString.right(1) != ")") return; + bcnt = 1; + junk = false; + for (int i = 1; i < currentString.length(); i++) { + cc = currentString[i]; + if (cc == '(') bcnt++; + if (cc == ')') bcnt--; + if (bcnt == 0) { + if (i == currentString.length() - 1) { + currentString = currentString.mid(1, currentString.length() - 2); + elements.pop_front(); + elements.pop_back(); + junk = true; + break; + } else break; + } + } + } +} + + +void PIEvaluator::replaceOperators() { + currentString.replaceAll("==", "="); + currentString.replaceAll("!=", ":"); + currentString.replaceAll(">=", "}"); + currentString.replaceAll("<=", "{"); + currentString.replaceAll("&&", "&"); + currentString.replaceAll("||", "|"); +} + + +void PIEvaluator::makeOutput(PIString & string) { + string.replaceAll(":", "≠"); + string.replaceAll("}", "≥"); + string.replaceAll("{", "≤"); + string.replaceAll("&", "â‹€"); + string.replaceAll("|", "â‹"); +} + + +void PIEvaluator::findUnknownVariables() { + PIString cvar; + unknownVars.clear(); + for (int i = 0; i < currentString.length(); i++) { + if (elements[i].var_num == -666) cvar += currentString[i]; + else { + if (cvar.length() == 0) continue; + unknownVars << cvar; + cvar = ""; + } + } + if (cvar.length() > 0) unknownVars << cvar; + unknownVars.removeDuplicates(); +} + + +bool PIEvaluator::isSign(const PIChar & ch) { + return ch == '+' || ch == '-' || + ch == '*' || ch == '/' || + ch == '%' || ch == '^' || + ch == '=' || ch == ':' || + ch == '>' || ch == '<' || + ch == '}' || ch == '{' || + ch == '&' || ch == '|'; +} + + +void PIEvaluator::checkBrackets() { + PIString tmps = currentString; + PIChar fc, sc; + int bcnt = 0, bpos = 0, inserted = 0; + currentString = tmps; + for (int i = 0; i < tmps.length(); i++) { + if (tmps[i] == '(') { + if (bcnt == 0) bpos = i; + bcnt++; + } + if (tmps[i] == ')') { + if (bcnt == 0) { + currentString.insert(bpos + inserted, "("); + inserted++; + } else bcnt--; + } + } + if (bcnt > 0) currentString += PIString(bcnt, ')'); + tmps = currentString; + for (int i = 0; i < tmps.length() - 1; i++) { + fc = tmps[i].toLower(); + sc = tmps[i + 1].toLower(); + if ((fc == ')' && sc == '(') || + (fc == ')' && sc >= '0' && sc <= '9') || + (fc == ')' && sc >= 'a' && sc <= 'z') ) tmps.insert(++i, '*'); + } + currentString = tmps; +} + + +bool PIEvaluator::fillElements() { + int fstart, flen, cnum = 0, cpart = 0, cfunc; + PIChar cc, nc, pc, fc = '!'; + bool numFound = false; + PIString curfind, tmps = currentString; + elements.resize(tmps.length()); + for (uint i = 0; i < elements.size(); i++) { + elements[i].type = PIEvaluatorTypes::etVariable; + elements[i].var_num = -666; + } + currentVariables.clear(); + //qDebug().nospace() << "search for functions ..."; + for (int i = 0; i < content.functionsCount(); i++) { + curfind = content.function(i).identifier; + cfunc = i; //(int)content.function(i).type; + flen = curfind.length(); + fstart = 0; + while (fstart >= 0) { + fstart = tmps.find(curfind, fstart); + if (fstart < 0) break; + if (tmps[fstart + flen] != '(') { + //currentString.insert(fstart + flen, "("); + //return true; + fstart++; + continue; + } + for (int j = fstart; j < fstart + flen; j++) { + elements[j].set(PIEvaluatorTypes::etFunction, cnum, cfunc); + tmps.replace(j, 1, fc); + } + cnum++; + } + } + cnum = 0; + //qDebug().nospace() << "search for variables ..."; + for (int i = 0; i < content.variablesCount(); i++) { + curfind = content.variable(i).name; + flen = curfind.length(); + fstart = 0; + while (fstart >= 0) { + fstart = tmps.find(curfind, fstart); + if (fstart < 0) break; + for (int j = fstart; j < fstart + flen; j++) { + elements[j].set(PIEvaluatorTypes::etVariable, cnum, i); + tmps.replace(j, 1, fc); + } + cnum++; + } + } + curfind = ""; + cnum = 1; + //qDebug().nospace() << "search for numbers ..."; + for (int i = 0; i < tmps.length(); i++) { + cc = tmps[i]; + /*if (cc == " " || cc == "(" || cc == ")") { + curfind = ""; + cpart = 0; + numFound = false; + continue; + }*/ + switch (cpart) { + case 0: + if ((cc >= '0' && cc <= '9')) {// || cc == '-' || cc == '+') { + curfind += cc; + cpart = 1; + continue; + } + if (cc == '.') { + curfind += cc; + cpart = 2; + continue; + } + if (cc == 'E') { + curfind += cc; + cpart = 3; + continue; + } + break; + case 1: + if (cc >= '0' && cc <= '9') { + curfind += cc; + continue; + } + if (cc == '.') { + curfind += cc; + cpart = 2; + continue; + } + if (cc == 'E') { + curfind += cc; + cpart = 3; + continue; + } + numFound = true; + break; + case 2: + if (cc >= '0' && cc <= '9') { + curfind += cc; + continue; + } + if (cc == 'E') { + curfind += cc; + cpart = 3; + continue; + } + numFound = true; + break; + case 3: + if ((cc >= '0' && cc <= '9') || cc == '-' || cc == '+') { + curfind += cc; + cpart = 4; + continue; + } + numFound = true; + break; + case 4: + if (cc >= '0' && cc <= '9') { + curfind += cc; + continue; + } + numFound = true; + break; + } + if (numFound) { + //qDebug().nospace() << "add " << cnum << ": " << curfind << " = " << curfind.toDouble(); + currentVariables.push_back(PIEvaluatorTypes::Variable("tmp" + PIString::fromNumber(cnum), curfind.toDouble())); + for (int j = i - curfind.length(); j < i; j++) { + elements[j].set(PIEvaluatorTypes::etNumber, cnum, -cnum); + tmps.replace(j, 1, fc); + } + curfind = ""; + cnum++; + cpart = 0; + numFound = false; + } + } + if (cpart > 0) { + //qDebug().nospace() << "add " << cnum << ": " << curfind << " = " << curfind.toDouble(); + currentVariables.push_back(PIEvaluatorTypes::Variable("tmp" + PIString::fromNumber(cnum), curfind.toDouble())); + for (int j = tmps.length() - curfind.length(); j < tmps.length(); j++) { + elements[j].set(PIEvaluatorTypes::etNumber, cnum, -cnum); + tmps.replace(j, 1, fc); + } + } + cc = nc = fc; + //qDebug().nospace() << "search for signes ..."; + for (int i = 0; i < tmps.length(); i++) { + cc = tmps[i]; + if (i > 0) pc = tmps[i - 1]; + else pc = fc; + if (i < tmps.length() - 1) nc = tmps[i + 1]; + else nc = fc; + if (cc == '(' || cc == ')' || cc == ',') { + elements[i].set(PIEvaluatorTypes::etOperator, -1); + continue; + } + if (cc == '-' || cc == '+') { + elements[i].set(PIEvaluatorTypes::etOperator, -1); + if (i < tmps.length() - 1) if (elements[i + 1].type == PIEvaluatorTypes::etVariable || + elements[i + 1].type == PIEvaluatorTypes::etFunction) continue; + if ((pc == '(' || isSign(pc) || i == 0) && i < tmps.length() - 1) { + if (elements[i + 1].type != PIEvaluatorTypes::etOperator) { + cnum = elements[i + 1].num; + elements[i].set(PIEvaluatorTypes::etNumber, cnum); + tmps.replace(i, 1, fc); + ///cout << "found sign " << cc << " :" << cnum - 1 << endl; + if (cc == '-' && currentVariables.size_s() >= cnum) + currentVariables[cnum - 1].value = -currentVariables[cnum - 1].value; + //i++; + continue; + } + } + } + if (isSign(cc)) { + elements[i].set(PIEvaluatorTypes::etOperator, -1); + continue; + } + } + /* + qDebug().nospace() << tmps; + cout << " "; + for (int i = 0; i < elements.size(); i++) { + switch (elements[i].type) { + case etFunction: cout << "f"; break; + case etNumber: cout << "n"; break; + case etOperator: cout << "o"; break; + case etVariable: cout << "v"; break; + } + } + cout << endl; + */ + return false; + //for (int i = 0; i < currentVariables.size(); i++) qDebug() << "var " << i << ": " << currentVariables[i].value.real(); +} + + +bool PIEvaluator::setSignes() { + int inserted = 0, ni, pi = 0, needInsert = 0; + PIChar fc, sc, pc; + PIString tmps = currentString; + for (int i = 0; i < tmps.length() - 1; i++) { + needInsert = 0; + ni = i + 1; + if (i > 0) pi = i - 1; + fc = tmps[i].toLower(); + sc = tmps[ni].toLower(); + pc = tmps[pi].toLower(); + //if (elements[i].type == etOperator || elements[ni].type == etVariable) continue; + if (fc == ',' || sc == ',') continue; + if (elements[i].type == PIEvaluatorTypes::etOperator && elements[ni].type == PIEvaluatorTypes::etOperator) continue; + if (fc == ')' && (elements[ni].type == PIEvaluatorTypes::etNumber || elements[ni].type == PIEvaluatorTypes::etVariable || elements[ni].type == PIEvaluatorTypes::etFunction)) needInsert = 1; + if (sc == '(' && (elements[i].type == PIEvaluatorTypes::etNumber || elements[i].type == PIEvaluatorTypes::etVariable)) needInsert = 1; + if (elements[i].type == PIEvaluatorTypes::etNumber && elements[ni].type == PIEvaluatorTypes::etNumber && elements[i].num != elements[ni].num) needInsert = 1; + if (elements[i].type == PIEvaluatorTypes::etVariable && elements[ni].type == PIEvaluatorTypes::etVariable && elements[i].num != elements[ni].num) needInsert = 1; + if ((elements[i].type == PIEvaluatorTypes::etNumber && elements[ni].type == PIEvaluatorTypes::etVariable) || (elements[i].type == PIEvaluatorTypes::etVariable && elements[ni].type == PIEvaluatorTypes::etNumber)) needInsert = 1; + if ((elements[i].type == PIEvaluatorTypes::etNumber || elements[i].type == PIEvaluatorTypes::etVariable) && elements[ni].type == PIEvaluatorTypes::etFunction) needInsert = 1; + if (elements[i].type == PIEvaluatorTypes::etFunction && elements[ni].type == PIEvaluatorTypes::etFunction && elements[i].num != elements[ni].num) needInsert = 2; + if (elements[i].type == PIEvaluatorTypes::etFunction && elements[ni].type != PIEvaluatorTypes::etFunction && sc != '(') needInsert = 2; + if (elements[pi].type == PIEvaluatorTypes::etOperator && (elements[ni].type == PIEvaluatorTypes::etFunction || elements[ni].type == PIEvaluatorTypes::etVariable) && fc == '-') needInsert = 3; + switch (needInsert) { + case 1: + currentString.insert(ni + inserted, "*"); + elements.insert(ni + inserted, PIEvaluatorTypes::Element(PIEvaluatorTypes::etOperator, -1)); + //inserted++; + //i++; + return true; + /*case 2: + currentString.insert(ni + inserted, ")"); + currentString.insert(ni + inserted, "("); + elements.insert(ni + inserted, Element(etOperator, -1)); + elements.insert(ni + inserted, Element(etOperator, -1)); + inserted++; + i++; + return true;*/ + case 3: + currentString.insert(ni + inserted, "1*"); + elements.insert(ni + inserted, PIEvaluatorTypes::Element(PIEvaluatorTypes::etOperator, -1)); + //inserted; + //i++; + return true; + } + } + /*if (elements[tmps.length() - 1].type == etFunction) { + currentString.insert(tmps.length() + inserted, ")"); + currentString.insert(tmps.length() + inserted, "("); + elements.insert(tmps.length() + inserted, Element(etOperator, -1)); + elements.insert(tmps.length() + inserted, Element(etOperator, -1)); + return true; + }*/ + return false; +} + + +void PIEvaluator::convert() { + int j; + PIEvaluatorTypes::Element ce, pe; + for (int i = 0; i < currentString.length(); i++) { + pe = elements[i]; + if (pe.type != PIEvaluatorTypes::etFunction) continue; + j = i + 1; + while (j < currentString.length()) { + ce = elements[j]; + if (ce != pe) break; + j++; + } + currentString.replace(i, j - i, " "); + for (int k = i + 1; k < j; k++) elements.remove(i); + //i++; + } + for (int i = 0; i < currentString.length(); i++) { + pe = elements[i]; + if (pe.type != PIEvaluatorTypes::etNumber) continue; + j = i + 1; + while (j < currentString.length()) { + ce = elements[j]; + if (ce != pe) break; + j++; + } + currentString.replace(i, j - i, " "); + for (int k = i + 1; k < j; k++) elements.remove(i); + //i++; + } + for (int i = 0; i < currentString.length(); i++) { + pe = elements[i]; + if (pe.type != PIEvaluatorTypes::etVariable) continue; + j = i + 1; + while (j < currentString.length()) { + ce = elements[j]; + if (ce != pe) break; + j++; + } + currentString.replace(i, j - i, " "); + for (int k = i + 1; k < j; k++) elements.remove(i); + //i++; + } + /*qDebug().nospace() << currentString; + cout << " "; + for (int i = 0; i < elements.size(); i++) { + switch (elements[i].type) { + case etFunction: cout << "f"; break; + case etNumber: cout << "n"; break; + case etOperator: cout << "o"; break; + case etVariable: cout << "v"; break; + } + } + cout << endl;*/ +} + + + +const PIString & PIEvaluator::preprocess(const PIString & string) { + static PIString ret; + int lind; + ret = prepare(string); + convert(); + instructions.clear(); + //qDebug() << preproc->currentString; + variables = currentVariables; + lind = parse(currentString); + if (instructions.size() == 0) { + variables.push_back(PIEvaluatorTypes::Variable()); + instructions.push_back(PIEvaluatorTypes::Instruction(PIEvaluatorTypes::oNone, PIVector(1, lind), -variables.size_s())); + } + kvars = &(content.variables); + /* + cout << endl << "variables:" << endl; + for (int i = 0; i < variables.size(); i++) + cout << i << " value = " << variables[i].value << endl; + + cout << endl << "instructions:" << endl; + for (int i = 0; i < instructions.size(); i++) { + cout << i << endl; + cout << " operation " << instructions[i].operation << endl; + cout << " operators: "; + for (int j = 0; j < instructions[i].operators.size(); j++) + cout << instructions[i].operators[j] << "; "; + cout << endl << " function " << instructions[i].function << endl; + cout << " out " << instructions[i].out << endl; + } + */ + makeOutput(ret); + return ret; +} + + +PIEvaluatorTypes::Operation PIEvaluator::operationInOrder(const int & index) { + switch (index) { + case 0: return PIEvaluatorTypes::oPower; + case 1: return PIEvaluatorTypes::oMultiply; + case 2: return PIEvaluatorTypes::oDivide; + case 3: return PIEvaluatorTypes::oResidue; + case 4: return PIEvaluatorTypes::oAdd; + case 5: return PIEvaluatorTypes::oSubtract; + case 6: return PIEvaluatorTypes::oEqual; + case 7: return PIEvaluatorTypes::oNotEqual; + case 8: return PIEvaluatorTypes::oGreaterEqual; + case 9: return PIEvaluatorTypes::oSmallerEqual; + case 10: return PIEvaluatorTypes::oGreater; + case 11: return PIEvaluatorTypes::oSmaller; + case 12: return PIEvaluatorTypes::oAnd; + case 13: return PIEvaluatorTypes::oOr; + default: return PIEvaluatorTypes::oNone; + } +} + + +int PIEvaluator::parse(const PIString & string, int offset) { + int slen = string.length(), /*facnt,*/ farg, bcnt, k; + PIChar cc; + PIEvaluatorTypes::Element ce; + PIEvaluatorTypes::Function cfunc; + PIEvaluatorTypes::Operation coper; + PIString sbrackets, carg; + PIVector args, atmp; + PIVector opers; + + ///qDebug() << "to parse :" + string; + ///cout << " "; for (int i = 0; i < slen; i++) cout << preproc->elements[i + offset].type; cout << endl; + + for (int i = 0; i < slen; i++) { + ce = elements[i + offset]; + cc = string[i]; + switch (ce.type) { + case PIEvaluatorTypes::etNumber: + args.push_back(ce.var_num); + continue; + case PIEvaluatorTypes::etVariable: + args.push_back(ce.var_num); + continue; + case PIEvaluatorTypes::etFunction: + i++; + cfunc = content.function(ce.var_num); + //facnt = cfunc.arguments; + atmp.clear(); + bcnt = farg = 1; + ///qDebug() << "function: " + cfunc.identifier; + //for (int k = 0; k < facnt; k++) { + bcnt = 1; + carg = ""; + k = i + 1; + //if (string.size_s() <= k || k < 0) return -666; + while (bcnt > 0) { + //if (k < facnt - 1) fcomma = string.indexOf(',', j); + cc = string[k]; + switch (cc.toAscii()) { + case '(': bcnt++; break; + case ')': + bcnt--; + if (bcnt == 0) { + ///qDebug() << "arument: " << carg; + atmp.push_back(parse(carg, k + offset - carg.length())); + k++; + carg = ""; + if (atmp.size_s() > 0) if (atmp.back() < 0 && farg > 0) farg = atmp.back(); + continue; + } + break; + case ',': + if (bcnt == 1) { + ///qDebug() << "arument: " << carg; + atmp.push_back(parse(carg, k + offset - carg.length())); + k++; + carg = ""; + if (atmp.size_s() > 0) if (atmp.back() < 0 && farg > 0) farg = atmp.back(); + continue; + } + break; + } + carg += cc; + k++; + } + i = k - 1; + if (farg > 0) { + variables.push_back(PIEvaluatorTypes::Variable()); + farg = -variables.size_s(); + } + instructions.push_back(PIEvaluatorTypes::Instruction(PIEvaluatorTypes::oFunction, atmp, farg, ce.var_num)); + args.push_back(farg); + //for (int i = 0; i < args.size_s(); i++) cout << preproc->currentVariables[-args[i]].value << endl; + //i = j + 1; + continue; + case PIEvaluatorTypes::etOperator: + //qDebug() << "operator: " << cc; + if (cc == '(') { + sbrackets = inBrackets(string.right(slen - i)); + args.push_back(parse(sbrackets, i + offset + 1)); + i += sbrackets.length() + 1; + continue; + } + if (cc == '+') {opers.push_back(PIEvaluatorTypes::oAdd); continue;} + if (cc == '-') {opers.push_back(PIEvaluatorTypes::oSubtract); continue;} + if (cc == '*') {opers.push_back(PIEvaluatorTypes::oMultiply); continue;} + if (cc == '/') {opers.push_back(PIEvaluatorTypes::oDivide); continue;} + if (cc == '%') {opers.push_back(PIEvaluatorTypes::oResidue); continue;} + if (cc == '^') {opers.push_back(PIEvaluatorTypes::oPower); continue;} + if (cc == '=') {opers.push_back(PIEvaluatorTypes::oEqual); continue;} + if (cc == ':') {opers.push_back(PIEvaluatorTypes::oNotEqual); continue;} + if (cc == '}') {opers.push_back(PIEvaluatorTypes::oGreaterEqual); continue;} + if (cc == '{') {opers.push_back(PIEvaluatorTypes::oSmallerEqual); continue;} + if (cc == '>') {opers.push_back(PIEvaluatorTypes::oGreater); continue;} + if (cc == '<') {opers.push_back(PIEvaluatorTypes::oSmaller); continue;} + if (cc == '&') {opers.push_back(PIEvaluatorTypes::oAnd); continue;} + if (cc == '|') {opers.push_back(PIEvaluatorTypes::oOr); continue;} + } + } + /* + cout << "stack: " << endl << "args: "; + for (int i = 0; i < args.size_s(); i++) cout << args[i] << ", "; + cout << endl << "opers: "; + for (int i = 0; i < opers.size_s(); i++) cout << opers[i] << ", "; + */ + if (opers.size_s() == 0) { + if (args.size_s() > 0) return args.back(); + else return -666; + } + for (int i = 0; i < PIEvaluatorTypes::operationCount; i++) { + coper = operationInOrder(i); + for (int j = 0; j < opers.size_s(); j++) { + if (coper == PIEvaluatorTypes::oDivide || coper == PIEvaluatorTypes::oMultiply) { + if (opers[j] != PIEvaluatorTypes::oDivide && opers[j] != PIEvaluatorTypes::oMultiply) continue; + } else { + if (opers[j] != coper) continue; + } + atmp.clear(); + if (j < args.size_s() && j >= 0) atmp.push_back(args[j]); + else atmp.push_back(-666); + if (j + 1 < args.size_s() && j >= -1) atmp.push_back(args[j + 1]); + else atmp.push_back(-666); + farg = 1; + if (atmp[0] < 0) farg = atmp[0]; + else { + if (atmp[1] < 0) farg = atmp[1]; + else { + variables.push_back(PIEvaluatorTypes::Variable()); + farg = -variables.size_s(); + } + } + instructions.push_back(PIEvaluatorTypes::Instruction(opers[j], atmp, farg)); + if (j >= 0 && j < args.size_s()) { + args.remove(j); + if (j < args.size_s()) args[j] = farg; + } + opers.remove(j); + j--; + } + } + return instructions.back().out; + ///cout << endl; +} + + +bool PIEvaluator::check() { + PIEvaluatorTypes::Instruction ci; + bool error; + if (unknownVars.size_s() > 0) { + lastError = "Unknown variables: \"" + unknownVars.join("\", \"") + "\""; + return false; + } + for (int i = 0; i < instructions.size_s(); i++) { + error = false; + ci = instructions[i]; + PIEvaluatorTypes::Function cf; + int fac, gac; + switch (ci.operation) { + case PIEvaluatorTypes::oNone: break; + case PIEvaluatorTypes::oFunction: + cf = content.function(ci.function); + fac = cf.arguments; + gac = ci.operators.size_s(); + for (int j = 0; j < ci.operators.size_s(); j++) { + if (ci.operators[j] == -666) { //(ci.operators[j] < -variables.size_s() || ci.operators[j] >= kvars->size()) { + error = true; + gac--; + } + } + if (fac > 0) { + if (gac != fac) { + lastError = "Invalid arguments count for function \"" + cf.identifier + + "\", expected " + PIString::fromNumber(fac) + " but " + + PIString::fromNumber(gac) + " given"; + return false; + } + if (error) { + lastError = "Invalid at least one of function \"" + cf.identifier + "\" argument"; + return false; + } + } + if (fac < 0) { + if (gac < -fac) { + lastError = "Invalid arguments count for function \"" + cf.identifier + + "\", expected at least " + PIString::fromNumber(-fac) + " but " + + PIString::fromNumber(gac) + " given"; + return false; + } + if (error) { + lastError = "Invalid at least one of function \"" + cf.identifier + "\" argument"; + return false; + } + } + break; + default: + if (ci.operators[0] == -666 || ci.operators[1] == -666) error = true; + if (ci.operators.size_s() != 2 || error) { + lastError = "Invalid arguments count for operation \" " + operationChar(ci.operation) + " \""; + return false; + } + break; + } + if (ci.out < -variables.size_s()) { + lastError = "Invalid variable index \"" + PIString::fromNumber(ci.out) + "\""; + return false; + } + for (int j = 0; j < ci.operators.size_s(); j++) { + if (ci.operators[j] < -variables.size_s() || ci.operators[j] >= kvars->size_s()) { + lastError = "Invalid variable index \"" + PIString::fromNumber(ci.operators[j]) + "\""; + return false; + } + } + } + return true; +} + + +PIString PIEvaluator::inBrackets(const PIString & string) { + int slen = string.length(), bcnt = 0; + PIChar cc; + for (int i = 0; i < slen; i++) { + cc = string[i]; + if (cc == '(') bcnt++; + if (cc == ')') { + bcnt--; + if (bcnt == 0) return string.mid(1, i - 1); + } + } + return PIString(); +} + + +PIString PIEvaluator::operationChar(const PIEvaluatorTypes::Operation & operation) { + switch (operation) { + case PIEvaluatorTypes::oAdd: return "+"; + case PIEvaluatorTypes::oSubtract: return "-"; + case PIEvaluatorTypes::oMultiply: return "*"; + case PIEvaluatorTypes::oDivide: return "/"; + case PIEvaluatorTypes::oPower: return "^"; + case PIEvaluatorTypes::oResidue: return "%"; + case PIEvaluatorTypes::oEqual: return "="; + case PIEvaluatorTypes::oNotEqual: return ("≠"); + case PIEvaluatorTypes::oGreaterEqual: return ("≥"); + case PIEvaluatorTypes::oSmallerEqual: return ("≤"); + case PIEvaluatorTypes::oGreater: return ">"; + case PIEvaluatorTypes::oSmaller: return "<"; + case PIEvaluatorTypes::oAnd: return ("â‹€"); + case PIEvaluatorTypes::oOr: return ("â‹"); + default: return "???"; + } +} + + +inline complexd PIEvaluator::residue(const complexd & f, const complexd & s) { + complexd ret; + if (s.real() != 0.) ret = complexd(f.real() - ((int)(f.real() / s.real())) * s.real(), 0.); + if (s.imag() != 0.) ret = complexd(ret.real(), f.imag() - ((int)(f.imag() / s.imag())) * s.imag()); + return ret; +} + + +inline void PIEvaluator::execFunction(const PIEvaluatorTypes::Instruction & ci) { + PIEvaluatorTypes::Function cfunc = content.function(ci.function); + int oi = -ci.out - 1; + complexd tmp, stmp, ttmp; + //qDebug() << "function " << (int)cfunc.type; + switch (cfunc.type) { + case PIEvaluatorTypes::bfSin: + tmpvars[oi].value = sin(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfCos: + tmpvars[oi].value = cos(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfTg: + tmpvars[oi].value = tan(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfCtg: + tmp = tan(value(ci.operators[0])); + if (tmp == complexd_0) tmpvars[oi].value = 0.; + else tmpvars[oi].value = complexd_1 / tmp; + break; + case PIEvaluatorTypes::bfArcsin: + tmpvars[oi].value = asinc(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfArccos: + tmpvars[oi].value = acosc(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfArctg: + tmpvars[oi].value = atanc(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfArcctg: + tmp = atanc(value(ci.operators[0])); + if (tmp == complexd_0) tmpvars[oi].value = 0.; + else tmpvars[oi].value = complexd_1 / tmp; + break; + case PIEvaluatorTypes::bfSh: + tmpvars[oi].value = sinh(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfCh: + tmpvars[oi].value = cosh(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfTh: + tmpvars[oi].value = tanh(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfCth: + tmp = tanh(value(ci.operators[0])); + if (tmp == complexd_0) tmpvars[oi].value = 0.; + else tmpvars[oi].value = complexd_1 / tmp; + break; + case PIEvaluatorTypes::bfAbs: + tmpvars[oi].value = abs(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfSqrt: + tmpvars[oi].value = sqrt(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfSqr: + tmpvars[oi].value = value(ci.operators[0]) * value(ci.operators[0]); + break; + case PIEvaluatorTypes::bfExp: + tmpvars[oi].value = exp(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfPow: + tmpvars[oi].value = pow(value(ci.operators[0]), value(ci.operators[1])); + break; + case PIEvaluatorTypes::bfLn: + tmpvars[oi].value = log(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfLg: + tmpvars[oi].value = log10(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfLog: + tmp = log(value(ci.operators[1])); + if (tmp == complexd_0) tmpvars[oi].value = 0.; + else tmpvars[oi].value = log(value(ci.operators[0])) / tmp; + break; + case PIEvaluatorTypes::bfRe: + tmpvars[oi].value = value(ci.operators[0]).real(); + break; + case PIEvaluatorTypes::bfIm: + tmpvars[oi].value = value(ci.operators[0]).imag(); + break; + case PIEvaluatorTypes::bfArg: + tmpvars[oi].value = arg(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfLen: + tmpvars[oi].value = abs(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfConj: + tmpvars[oi].value = conj(value(ci.operators[0])); + break; + case PIEvaluatorTypes::bfSign: + tmpvars[oi].value = value(ci.operators[0]).real() >= 0. ? complexd_1 : -complexd_1; + break; + case PIEvaluatorTypes::bfRad: + tmpvars[oi].value = value(ci.operators[0]) * complexd(deg2rad, 0.); + break; + case PIEvaluatorTypes::bfDeg: + tmpvars[oi].value = value(ci.operators[0]) * complexd(rad2deg, 0.); + break; + case PIEvaluatorTypes::bfJ0: + tmpvars[oi].value = piJ0(value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfJ1: + tmpvars[oi].value = piJ1(value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfJN: + tmpvars[oi].value = piJn(piRoundd(value(ci.operators[1]).real()), value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfY0: + tmpvars[oi].value = piY0(value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfY1: + tmpvars[oi].value = piY1(value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfYN: + tmpvars[oi].value = piYn(piRoundd(value(ci.operators[1]).real()), value(ci.operators[0]).real()); + break; + case PIEvaluatorTypes::bfMin: + tmp = value(ci.operators[0]); + for (int i = 1; i < ci.operators.size_s(); ++i) { + stmp = value(ci.operators[i]); + tmp = complexd(piMind(tmp.real(), stmp.real()), piMind(tmp.imag(), stmp.imag())); + } + tmpvars[oi].value = tmp; + break; + case PIEvaluatorTypes::bfMax: + tmp = value(ci.operators[0]); + for (int i = 1; i < ci.operators.size_s(); ++i) { + stmp = value(ci.operators[i]); + tmp = complexd(piMaxd(tmp.real(), stmp.real()), piMaxd(tmp.imag(), stmp.imag())); + } + tmpvars[oi].value = tmp; + break; + case PIEvaluatorTypes::bfClamp: + tmp = value(ci.operators[0]); + stmp = value(ci.operators[1]); + ttmp = value(ci.operators[2]); + tmpvars[oi].value = complexd(piClampd(tmp.real(), stmp.real(), ttmp.real()), piClampd(tmp.imag(), stmp.imag(), ttmp.imag())); + break; + case PIEvaluatorTypes::bfStep: + tmpvars[oi].value = complexd(value(ci.operators[0]).real() >= value(ci.operators[1]).real() ? complexld_1 : complexld_0); + break; + case PIEvaluatorTypes::bfMix: + tmp = value(ci.operators[0]); + stmp = value(ci.operators[1]); + ttmp = value(ci.operators[2]); + tmpvars[oi].value = stmp.real() * (1. - tmp.real()) + ttmp.real() * tmp.real(); + break; + case PIEvaluatorTypes::bfDefined: + tmpvars[oi].value = value(ci.operators[0]).real() > 0. ? complexd_1 : complexd_0; + break; + case PIEvaluatorTypes::bfRandom: + tmp = static_cast(rand()) / RAND_MAX; + stmp = value(ci.operators[1]) - value(ci.operators[0]); + tmpvars[oi].value = value(ci.operators[0]) + tmp * stmp; + break; + default: break; + } +} + + +inline bool PIEvaluator::execInstructions() { + PIEvaluatorTypes::Instruction ci; + int oi; + complexd tmp; + tmpvars = variables; + //cout << "var count " << tmpvars.size_s() << endl; + for (int i = 0; i < instructions.size_s(); i++) { + ci = instructions[i]; + oi = -ci.out - 1; + //cout << value(ci.operators[0]) << operationChar(ci.operation) << value(ci.operators[1]) << ", " << oi << endl; + switch (ci.operation) { + case PIEvaluatorTypes::oAdd: + tmpvars[oi].value = value(ci.operators[0]) + value(ci.operators[1]); + break; + case PIEvaluatorTypes::oSubtract: + tmpvars[oi].value = value(ci.operators[0]) - value(ci.operators[1]); + break; + case PIEvaluatorTypes::oMultiply: + tmpvars[oi].value = value(ci.operators[0]) * value(ci.operators[1]); + break; + case PIEvaluatorTypes::oDivide: + tmp = value(ci.operators[1]); + if (tmp == complexd(0., 0.)) tmpvars[oi].value = 0.; + else tmpvars[oi].value = value(ci.operators[0]) / tmp; + break; + case PIEvaluatorTypes::oResidue: + tmpvars[oi].value = residue(value(ci.operators[0]), value(ci.operators[1])); + break; + case PIEvaluatorTypes::oPower: + tmpvars[oi].value = pow(value(ci.operators[0]), value(ci.operators[1])); + break; + case PIEvaluatorTypes::oEqual: + tmpvars[oi].value = value(ci.operators[0]) == value(ci.operators[1]); + break; + case PIEvaluatorTypes::oNotEqual: + tmpvars[oi].value = value(ci.operators[0]) != value(ci.operators[1]); + break; + case PIEvaluatorTypes::oGreaterEqual: + tmpvars[oi].value = value(ci.operators[0]).real() >= value(ci.operators[1]).real(); + break; + case PIEvaluatorTypes::oSmallerEqual: + tmpvars[oi].value = value(ci.operators[0]).real() <= value(ci.operators[1]).real(); + break; + case PIEvaluatorTypes::oGreater: + tmpvars[oi].value = value(ci.operators[0]).real() > value(ci.operators[1]).real(); + break; + case PIEvaluatorTypes::oSmaller: + tmpvars[oi].value = value(ci.operators[0]).real() < value(ci.operators[1]).real(); + break; + case PIEvaluatorTypes::oAnd: + tmpvars[oi].value = value(ci.operators[0]).real() > 0. && value(ci.operators[1]).real() > 0.; + break; + case PIEvaluatorTypes::oOr: + tmpvars[oi].value = value(ci.operators[0]).real() > 0. || value(ci.operators[1]).real() > 0.; + break; + case PIEvaluatorTypes::oFunction: + execFunction(ci); + break; + case PIEvaluatorTypes::oNone: + tmpvars[oi].value = value(ci.operators[0]); + break; + } + } + if (!instructions.isEmpty()) + out = value(instructions.back().out); + return true; +} + + +bool PIEvaluator::check(const PIString & string) { + currentString = preprocess(string); + correct = check(); + if (!correct) { + instructions.clear(); + return false; + } + lastError = "Correct"; + return true; +} + + +complexd PIEvaluator::evaluate() { + if (!execInstructions()) out = 0.; + if (fabs(out.real()) < 1E-300) out = complexd(0., out.imag()); + if (fabs(out.imag()) < 1E-300) out = complexd(out.real(), 0.); + return out; +} diff --git a/src/math/pievaluator.h b/src/math/pievaluator.h new file mode 100755 index 00000000..9703a5d4 --- /dev/null +++ b/src/math/pievaluator.h @@ -0,0 +1,227 @@ +/*! \file pievaluator.h + * \brief Mathematic expressions calculator +*/ +/* + PIP - Platform Independent Primitives + Evaluator designed for stream calculations + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIEVALUATOR_H +#define PIEVALUATOR_H + +#include "pistring.h" +#include "pimath.h" + +typedef complexd (*FuncFunc)(void * , int, complexd * ); + +namespace PIEvaluatorTypes { + static const int operationCount = 14; + + enum eType {etNumber, etOperator, etVariable, etFunction}; + enum Operation {oNone, oAdd, oSubtract, oMultiply, oDivide, oResidue, oPower, + oEqual, oNotEqual, oGreater, oSmaller, oGreaterEqual, oSmallerEqual, + oAnd, oOr, oFunction + }; + enum BaseFunctions {bfUnknown, bfSin, bfCos, bfTg, bfCtg, + bfArcsin, bfArccos, bfArctg, bfArcctg, + bfExp, bfRandom, bfSh, bfCh, bfTh, bfCth, + bfSqrt, bfSqr, bfPow, bfAbs, + bfLn, bfLg, bfLog, bfSign, + bfIm, bfRe, bfArg, bfLen, bfConj, + bfRad, bfDeg, bfJ0, bfJ1, bfJN, + bfY0, bfY1, bfYN, bfMin, bfMax, + bfClamp, bfStep, bfMix, bfDefined, + bfCustom = 0xFFFF + }; + + struct Instruction { + Instruction() {;} + Instruction(Operation oper, PIVector opers, int out_ind, int func = -1) { + operation = oper; operators = opers; out = out_ind; function = func;} + Operation operation; + PIVector operators; + int out; + int function; + }; + struct Element { + Element() {;} + Element(eType new_type, int new_num, int new_var_num = -1) {set(new_type, new_num, new_var_num);} + void set(eType new_type, int new_num, int new_var_num = -1) {type = new_type; num = new_num; var_num = new_var_num;} + eType type; + int num; + int var_num; + }; + struct Function { + Function() {arguments = 0; type = bfUnknown; handler = 0;} + Function(const PIString & name, int args, BaseFunctions ftype) {identifier = name; arguments = args; type = ftype; handler = 0;} + Function(const PIString & name, int args, FuncFunc h) {identifier = name; arguments = args; type = bfCustom; handler = h;} + PIString identifier; + BaseFunctions type; + FuncFunc handler; + int arguments; + }; + struct Variable { + Variable() {value = 0.;} + Variable(const PIString & var_name, complexd val) {name = var_name; value = val;} + PIString name; + complexd value; + }; +}; +/* + ≠ : + ≥ } + ≤ { + â‹€ & + â‹ | +*/ + +class PIP_EXPORT PIEvaluatorContent +{ + friend class PIEvaluator; +public: + PIEvaluatorContent(); + ~PIEvaluatorContent() {;} + + void addFunction(const PIString & name, int args = 1) {functions.push_back(PIEvaluatorTypes::Function(name, args, getBaseFunction(name)));} + void addVariable(const PIString & name, const complexd & val = 0.) {variables.push_back(PIEvaluatorTypes::Variable(name, val)); sortVariables();} + void addCustomFunction(const PIString & name, int args_count, FuncFunc func) {functions << PIEvaluatorTypes::Function(name, args_count, func);} + int functionsCount() const {return functions.size();} + int variablesCount() const {return variables.size();} + int customVariablesCount() const {return variables.size() - cv_count;} + int findFunction(const PIString & name) const {for (uint i = 0; i < functions.size(); i++) if (functions[i].identifier == name) return i; return -1;} + int findVariable(const PIString & var_name) const {for (uint i = 0; i < variables.size(); i++) if (variables[i].name == var_name) return i; return -1;} + PIEvaluatorTypes::Function function(int index) {if (index < 0 || index >= functions.size_s()) return PIEvaluatorTypes::Function(); return functions[index];} + PIEvaluatorTypes::Variable variable(int index) {if (index < 0 || index >= variables.size_s()) return PIEvaluatorTypes::Variable(); return variables[index];} + PIEvaluatorTypes::Function function(const PIString & name) {return function(findFunction(name));} + PIEvaluatorTypes::Variable variable(const PIString & name) {return variable(findVariable(name));} + PIEvaluatorTypes::Variable customVariable(int index) {if (index < cv_count || index >= variables.size_s() + cv_count) return PIEvaluatorTypes::Variable(); return variables[index + cv_count];} + bool setVariableValue(int index, complexd new_value); + bool setVariableName(int index, const PIString & new_name); + bool setVariableValue(const PIString & var_name, const complexd & new_value) {return setVariableValue(findVariable(var_name), new_value);} + bool setVariableName(const PIString & var_name, const PIString & new_name) {return setVariableName(findVariable(var_name), new_name);} + void removeVariable(int index) {variables.remove(index);} + void removeVariable(const PIString & var_name) {removeVariable(findVariable(var_name));} + void clearCustomVariables(); + void sortVariables(); + PIEvaluatorTypes::BaseFunctions getBaseFunction(const PIString & name); + +private: + PIVector functions; + PIVector variables; + int cv_count; + +}; + + +class PIP_EXPORT PIEvaluator +{ +public: + + //! Constructs an empty evaluator + PIEvaluator() {correct = false; data_ = 0;} + + ~PIEvaluator() {;} + + + //! Returns custom data + void * data() {return data_;} + + //! Set custom data to "_data" + void setData(void * _data) {data_ = _data;} + + + //! Check mathematical expression and parse it to list of instructions + bool check(const PIString & string); + + //! Returns true if expression was checked succesfully + bool isCorrect() const {return correct;} + + //! Set variable value with name "name" to value "value". Add variable if it doesn`t exists + int setVariable(const PIString & name, complexd value = 0.) {if (content.findVariable(name) < 0) content.addVariable(name, value); else content.setVariableValue(name, value); return content.findVariable(name);} + + //! Set variable value with index "index" to value "value". Don`t add variable if it doesn`t exists + void setVariable(int index, complexd value = 0.) {if (index >= 0 && index < content.variablesCount()) content.setVariableValue(index, value);} + + void setCustomVariableValue(int index, complexd value = 0.) {content.variables[index + content.cv_count].value = value;} +/* + //! Add function "name" with arguments count "args_count" and handler "func". Three arguments will be passed to handler: \a data(), "args_count" and array of input values. + void addFunction(const PIString & name, int args_count, FuncFunc func) {content.addCustomFunction(name, args_count, func);} +*/ + //! Evaluate last successfully checked with function \a check() expression and returns result + complexd evaluate(); + + //! Remove variable with name "name" + void removeVariable(const PIString & name) {content.removeVariable(name);} + + //! Remove all manually added variables + void clearCustomVariables() {content.clearCustomVariables();} + + //! Returns index of variable with name "name" + int variableIndex(const PIString & name) const {return content.findVariable(name);} + + //! Returns all unknown variables founded in last expression passed to \a check() function + const PIStringList & unknownVariables() const {return unknownVars;} + + //! Returns processed last expression passed to \a check() function + const PIString & expression() const {return currentString;} + + //! Returns last error description occured in \a check() function + const PIString & error() const {return lastError;} + + //! Returns last result of \a evaluate() + const complexd & lastResult() const {return out;} + + PIEvaluatorContent content; + +private: + const PIString & prepare(const PIString & string); + const PIString & preprocess(const PIString & string); + int parse(const PIString & string, int offset = 0); + void convert(); + void checkBrackets(); + void removeSpaces(); + void findUnknownVariables(); + void removeJunk(); + void replaceOperators(); + void makeOutput(PIString & string); + bool fillElements(); + bool setSignes(); + bool isSign(const PIChar & ch); + PIString inverse(const PIString & string) {int len = string.length(); PIString s; for (int i = 0; i < len; i++) s += string[len - i - 1]; return s;} + bool check(); + bool execInstructions(); + PIString inBrackets(const PIString & string); + PIString operationChar(const PIEvaluatorTypes::Operation & operation); + PIEvaluatorTypes::Operation operationInOrder(const int & index); + complexd value(const int & index) {if (index < 0) return tmpvars[-index - 1].value; else return kvars->at(index).value;} + inline complexd residue(const complexd & f, const complexd & s); + inline void execFunction(const PIEvaluatorTypes::Instruction & ci); + + PIVector elements; + PIVector currentVariables, variables, tmpvars, * kvars; + PIVector instructions; + PIStringList unknownVars; + PIString currentString, lastError; + complexd out; + bool correct; + void * data_; +}; + +inline bool operator ==(PIEvaluatorTypes::Element e1, PIEvaluatorTypes::Element e2) {return (e1.type == e2.type && e1.num == e2.num);} +inline bool operator !=(PIEvaluatorTypes::Element e1, PIEvaluatorTypes::Element e2) {return (e1.type != e2.type || e1.num != e2.num);} + +#endif // PIEVALUATOR_H diff --git a/src/math/pifft.cpp b/src/math/pifft.cpp new file mode 100644 index 00000000..61814720 --- /dev/null +++ b/src/math/pifft.cpp @@ -0,0 +1,936 @@ +/* + PIP - Platform Independent Primitives + Class for FFT, IFFT and Hilbert transformations + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pifft.h" + + +PIFFT::PIFFT() { + prepared = false; +} + + +PIVector * PIFFT::calcFFT(const PIVector & val) { + result.clear(); + if (val.size_s() < 4) return &result; + fftc1d(val, val.size()); + return &result; +} + + +PIVector * PIFFT::calcFFTinverse(const PIVector & val) { + result.clear(); + if (val.size_s() < 4) return &result; + fftc1dinv(val, val.size()); + return &result; +} + + +PIVector * PIFFT::calcHilbert(const PIVector & val) { + result.clear(); + if (val.size_s() < 4) return &result; + fftc1r(val, val.size()); + for (uint i = 0; i < result.size() / 2; i++) result[i] = result[i] * 2.; + for (uint i = result.size() / 2; i < result.size(); i++) result[i] = 0; + fftc1dinv(result, result.size()); + return &result; +} + + +PIVector * PIFFT::calcFFT(const PIVector & val) { + result.clear(); + if (val.size_s() < 4) return &result; + fftc1r(val, val.size()); + return &result; +} + + +PIVector PIFFT::getAmplitude() { + PIVector a; + double tmp; + for (uint i = 0; i < result.size(); i++) { + tmp = sqrt(result[i].real() * result[i].real() + result[i].imag() * result[i].imag()); + a.push_back(tmp); + } + return a; +} + + +void PIFFT::fftc1d(const PIVector & a, uint n) { + createPlan(n); + uint i; + PIVector buf; + buf.resize(2 * n); + for (i = 0; i < n; i++) { + buf[2 * i + 0] = a[i].real(); + buf[2 * i + 1] = a[i].imag(); + } + ftbaseexecuteplan(&buf, 0, n, &curplan); + result.resize(n); + for (i = 0; i < n; i++) + result[i] = complexd(buf[2 * i + 0], buf[2 * i + 1]); +} + + +void PIFFT::fftc1r(const PIVector & a, uint n) { + uint i; + if (n % 2 == 0) { + PIVector buf; + uint n2 = n / 2; + buf = a; + createPlan(n2); + ftbaseexecuteplan(&buf, 0, n2, &curplan); + result.resize(n); + uint idx; + complexd hn, hmnc, v; + for (i = 0; i <= n2; i++) { + idx = 2 * (i % n2); + hn = complexd(buf[idx + 0], buf[idx + 1]); + idx = 2 * ((n2 - i) % n2); + hmnc = complexd(buf[idx + 0], -buf[idx + 1]); + v = complexd(sin(M_PI * i / n2), cos(M_PI * i / n2)); + result[i] = ((hn + hmnc) - (v * (hn - hmnc))); + result[i] *= 0.5; + } + for (i = n2 + 1; i < n; i++) + result[i] = conj(result[n - i]); + } else { + PIVector cbuf; + cbuf.resize(n); + for (i = 0; i < n; i++) + cbuf[i] = complexd(a[i], 0.); + fftc1d(cbuf, n); + } +} + + +void PIFFT::fftc1dinv(const PIVector & a, uint n) { + PIVector cbuf; + cbuf.resize(n); + uint i; + for (i = 0; i < n; i++) { + cbuf[i] = conj(a[i]); + } + fftc1d(cbuf, n); + for (i = 0; i < n; i++) { + result[i] = conj(result[i] / (double)n); + } +} + + +void PIFFT::createPlan(uint n) { + curplan.plan.clear(); + curplan.precomputed.clear(); + curplan.stackbuf.clear(); + curplan.tmpbuf.clear(); + if (n < 2) return; + ftbasegeneratecomplexfftplan(n, &curplan); + prepared = true; +} + + +void PIFFT::ftbasegeneratecomplexfftplan(uint n, ftplan * plan) { + int planarraysize; + int plansize; + int precomputedsize; + int tmpmemsize; + int stackmemsize; + ae_int_t stackptr; + planarraysize = 1; + plansize = 0; + precomputedsize = 0; + stackmemsize = 0; + stackptr = 0; + tmpmemsize = 2 * n; + curplan.plan.resize(planarraysize); + int ftbase_ftbasecffttask = 0; + ftbase_ftbasegenerateplanrec(n, ftbase_ftbasecffttask, plan, &plansize, &precomputedsize, &planarraysize, &tmpmemsize, &stackmemsize, stackptr); + if (stackptr != 0) { + return;//ae_assert(stackptr==0, "Internal error in FTBaseGenerateComplexFFTPlan: stack ptr!"); + } + curplan.stackbuf.resize(piMax(stackmemsize, 1)); //ae_vector_set_length(&curplan.stackbuf, ae_maxint(stackmemsize, 1)); + curplan.tmpbuf.resize(piMax(tmpmemsize, 1)); //ae_vector_set_length(&(curplan.tmpbuf), ae_maxint(tmpmemsize, 1)); + curplan.precomputed.resize(piMax(precomputedsize, 1)); //ae_vector_set_length(&curplan.precomputed, ae_maxint(precomputedsize, 1)); + stackptr = 0; + ftbase_ftbaseprecomputeplanrec(plan, 0, stackptr); + if (stackptr != 0) { + return;//ae_assert(stackptr==0, "Internal error in FTBaseGenerateComplexFFTPlan: stack ptr!"); + } +} + + +/************************************************************************* +Recurrent subroutine for the FFTGeneratePlan: + +PARAMETERS: + N plan size + IsReal whether input is real or not. + subroutine MUST NOT ignore this flag because real + inputs comes with non-initialized imaginary parts, + so ignoring this flag will result in corrupted output + HalfOut whether full output or only half of it from 0 to + floor(N/2) is needed. This flag may be ignored if + doing so will simplify calculations + Plan plan array + PlanSize size of used part (in integers) + PrecomputedSize size of precomputed array allocated yet + PlanArraySize plan array size (actual) + TmpMemSize temporary memory required size + BluesteinMemSize temporary memory required size + +-- ALGLIB -- + Copyright 01.05.2009 by Bochkanov Sergey +*************************************************************************/ +void PIFFT::ftbase_ftbasegenerateplanrec( +int n, +int tasktype, +ftplan * plan, +int * plansize, +int * precomputedsize, +int * planarraysize, +int * tmpmemsize, +int * stackmemsize, +ae_int_t stackptr, int debugi) { + int k, m, n1, n2, esize, entryoffset; + int ftbase_ftbaseplanentrysize = 8; + int ftbase_ftbasecffttask = 0; + int ftbase_fftcooleytukeyplan = 0; + int ftbase_fftbluesteinplan = 1; + int ftbase_fftcodeletplan = 2; + int ftbase_fftrealcooleytukeyplan = 5; + int ftbase_fftemptyplan = 6; + if (*plansize + ftbase_ftbaseplanentrysize > (*planarraysize)) { + curplan.plan.resize(8 * (*planarraysize)); + *planarraysize = 8 * (*planarraysize); + } + entryoffset = *plansize; + esize = ftbase_ftbaseplanentrysize; + *plansize = *plansize + esize; + if (n == 1) { + curplan.plan[entryoffset + 0] = esize; + curplan.plan[entryoffset + 1] = -1; + curplan.plan[entryoffset + 2] = -1; + curplan.plan[entryoffset + 3] = ftbase_fftemptyplan; + curplan.plan[entryoffset + 4] = -1; + curplan.plan[entryoffset + 5] = -1; + curplan.plan[entryoffset + 6] = -1; + curplan.plan[entryoffset + 7] = -1; + return; + } + ftbasefactorize(n, &n1, &n2); + if (n1 != 1) { + *tmpmemsize = piMax(*tmpmemsize, 2 * n1 * n2); + curplan.plan[entryoffset + 0] = esize; + curplan.plan[entryoffset + 1] = n1; + curplan.plan[entryoffset + 2] = n2; + if (tasktype == ftbase_ftbasecffttask) + curplan.plan[entryoffset + 3] = ftbase_fftcooleytukeyplan; + else + curplan.plan[entryoffset + 3] = ftbase_fftrealcooleytukeyplan; + curplan.plan[entryoffset + 4] = 0; + curplan.plan[entryoffset + 5] = *plansize; + debugi++; + ftbase_ftbasegenerateplanrec(n1, ftbase_ftbasecffttask, plan, plansize, precomputedsize, planarraysize, tmpmemsize, stackmemsize, stackptr, debugi); + curplan.plan[entryoffset + 6] = *plansize; + ftbase_ftbasegenerateplanrec(n2, ftbase_ftbasecffttask, plan, plansize, precomputedsize, planarraysize, tmpmemsize, stackmemsize, stackptr, debugi); + curplan.plan[entryoffset + 7] = -1; + return; + } else { + if (n >= 2 && n <= 5) { + curplan.plan[entryoffset + 0] = esize; + curplan.plan[entryoffset + 1] = n1; + curplan.plan[entryoffset + 2] = n2; + curplan.plan[entryoffset + 3] = ftbase_fftcodeletplan; + curplan.plan[entryoffset + 4] = 0; + curplan.plan[entryoffset + 5] = -1; + curplan.plan[entryoffset + 6] = -1; + curplan.plan[entryoffset + 7] = *precomputedsize; + if (n == 3) + *precomputedsize = *precomputedsize + 2; + if (n == 5) + *precomputedsize = *precomputedsize + 5; + return; + } else { + k = 2 * n2 - 1; + m = ftbasefindsmooth(k); + *tmpmemsize = piMax(*tmpmemsize, 2 * m); + curplan.plan[entryoffset + 0] = esize; + curplan.plan[entryoffset + 1] = n2; + curplan.plan[entryoffset + 2] = -1; + curplan.plan[entryoffset + 3] = ftbase_fftbluesteinplan; + curplan.plan[entryoffset + 4] = m; + curplan.plan[entryoffset + 5] = *plansize; + stackptr = stackptr + 2 * 2 * m; + *stackmemsize = piMax(*stackmemsize, stackptr); + ftbase_ftbasegenerateplanrec(m, ftbase_ftbasecffttask, plan, plansize, precomputedsize, planarraysize, tmpmemsize, stackmemsize, stackptr); + stackptr = stackptr - 2 * 2 * m; + curplan.plan[entryoffset + 6] = -1; + curplan.plan[entryoffset + 7] = *precomputedsize; + *precomputedsize = *precomputedsize + 2 * m + 2 * n; + return; + } + } +} + + +/************************************************************************* +Recurrent subroutine for precomputing FFT plans + +-- ALGLIB -- + Copyright 01.05.2009 by Bochkanov Sergey +*************************************************************************/ +void PIFFT::ftbase_ftbaseprecomputeplanrec(ftplan * plan, +int entryoffset, +ae_int_t stackptr) { + int n1, n2, n, m, offs; + double v, bx, by; + int ftbase_fftcooleytukeyplan = 0; + int ftbase_fftbluesteinplan = 1; + int ftbase_fftcodeletplan = 2; + int ftbase_fhtcooleytukeyplan = 3; + int ftbase_fhtcodeletplan = 4; + int ftbase_fftrealcooleytukeyplan = 5; + if ((curplan.plan[entryoffset + 3] == ftbase_fftcooleytukeyplan || curplan.plan[entryoffset + 3] == ftbase_fftrealcooleytukeyplan) || curplan.plan[entryoffset + 3] == ftbase_fhtcooleytukeyplan) { + ftbase_ftbaseprecomputeplanrec(plan, curplan.plan[entryoffset + 5], stackptr); + ftbase_ftbaseprecomputeplanrec(plan, curplan.plan[entryoffset + 6], stackptr); + return; + } + if (curplan.plan[entryoffset + 3] == ftbase_fftcodeletplan || curplan.plan[entryoffset + 3] == ftbase_fhtcodeletplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + n = n1 * n2; + if (n == 3) { + offs = curplan.plan[entryoffset + 7]; + curplan.precomputed[offs + 0] = cos(2 * M_PI / 3) - 1; + curplan.precomputed[offs + 1] = sin(2 * M_PI / 3); + return; + } + if (n == 5) { + offs = curplan.plan[entryoffset + 7]; + v = 2 * M_PI / 5; + curplan.precomputed[offs + 0] = (cos(v) + cos(2 * v)) / 2 - 1; + curplan.precomputed[offs + 1] = (cos(v) - cos(2 * v)) / 2; + curplan.precomputed[offs + 2] = -sin(v); + curplan.precomputed[offs + 3] = -(sin(v) + sin(2 * v)); + curplan.precomputed[offs + 4] = sin(v) - sin(2 * v); + return; + } + } + if (curplan.plan[entryoffset + 3] == ftbase_fftbluesteinplan) { + ftbase_ftbaseprecomputeplanrec(plan, curplan.plan[entryoffset + 5], stackptr); + n = curplan.plan[entryoffset + 1]; + m = curplan.plan[entryoffset + 4]; + offs = curplan.plan[entryoffset + 7]; + for (int i = 0; i <= 2 * m - 1; i++) + curplan.precomputed[offs + i] = 0; + for (int i = 0; i < n; i++) { + bx = cos(M_PI * sqr(i) / n); + by = sin(M_PI * sqr(i) / n); + curplan.precomputed[offs + 2 * i + 0] = bx; + curplan.precomputed[offs + 2 * i + 1] = by; + curplan.precomputed[offs + 2 * m + 2 * i + 0] = bx; + curplan.precomputed[offs + 2 * m + 2 * i + 1] = by; + if (i > 0) { + curplan.precomputed[offs + 2 * (m - i) + 0] = bx; + curplan.precomputed[offs + 2 * (m - i) + 1] = by; + } + } + ftbaseexecuteplanrec(&curplan.precomputed, offs, plan, curplan.plan[entryoffset + 5], stackptr); + return; + } +} + + +void PIFFT::ftbasefactorize(int n, int * n1, int * n2) { + *n1 = *n2 = 0; + int ftbase_ftbasecodeletrecommended = 5; + if ((*n1) * (*n2) != n) { + for (int j = ftbase_ftbasecodeletrecommended; j >= 2; j--) { + if (n % j == 0) { + *n1 = j; + *n2 = n / j; + break; + } + } + } + if ((*n1) * (*n2) != n) { + for (int j = ftbase_ftbasecodeletrecommended + 1; j <= n - 1; j++) { + if (n % j == 0) { + *n1 = j; + *n2 = n / j; + break; + } + } + } + if ((*n1) * (*n2) != n) { + *n1 = 1; + *n2 = n; + } + if ((*n2) == 1 && (*n1) != 1) { + *n2 = *n1; + *n1 = 1; + } +} + + +/************************************************************************* +Is number smooth? + +-- ALGLIB -- + Copyright 01.05.2009 by Bochkanov Sergey +*************************************************************************/ +void PIFFT::ftbase_ftbasefindsmoothrec(int n, int seed, int leastfactor, int * best) { + if (seed >= n) { + *best = piMini(*best, seed); + return; + } + if (leastfactor <= 2) + ftbase_ftbasefindsmoothrec(n, seed * 2, 2, best); + if (leastfactor <= 3) + ftbase_ftbasefindsmoothrec(n, seed * 3, 3, best); + if (leastfactor <= 5) + ftbase_ftbasefindsmoothrec(n, seed * 5, 5, best); +} + + +int PIFFT::ftbasefindsmooth(int n) { + int best, result; + best = 2; + while (best < n) + best = 2 * best; + ftbase_ftbasefindsmoothrec(n, 1, 2, &best); + result = best; + return result; +} + + +void PIFFT::ftbase_internalreallintranspose(PIVector * a, int m, int n, int astart, PIVector * buf) { + ftbase_fftirltrec(a, astart, n, buf, 0, m, m, n); + for (int i = 0; i < 2 * m * n; i++) (*a)[astart + i] = (*buf)[i]; +} + + +void PIFFT::ftbase_fftirltrec(PIVector * a, int astart, int astride, PIVector * b, int bstart, int bstride, int m, int n) { + int idx1, idx2; + int m1, n1; + if (m == 0 || n == 0) + return; + if (piMaxi(m, n) <= 8) { + for (int i = 0; i <= m - 1; i++) { + idx1 = bstart + i; + idx2 = astart + i * astride; + for (int j = 0; j <= n - 1; j++) { + (*b)[idx1] = a->at(idx2); + idx1 = idx1 + bstride; + idx2 = idx2 + 1; + } + } + return; + } + if (n > m) { + n1 = n / 2; + if (n - n1 >= 8 && n1 % 8 != 0) + n1 = n1 + (8 - n1 % 8); + ftbase_fftirltrec(a, astart, astride, b, bstart, bstride, m, n1); + ftbase_fftirltrec(a, astart + n1, astride, b, bstart + n1 * bstride, bstride, m, n - n1); + } else { + m1 = m / 2; + if (m - m1 >= 8 && m1 % 8 != 0) + m1 = m1 + (8 - m1 % 8); + ftbase_fftirltrec(a, astart, astride, b, bstart, bstride, m1, n); + ftbase_fftirltrec(a, astart + m1 * astride, astride, b, bstart + m1, bstride, m - m1, n); + } +} + + +void PIFFT::ftbase_internalcomplexlintranspose(PIVector * a, int m, int n, int astart, PIVector * buf) { + ftbase_ffticltrec(a, astart, n, buf, 0, m, m, n); + for (int i = 0; i < 2 * m * n; i++) + (*a)[astart + i] = (*buf)[i]; +} + + +void PIFFT::ftbase_ffticltrec(PIVector * a, int astart, int astride, PIVector * b, int bstart, int bstride, int m, int n) { + int idx1, idx2, m2, m1, n1; + if (m == 0 || n == 0) + return; + if (piMax(m, n) <= 8) { + m2 = 2 * bstride; + for (int i = 0; i <= m - 1; i++) { + idx1 = bstart + 2 * i; + idx2 = astart + 2 * i * astride; + for (int j = 0; j <= n - 1; j++) { + (*b)[idx1 + 0] = a->at(idx2 + 0); + (*b)[idx1 + 1] = a->at(idx2 + 1); + idx1 = idx1 + m2; + idx2 = idx2 + 2; + } + } + return; + } + if (n > m) { + n1 = n / 2; + if (n - n1 >= 8 && n1 % 8 != 0) + n1 = n1 + (8 - n1 % 8); + ftbase_ffticltrec(a, astart, astride, b, bstart, bstride, m, n1); + ftbase_ffticltrec(a, astart + 2 * n1, astride, b, bstart + 2 * n1 * bstride, bstride, m, n - n1); + } else { + m1 = m / 2; + if (m - m1 >= 8 && m1 % 8 != 0) + m1 = m1 + (8 - m1 % 8); + ftbase_ffticltrec(a, astart, astride, b, bstart, bstride, m1, n); + ftbase_ffticltrec(a, astart + 2 * m1 * astride, astride, b, bstart + 2 * m1, bstride, m - m1, n); + } +} + + +void PIFFT::ftbaseexecuteplan(PIVector * a, int aoffset, int n, ftplan * plan) { + ae_int_t stackptr; + stackptr = 0; + ftbaseexecuteplanrec(a, aoffset, plan, 0, stackptr); +} + + +/************************************************************************* +Recurrent subroutine for the FTBaseExecutePlan + +Parameters: + A FFT'ed array + AOffset offset of the FFT'ed part (distance is measured in doubles) + +-- ALGLIB -- + Copyright 01.05.2009 by Bochkanov Sergey +*************************************************************************/ +void PIFFT::ftbaseexecuteplanrec(PIVector * a, int aoffset, ftplan * plan, int entryoffset, ae_int_t stackptr) { + int n1, n2, n, m, offs, offs1, offs2, offsa, offsb, offsp; + double hk, hnk, x, y, bx, by, v0, v1, v2, v3; + double a0x, a0y, a1x, a1y, a2x, a2y, a3x, a3y; + double t1x, t1y, t2x, t2y, t3x, t3y, t4x, t4y, t5x, t5y; + double m1x, m1y, m2x, m2y, m3x, m3y, m4x, m4y, m5x, m5y; + double s1x, s1y, s2x, s2y, s3x, s3y, s4x, s4y, s5x, s5y; + double c1, c2, c3, c4, c5; + int ftbase_fftcooleytukeyplan = 0; + int ftbase_fftbluesteinplan = 1; + int ftbase_fftcodeletplan = 2; + int ftbase_fhtcooleytukeyplan = 3; + int ftbase_fhtcodeletplan = 4; + int ftbase_fftrealcooleytukeyplan = 5; + int ftbase_fftemptyplan = 6; + PIVector & tmpb(curplan.tmpbuf); + + if (curplan.plan[entryoffset + 3] == ftbase_fftemptyplan) + return; + if (curplan.plan[entryoffset + 3] == ftbase_fftcooleytukeyplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + ftbase_internalcomplexlintranspose(a, n1, n2, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n2 - 1; i++) + ftbaseexecuteplanrec(a, aoffset + i * n1 * 2, plan, curplan.plan[entryoffset + 5], stackptr); + ftbase_ffttwcalc(a, aoffset, n1, n2); + ftbase_internalcomplexlintranspose(a, n2, n1, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n1 - 1; i++) + ftbaseexecuteplanrec(a, aoffset + i * n2 * 2, plan, curplan.plan[entryoffset + 6], stackptr); + ftbase_internalcomplexlintranspose(a, n1, n2, aoffset, &(curplan.tmpbuf)); + return; + } + if (curplan.plan[entryoffset + 3] == ftbase_fftrealcooleytukeyplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + ftbase_internalcomplexlintranspose(a, n2, n1, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n1 / 2 - 1; i++) { + offs = aoffset + 2 * i * n2 * 2; + for (int k = 0; k <= n2 - 1; k++) + (*a)[offs + 2 * k + 1] = (*a)[offs + 2 * n2 + 2 * k + 0]; + ftbaseexecuteplanrec(a, offs, plan, curplan.plan[entryoffset + 6], stackptr); + tmpb[0] = (*a)[offs + 0]; + tmpb[1] = 0; + tmpb[2 * n2 + 0] = (*a)[offs + 1]; + tmpb[2 * n2 + 1] = 0; + for (int k = 1; k <= n2 - 1; k++) { + offs1 = 2 * k; + offs2 = 2 * n2 + 2 * k; + hk = (*a)[offs + 2 * k + 0]; + hnk = (*a)[offs + 2 * (n2 - k) + 0]; + tmpb[offs1 + 0] = 0.5 * (hk + hnk); + tmpb[offs2 + 1] = -0.5 * (hk - hnk); + hk = (*a)[offs + 2 * k + 1]; + hnk = (*a)[offs + 2 * (n2 - k) + 1]; + tmpb[offs2 + 0] = 0.5 * (hk + hnk); + tmpb[offs1 + 1] = 0.5 * (hk - hnk); + } + for (int k = 0; k < 2 * n2 * 2; k++) (*a)[offs + k] = tmpb[k]; + } + if (n1 % 2 != 0) + ftbaseexecuteplanrec(a, aoffset + (n1 - 1)*n2 * 2, plan, curplan.plan[entryoffset + 6], stackptr); + ftbase_ffttwcalc(a, aoffset, n2, n1); + ftbase_internalcomplexlintranspose(a, n1, n2, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n2 - 1; i++) + ftbaseexecuteplanrec(a, aoffset + i * n1 * 2, plan, curplan.plan[entryoffset + 5], stackptr); + ftbase_internalcomplexlintranspose(a, n2, n1, aoffset, &(curplan.tmpbuf)); + return; + } + if (curplan.plan[entryoffset + 3] == ftbase_fhtcooleytukeyplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + n = n1 * n2; + ftbase_internalreallintranspose(a, n1, n2, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n2 - 1; i++) + ftbaseexecuteplanrec(a, aoffset + i * n1, plan, curplan.plan[entryoffset + 5], stackptr); + for (int i = 0; i <= n2 - 1; i++) { + for (int j = 0; j <= n1 - 1; j++) { + offsa = aoffset + i * n1; + hk = (*a)[offsa + j]; + hnk = (*a)[offsa + (n1 - j) % n1]; + offs = 2 * (i * n1 + j); + tmpb[offs + 0] = -0.5 * (hnk - hk); + tmpb[offs + 1] = 0.5 * (hk + hnk); + } + } + ftbase_ffttwcalc(&(curplan.tmpbuf), 0, n1, n2); + for (int j = 0; j <= n1 - 1; j++) + (*a)[aoffset + j] = tmpb[2 * j + 0] + tmpb[2 * j + 1]; + if (n2 % 2 == 0) { + offs = 2 * (n2 / 2) * n1; + offsa = aoffset + n2 / 2 * n1; + for (int j = 0; j <= n1 - 1; j++) + (*a)[offsa + j] = tmpb[offs + 2 * j + 0] + tmpb[offs + 2 * j + 1]; + } + for (int i = 1; i <= (n2 + 1) / 2 - 1; i++) { + offs = 2 * i * n1; + offs2 = 2 * (n2 - i) * n1; + offsa = aoffset + i * n1; + for (int j = 0; j <= n1 - 1; j++) + (*a)[offsa + j] = tmpb[offs + 2 * j + 1] + tmpb[offs2 + 2 * j + 0]; + offsa = aoffset + (n2 - i) * n1; + for (int j = 0; j <= n1 - 1; j++) + (*a)[offsa + j] = tmpb[offs + 2 * j + 0] + tmpb[offs2 + 2 * j + 1]; + } + ftbase_internalreallintranspose(a, n2, n1, aoffset, &(curplan.tmpbuf)); + for (int i = 0; i <= n1 - 1; i++) + ftbaseexecuteplanrec(a, aoffset + i * n2, plan, curplan.plan[entryoffset + 6], stackptr); + ftbase_internalreallintranspose(a, n1, n2, aoffset, &(curplan.tmpbuf)); + return; + } + if (curplan.plan[entryoffset + 3] == ftbase_fftcodeletplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + n = n1 * n2; + if (n == 2) { + a0x = (*a)[aoffset + 0]; + a0y = (*a)[aoffset + 1]; + a1x = (*a)[aoffset + 2]; + a1y = (*a)[aoffset + 3]; + v0 = a0x + a1x; + v1 = a0y + a1y; + v2 = a0x - a1x; + v3 = a0y - a1y; + (*a)[aoffset + 0] = v0; + (*a)[aoffset + 1] = v1; + (*a)[aoffset + 2] = v2; + (*a)[aoffset + 3] = v3; + return; + } + if (n == 3) { + offs = curplan.plan[entryoffset + 7]; + c1 = curplan.precomputed[offs + 0]; + c2 = curplan.precomputed[offs + 1]; + a0x = (*a)[aoffset + 0]; + a0y = (*a)[aoffset + 1]; + a1x = (*a)[aoffset + 2]; + a1y = (*a)[aoffset + 3]; + a2x = (*a)[aoffset + 4]; + a2y = (*a)[aoffset + 5]; + t1x = a1x + a2x; + t1y = a1y + a2y; + a0x = a0x + t1x; + a0y = a0y + t1y; + m1x = c1 * t1x; + m1y = c1 * t1y; + m2x = c2 * (a1y - a2y); + m2y = c2 * (a2x - a1x); + s1x = a0x + m1x; + s1y = a0y + m1y; + a1x = s1x + m2x; + a1y = s1y + m2y; + a2x = s1x - m2x; + a2y = s1y - m2y; + (*a)[aoffset + 0] = a0x; + (*a)[aoffset + 1] = a0y; + (*a)[aoffset + 2] = a1x; + (*a)[aoffset + 3] = a1y; + (*a)[aoffset + 4] = a2x; + (*a)[aoffset + 5] = a2y; + return; + } + if (n == 4) { + a0x = (*a)[aoffset + 0]; + a0y = (*a)[aoffset + 1]; + a1x = (*a)[aoffset + 2]; + a1y = (*a)[aoffset + 3]; + a2x = (*a)[aoffset + 4]; + a2y = (*a)[aoffset + 5]; + a3x = (*a)[aoffset + 6]; + a3y = (*a)[aoffset + 7]; + t1x = a0x + a2x; + t1y = a0y + a2y; + t2x = a1x + a3x; + t2y = a1y + a3y; + m2x = a0x - a2x; + m2y = a0y - a2y; + m3x = a1y - a3y; + m3y = a3x - a1x; + (*a)[aoffset + 0] = t1x + t2x; + (*a)[aoffset + 1] = t1y + t2y; + (*a)[aoffset + 4] = t1x - t2x; + (*a)[aoffset + 5] = t1y - t2y; + (*a)[aoffset + 2] = m2x + m3x; + (*a)[aoffset + 3] = m2y + m3y; + (*a)[aoffset + 6] = m2x - m3x; + (*a)[aoffset + 7] = m2y - m3y; + return; + } + if (n == 5) { + offs = curplan.plan[entryoffset + 7]; + c1 = curplan.precomputed[offs + 0]; + c2 = curplan.precomputed[offs + 1]; + c3 = curplan.precomputed[offs + 2]; + c4 = curplan.precomputed[offs + 3]; + c5 = curplan.precomputed[offs + 4]; + t1x = (*a)[aoffset + 2] + (*a)[aoffset + 8]; + t1y = (*a)[aoffset + 3] + (*a)[aoffset + 9]; + t2x = (*a)[aoffset + 4] + (*a)[aoffset + 6]; + t2y = (*a)[aoffset + 5] + (*a)[aoffset + 7]; + t3x = (*a)[aoffset + 2] - (*a)[aoffset + 8]; + t3y = (*a)[aoffset + 3] - (*a)[aoffset + 9]; + t4x = (*a)[aoffset + 6] - (*a)[aoffset + 4]; + t4y = (*a)[aoffset + 7] - (*a)[aoffset + 5]; + t5x = t1x + t2x; + t5y = t1y + t2y; + (*a)[aoffset + 0] = (*a)[aoffset + 0] + t5x; + (*a)[aoffset + 1] = (*a)[aoffset + 1] + t5y; + m1x = c1 * t5x; + m1y = c1 * t5y; + m2x = c2 * (t1x - t2x); + m2y = c2 * (t1y - t2y); + m3x = -c3 * (t3y + t4y); + m3y = c3 * (t3x + t4x); + m4x = -c4 * t4y; + m4y = c4 * t4x; + m5x = -c5 * t3y; + m5y = c5 * t3x; + s3x = m3x - m4x; + s3y = m3y - m4y; + s5x = m3x + m5x; + s5y = m3y + m5y; + s1x = (*a)[aoffset + 0] + m1x; + s1y = (*a)[aoffset + 1] + m1y; + s2x = s1x + m2x; + s2y = s1y + m2y; + s4x = s1x - m2x; + s4y = s1y - m2y; + (*a)[aoffset + 2] = s2x + s3x; + (*a)[aoffset + 3] = s2y + s3y; + (*a)[aoffset + 4] = s4x + s5x; + (*a)[aoffset + 5] = s4y + s5y; + (*a)[aoffset + 6] = s4x - s5x; + (*a)[aoffset + 7] = s4y - s5y; + (*a)[aoffset + 8] = s2x - s3x; + (*a)[aoffset + 9] = s2y - s3y; + return; + } + } + if (curplan.plan[entryoffset + 3] == ftbase_fhtcodeletplan) { + n1 = curplan.plan[entryoffset + 1]; + n2 = curplan.plan[entryoffset + 2]; + n = n1 * n2; + if (n == 2) { + a0x = (*a)[aoffset + 0]; + a1x = (*a)[aoffset + 1]; + (*a)[aoffset + 0] = a0x + a1x; + (*a)[aoffset + 1] = a0x - a1x; + return; + } + if (n == 3) { + offs = curplan.plan[entryoffset + 7]; + c1 = curplan.precomputed[offs + 0]; + c2 = curplan.precomputed[offs + 1]; + a0x = (*a)[aoffset + 0]; + a1x = (*a)[aoffset + 1]; + a2x = (*a)[aoffset + 2]; + t1x = a1x + a2x; + a0x = a0x + t1x; + m1x = c1 * t1x; + m2y = c2 * (a2x - a1x); + s1x = a0x + m1x; + (*a)[aoffset + 0] = a0x; + (*a)[aoffset + 1] = s1x - m2y; + (*a)[aoffset + 2] = s1x + m2y; + return; + } + if (n == 4) { + a0x = (*a)[aoffset + 0]; + a1x = (*a)[aoffset + 1]; + a2x = (*a)[aoffset + 2]; + a3x = (*a)[aoffset + 3]; + t1x = a0x + a2x; + t2x = a1x + a3x; + m2x = a0x - a2x; + m3y = a3x - a1x; + (*a)[aoffset + 0] = t1x + t2x; + (*a)[aoffset + 1] = m2x - m3y; + (*a)[aoffset + 2] = t1x - t2x; + (*a)[aoffset + 3] = m2x + m3y; + return; + } + if (n == 5) { + offs = curplan.plan[entryoffset + 7]; + c1 = curplan.precomputed[offs + 0]; + c2 = curplan.precomputed[offs + 1]; + c3 = curplan.precomputed[offs + 2]; + c4 = curplan.precomputed[offs + 3]; + c5 = curplan.precomputed[offs + 4]; + t1x = (*a)[aoffset + 1] + (*a)[aoffset + 4]; + t2x = (*a)[aoffset + 2] + (*a)[aoffset + 3]; + t3x = (*a)[aoffset + 1] - (*a)[aoffset + 4]; + t4x = (*a)[aoffset + 3] - (*a)[aoffset + 2]; + t5x = t1x + t2x; + v0 = (*a)[aoffset + 0] + t5x; + (*a)[aoffset + 0] = v0; + m2x = c2 * (t1x - t2x); + m3y = c3 * (t3x + t4x); + s3y = m3y - c4 * t4x; + s5y = m3y + c5 * t3x; + s1x = v0 + c1 * t5x; + s2x = s1x + m2x; + s4x = s1x - m2x; + (*a)[aoffset + 1] = s2x - s3y; + (*a)[aoffset + 2] = s4x - s5y; + (*a)[aoffset + 3] = s4x + s5y; + (*a)[aoffset + 4] = s2x + s3y; + return; + } + } + if (curplan.plan[entryoffset + 3] == ftbase_fftbluesteinplan) { + n = curplan.plan[entryoffset + 1]; + m = curplan.plan[entryoffset + 4]; + offs = curplan.plan[entryoffset + 7]; + for (int i = stackptr + 2 * n; i <= stackptr + 2 * m - 1; i++) + curplan.stackbuf[i] = 0; + offsp = offs + 2 * m; + offsa = aoffset; + offsb = stackptr; + for (int i = 0; i < n; i++) { + bx = curplan.precomputed[offsp + 0]; + by = curplan.precomputed[offsp + 1]; + x = (*a)[offsa + 0]; + y = (*a)[offsa + 1]; + curplan.stackbuf[offsb + 0] = x * bx - y * (-by); + curplan.stackbuf[offsb + 1] = x * (-by) + y * bx; + offsp = offsp + 2; + offsa = offsa + 2; + offsb = offsb + 2; + } + ftbaseexecuteplanrec(&curplan.stackbuf, stackptr, plan, curplan.plan[entryoffset + 5], stackptr + 2 * 2 * m); + offsb = stackptr; + offsp = offs; + for (int i = 0; i <= m - 1; i++) { + x = curplan.stackbuf[offsb + 0]; + y = curplan.stackbuf[offsb + 1]; + bx = curplan.precomputed[offsp + 0]; + by = curplan.precomputed[offsp + 1]; + curplan.stackbuf[offsb + 0] = x * bx - y * by; + curplan.stackbuf[offsb + 1] = -(x * by + y * bx); + offsb = offsb + 2; + offsp = offsp + 2; + } + ftbaseexecuteplanrec(&curplan.stackbuf, stackptr, plan, curplan.plan[entryoffset + 5], stackptr + 2 * 2 * m); + offsb = stackptr; + offsp = offs + 2 * m; + offsa = aoffset; + for (int i = 0; i < n; i++) { + x = curplan.stackbuf[offsb + 0] / m; + y = -curplan.stackbuf[offsb + 1] / m; + bx = curplan.precomputed[offsp + 0]; + by = curplan.precomputed[offsp + 1]; + (*a)[offsa + 0] = x * bx - y * (-by); + (*a)[offsa + 1] = x * (-by) + y * bx; + offsp = offsp + 2; + offsa = offsa + 2; + offsb = offsb + 2; + } + return; + } +} + + +/************************************************************************* +Twiddle factors calculation + +-- ALGLIB -- + Copyright 01.05.2009 by Bochkanov Sergey +*************************************************************************/ +void PIFFT::ftbase_ffttwcalc(PIVector * a, int aoffset, int n1, int n2) { + int n, idx, offs; + double x, y, twxm1, twy, twbasexm1, twbasey, twrowxm1, twrowy, tmpx, tmpy, v; + int ftbase_ftbaseupdatetw = 4; + n = n1 * n2; + v = -2 * M_PI / n; + twbasexm1 = -2 * sqr(sin(0.5 * v)); + twbasey = sin(v); + twrowxm1 = 0; + twrowy = 0; + for (int i = 0, j = 0; i <= n2 - 1; i++) { + twxm1 = 0; + twy = 0; + for (j = 0; j <= n1 - 1; j++) { + idx = i * n1 + j; + offs = aoffset + 2 * idx; + x = (*a)[offs + 0]; + y = (*a)[offs + 1]; + tmpx = x * twxm1 - y * twy; + tmpy = x * twy + y * twxm1; + (*a)[offs + 0] = x + tmpx; + (*a)[offs + 1] = y + tmpy; + if (j < n1 - 1) { + if (j % ftbase_ftbaseupdatetw == 0) { + v = -2 * M_PI * i * (j + 1) / n; + twxm1 = -2 * sqr(sin(0.5 * v)); + twy = sin(v); + } else { + tmpx = twrowxm1 + twxm1 * twrowxm1 - twy * twrowy; + tmpy = twrowy + twxm1 * twrowy + twy * twrowxm1; + twxm1 = twxm1 + tmpx; + twy = twy + tmpy; + } + } + } + + if (i < n2 - 1) { + if (j % ftbase_ftbaseupdatetw == 0) { + v = -2 * M_PI * (i + 1) / n; + twrowxm1 = -2 * sqr(sin(0.5 * v)); + twrowy = sin(v); + } else { + tmpx = twbasexm1 + twrowxm1 * twbasexm1 - twrowy * twbasey; + tmpy = twbasey + twrowxm1 * twbasey + twrowy * twbasexm1; + twrowxm1 = twrowxm1 + tmpx; + twrowy = twrowy + tmpy; + } + } + } +} diff --git a/src/math/pifft.h b/src/math/pifft.h new file mode 100644 index 00000000..4cdb8642 --- /dev/null +++ b/src/math/pifft.h @@ -0,0 +1,77 @@ +/*! \file pifft.h + * \brief Class for FFT, IFFT and Hilbert transformations +*/ +/* + PIP - Platform Independent Primitives + Class for FFT, IFFT and Hilbert transformations + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIFFT_H +#define PIFFT_H + +#include "pimathbase.h" + +class PIP_EXPORT PIFFT +{ +public: + PIFFT(); + + PIVector * calcFFT(const PIVector &val); + PIVector * calcFFT(const PIVector &val); + PIVector * calcFFTinverse(const PIVector &val); + PIVector * calcHilbert(const PIVector &val); + PIVector getAmplitude(); + +private: + PIVector result; + bool prepared; + typedef ptrdiff_t ae_int_t; + void calc_coefs(uint cnt2); + void calc_indexes(uint cnt2, uint deep2); + complexd coef(uint n, uint k); + + struct ftplan { + PIVector plan; + PIVector precomputed; + PIVector tmpbuf; + PIVector stackbuf; + }; + + ftplan curplan; + + void fftc1d(const PIVector &a, uint n); + void fftc1r(const PIVector &a, uint n); + void fftc1dinv(const PIVector &a, uint n); + + void createPlan(uint n); + void ftbasegeneratecomplexfftplan(uint n, ftplan *plan); + void ftbase_ftbasegenerateplanrec(int n, int tasktype, ftplan *plan, int *plansize, int *precomputedsize, int *planarraysize, int *tmpmemsize, int *stackmemsize, ae_int_t stackptr, int debugi=0); + void ftbase_ftbaseprecomputeplanrec(ftplan *plan, int entryoffset, ae_int_t stackptr); + void ftbasefactorize(int n, int *n1, int *n2); + void ftbase_ftbasefindsmoothrec(int n, int seed, int leastfactor, int *best); + int ftbasefindsmooth(int n); + void ftbaseexecuteplan(PIVector *a, int aoffset, int n, ftplan *plan); + void ftbaseexecuteplanrec(PIVector *a, int aoffset, ftplan *plan, int entryoffset, ae_int_t stackptr); + void ftbase_internalcomplexlintranspose(PIVector *a, int m, int n, int astart, PIVector *buf); + void ftbase_ffticltrec(PIVector *a, int astart, int astride, PIVector *b, int bstart, int bstride, int m, int n); + void ftbase_internalreallintranspose(PIVector *a, int m, int n, int astart, PIVector *buf); + void ftbase_fftirltrec(PIVector *a, int astart, int astride, PIVector *b, int bstart, int bstride, int m, int n); + void ftbase_ffttwcalc(PIVector *a, int aoffset, int n1, int n2); + +}; + +#endif // PIFFT_H diff --git a/src/math/pimath.h b/src/math/pimath.h new file mode 100644 index 00000000..b9283cf3 --- /dev/null +++ b/src/math/pimath.h @@ -0,0 +1,30 @@ +/*! \file pimath.h + * \brief Many mathematical functions and classes +*/ +/* + PIP - Platform Independent Primitives + Many mathematical functions and classes + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMATH_H +#define PIMATH_H + +#include "pimathsolver.h" +#include "pistatistic.h" +#include "pifft.h" + +#endif // PIMATH_H diff --git a/src/math/pimathbase.cpp b/src/math/pimathbase.cpp new file mode 100644 index 00000000..36602de0 --- /dev/null +++ b/src/math/pimathbase.cpp @@ -0,0 +1,468 @@ +/* + PIP - Platform Independent Primitives + Basic mathematical functions and defines + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pimathbase.h" + + +double piJ0(const double & v) { +#ifndef PIP_MATH_J0 + double x = v; + double xsq; + double nn; + double pzero; + double qzero; + double p1; + double q1; + double result; + if (x < 0) x = -x; + if (x > 8.) { + double xsq_; + double p2; + double q2; + double p3; + double q3; + xsq_ = 64. / (x * x); + p2 = 0.0; + p2 = 2485.271928957404011288128951 + xsq_ * p2; + p2 = 153982.6532623911470917825993 + xsq_ * p2; + p2 = 2016135.283049983642487182349 + xsq_ * p2; + p2 = 8413041.456550439208464315611 + xsq_ * p2; + p2 = 12332384.76817638145232406055 + xsq_ * p2; + p2 = 5393485.083869438325262122897 + xsq_ * p2; + q2 = 1.0; + q2 = 2615.700736920839685159081813 + xsq_ * q2; + q2 = 156001.7276940030940592769933 + xsq_ * q2; + q2 = 2025066.801570134013891035236 + xsq_ * q2; + q2 = 8426449.050629797331554404810 + xsq_ * q2; + q2 = 12338310.22786324960844856182 + xsq_ * q2; + q2 = 5393485.083869438325560444960 + xsq_ * q2; + p3 = -0.0; + p3 = -4.887199395841261531199129300 +xsq_ * p3; + p3 = -226.2630641933704113967255053 +xsq_ * p3; + p3 = -2365.956170779108192723612816 +xsq_ * p3; + p3 = -8239.066313485606568803548860 +xsq_ * p3; + p3 = -10381.41698748464093880530341 +xsq_ * p3; + p3 = -3984.617357595222463506790588 +xsq_ * p3; + q3 = 1.0; + q3 = 408.7714673983499223402830260 + xsq_ * q3; + q3 = 15704.89191515395519392882766 + xsq_ * q3; + q3 = 156021.3206679291652539287109 + xsq_ * q3; + q3 = 533291.3634216897168722255057 + xsq_ * q3; + q3 = 666745.4239319826986004038103 + xsq_ * q3; + q3 = 255015.5108860942382983170882 + xsq_ * q3; + pzero = p2 / q2; + qzero = 8. * p3 / q3 / x; + nn = x- M_PI / 4.; + result = sqrt(2. / M_PI / x) * (pzero * cos(nn) - qzero * sin(nn)); + return result; + } + xsq = x * x; + p1 = 26857.86856980014981415848441; + p1 = -40504123.71833132706360663322 + xsq * p1; + p1 = 25071582855.36881945555156435 + xsq * p1; + p1 = -8085222034853.793871199468171 + xsq * p1; + p1 = 1434354939140344.111664316553 + xsq * p1; + p1 = -136762035308817138.6865416609 + xsq * p1; + p1 = 6382059341072356562.289432465 + xsq * p1; + p1 = -117915762910761053603.8440800 + xsq * p1; + p1 = 493378725179413356181.6813446 + xsq * p1; + q1 = 1.; + q1 = 1363.063652328970604442810507 + xsq * q1; + q1 = 1114636.098462985378182402543 + xsq * q1; + q1 = 669998767.2982239671814028660 + xsq * q1; + q1 = 312304311494.1213172572469442 + xsq * q1; + q1 = 112775673967979.8507056031594 + xsq * q1; + q1 = 30246356167094626.98627330784 + xsq * q1; + q1 = 5428918384092285160.200195092 + xsq * q1; + q1 = 493378725179413356211.3278438 + xsq * q1; + return p1 / q1; +#else + return j0(v); +#endif +} + + +double piJ1(const double & v) { +#ifndef PIP_MATH_J1 + double x = v; + double s; + double xsq; + double nn; + double pzero; + double qzero; + double p1; + double q1; + double result; + s = sign(x); + if (x < 0) + x = -x; + if (x > 8.) { + double xsq_; + double p2; + double q2; + double p3; + double q3; + xsq_ = 64.0 / (x * x); + p2 = -1611.616644324610116477412898; + p2 = -109824.0554345934672737413139 + xsq_ * p2; + p2 = -1523529.351181137383255105722 + xsq_ * p2; + p2 = -6603373.248364939109255245434 + xsq_ * p2; + p2 = -9942246.505077641195658377899 + xsq_ * p2; + p2 = -4435757.816794127857114720794 + xsq_ * p2; + q2 = 1.0; + q2 = -1455.009440190496182453565068 + xsq_ * q2; + q2 = -107263.8599110382011903063867 + xsq_ * q2; + q2 = -1511809.506634160881644546358 + xsq_ * q2; + q2 = -6585339.479723087072826915069 + xsq_ * q2; + q2 = -9934124.389934585658967556309 + xsq_ * q2; + q2 = -4435757.816794127856828016962 + xsq_ * q2; + p3 = 35.26513384663603218592175580; + p3 = 1706.375429020768002061283546 + xsq_ * p3; + p3 = 18494.26287322386679652009819 + xsq_ * p3; + p3 = 66178.83658127083517939992166 + xsq_ * p3; + p3 = 85145.16067533570196555001171 + xsq_ * p3; + p3 = 33220.91340985722351859704442 + xsq_ * p3; + q3 = 1.0; + q3 = 863.8367769604990967475517183 + xsq_ * q3; + q3 = 37890.22974577220264142952256 + xsq_ * q3; + q3 = 400294.4358226697511708610813 + xsq_ * q3; + q3 = 1419460.669603720892855755253 + xsq_ * q3; + q3 = 1819458.042243997298924553839 + xsq_ * q3; + q3 = 708712.8194102874357377502472 + xsq_ * q3; + pzero = p2 / q2; + qzero = 8 * p3 / q3 / x; + nn = x - 3 * M_PI / 4; + result = sqrt(2 / M_PI / x) * (pzero * cos(nn) - qzero * sin(nn)); + if (s < 0) + result = -result; + return result; + } + xsq = sqr(x); + p1 = 2701.122710892323414856790990; + p1 = -4695753.530642995859767162166 + xsq * p1; + p1 = 3413234182.301700539091292655 + xsq * p1; + p1 = -1322983480332.126453125473247 + xsq * p1; + p1 = 290879526383477.5409737601689 + xsq * p1; + p1 = -35888175699101060.50743641413 + xsq * p1; + p1 = 2316433580634002297.931815435 + xsq * p1; + p1 = -66721065689249162980.20941484 + xsq * p1; + p1 = 581199354001606143928.050809 + xsq * p1; + q1 = 1.0; + q1 = 1606.931573481487801970916749 + xsq * q1; + q1 = 1501793.594998585505921097578 + xsq * q1; + q1 = 1013863514.358673989967045588 + xsq * q1; + q1 = 524371026216.7649715406728642 + xsq * q1; + q1 = 208166122130760.7351240184229 + xsq * q1; + q1 = 60920613989175217.46105196863 + xsq * q1; + q1 = 11857707121903209998.37113348 + xsq * q1; + q1 = 1162398708003212287858.529400 + xsq * q1; + result = s * x * p1 / q1; + return result; +#else + return j1(v); +#endif +} + + +double piJn(int n, const double & v) { +#ifndef PIP_MATH_JN + double x = v; + double pkm2; + double pkm1; + double pk; + double xk; + double r; + double ans; + int k; + int sg; + double result; + if (n < 0) { + n = -n; + if (n % 2 == 0) + sg = 1; + else + sg = -1; + } else + sg = 1; + if (x < 0) { + if (n % 2 != 0) + sg = -sg; + x = -x; + } + if (n == 0) { + result = sg * piJ0(x); + return result; + } + if (n == 1) { + result = sg * piJ1(x); + return result; + } + if (n == 2) { + if (x == 0) + result = 0; + else + result = sg * (2.0 * piJ1(x) / x - piJ0(x)); + return result; + } + if (x < 1E-16) { + result = 0; + return result; + } + k = 53; + pk = 2 * (n + k); + ans = pk; + xk = x * x; + do { + pk = pk - 2.0; + ans = pk - xk / ans; + k = k - 1; + } while (k != 0); + ans = x / ans; + pk = 1.0; + pkm1 = 1.0 / ans; + k = n - 1; + r = 2 * k; + do { + pkm2 = (pkm1 * r - pk * x) / x; + pk = pkm1; + pkm1 = pkm2; + r = r - 2.0; + k = k - 1; + } while (k != 0); + if (fabs(pk) > fabs(pkm1)) + ans = piJ1(x) / pk; + else + ans = piJ0(x) / pkm1; + result = sg * ans; + return result; +#else + return jn(n, v); +#endif +} + + +double piY0(const double & v) { +#ifndef PIP_MATH_Y0 + double x = v; + double nn; + double xsq; + double pzero; + double qzero; + double p4; + double q4; + double result; + if (x > 8.) { + double xsq_; + double p2; + double q2; + double p3; + double q3; + xsq_ = 64.0 / (x * x); + p2 = 0.0; + p2 = 2485.271928957404011288128951 + xsq_ * p2; + p2 = 153982.6532623911470917825993 + xsq_ * p2; + p2 = 2016135.283049983642487182349 + xsq_ * p2; + p2 = 8413041.456550439208464315611 + xsq_ * p2; + p2 = 12332384.76817638145232406055 + xsq_ * p2; + p2 = 5393485.083869438325262122897 + xsq_ * p2; + q2 = 1.0; + q2 = 2615.700736920839685159081813 + xsq_ * q2; + q2 = 156001.7276940030940592769933 + xsq_ * q2; + q2 = 2025066.801570134013891035236 + xsq_ * q2; + q2 = 8426449.050629797331554404810 + xsq_ * q2; + q2 = 12338310.22786324960844856182 + xsq_ * q2; + q2 = 5393485.083869438325560444960 + xsq_ * q2; + p3 = -0.0; + p3 = -4.887199395841261531199129300 + xsq_ * p3; + p3 = -226.2630641933704113967255053 + xsq_ * p3; + p3 = -2365.956170779108192723612816 + xsq_ * p3; + p3 = -8239.066313485606568803548860 + xsq_ * p3; + p3 = -10381.41698748464093880530341 + xsq_ * p3; + p3 = -3984.617357595222463506790588 + xsq_ * p3; + q3 = 1.0; + q3 = 408.7714673983499223402830260 + xsq_ * q3; + q3 = 15704.89191515395519392882766 + xsq_ * q3; + q3 = 156021.3206679291652539287109 + xsq_ * q3; + q3 = 533291.3634216897168722255057 + xsq_ * q3; + q3 = 666745.4239319826986004038103 + xsq_ * q3; + q3 = 255015.5108860942382983170882 + xsq_ * q3; + pzero = p2 / q2; + qzero = 8 * p3 / q3 / x; + nn = x - M_PI / 4; + result = sqrt(2 / M_PI / x) * (pzero * sin(nn) + qzero * cos(nn)); + return result; + } + xsq = sqr(x); + p4 = -41370.35497933148554125235152; + p4 = 59152134.65686889654273830069 + xsq * p4; + p4 = -34363712229.79040378171030138 + xsq * p4; + p4 = 10255208596863.94284509167421 + xsq * p4; + p4 = -1648605817185729.473122082537 + xsq * p4; + p4 = 137562431639934407.8571335453 + xsq * p4; + p4 = -5247065581112764941.297350814 + xsq * p4; + p4 = 65874732757195549259.99402049 + xsq * p4; + p4 = -27502866786291095837.01933175 + xsq * p4; + q4 = 1.0; + q4 = 1282.452772478993804176329391 + xsq * q4; + q4 = 1001702.641288906265666651753 + xsq * q4; + q4 = 579512264.0700729537480087915 + xsq * q4; + q4 = 261306575504.1081249568482092 + xsq * q4; + q4 = 91620380340751.85262489147968 + xsq * q4; + q4 = 23928830434997818.57439356652 + xsq * q4; + q4 = 4192417043410839973.904769661 + xsq * q4; + q4 = 372645883898616588198.9980 + xsq * q4; + result = p4 / q4 + 2 / M_PI * piJ0(x) * log(x); + return result; +#else + return y0(v); +#endif +} + + +double piY1(const double & v) { +#ifndef PIP_MATH_Y1 + double x = v; + double nn; + double xsq; + double pzero; + double qzero; + double p4; + double q4; + double result; + if (x > 8.) { + double xsq_; + double p2; + double q2; + double p3; + double q3; + xsq_ = 64.0 / (x * x); + p2 = -1611.616644324610116477412898; + p2 = -109824.0554345934672737413139 + xsq_ * p2; + p2 = -1523529.351181137383255105722 + xsq_ * p2; + p2 = -6603373.248364939109255245434 + xsq_ * p2; + p2 = -9942246.505077641195658377899 + xsq_ * p2; + p2 = -4435757.816794127857114720794 + xsq_ * p2; + q2 = 1.0; + q2 = -1455.009440190496182453565068 + xsq_ * q2; + q2 = -107263.8599110382011903063867 + xsq_ * q2; + q2 = -1511809.506634160881644546358 + xsq_ * q2; + q2 = -6585339.479723087072826915069 + xsq_ * q2; + q2 = -9934124.389934585658967556309 + xsq_ * q2; + q2 = -4435757.816794127856828016962 + xsq_ * q2; + p3 = 35.26513384663603218592175580; + p3 = 1706.375429020768002061283546 + xsq_ * p3; + p3 = 18494.26287322386679652009819 + xsq_ * p3; + p3 = 66178.83658127083517939992166 + xsq_ * p3; + p3 = 85145.16067533570196555001171 + xsq_ * p3; + p3 = 33220.91340985722351859704442 + xsq_ * p3; + q3 = 1.0; + q3 = 863.8367769604990967475517183 + xsq_ * q3; + q3 = 37890.22974577220264142952256 + xsq_ * q3; + q3 = 400294.4358226697511708610813 + xsq_ * q3; + q3 = 1419460.669603720892855755253 + xsq_ * q3; + q3 = 1819458.042243997298924553839 + xsq_ * q3; + q3 = 708712.8194102874357377502472 + xsq_ * q3; + pzero = p2 / q2; + qzero = 8 * p3 / q3 / x; + nn = x - 3 * M_PI / 4; + result = sqrt(2 / M_PI / x) * (pzero * sin(nn) + qzero * cos(nn)); + return result; + } + xsq = sqr(x); + p4 = -2108847.540133123652824139923; + p4 = 3639488548.124002058278999428 + xsq * p4; + p4 = -2580681702194.450950541426399 + xsq * p4; + p4 = 956993023992168.3481121552788 + xsq * p4; + p4 = -196588746272214065.8820322248 + xsq * p4; + p4 = 21931073399177975921.11427556 + xsq * p4; + p4 = -1212297555414509577913.561535 + xsq * p4; + p4 = 26554738314348543268942.48968 + xsq * p4; + p4 = -99637534243069222259967.44354 + xsq * p4; + q4 = 1.0; + q4 = 1612.361029677000859332072312 + xsq * q4; + q4 = 1563282.754899580604737366452 + xsq * q4; + q4 = 1128686837.169442121732366891 + xsq * q4; + q4 = 646534088126.5275571961681500 + xsq * q4; + q4 = 297663212564727.6729292742282 + xsq * q4; + q4 = 108225825940881955.2553850180 + xsq * q4; + q4 = 29549879358971486742.90758119 + xsq * q4; + q4 = 5435310377188854170800.653097 + xsq * q4; + q4 = 508206736694124324531442.4152 + xsq * q4; + result = x * p4 / q4 + 2 / M_PI * (piJ1(x) * log(x) - 1 / x); + return result; +#else + return y1(v); +#endif +} + + +double piYn(int n, const double & v) { +#ifndef PIP_MATH_YN + int i; + double x = v; + double a; + double b; + double tmp; + double s; + double result; + s = 1; + if (n < 0) { + n = -n; + if (n % 2 != 0) + s = -1; + } + if (n == 0) { + result = piY0(x); + return result; + } + if (n == 1) { + result = s * piY1(x); + return result; + } + a = piY0(x); + b = piY1(x); + for (i = 1; i <= n - 1; i++) { + tmp = b; + b = 2 * i / x * b - a; + a = tmp; + } + result = s * b; + return result; +#else + return yn(n, v); +#endif +} + + +double randomn(double dv, double sv) { + static bool agen = false; + double s = 2., v0 = 0., v1 = 0.; + if (agen) { + agen = false; + v1 = v1 * sqrt(-2 * log(s) / s); + return v1 * sv + dv; + } + while (s > 1. || s == 0.) { + v0 = randomd(); + v1 = randomd(); + s = v0*v0 + v1*v1; + } + v0 = v0 * sqrt(-2 * log(s) / s); + return v0 * sv + dv; +} diff --git a/src/math/pimathbase.h b/src/math/pimathbase.h new file mode 100644 index 00000000..963a3bbe --- /dev/null +++ b/src/math/pimathbase.h @@ -0,0 +1,189 @@ +/*! \file pimathbase.h + * \brief Basic mathematical functions and defines +*/ +/* + PIP - Platform Independent Primitives + Basic mathematical functions and defines + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMATHBASE_H +#define PIMATHBASE_H + +#include "piinit.h" +#include "pibytearray.h" +#ifdef QNX +# undef PIP_MATH_J0 +# undef PIP_MATH_J1 +# undef PIP_MATH_JN +# undef PIP_MATH_Y0 +# undef PIP_MATH_Y1 +# undef PIP_MATH_YN +#endif + +#ifndef M_LN2 +# define M_LN2 0.69314718055994530942 +#endif +#ifndef M_LN10 +# define M_LN10 2.30258509299404568402 +#endif +#ifndef M_SQRT2 +# define M_SQRT2 1.41421356237309514547 +#endif +#ifndef M_SQRT3 +# define M_SQRT3 1.73205080756887719318 +#endif +#ifndef M_1_SQRT2 +# define M_1_SQRT2 0.70710678118654746172 +#endif +#ifndef M_1_SQRT3 +# define M_1_SQRT3 0.57735026918962584208 +#endif +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif +#ifndef M_2PI +# define M_2PI 6.28318530717958647692 +#endif +#ifndef M_PI_3 +# define M_PI_3 1.04719755119659774615 +#endif +#ifndef M_2PI_3 +# define M_2PI_3 2.0943951023931954923 +#endif +#ifndef M_180_PI +# define M_180_PI 57.2957795130823208768 +#endif +#ifndef M_PI_180 +# define M_PI_180 1.74532925199432957692e-2 +#endif +#ifndef M_E +# define M_E 2.7182818284590452353602874713527 +#endif +#ifndef M_LIGHT_SPEED +# define M_LIGHT_SPEED 2.99792458e+8 +#endif + +const double deg2rad = M_PI_180; +const double rad2deg = M_180_PI; + +inline int sign(const float & x) {return (x < 0.) ? -1 : (x > 0. ? 1 : 0);} +inline int sign(const double & x) {return (x < 0.) ? -1 : (x > 0. ? 1 : 0);} +inline complexd sign(const complexd & x) {return complexd(sign(x.real()), sign(x.imag()));} +inline int pow2(const int p) {return 1 << p;} +inline double sqr(const int v) {return v * v;} +inline double sqr(const float & v) {return v * v;} +inline double sqr(const double & v) {return v * v;} +inline double sinc(const double & v) {if (v == 0.) return 1.; double t = M_PI * v; return sin(t) / t;} +inline complexd round(const complexd & c) {return complexd(piRound(c.real()), piRound(c.imag()));} +inline complexd floor(const complexd & c) {return complexd(floor(c.real()), floor(c.imag()));} +inline complexd ceil(const complexd & c) {return complexd(ceil(c.real()), ceil(c.imag()));} +inline complexd atanc(const complexd & c) {return -complexd(-0.5, 1.) * log((complexd_1 + complexd_i * c) / (complexd_1 - complexd_i * c));} +inline complexd asinc(const complexd & c) {return -complexd_i * log(complexd_i * c + sqrt(complexd_1 - c * c));} +inline complexd acosc(const complexd & c) {return -complexd_i * log(c + complexd_i * sqrt(complexd_1 - c * c));} +#ifdef CC_GCC +# if CC_GCC_VERSION <= 0x025F +inline complexd tan(const complexd & c) {return sin(c) / cos(c);} +inline complexd tanh(const complexd & c) {return sinh(c) / cosh(c);} +inline complexd log2(const complexd & c) {return log(c) / M_LN2;} +inline complexd log10(const complexd & c) {return log(c) / M_LN10;} +# endif +#endif +double piJ0(const double & v); +double piJ1(const double & v); +double piJn(int n, const double & v); +double piY0(const double & v); +double piY1(const double & v); +double piYn(int n, const double & v); +inline double toDb(double val) {return 10. * log10(val);} +inline double fromDb(double val) {return pow(10., val / 10.);} +inline double toRad(double deg) {return deg * M_PI_180;} +inline double toDeg(double rad) {return rad * M_180_PI;} + +template +inline PICout operator <<(PICout s, const complex & v) {s.space(); s.setControl(0, true); s << "(" << v.real() << "; " << v.imag() << ")"; s.restoreControl(); return s;} + +// [-1 ; 1] +inline double randomd() {return (double)random() / RAND_MAX * 2. - 1.;} +// [-1 ; 1] normal +double randomn(double dv = 0., double sv = 1.); + +inline PIVector abs(const PIVector & v) { + PIVector result; + result.resize(v.size()); + for (uint i = 0; i < v.size(); i++) + result[i] = abs(v[i]); + return result; +} +inline PIVector abs(const PIVector & v) { + PIVector result; + result.resize(v.size()); + for (uint i = 0; i < v.size(); i++) + result[i] = abs(v[i]); + return result; +} + + +template +bool OLS_Linear(const PIVector > & input, T * out_a, T * out_b) { + if (input.size_s() < 2) + return false; + int n = input.size_s(); + T a_t0 = T(), a_t1 = T(), a_t2 = T(), a_t3 = T(), a_t4 = T(), a = T(), b = T(); + for (int i = 0; i < n; ++i) { + const PIPair & cv(input[i]); + a_t0 += cv.first * cv.second; + a_t1 += cv.first; + a_t2 += cv.second; + a_t3 += cv.first * cv.first; + } + a_t4 = n * a_t3 - a_t1 * a_t1; + if (a_t4 != T()) + a = (n * a_t0 - a_t1 * a_t2) / a_t4; + b = (a_t2 - a * a_t1) / n; + if (out_a != 0) *out_a = a; + if (out_b != 0) *out_b = b; + return true; +} + + +template +bool WLS_Linear(const PIVector > & input, const PIVector & weights, T * out_a, T * out_b) { + if (input.size_s() < 2) + return false; + if (input.size_s() != weights.size_s()) + return false; + int n = input.size_s(); + T a_t0 = T(), a_t1 = T(), a_t2 = T(), a_t3 = T(), a_t4 = T(), a_n = T(), a = T(), b = T(); + for (int i = 0; i < n; ++i) { + T cp = weights[i]; + const PIPair & cv(input[i]); + a_t0 += cv.first * cv.second * cp; + a_t1 += cv.first * cp; + a_t2 += cv.second * cp; + a_t3 += cv.first * cv.first * cp; + a_n += cp; + } + a_t4 = a_n * a_t3 - a_t1 * a_t1; + if (a_t4 != T()) + a = (a_n * a_t0 - a_t1 * a_t2) / a_t4; + b = (a_t2 - a * a_t1) / a_n; + if (out_a != 0) *out_a = a; + if (out_b != 0) *out_b = b; + return true; +} + +#endif // PIMATHBASE_H diff --git a/src/math/pimathmatrix.h b/src/math/pimathmatrix.h new file mode 100644 index 00000000..9156e608 --- /dev/null +++ b/src/math/pimathmatrix.h @@ -0,0 +1,504 @@ +/*! \file pimathmatrix.h + * \brief PIMathMatrix +*/ +/* + PIP - Platform Independent Primitives + PIMathMatrix + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMATHMATRIX_H +#define PIMATHMATRIX_H + +#include "pimathvector.h" + +/// Matrix templated + +#define PIMM_FOR(r, c) for (uint c = 0; c < Cols; ++c) { for (uint r = 0; r < Rows; ++r) { +#define PIMM_FOR_WB(r, c) for (uint c = 0; c < Cols; ++c) for (uint r = 0; r < Rows; ++r) // without brakes +#define PIMM_FOR_I(r, c) for (uint r = 0; r < Rows; ++r) { for (uint c = 0; c < Cols; ++c) { +#define PIMM_FOR_I_WB(r, c) for (uint r = 0; r < Rows; ++r) for (uint c = 0; c < Cols; ++c) // without brakes +#define PIMM_FOR_C(v) for (uint v = 0; v < Cols; ++v) +#define PIMM_FOR_R(v) for (uint v = 0; v < Rows; ++v) + +#pragma pack(push, 1) +template +class PIP_EXPORT PIMathMatrixT { + typedef PIMathMatrixT _CMatrix; + typedef PIMathMatrixT _CMatrixI; + typedef PIMathVectorT _CMCol; + typedef PIMathVectorT _CMRow; +public: + PIMathMatrixT() {resize(Rows, Cols);} + PIMathMatrixT(Type fval, ...) {resize(Rows, Cols); va_list vl; va_start(vl, fval); PIMM_FOR_I_WB(r, c) m[r][c] = (r + c == 0 ? fval : va_arg(vl, Type)); va_end(vl);} + PIMathMatrixT(const PIVector & val) {resize(Rows, Cols); int i = 0; PIMM_FOR_I_WB(r, c) m[r][c] = val[i++];} + //PIMathMatrixT(const _CMatrix & o) {resize(Rows, Cols); int i = 0; PIMM_FOR_I_WB(r, c) m[r][c] = val[i++];} + + static _CMatrix identity() {_CMatrix tm = _CMatrix(); PIMM_FOR_WB(r, c) tm.m[r][c] = (c == r ? Type(1) : Type(0)); return tm;} + static _CMatrix rotation(double angle) {return _CMatrix();} + static _CMatrix rotationX(double angle) {return _CMatrix();} + static _CMatrix rotationY(double angle) {return _CMatrix();} + static _CMatrix rotationZ(double angle) {return _CMatrix();} + static _CMatrix scaleX(double factor) {return _CMatrix();} + static _CMatrix scaleY(double factor) {return _CMatrix();} + static _CMatrix scaleZ(double factor) {return _CMatrix();} + + uint cols() const {return Cols;} + uint rows() const {return Rows;} + _CMCol col(uint index) {_CMCol tv; PIMM_FOR_R(i) tv[i] = m[i][index]; return tv;} + _CMRow row(uint index) {_CMRow tv; PIMM_FOR_C(i) tv[i] = m[index][i]; return tv;} + _CMatrix & setCol(uint index, const _CMCol & v) {PIMM_FOR_R(i) m[i][index] = v[i]; return *this;} + _CMatrix & setRow(uint index, const _CMRow & v) {PIMM_FOR_C(i) m[index][i] = v[i]; return *this;} + _CMatrix & swapRows(uint r0, uint r1) {Type t; PIMM_FOR_C(i) {t = m[r0][i]; m[r0][i] = m[r1][i]; m[r1][i] = t;} return *this;} + _CMatrix & swapCols(uint c0, uint c1) {Type t; PIMM_FOR_R(i) {t = m[i][c0]; m[i][c0] = m[i][c1]; m[i][c1] = t;} return *this;} + _CMatrix & fill(const Type & v) {PIMM_FOR_WB(r, c) m[r][c] = v; return *this;} + //inline _CMatrix & set(Type fval, ...) {m[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) m[i] = va_arg(vl, Type); va_end(vl); return *this;} + //inline void normalize() {Type tv = length(); if (tv == Type(1)) return; PIMV_FOR(i, 0) m[i] /= tv;} + bool isSquare() const {return cols() == rows();} + bool isIdentity() const {PIMM_FOR_WB(r, c) if ((c == r) ? m[r][c] != Type(1) : m[r][c] != Type(0)) return false; return true;} + bool isNull() const {PIMM_FOR_WB(r, c) if (m[r][c] != Type(0)) return false; return true;} + + Type & at(uint row, uint col) {return m[row][col];} + Type at(uint row, uint col) const {return m[row][col];} + Type * operator [](uint row) {return m[row];} + const Type * operator [](uint row) const {return m[row];} + void operator =(const _CMatrix & sm) {memcpy(m, sm.m, sizeof(Type) * Cols * Rows);} + bool operator ==(const _CMatrix & sm) const {PIMM_FOR_WB(r, c) if (m[r][c] != sm.m[r][c]) return false; return true;} + bool operator !=(const _CMatrix & sm) const {return !(*this == sm);} + void operator +=(const _CMatrix & sm) {PIMM_FOR_WB(r, c) m[r][c] += sm.m[r][c];} + void operator -=(const _CMatrix & sm) {PIMM_FOR_WB(r, c) m[r][c] -= sm.m[r][c];} + void operator *=(const Type & v) {PIMM_FOR_WB(r, c) m[r][c] *= v;} + void operator /=(const Type & v) {PIMM_FOR_WB(r, c) m[r][c] /= v;} + _CMatrix operator -() {_CMatrix tm; PIMM_FOR_WB(r, c) tm.m[r][c] = -m[r][c]; return tm;} + _CMatrix operator +(const _CMatrix & sm) {_CMatrix tm = _CMatrix(*this); PIMM_FOR_WB(r, c) tm.m[r][c] += sm.m[r][c]; return tm;} + _CMatrix operator -(const _CMatrix & sm) {_CMatrix tm = _CMatrix(*this); PIMM_FOR_WB(r, c) tm.m[r][c] -= sm.m[r][c]; return tm;} + _CMatrix operator *(const Type & v) {_CMatrix tm = _CMatrix(*this); PIMM_FOR_WB(r, c) tm.m[r][c] *= v; return tm;} + _CMatrix operator /(const Type & v) {_CMatrix tm = _CMatrix(*this); PIMM_FOR_WB(r, c) tm.m[r][c] /= v; return tm;} + + Type determinant(bool * ok = 0) const { + _CMatrix m(*this); + bool k; + Type ret = Type(0); + m.toUpperTriangular(&k); + if (ok) *ok = k; + if (!k) return ret; + ret = Type(1); + for (uint c = 0; c < Cols; ++c) + for (uint r = 0; r < Rows; ++r) + if (r == c) + ret *= m[r][c]; + return ret; + } + + _CMatrix & toUpperTriangular(bool * ok = 0) { + if (Cols != Rows) { + if (ok != 0) *ok = false; + return *this; + } + _CMatrix smat(*this); + bool ndet; + uint crow; + Type mul; + for (uint i = 0; i < Cols; ++i) { + ndet = true; + for (uint j = 0; j < Rows; ++j) if (smat.m[i][j] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + for (uint j = 0; j < Cols; ++j) if (smat.m[j][i] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + } + for (uint i = 0; i < Cols; ++i) { + crow = i; + while (smat.m[i][i] == Type(0)) + smat.swapRows(i, ++crow); + for (uint j = i + 1; j < Rows; ++j) { + mul = smat.m[i][j] / smat.m[i][i]; + for (uint k = i; k < Cols; ++k) smat.m[k][j] -= mul * smat.m[k][i]; + } + if (i < Cols - 1) { + if (fabs(smat.m[i+1][i+1]) < Type(1E-100)) { + if (ok != 0) *ok = false; + return *this; + } + } + } + if (ok != 0) *ok = true; + memcpy(m, smat.m, sizeof(Type) * Cols * Rows); + return *this; + } + + _CMatrix & invert(bool * ok = 0) { + if (Cols != Rows) { + if (ok != 0) *ok = false; + return *this; + } + _CMatrix mtmp = _CMatrix::identity(), smat(*this); + bool ndet; + uint crow; + Type mul, iddiv; + for (uint i = 0; i < Cols; ++i) { + ndet = true; + for (uint j = 0; j < Rows; ++j) if (smat.m[i][j] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + for (uint j = 0; j < Cols; ++j) if (smat.m[j][i] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + } + for (uint i = 0; i < Cols; ++i) { + crow = i; + while (smat.m[i][i] == Type(0)) { + ++crow; + smat.swapRows(i, crow); + mtmp.swapRows(i, crow); + } + for (uint j = i + 1; j < Rows; ++j) { + mul = smat.m[i][j] / smat.m[i][i]; + for (uint k = i; k < Cols; ++k) smat.m[k][j] -= mul * smat.m[k][i]; + for (uint k = 0; k < Cols; ++k) mtmp.m[k][j] -= mul * mtmp.m[k][i]; + } + //cout << i << endl << smat << endl; + if (i < Cols - 1) { + if (fabs(smat.m[i+1][i+1]) < Type(1E-100)) { + if (ok != 0) *ok = false; + return *this; + } + } + iddiv = smat.m[i][i]; + for (uint j = i; j < Cols; ++j) smat.m[j][i] /= iddiv; + for (uint j = 0; j < Cols; ++j) mtmp.m[j][i] /= iddiv; + } + for (uint i = Cols - 1; i > 0; --i) { + for (uint j = 0; j < i; ++j) { + mul = smat.m[i][j]; + smat.m[i][j] -= mul; + for (uint k = 0; k < Cols; ++k) mtmp.m[k][j] -= mtmp.m[k][i] * mul; + } + } + if (ok != 0) *ok = true; + memcpy(m, mtmp.m, sizeof(Type) * Cols * Rows); + return *this; + } + _CMatrix inverted(bool * ok = 0) const {_CMatrix tm(*this); tm.invert(ok); return tm;} + _CMatrixI transposed() const {_CMatrixI tm; PIMM_FOR_WB(r, c) tm[r][c] = m[r][c]; return tm;} + +private: + void resize(uint rows_, uint cols_, const Type & new_value = Type()) {r_ = rows_; c_ = cols_; PIMM_FOR_WB(r, c) m[r][c] = new_value;} + int c_, r_; + Type m[Rows][Cols]; + +}; +#pragma pack(pop) + + +template<> inline PIMathMatrixT<2u, 2u> PIMathMatrixT<2u, 2u>::rotation(double angle) {double c = cos(angle), s = sin(angle); PIMathMatrixT<2u, 2u> tm; tm[0][0] = tm[1][1] = c; tm[0][1] = -s; tm[1][0] = s; return tm;} +template<> inline PIMathMatrixT<2u, 2u> PIMathMatrixT<2u, 2u>::scaleX(double factor) {PIMathMatrixT<2u, 2u> tm; tm[0][0] = factor; tm[1][1] = 1.; return tm;} +template<> inline PIMathMatrixT<2u, 2u> PIMathMatrixT<2u, 2u>::scaleY(double factor) {PIMathMatrixT<2u, 2u> tm; tm[0][0] = 1.; tm[1][1] = factor; return tm;} + +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::rotationX(double angle) {double c = cos(angle), s = sin(angle); PIMathMatrixT<3u, 3u> tm; tm[0][0] = 1.; tm[1][1] = tm[2][2] = c; tm[2][1] = s; tm[1][2] = -s; return tm;} +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::rotationY(double angle) {double c = cos(angle), s = sin(angle); PIMathMatrixT<3u, 3u> tm; tm[1][1] = 1.; tm[0][0] = tm[2][2] = c; tm[2][0] = -s; tm[0][2] = s; return tm;} +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::rotationZ(double angle) {double c = cos(angle), s = sin(angle); PIMathMatrixT<3u, 3u> tm; tm[2][2] = 1.; tm[0][0] = tm[1][1] = c; tm[1][0] = s; tm[0][1] = -s; return tm;} +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::scaleX(double factor) {PIMathMatrixT<3u, 3u> tm; tm[1][1] = tm[2][2] = 1.; tm[0][0] = factor; return tm;} +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::scaleY(double factor) {PIMathMatrixT<3u, 3u> tm; tm[0][0] = tm[2][2] = 1.; tm[1][1] = factor; return tm;} +template<> inline PIMathMatrixT<3u, 3u> PIMathMatrixT<3u, 3u>::scaleZ(double factor) {PIMathMatrixT<3u, 3u> tm; tm[0][0] = tm[1][1] = 1.; tm[2][2] = factor; return tm;} + +template +inline std::ostream & operator <<(std::ostream & s, const PIMathMatrixT & m) {s << '{'; PIMM_FOR_I(r, c) s << m[r][c]; if (c < Cols - 1 || r < Rows - 1) s << ", ";} if (r < Rows - 1) s << endl << ' ';} s << '}'; return s;} +template +inline PICout operator <<(PICout s, const PIMathMatrixT & m) {s << '{'; PIMM_FOR_I(r, c) s << m[r][c]; if (c < Cols - 1 || r < Rows - 1) s << ", ";} if (r < Rows - 1) s << NewLine << ' ';} s << '}'; return s;} + +/// Multiply matrices {Rows0 x CR} on {CR x Cols1}, result is {Rows0 x Cols1} +template +inline PIMathMatrixT operator *(const PIMathMatrixT & fm, + const PIMathMatrixT & sm) { + PIMathMatrixT tm; + Type t; + for (uint j = 0; j < Rows0; ++j) { + for (uint i = 0; i < Cols1; ++i) { + t = Type(0); + for (uint k = 0; k < CR; ++k) + t += fm[j][k] * sm[k][i]; + tm[j][i] = t; + } + } + return tm; +} + +/// Multiply matrix {Rows x Cols} on vector {Rows}, result is vector {Cols} +template +inline PIMathVectorT operator *(const PIMathMatrixT & fm, + const PIMathVectorT & sv) { + PIMathVectorT tv; + Type t; + for (uint j = 0; j < Rows; ++j) { + t = Type(0); + for (uint i = 0; i < Cols; ++i) + t += fm[j][i] * sv[i]; + tv[j] = t; + } + return tv; +} + +typedef PIMathMatrixT<2u, 2u, int> PIMathMatrixT22i; +typedef PIMathMatrixT<3u, 3u, int> PIMathMatrixT33i; +typedef PIMathMatrixT<4u, 4u, int> PIMathMatrixT44i; +typedef PIMathMatrixT<2u, 2u, double> PIMathMatrixT22d; +typedef PIMathMatrixT<3u, 3u, double> PIMathMatrixT33d; +typedef PIMathMatrixT<4u, 4u, double> PIMathMatrixT44d; + + +template +class PIMathMatrix; + +#undef PIMV_FOR +#undef PIMM_FOR +#undef PIMM_FOR_WB +#undef PIMM_FOR_I +#undef PIMM_FOR_I_WB +#undef PIMM_FOR_C +#undef PIMM_FOR_R + + + + + +/// Matrix + +#define PIMM_FOR(c, r) for (uint c = 0; c < cols_; ++c) { for (uint r = 0; r < rows_; ++r) { +#define PIMM_FOR_WB(c, r) for (uint c = 0; c < cols_; ++c) for (uint r = 0; r < rows_; ++r) // without brakes +#define PIMM_FOR_I(c, r) for (uint r = 0; r < rows_; ++r) { for (uint c = 0; c < cols_; ++c) { +#define PIMM_FOR_I_WB(c, r) for (uint r = 0; r < rows_; ++r) for (uint c = 0; c < cols_; ++c) // without brakes +#define PIMM_FOR_C(v) for (uint v = 0; v < cols_; ++v) +#define PIMM_FOR_R(v) for (uint v = 0; v < rows_; ++v) + +template +class PIP_EXPORT PIMathMatrix { + typedef PIMathMatrix _CMatrix; + typedef PIMathVector _CMCol; + typedef PIMathVector _CMRow; +public: + PIMathMatrix(const uint cols = 3, const uint rows = 3) {resize(cols, rows);} + PIMathMatrix(const uint cols, const uint rows, Type fval, ...) {resize(cols, rows); va_list vl; va_start(vl, fval); PIMM_FOR_I_WB(c, r) m[c][r] = (r + c == 0 ? fval : va_arg(vl, Type)); va_end(vl);} + PIMathMatrix(const uint cols, const uint rows, const PIVector & val) {resize(cols, rows); int i = 0; PIMM_FOR_I_WB(c, r) m[c][r] = val[i++];} + + static _CMatrix identity(const uint cols_, const uint rows_) {_CMatrix tm(cols_, rows_); PIMM_FOR_WB(c, r) tm.m[c][r] = (c == r ? Type(1) : Type(0)); return tm;} + + uint cols() const {return cols_;} + uint rows() const {return rows_;} + _CMCol col(uint index) {_CMCol tv; PIMM_FOR_R(i) tv[i] = m[index][i]; return tv;} + _CMRow row(uint index) {_CMRow tv; PIMM_FOR_C(i) tv[i] = m[i][index]; return tv;} + _CMatrix & resize(const uint cols, const uint rows, const Type & new_value = Type()) {cols_ = cols; rows_ = rows; m.resize(cols); PIMM_FOR_C(i) m[i].resize(rows, new_value); return *this;} + _CMatrix & setCol(uint index, const _CMCol & v) {PIMM_FOR_R(i) m[index][i] = v[i]; return *this;} + _CMatrix & setRow(uint index, const _CMRow & v) {PIMM_FOR_C(i) m[i][index] = v[i]; return *this;} + _CMatrix & swapRows(uint r0, uint r1) {Type t; PIMM_FOR_C(i) {t = m[i][r0]; m[i][r0] = m[i][r1]; m[i][r1] = t;} return *this;} + _CMatrix & swapCols(uint c0, uint c1) {Type t; PIMM_FOR_R(i) {t = m[c0][i]; m[c0][i] = m[c1][i]; m[c1][i] = t;} return *this;} + _CMatrix & fill(const Type & v) {PIMM_FOR_WB(c, r) m[c][r] = v; return *this;} + //inline _CMatrix & set(Type fval, ...) {m[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) m[i] = va_arg(vl, Type); va_end(vl); return *this;} + //inline void normalize() {Type tv = length(); if (tv == Type(1)) return; PIMV_FOR(i, 0) m[i] /= tv;} + bool isSquare() const {return cols() == rows();} + bool isIdentity() const {PIMM_FOR_WB(c, r) if ((c == r) ? m[c][r] != Type(1) : m[c][r] != Type(0)) return false; return true;} + bool isNull() const {PIMM_FOR_WB(c, r) if (m[c][r] != Type(0)) return false; return true;} + + Type & at(uint col, uint row) {return m[col][row];} + Type at(uint col, uint row) const {return m[col][row];} + PIVector & operator [](uint col) {return m[col];} + PIVector operator [](uint col) const {return m[col];} + void operator =(const _CMatrix & sm) {m = sm.m;} + bool operator ==(const _CMatrix & sm) const {PIMM_FOR_WB(c, r) if (m[c][r] != sm.m[c][r]) return false; return true;} + bool operator !=(const _CMatrix & sm) const {return !(*this == sm);} + void operator +=(const _CMatrix & sm) {PIMM_FOR_WB(c, r) m[c][r] += sm.m[c][r];} + void operator -=(const _CMatrix & sm) {PIMM_FOR_WB(c, r) m[c][r] -= sm.m[c][r];} + void operator *=(const Type & v) {PIMM_FOR_WB(c, r) m[c][r] *= v;} + void operator /=(const Type & v) {PIMM_FOR_WB(c, r) m[c][r] /= v;} + _CMatrix operator -() {_CMatrix tm(*this); PIMM_FOR_WB(c, r) tm.m[c][r] = -m[c][r]; return tm;} + _CMatrix operator +(const _CMatrix & sm) {_CMatrix tm(*this); PIMM_FOR_WB(c, r) tm.m[c][r] += sm.m[c][r]; return tm;} + _CMatrix operator -(const _CMatrix & sm) {_CMatrix tm(*this); PIMM_FOR_WB(c, r) tm.m[c][r] -= sm.m[c][r]; return tm;} + _CMatrix operator *(const Type & v) {_CMatrix tm(*this); PIMM_FOR_WB(c, r) tm.m[c][r] *= v; return tm;} + _CMatrix operator /(const Type & v) {_CMatrix tm(*this); PIMM_FOR_WB(c, r) tm.m[c][r] /= v; return tm;} + + _CMatrix & toUpperTriangular(bool * ok = 0) { + if (cols_ != rows_) { + if (ok != 0) *ok = false; + return *this; + } + _CMatrix smat(*this); + bool ndet; + uint crow; + Type mul; + for (uint i = 0; i < cols_; ++i) { + ndet = true; + for (uint j = 0; j < rows_; ++j) if (smat.m[i][j] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + for (uint j = 0; j < cols_; ++j) if (smat.m[j][i] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + } + for (uint i = 0; i < cols_; ++i) { + crow = i; + while (smat.m[i][i] == Type(0)) + smat.swapRows(i, ++crow); + for (uint j = i + 1; j < rows_; ++j) { + mul = smat.m[i][j] / smat.m[i][i]; + for (uint k = i; k < cols_; ++k) smat.m[k][j] -= mul * smat.m[k][i]; + } + if (i < cols_ - 1) { + if (fabs(smat.m[i+1][i+1]) < Type(1E-100)) { + if (ok != 0) *ok = false; + return *this; + } + } + } + if (ok != 0) *ok = true; + m = smat.m; + return *this; + } + + _CMatrix & invert(bool * ok = 0, _CMCol * sv = 0) { + if (cols_ != rows_) { + if (ok != 0) *ok = false; + return *this; + } + _CMatrix mtmp = _CMatrix::identity(cols_, rows_), smat(*this); + bool ndet; + uint crow; + Type mul, iddiv; + for (uint i = 0; i < cols_; ++i) { + ndet = true; + for (uint j = 0; j < rows_; ++j) if (smat.m[i][j] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + for (uint j = 0; j < cols_; ++j) if (smat.m[j][i] != 0) ndet = false; + if (ndet) { + if (ok != 0) *ok = false; + return *this; + } + } + for (uint i = 0; i < cols_; ++i) { + crow = i; + while (smat.m[i][i] == Type(0)) { + ++crow; + smat.swapRows(i, crow); + mtmp.swapRows(i, crow); + if (sv != 0) sv->swap(i, crow); + } + for (uint j = i + 1; j < rows_; ++j) { + mul = smat.m[i][j] / smat.m[i][i]; + for (uint k = i; k < cols_; ++k) smat.m[k][j] -= mul * smat.m[k][i]; + for (uint k = 0; k < cols_; ++k) mtmp.m[k][j] -= mul * mtmp.m[k][i]; + if (sv != 0) (*sv)[j] -= mul * (*sv)[i]; + } + //cout << i << endl << smat << endl; + if (i < cols_ - 1) { + if (fabs(smat.m[i+1][i+1]) < Type(1E-100)) { + if (ok != 0) *ok = false; + return *this; + } + } + iddiv = smat.m[i][i]; + for (uint j = i; j < cols_; ++j) smat.m[j][i] /= iddiv; + for (uint j = 0; j < cols_; ++j) mtmp.m[j][i] /= iddiv; + if (sv != 0) (*sv)[i] /= iddiv; + } + for (uint i = cols_ - 1; i > 0; --i) { + for (uint j = 0; j < i; ++j) { + mul = smat.m[i][j]; + smat.m[i][j] -= mul; + for (uint k = 0; k < cols_; ++k) mtmp.m[k][j] -= mtmp.m[k][i] * mul; + if (sv != 0) (*sv)[j] -= mul * (*sv)[i]; + } + } + if (ok != 0) *ok = true; + m = mtmp.m; + return *this; + } + _CMatrix inverted(bool * ok = 0) {_CMatrix tm(*this); tm.invert(ok); return tm;} + _CMatrix transposed() {_CMatrix tm(rows_, cols_); PIMM_FOR_WB(c, r) tm[r][c] = m[c][r]; return tm;} + +private: + uint cols_, rows_; + PIVector > m; + +}; + +template +inline std::ostream & operator <<(std::ostream & s, const PIMathMatrix & m) {s << '{'; for (uint r = 0; r < m.rows(); ++r) { for (uint c = 0; c < m.cols(); ++c) { s << m[c][r]; if (c < m.cols() - 1 || r < m.rows() - 1) s << ", ";} if (r < m.rows() - 1) s << endl << ' ';} s << '}'; return s;} +template +inline PICout operator <<(PICout s, const PIMathMatrix & m) {s << '{'; for (uint r = 0; r < m.rows(); ++r) { for (uint c = 0; c < m.cols(); ++c) { s << m[c][r]; if (c < m.cols() - 1 || r < m.rows() - 1) s << ", ";} if (r < m.rows() - 1) s << NewLine << ' ';} s << '}'; return s;} + +/// Multiply matrices {CR x Rows0} on {Cols1 x CR}, result is {Cols1 x Rows0} +template +inline PIMathMatrix operator *(const PIMathMatrix & fm, + const PIMathMatrix & sm) { + uint cr = fm.cols(), rows0 = fm.rows(), cols1 = sm.cols(); + PIMathMatrix tm(cols1, rows0); + if (fm.cols() != sm.rows()) return tm; + Type t; + for (uint j = 0; j < rows0; ++j) { + for (uint i = 0; i < cols1; ++i) { + t = Type(0); + for (uint k = 0; k < cr; ++k) + t += fm[k][j] * sm[i][k]; + tm[i][j] = t; + } + } + return tm; +} + +/// Multiply matrix {Cols x Rows} on vector {Cols}, result is vector {Rows} +template +inline PIMathVector operator *(const PIMathMatrix & fm, + const PIMathVector & sv) { + uint c = fm.cols(), r = fm.rows(); + PIMathVector tv(r); + if (c != sv.size()) return tv; + Type t; + for (uint i = 0; i < r; ++i) { + t = Type(0); + for (uint j = 0; j < c; ++j) + t += fm[j][i] * sv[j]; + tv[i] = t; + } + return tv; +} + +typedef PIMathMatrix PIMathMatrixi; +typedef PIMathMatrix PIMathMatrixd; + +#undef PIMV_FOR +#undef PIMM_FOR +#undef PIMM_FOR_WB +#undef PIMM_FOR_I +#undef PIMM_FOR_I_WB +#undef PIMM_FOR_C +#undef PIMM_FOR_R + +#endif // PIMATHMATRIX_H diff --git a/src/math/pimathsolver.cpp b/src/math/pimathsolver.cpp new file mode 100644 index 00000000..1218aad7 --- /dev/null +++ b/src/math/pimathsolver.cpp @@ -0,0 +1,248 @@ +/* + PIP - Platform Independent Primitives + PIMathSolver + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pimathsolver.h" + +const char PIMathSolver::methods_desc[] = "b{Methods:}\ +\n -1 - Global settings\ +\n 01 - Eyler 1\ +\n 02 - Eyler 2\ +\n 14 - Runge-Kutta 4\ +\n 23 - Adams-Bashfort-Moulton 3\ +\n 24 - Adams-Bashfort-Moulton 4\ +\n 32 - Polynomial Approximation 2\ +\n 33 - Polynomial Approximation 3\ +\n 34 - Polynomial Approximation 4\ +\n 35 - Polynomial Approximation 5"; + +PIMathSolver::Method PIMathSolver::method_global = PIMathSolver::Eyler_2; + + +void PIMathSolver::solve(double u, double h) { + switch (method) { + case Global: + switch (method_global) { + case Eyler_1: solveEyler1(u, h); break; + case Eyler_2: solveEyler2(u, h); break; + case RungeKutta_4: solveRK4(u, h); break; + case AdamsBashfortMoulton_2: solveABM2(u, h); break; + case AdamsBashfortMoulton_3: solveABM3(u, h); break; + case AdamsBashfortMoulton_4: default: solveABM4(u, h); break; + case PolynomialApproximation_2: solvePA2(u, h); break; + case PolynomialApproximation_3: solvePA3(u, h); break; + case PolynomialApproximation_4: solvePA4(u, h); break; + case PolynomialApproximation_5: solvePA5(u, h); break; + } + break; + case Eyler_1: solveEyler1(u, h); break; + case Eyler_2: solveEyler2(u, h); break; + case RungeKutta_4: solveRK4(u, h); break; + case AdamsBashfortMoulton_2: solveABM2(u, h); break; + case AdamsBashfortMoulton_3: solveABM3(u, h); break; + case AdamsBashfortMoulton_4: default: solveABM4(u, h); break; + case PolynomialApproximation_2: solvePA2(u, h); break; + case PolynomialApproximation_3: solvePA3(u, h); break; + case PolynomialApproximation_4: solvePA4(u, h); break; + case PolynomialApproximation_5: solvePA5(u, h); break; + } + step++; +} + + +void PIMathSolver::fromTF(const TransferFunction & TF) { + if (TF.vector_An.size() >= TF.vector_Bm.size()) + size = TF.vector_An.size()-1; + else { + piCout << "PIMathSolver error: {A} should be greater than {B}"; + return; + } + if (size == 0) return; + + step = 0; + times.fill(0.); + A.resize(size, size); + d.resize(size + 1); d.fill(0.); + a1.resize(size + 1); a1.fill(0.); + b1.resize(size + 1); b1.fill(0.); + X.resize(size); X.fill(0.); + F.resize(5); + for (uint i = 0; i < 5; ++i) + F[i].resize(size), F[i].fill(0.); + k1.resize(size); k1.fill(0.); + k2.resize(size); k2.fill(0.); + k3.resize(size); k3.fill(0.); + k4.resize(size); k4.fill(0.); + xx.resize(size); xx.fill(0.); + XX.resize(size); XX.fill(0.); + for (uint i = 0; i < size + 1; ++i) + a1[size - i] = TF.vector_An[i]; + for (uint i = 0; i < TF.vector_Bm.size(); ++i) + b1[size - i] = TF.vector_Bm[i]; + double a0 = a1[0]; + a1 /= a0; + b1 /= a0; + + d[0] = b1[0]; // Ðàññ÷èòûâàåì âåêòîð d + for (uint i = 1; i < size + 1; ++i) { + sum = 0.; + for (uint m = 0; m < i; ++m) + sum += a1[i - m] * d[m]; + d[i] = b1[i] - sum; + } + + for (uint i = 0; i < size - 1; ++i) // Çàïîëíÿåì ìàòðèöó À + for (uint j = 0; j < size; ++j) + A[j][i] = (j == i + 1); + for (uint i = 0; i < size; ++i) + A[i][size - 1] = -a1[size - i]; + for (uint i = 0; i < size; ++i) + d[i] = d[i + 1]; +} + + +void PIMathSolver::solveEyler1(double u, double h) { + /*for (uint i = 0; i < size; ++i) { + * sum = 0.; + * for (uint j = 0; j < size; ++j) + * sum += A[j][i] * X[j]; + * xx[i] = sum + d[i] * u; + }*/ + F[0] = A * X + d * u; + X += F[0] * h; + moveF(); +} + + +void PIMathSolver::solveEyler2(double u, double h) { + F[0] = A * X + d * u; + X += (F[0] + F[1]) * h / 2.; + moveF(); +} + + +void PIMathSolver::solveRK4(double u, double h) { + td = X[0] - F[0][0]; + k1 = A * X + d * u; xx = k1 * h / 2.; XX = X + xx; + k2 = A * (XX + k1 * h / 2.) + d * (u + td/3.); xx = k2 * h / 2.; XX += xx; + k3 = A * (XX + k2 * h / 2.) + d * (u + td*2./3.); xx = k3 * h; XX += xx; + k4 = A * (XX + k3 * h) + d * (u + td); + //cout << k1 << k2 << k3 << k4 << endl; + X += (k1 + k2 * 2. + k3 * 2. + k4) * h / 6.; + F[0] = X; +} + + +void PIMathSolver::solveABM2(double u, double h) { + F[0] = A * X + d * u; + XX = X + (F[0] * 3. - F[1]) * (h / 2.); + F[1] = A * XX + d * u; + X += (F[1] + F[0]) * (h / 2.); + moveF(); +} + + +void PIMathSolver::solveABM3(double u, double h) { + F[0] = A * X + d * u; + XX = X + (F[0] * 23. - F[1] * 16. + F[2] * 5.) * (h / 12.); + F[2] = A * XX + d * u; + X += (F[2] * 5. + F[0] * 8. - F[1]) * (h / 12.); + moveF(); +} + + +void PIMathSolver::solveABM4(double u, double h) { + F[0] = A * X + d * u; + XX = X + (F[0] * 55. - F[1] * 59. + F[2] * 37. - F[3] * 9.) * (h / 24.); + F[3] = A * XX + d * u; + X += (F[3] * 9. + F[0] * 19. - F[1] * 5. + F[2]) * (h / 24.); + moveF(); +} + + +void PIMathSolver::solvePA(double u, double h, uint deg) { + F[0] = A * X + d * u; + M.resize(deg, deg); + Y.resize(deg); + pY.resize(deg); + + for (uint k = 0; k < size; ++k) { + for (uint i = 0; i < deg; ++i) { + td = 1.; + ct = times[i]; + for (uint j = 0; j < deg; ++j) { + M[j][i] = td; + td *= ct; + } + } + for (uint i = 0; i < deg; ++i) + Y[i] = F[i][k]; + /// find polynom + //if (step == 1) cout << M << endl << Y << endl; + M.invert(&ok, &Y); + //if (step == 1) cout << Y << endl; + if (!ok) { + solveEyler2(u, h); + break; + } + /// calc last piece + x0 = 0.; + td = 1.; + t = times[0]; + for (uint i = 0; i < deg; ++i) { + x0 += Y[i] * td / (i + 1.); + td *= t; + } + x0 *= t; + + x1 = 0.; + td = 1.; + t = times[1]; + for (uint i = 0; i < deg; ++i) { + x1 += Y[i] * td / (i + 1.); + td *= t; + } + x1 *= t; + lp = x0 - x1; + + if (deg > 2) { + /// calc prev piece + x0 = 0.; + td = 1.; + dh = times[1] - times[2]; + if (dh != 0. && step > 1) { + t = times[2]; + for (uint i = 0; i < deg; ++i) { + x0 += Y[i] * td / (i + 1.); + td *= t; + } + x0 *= t; + ct = x1 - x0; + /// calc correction + ct -= pY[k]; + } + /// calc final + X[k] += lp - ct; + pY[k] = lp; + } else { + X[k] += lp; + pY[k] = lp; + } + } + moveF(); +} diff --git a/src/math/pimathsolver.h b/src/math/pimathsolver.h new file mode 100644 index 00000000..f9b4926d --- /dev/null +++ b/src/math/pimathsolver.h @@ -0,0 +1,94 @@ +/*! \file pimathsolver.h + * \brief PIMathSolver +*/ +/* + PIP - Platform Independent Primitives + PIMathSolver + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMATHSOLVER_H +#define PIMATHSOLVER_H + +#include "pimathmatrix.h" + +/// Differential evaluations + +struct TransferFunction { // Äëÿ çàäàíèÿ ïåðåäàòî÷íîé ôóíêöèè + PIVector vector_Bm, vector_An; +}; + +// Êëàññ, ñëóæàùèé äëÿ ïåðåâîäà ïåðåäàòî÷íîé ôóíêöèè â ñèñòåìó ÎÄÓ ïåðâîãî ïîðÿäêà +// ðåàëèçîâàíû ñëåä. ìåòîäû ðåøåíèÿ äèôô. óð-íèé: +// Ýéëåðà +// Ðóíãå-Êóòòà 4-ãî ïîðÿäêà +// Àäàìñà-Áýøôîðòñà-Ìîóëòîíà 2, 3, 4 ïîðÿäêîâ +class PIP_EXPORT PIMathSolver +{ +public: + enum Method {Global = -1, + Eyler_1 = 01, + Eyler_2 = 02, + EylerKoshi = 03, + RungeKutta_4 = 14, + AdamsBashfortMoulton_2 = 22, + AdamsBashfortMoulton_3 = 23, + AdamsBashfortMoulton_4 = 24, + PolynomialApproximation_2 = 32, + PolynomialApproximation_3 = 33, + PolynomialApproximation_4 = 34, + PolynomialApproximation_5 = 35 + }; + + PIMathSolver() {times.resize(4); step = 0;} + + void solve(double u, double h); + void fromTF(const TransferFunction & TF); + void setMethod(Method m) {method = m;} + void setTime(double time) {times.pop_back(); times.push_front(time);} + + void solveEyler1(double u, double h); + void solveEyler2(double u, double h); + void solveRK4(double u, double h); + void solveABM2(double u, double h); + void solveABM3(double u, double h); + void solveABM4(double u, double h); + void solvePA(double u, double h, uint deg); + void solvePA2(double u, double h) {if (step > 0) solvePA(u, h, 2); else solveEyler1(u, h);} + void solvePA3(double u, double h) {if (step > 1) solvePA(u, h, 3); else solvePA2(u, h);} + void solvePA4(double u, double h) {if (step > 2) solvePA(u, h, 4); else solvePA3(u, h);} + void solvePA5(double u, double h) {if (step > 3) solvePA(u, h, 5); else solvePA4(u, h);} + + PIMathVectord X; + static Method method_global; + static const char methods_desc[]; + +private: + void moveF() {for (uint i = F.size() - 1; i > 0; --i) F[i] = F[i - 1];} + + PIMathMatrixd A, M; + PIMathVectord d, a1, b1; + PIMathVectord k1, k2, k3, k4, xx; + PIMathVectord XX, Y, pY; + PIVector F; + PIVector times; + uint size, step; + Method method; + double sum, td, ct, lp, dh, t, x1, x0; + bool ok; +}; + +#endif // PIMATHSOLVER_H diff --git a/src/math/pimathvector.h b/src/math/pimathvector.h new file mode 100644 index 00000000..760b81fb --- /dev/null +++ b/src/math/pimathvector.h @@ -0,0 +1,229 @@ +/*! \file pimathvector.h + * \brief PIMathVector +*/ +/* + PIP - Platform Independent Primitives + PIMathVector + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMATHVECTOR_H +#define PIMATHVECTOR_H + +#include "pimathbase.h" + +template +class PIMathMatrixT; + + +/// Vector templated + +#define PIMV_FOR(v, s) for (uint v = s; v < Size; ++v) + +#pragma pack(push, 1) +template +class PIP_EXPORT PIMathVectorT { + typedef PIMathVectorT _CVector; +public: + PIMathVectorT() {resize(Size);} + //PIMathVectorT(Type val) {resize(Size); PIMV_FOR(i, 0) c[i] = val;} + PIMathVectorT(Type fval, ...) {resize(Size); c[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] = va_arg(vl, Type); va_end(vl);} + PIMathVectorT(const PIVector & val) {resize(Size); PIMV_FOR(i, 0) c[i] = val[i];} + PIMathVectorT(const _CVector & st, const _CVector & fn) {resize(Size); set(st, fn);} + + uint size() const {return Size;} + _CVector & fill(const Type & v) {PIMV_FOR(i, 0) c[i] = v; return *this;} + _CVector & set(Type fval, ...) {c[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] = va_arg(vl, Type); va_end(vl); return *this;} + _CVector & set(const _CVector & st, const _CVector & fn) {PIMV_FOR(i, 0) c[i] = fn[i] - st[i]; return *this;} + _CVector & move(const Type & v) {PIMV_FOR(i, 0) c[i] += v; return *this;} + _CVector & move(const _CVector & v) {PIMV_FOR(i, 0) c[i] += v[i]; return *this;} + _CVector & move(Type fval, ...) {c[0] += fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] += va_arg(vl, Type); va_end(vl); return *this;} + Type lengthSqr() const {Type tv(0); PIMV_FOR(i, 0) tv += (c[i] * c[i]); return tv;} + Type length() const {return sqrt(lengthSqr());} + Type manhattanLength() const {Type tv(0); PIMV_FOR(i, 0) tv += fabs(c[i]); return tv;} + Type angleCos(const _CVector & v) const {Type tv = v.length() * length(); return (tv == Type(0) ? Type(0) : ((*this) ^ v) / tv);} + Type angleSin(const _CVector & v) const {Type tv = angleCos(v); return sqrt(Type(1) - tv * tv);} + Type angleRad(const _CVector & v) const {return acos(angleCos(v));} + Type angleDeg(const _CVector & v) const {return toDeg(acos(angleCos(v)));} + _CVector projection(const _CVector & v) {Type tv = v.length(); return (tv == Type(0) ? _CVector() : v * (((*this) ^ v) / tv));} + _CVector & normalize() {Type tv = length(); if (tv == Type(1)) return *this; if (piAbs(tv) <= Type(1E-100)) {fill(Type(0)); return *this;} PIMV_FOR(i, 0) c[i] /= tv; return *this;} + _CVector normalized() {_CVector tv(*this); tv.normalize(); return tv;} + bool isNull() const {PIMV_FOR(i, 0) if (c[i] != Type(0)) return false; return true;} + bool isOrtho(const _CVector & v) const {return ((*this) ^ v) == Type(0);} + + Type & at(uint index) {return c[index];} + Type at(uint index) const {return c[index];} + Type & operator [](uint index) {return c[index];} + Type operator [](uint index) const {return c[index];} + _CVector & operator =(const _CVector & v) {memcpy(c, v.c, sizeof(Type) * Size); return *this;} + bool operator ==(const _CVector & v) const {PIMV_FOR(i, 0) if (c[i] != v[i]) return false; return true;} + bool operator !=(const _CVector & v) const {return !(*this == c);} + void operator +=(const _CVector & v) {PIMV_FOR(i, 0) c[i] += v[i];} + void operator -=(const _CVector & v) {PIMV_FOR(i, 0) c[i] -= v[i];} + void operator *=(const Type & v) {PIMV_FOR(i, 0) c[i] *= v;} + void operator *=(const _CVector & v) {PIMV_FOR(i, 0) c[i] *= v[i];} + void operator /=(const Type & v) {PIMV_FOR(i, 0) c[i] /= v;} + void operator /=(const _CVector & v) {PIMV_FOR(i, 0) c[i] /= v[i];} + _CVector operator -() const {_CVector tv; PIMV_FOR(i, 0) tv[i] = -c[i]; return tv;} + _CVector operator +(const _CVector & v) const {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] += v[i]; return tv;} + _CVector operator -(const _CVector & v) const {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] -= v[i]; return tv;} + _CVector operator *(const Type & v) const {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] *= v; return tv;} + _CVector operator /(const Type & v) const {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] /= v; return tv;} + _CVector operator /(const _CVector & v) const {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] /= v[i]; return tv;} + _CVector operator *(const _CVector & v) const {if (Size > 3) return _CVector(); _CVector tv; tv.fill(Type(1)); tv[0] = c[1]*v[2] - v[1]*c[2]; tv[1] = v[0]*c[2] - c[0]*v[2]; tv[2] = c[0]*v[1] - v[0]*c[1]; return tv;} + Type operator ^(const _CVector & v) const {Type tv(0); PIMV_FOR(i, 0) tv += c[i] * v[i]; return tv;} + + PIMathMatrixT<1, Size, Type> transposed() const { + PIMathMatrixT<1, Size, Type> ret; + PIMV_FOR(i, 0) ret[0][i] = c[i]; + return ret; + } + + operator PIMathMatrixT<1, Size, Type>() {return transposed();} + operator PIMathMatrixT() { + PIMathMatrixT ret; + PIMV_FOR(i, 0) ret[i][0] = c[i]; + return ret; + } + Type distToLine(const _CVector & lp0, const _CVector & lp1) { + _CVector a(lp0, lp1), b(lp0, *this), c(lp1, *this); + Type f = fabs(a[0]*b[1] - a[1]*b[0]) / a.length();//, s = b.length() + c.length() - a.length(); + return f;} + + template /// vector {Size, Type} to vector {Size1, Type1} + PIMathVectorT turnTo() {PIMathVectorT tv; uint sz = piMin(Size, Size1); for (uint i = 0; i < sz; ++i) tv[i] = c[i]; return tv;} + +private: + void resize(uint size, const Type & new_value = Type()) {s = size; for (int i = 0; i < s; ++i) c[i] = new_value;} + + int s; + Type c[Size]; + +}; +#pragma pack(pop) + +template +inline std::ostream & operator <<(std::ostream & s, const PIMathVectorT & v) {s << '{'; PIMV_FOR(i, 0) {s << v[i]; if (i < Size - 1) s << ", ";} s << '}'; return s;} +template +inline PICout operator <<(PICout s, const PIMathVectorT & v) {s << '{'; PIMV_FOR(i, 0) {s << v[i]; if (i < Size - 1) s << ", ";} s << '}'; return s;} +template +inline bool operator ||(const PIMathVectorT & f, const PIMathVectorT & s) {return (f * s).isNull();} +template +inline PIMathVectorT sqrt(const PIMathVectorT & v) {PIMathVectorT ret; PIMV_FOR(i, 0) {ret[i] = sqrt(v[i]);} return ret;} +template +inline PIMathVectorT sqr(const PIMathVectorT & v) {PIMathVectorT ret; PIMV_FOR(i, 0) {ret[i] = sqr(v[i]);} return ret;} + +template +inline PIByteArray & operator <<(PIByteArray & s, const PIMathVectorT & v) {for (uint i = 0; i < Size; ++i) s << v[i]; return s;} +template +inline PIByteArray & operator >>(PIByteArray & s, PIMathVectorT & v) {for (uint i = 0; i < Size; ++i) s >> v[i]; return s;} + +//template /// vector {Size0, Type0} to vector {Size1, Type1} +//inline operator PIMathVectorT(const PIMathVectorT & v) {PIMathVectorT tv; uint sz = piMin(Size0, Size1); for (uint i = 0; i < sz; ++i) tv[i] = v[i]; return tv;} + +typedef PIMathVectorT<2u, int> PIMathVectorT2i; +typedef PIMathVectorT<3u, int> PIMathVectorT3i; +typedef PIMathVectorT<4u, int> PIMathVectorT4i; +typedef PIMathVectorT<2u, double> PIMathVectorT2d; +typedef PIMathVectorT<3u, double> PIMathVectorT3d; +typedef PIMathVectorT<4u, double> PIMathVectorT4d; + +#undef PIMV_FOR + +/// Vector + +#define PIMV_FOR(v, s) for (uint v = s; v < size_; ++v) + +template +class PIP_EXPORT PIMathVector { + typedef PIMathVector _CVector; +public: + PIMathVector(const uint size = 3) {resize(size);} + PIMathVector(const uint size, Type fval, ...) {resize(size); c[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] = va_arg(vl, Type); va_end(vl);} + PIMathVector(const PIVector & val) {resize(val.size()); PIMV_FOR(i, 0) c[i] = val[i];} + PIMathVector(const _CVector & st, const _CVector & fn) {resize(st.size()); PIMV_FOR(i, 0) c[i] = fn[i] - st[i];} + + uint size() const {return size_;} + _CVector & resize(uint size, const Type & new_value = Type()) {size_ = size; c.resize(size, new_value); return *this;} + _CVector resized(uint size, const Type & new_value = Type()) {_CVector tv = _CVector(*this); tv.resize(size, new_value); return tv;} + _CVector & fill(const Type & v) {PIMV_FOR(i, 0) c[i] = v; return *this;} + _CVector & set(Type fval, ...) {c[0] = fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] = va_arg(vl, Type); va_end(vl); return *this;} + _CVector & move(const Type & v) {PIMV_FOR(i, 0) c[i] += v; return *this;} + _CVector & move(const _CVector & v) {PIMV_FOR(i, 0) c[i] += v[i]; return *this;} + _CVector & move(Type fval, ...) {c[0] += fval; va_list vl; va_start(vl, fval); PIMV_FOR(i, 1) c[i] += va_arg(vl, Type); va_end(vl); return *this;} + _CVector & swap(uint fe, uint se) {piSwap(c[fe], c[se]); return *this;} + Type lengthSqr() const {Type tv(0); PIMV_FOR(i, 0) tv += (c[i] * c[i]); return tv;} + Type length() const {return sqrt(lengthSqr());} + Type manhattanLength() const {Type tv(0); PIMV_FOR(i, 0) tv += fabs(c[i]); return tv;} + Type angleCos(const _CVector & v) const {Type tv = v.length() * length(); return (tv == Type(0) ? Type(0) : ((*this) ^ v) / tv);} + Type angleSin(const _CVector & v) const {Type tv = angleCos(v); return sqrt(Type(1) - tv * tv);} + Type angleRad(const _CVector & v) const {return acos(angleCos(v));} + Type angleDeg(const _CVector & v) const {return toDeg(acos(angleCos(v)));} + _CVector projection(const _CVector & v) {Type tv = v.length(); return (tv == Type(0) ? _CVector() : v * (((*this) ^ v) / tv));} + _CVector & normalize() {Type tv = length(); if (tv == Type(1)) return *this; if (piAbs(tv) <= Type(1E-100)) {fill(Type(0)); return *this;} PIMV_FOR(i, 0) c[i] /= tv; return *this;} + _CVector normalized() {_CVector tv(*this); tv.normalize(); return tv;} + bool isNull() const {PIMV_FOR(i, 0) if (c[i] != Type(0)) return false; return true;} + bool isOrtho(const _CVector & v) const {return ((*this) ^ v) == Type(0);} + + Type & at(uint index) {return c[index];} + Type at(uint index) const {return c[index];} + Type & operator [](uint index) {return c[index];} + Type operator [](uint index) const {return c[index];} + void operator =(const _CVector & v) {c = v.c;} + bool operator ==(const _CVector & v) const {PIMV_FOR(i, 0) if (c[i] != v[i]) return false; return true;} + bool operator !=(const _CVector & v) const {return !(*this == c);} + void operator +=(const _CVector & v) {PIMV_FOR(i, 0) c[i] += v[i];} + void operator -=(const _CVector & v) {PIMV_FOR(i, 0) c[i] -= v[i];} + void operator *=(const Type & v) {PIMV_FOR(i, 0) c[i] *= v;} + void operator *=(const _CVector & v) {PIMV_FOR(i, 0) c[i] *= v[i];} + void operator /=(const Type & v) {PIMV_FOR(i, 0) c[i] /= v;} + void operator /=(const _CVector & v) {PIMV_FOR(i, 0) c[i] /= v[i];} + _CVector operator -() {_CVector tv; PIMV_FOR(i, 0) tv[i] = -c[i]; return tv;} + _CVector operator +(const _CVector & v) {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] += v[i]; return tv;} + _CVector operator -(const _CVector & v) {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] -= v[i]; return tv;} + _CVector operator *(const Type & v) {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] *= v; return tv;} + _CVector operator /(const Type & v) {_CVector tv = _CVector(*this); PIMV_FOR(i, 0) tv[i] /= v; return tv;} + _CVector operator *(const _CVector & v) {if (size_ < 3) return _CVector(); _CVector tv; tv.fill(Type(1)); tv[0] = c[1]*v[2] - v[1]*c[2]; tv[1] = v[0]*c[2] - c[0]*v[2]; tv[2] = c[0]*v[1] - v[0]*c[1]; return tv;} + Type operator ^(const _CVector & v) const {Type tv(0); PIMV_FOR(i, 0) tv += c[i] * v[i]; return tv;} + + //inline operator PIMathMatrix<1, Size, Type>() {return PIMathMatrix<1, Size, Type>(c);} + Type distToLine(const _CVector & lp0, const _CVector & lp1) { + _CVector a(lp0, lp1), b(lp0, *this), c(lp1, *this); + Type f = fabs(a[0]*b[1] - a[1]*b[0]) / a.length();//, s = b.length() + c.length() - a.length(); + return f;} + + template + PIMathVector turnTo(uint size) {PIMathVector tv; uint sz = piMin(size_, size); for (uint i = 0; i < sz; ++i) tv[i] = c[i]; return tv;} + +private: + uint size_; + PIVector c; + +}; + +#undef PIMV_FOR + +template +inline std::ostream & operator <<(std::ostream & s, const PIMathVector & v) {s << '{'; for (uint i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << '}'; return s;} +template +inline PICout operator <<(PICout s, const PIMathVector & v) {s << '{'; for (uint i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << '}'; return s;} + +typedef PIMathVector PIMathVectori; +typedef PIMathVector PIMathVectord; + +//#include "pimathmatrix.h" + +#endif // PIMATHVECTOR_H diff --git a/src/math/pistatistic.h b/src/math/pistatistic.h new file mode 100644 index 00000000..3d8f1c07 --- /dev/null +++ b/src/math/pistatistic.h @@ -0,0 +1,89 @@ +/*! \file pistatistic.h + * \brief Class for calculating math statistic in values array +*/ +/* + PIP - Platform Independent Primitives + Class for calculacing math statistic in values array + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISTATISTIC_H +#define PISTATISTIC_H + +#include "pimathbase.h" + +template +class PIP_EXPORT PIStatistic { +public: + PIStatistic() {mean = variance = skewness = kurtosis = T();} + + static T calculateMean(const PIVector & val) { + T ret = T(); + int n = val.size(); + if (n < 1) + return ret; + for (int i = 0; i < n; i++) + ret += val[i]; + return ret / n; + } + bool calculate(const PIVector & val, const T & given_mean) { + T v = T(), v1 = T(), v2 = T(), stddev = T(), var = T(); + int i, n = val.size(); + if (n < 2) + return false; + mean = given_mean; + variance = skewness = kurtosis = T(); + /* + * Variance (using corrected two-pass algorithm) + */ + for (i = 0; i < n; i++) + v1 += sqr(val[i] - mean); + for (i = 0; i < n; i++) + v2 += val[i] - mean; + v2 = sqr(v2) / n; + variance = v1 / n; + var = (v1 / n - v2) / (n - 1); + if (var < T()) + var = T(); + stddev = sqrt(var); + /* + * Skewness and kurtosis + */ + if (stddev != T()) { + for (i = 0; i < n; i++) { + v = (val[i] - mean) / stddev; + v2 = sqr(v); + skewness = skewness + v2 * v; + kurtosis = kurtosis + sqr(v2); + } + skewness /= n; + kurtosis = kurtosis / n - 3.; + } + return true; + } + bool calculate(const PIVector & val) {return calculate(val, calculateMean(val));} + + T mean; + T variance; + T skewness; + T kurtosis; +}; + +typedef PIStatistic PIStatistici; +typedef PIStatistic PIStatisticf; +typedef PIStatistic PIStatisticd; + +#endif // PISTATISTIC_H diff --git a/src/system/.piscreen.cpp.kate-swp b/src/system/.piscreen.cpp.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..3b43720cb0c2bd2dd6398ded066063bf7a943b9a GIT binary patch literal 74 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?VnnAH1zL+^)eifd->u2uAH{1og76fFT_ RJ|JeybOrNEfoy&V9{?gI62AZd literal 0 HcmV?d00001 diff --git a/src/system/picodec.cpp b/src/system/picodec.cpp new file mode 100755 index 00000000..cecb3d32 --- /dev/null +++ b/src/system/picodec.cpp @@ -0,0 +1,41 @@ +/* + PIP - Platform Independent Primitives + Text codings coder, based on "iconv" + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picodec.h" + + +PIStringList PICodec::availableCodecs() { + exec("/usr/bin/iconv", "-l"); + waitForFinish(); + PIString str(readOutput()); + str.cutLeft(str.find("\n ")); + str.replaceAll("\n", ""); + return str.split("//"); +} + + +PIByteArray PICodec::exec_iconv(const PIString & from, const PIString & to, const PIByteArray & str) { + tf.open(); + tf.clear(); + tf << str; + tf.close(); + exec("/usr/bin/iconv", ("-f=" + from), ("-t=" + to), tf.path()); + waitForFinish(); + return readOutput(); +} diff --git a/src/system/picodec.h b/src/system/picodec.h new file mode 100755 index 00000000..bcfa0f33 --- /dev/null +++ b/src/system/picodec.h @@ -0,0 +1,51 @@ +/* + PIP - Platform Independent Primitives + Text codings coder, based on "iconv" + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICODEC_H +#define PICODEC_H + +#include "piprocess.h" + +class PIP_EXPORT PICodec: private PIProcess +{ + PIOBJECT(PICodec) +public: + PICodec(): PIProcess() {setGrabOutput(true); tf = PIFile::openTemporary(PIIODevice::ReadWrite); tf.open();} + PICodec(const PIString & from, const PIString & to): PIProcess() {setCodings(from, to); tf = PIFile::openTemporary(PIIODevice::ReadWrite);} + ~PICodec() {tf.remove();} + + void setFromCoding(const PIString & from) {c_from = from;} + void setToCoding(const PIString & to) {c_to = to;} + void setCodings(const PIString & from, const PIString & to) {c_from = from; c_to = to;} + + PIStringList availableCodecs(); + PIString encode(PIString & str) {return PIString(exec_iconv(c_from, c_to, str.toByteArray()));} + PIString encode(const PIByteArray & str) {return PIString(exec_iconv(c_from, c_to, str));} + PIString decode(PIString & str) {return PIString(exec_iconv(c_to, c_from, str.toByteArray()));} + PIString decode(const PIByteArray & str) {return PIString(exec_iconv(c_to, c_from, str));} + +private: + PIByteArray exec_iconv(const PIString & from, const PIString & to, const PIByteArray & str); + + PIString c_from, c_to; + PIFile tf; + +}; + +#endif // PICODEC_H diff --git a/src/system/piconsole.cpp b/src/system/piconsole.cpp new file mode 100755 index 00000000..ccf79ac7 --- /dev/null +++ b/src/system/piconsole.cpp @@ -0,0 +1,1064 @@ +/* + PIP - Platform Independent Primitives + Console output/input + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piconsole.h" +#include "pipeer.h" + + +/** \class PIConsole + * \brief Console output class + * \details + * \section PIConsole_sec0 Synopsis + * This class provides output to console with automatic alignment and update. + * It supports tabs, keyboard listening, formats and colors. + * + * \section PIConsole_sec1 Layout + * %PIConsole works with variable pointers. You should add your variables with + * functions \a addVariable() which receives label name, pointer to variable + * and optional column and format. Columns count is dynamically increased if + * new column used. E.g. if you add variable to empty tab to column 3, columns + * count will be increased to 3, but two firsts columns will be empty. Each column + * filled from top to bottom, but you can add just string with function + * \a addString() or add empty line with function \a addEmptyLine(). Layout scheme: + * \image html piconsole_layout.png + * + * \section PIConsole_sec2 Keyboard usage + * %PIConsole should to be single in application. %PIConsole aggregate PIKbdListener + * which grab keyboard and automatic switch tabs by theirs bind keys. If there is no + * tab binded to pressed key external function "slot" will be called + * + **/ + + +extern PIMutex __PICout_mutex__; + + +PIConsole::PIConsole(bool startNow, KBFunc slot): PIThread() { + setName("console"); + setPriority(piLow); + needLockRun(true); + ret_func = slot; + num_format = systime_format = 0; + vid = 0; + cur_tab = width = height = pwidth = pheight = max_y = 0; + def_align = Nothing; + tabs.reserve(16); +#ifdef WINDOWS + ulcoord.X = 0; + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + GetConsoleScreenBufferInfo(hOut, &sbi); + dattr = sbi.wAttributes; + width = sbi.srWindow.Right - sbi.srWindow.Left; + height = sbi.srWindow.Bottom - sbi.srWindow.Top; + ulcoord.Y = sbi.srWindow.Top; + GetConsoleMode(hOut, &smode); + GetConsoleCursorInfo(hOut, &curinfo); +#else + winsize ws; + ioctl(0, TIOCGWINSZ, &ws); + width = ws.ws_col; + height = ws.ws_row; +#endif + tabs.reserve(16); + addTab("main"); + listener = new PIKbdListener(key_event, this); + peer = 0; + server_mode = pause_ = false; + state = Disconnected; + peer_timer.addDelimiter(20); + peer_timer.setName("__S__PIConsole::peer_timer"); + CONNECT2(void, void * , int, &peer_timer, tickEvent, this, peerTimer); + if (startNow) start(); +} + + +PIConsole::~PIConsole() { + stopPeer(); + if (isRunning()) + stop(); + clearTabs(false); + delete listener; +#ifdef WINDOWS + SetConsoleMode(hOut, smode); + SetConsoleTextAttribute(hOut, dattr); +#endif +} + + +int PIConsole::addTab(const PIString & name, char bind_key) { + if (isRunning()) lock(); + tabs.push_back(Tab(name, bind_key)); + cur_tab = tabs.size() - 1; + if (isRunning()) unlock(); + return tabs.size(); +} + + +void PIConsole::removeTab(uint index) { + if (index >= tabs.size()) return; + if (isRunning()) lock(); + tabs.remove(index); + if (cur_tab >= tabs.size()) cur_tab = tabs.size() - 1; + if (isRunning()) unlock(); +} + + +void PIConsole::removeTab(const PIString & name) { + uint index = tabs.size() + 1; + for (uint i = 0; i < tabs.size(); ++i) { + if (tabs[i].name == name) { + index = i; + break; + } + } + removeTab(index); +} + + +void PIConsole::clearTab(uint index) { + if (index >= tabs.size()) return; + lock(); + tabs[index].columns.clear(); + if (cur_tab == index) { + clearScreen(); + fillLabels(); + } + if (cur_tab >= tabs.size()) cur_tab = tabs.size() - 1; + unlock(); +} + + +void PIConsole::clearTab(const PIString & name) { + uint index = tabs.size() + 1; + for (uint i = 0; i < tabs.size(); ++i) { + if (tabs[i].name == name) { + index = i; + break; + } + } + clearTab(index); +} + + +void PIConsole::update() { + lock(); + fillLabels(); + unlock(); +} + + +bool PIConsole::setTab(uint index) { + if (index >= tabs.size()) + return false; + if (!isRunning()) { + cur_tab = index; + return true; + } + lock(); + __PICout_mutex__.lock(); + cur_tab = index; + clearScreen(); + fillLabels(); + __PICout_mutex__.unlock(); + unlock(); + return true; +} + + +bool PIConsole::setTab(const PIString & name) { + uint index = tabs.size() + 1; + for (uint i = 0; i < tabs.size(); ++i) { + if (tabs[i].name == name) { + index = i; + break; + } + } + return setTab(index); +} + + +bool PIConsole::setTabBindKey(uint index, char bind_key) { + if (index >= tabs.size()) + return false; + tabs[index].key = bind_key; + return true; +} + + +bool PIConsole::setTabBindKey(const PIString & name, char bind_key) { + uint index =tabs.size() + 1; + for (uint i = 0; i < tabs.size(); ++i) { + if (tabs[i].name == name) { + index = i; + break; + } + } + return setTabBindKey(index, bind_key); +} + + +void PIConsole::key_event(char key, void * t) { + PIConsole * p = (PIConsole * )t; + int ct = p->cur_tab; + if (key == char(PIKbdListener::LeftArrow)) { + do { + ct--; + if (ct < 0) return; + } while (p->tabs[ct].key == 0); + p->setTab(ct); + return; + } + if (key == char(PIKbdListener::RightArrow)) { + do { + ct++; + if (ct >= p->tabs.size_s()) return; + } while (p->tabs[ct].key == 0); + p->setTab(ct); + return; + } + for (uint i = 0; i < p->tabsCount(); ++i) { + if (p->tabs[i].key == key) { + p->setTab(i); + return; + } + } + if (p->ret_func != 0) p->ret_func(key, t); + p->keyPressed(key, t); +} + + +void PIConsole::clearVariables(bool clearScreen) { + if (isRunning()) lock(); + if (clearScreen && isRunning()) { + toUpperLeft(); + clearScreenLower(); + } + columns().clear(); + if (isRunning()) unlock(); +} + + +void PIConsole::stop(bool clear) { + PIThread::stop(true); + if (clear) clearScreen(); + moveTo(0, max_y + 4); + showCursor(); + couts(fstr(Normal)); +#ifdef WINDOWS + SetConsoleMode(hOut, smode); + SetConsoleTextAttribute(hOut, dattr); +#endif + fflush(0); +} + + +PIString PIConsole::fstr(FormatFlags f) { + num_format = systime_format = 0; + if (f[PIConsole::Dec]) num_format = 0; + if (f[PIConsole::Hex]) num_format = 1; + if (f[PIConsole::Oct]) num_format = 2; + if (f[PIConsole::Bin]) num_format = 4; + if (f[PIConsole::Scientific]) num_format = 3; + if (f[PIConsole::SystemTimeSplit]) systime_format = 0; + if (f[PIConsole::SystemTimeSeconds]) systime_format = 1; + +#ifdef WINDOWS + WORD attr = 0; + + if (f[PIConsole::Inverse]) { + if (f[PIConsole::Red]) attr |= BACKGROUND_RED; + if (f[PIConsole::Green]) attr |= BACKGROUND_GREEN; + if (f[PIConsole::Blue]) attr |= BACKGROUND_BLUE; + if (f[PIConsole::Yellow]) attr |= (BACKGROUND_RED | BACKGROUND_GREEN); + if (f[PIConsole::Magenta]) attr |= (BACKGROUND_RED | BACKGROUND_BLUE); + if (f[PIConsole::Cyan]) attr |= (BACKGROUND_GREEN | BACKGROUND_BLUE); + if (f[PIConsole::White]) attr |= (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); + if (f[PIConsole::BackRed]) attr |= FOREGROUND_RED; + if (f[PIConsole::BackGreen]) attr |= FOREGROUND_GREEN; + if (f[PIConsole::BackBlue]) attr |= FOREGROUND_BLUE; + if (f[PIConsole::BackYellow]) attr |= (FOREGROUND_RED | FOREGROUND_GREEN); + if (f[PIConsole::BackMagenta]) attr |= (FOREGROUND_RED | FOREGROUND_BLUE); + if (f[PIConsole::BackCyan]) attr |= (FOREGROUND_GREEN | FOREGROUND_BLUE); + if (f[PIConsole::BackWhite]) attr |= (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); + if ((attr & BACKGROUND_RED) + (attr & BACKGROUND_GREEN) + (attr & BACKGROUND_BLUE) == 0) + attr |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + } else { + if (f[PIConsole::Red]) attr |= FOREGROUND_RED; + if (f[PIConsole::Green]) attr |= FOREGROUND_GREEN; + if (f[PIConsole::Blue]) attr |= FOREGROUND_BLUE; + if (f[PIConsole::Yellow]) attr |= (FOREGROUND_RED | FOREGROUND_GREEN); + if (f[PIConsole::Magenta]) attr |= (FOREGROUND_RED | FOREGROUND_BLUE); + if (f[PIConsole::Cyan]) attr |= (FOREGROUND_GREEN | FOREGROUND_BLUE); + if (f[PIConsole::White]) attr |= (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); + if (f[PIConsole::BackRed]) attr |= BACKGROUND_RED; + if (f[PIConsole::BackGreen]) attr |= BACKGROUND_GREEN; + if (f[PIConsole::BackBlue]) attr |= BACKGROUND_BLUE; + if (f[PIConsole::BackYellow]) attr |= (BACKGROUND_RED | BACKGROUND_GREEN); + if (f[PIConsole::BackMagenta]) attr |= (BACKGROUND_RED | BACKGROUND_BLUE); + if (f[PIConsole::BackCyan]) attr |= (BACKGROUND_GREEN | BACKGROUND_BLUE); + if (f[PIConsole::BackWhite]) attr |= (BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); + if ((attr & FOREGROUND_RED) + (attr & FOREGROUND_GREEN) + (attr & FOREGROUND_BLUE) == 0) + attr |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + } + if (f[PIConsole::Bold]) attr |= FOREGROUND_INTENSITY; + if (f[PIConsole::Underline]) attr |= COMMON_LVB_UNDERSCORE; + + SetConsoleTextAttribute(hOut, attr); + return PIString(); +#else + PIString ts("\e[0"); + + if (f[PIConsole::Bold]) ts += ";1"; + if (f[PIConsole::Faint]) ts += ";2"; + if (f[PIConsole::Italic]) ts += ";3"; + if (f[PIConsole::Underline]) ts += ";4"; + if (f[PIConsole::Blink]) ts += ";5"; + if (f[PIConsole::Inverse]) ts += ";7"; + + if (f[PIConsole::Black]) ts += ";30"; + if (f[PIConsole::Red]) ts += ";31"; + if (f[PIConsole::Green]) ts += ";32"; + if (f[PIConsole::Yellow]) ts += ";33"; + if (f[PIConsole::Blue]) ts += ";34"; + if (f[PIConsole::Magenta]) ts += ";35"; + if (f[PIConsole::Cyan]) ts += ";36"; + if (f[PIConsole::White]) ts += ";37"; + + if (f[PIConsole::BackBlack]) ts += ";40"; + if (f[PIConsole::BackRed]) ts += ";41"; + if (f[PIConsole::BackGreen]) ts += ";42"; + if (f[PIConsole::BackYellow]) ts += ";43"; + if (f[PIConsole::BackBlue]) ts += ";44"; + if (f[PIConsole::BackMagenta]) ts += ";45"; + if (f[PIConsole::BackCyan]) ts += ";46"; + if (f[PIConsole::BackWhite]) ts += ";47"; + + return ts + "m"; +#endif +} + + +inline int PIConsole::couts(const bool v) {return (v ? printf("true") : printf("false"));} +inline int PIConsole::couts(const char v) {return printf("%c", v);} +inline int PIConsole::couts(const short v) { + switch (num_format) {case (1): return printf("0x%.4hX", v); break; case (2): return printf("%o", v); break; case (4): return printf("%s", toBin(&v, 2)); break; default: return printf("%hd", v); break;} +} +inline int PIConsole::couts(const int v) { + switch (num_format) {case (1): return printf("0x%.8X", v); break; case (2): return printf("%o", v); break; case (4): return printf("%s", toBin(&v, 4)); break; default: return printf("%d", v); break;} +} +inline int PIConsole::couts(const long v) { + switch (num_format) {case (1): return printf("0x%.16lX", v); break; case (2): return printf("%lo", v); break; case (4): return printf("%s", toBin(&v, sizeof(v))); break; default: return printf("%ld", v); break;} +} +inline int PIConsole::couts(const llong v) { + switch (num_format) {case (1): return printf("0x%.16llX", v); break; case (2): return printf("%llo", v); break; case (4): return printf("%s", toBin(&v, sizeof(v))); break; default: return printf("%lld", v); break;} +} +inline int PIConsole::couts(const uchar v) { + switch (num_format) {case (1): return printf("0x%.2X", v); break; case (2): return printf("%o", v); break; case (4): return printf("%s", toBin(&v, 1)); break; default: return printf("%u", v); break;} +} +inline int PIConsole::couts(const ushort v) { + switch (num_format) {case (1): return printf("0x%.4hX", v); break; case (2): return printf("%o", v); break; case (4): return printf("%s", toBin(&v, 2)); break; default: return printf("%hu", v); break;} +} +inline int PIConsole::couts(const uint v) { + switch (num_format) {case (1): return printf("0x%.8X", v); break; case (2): return printf("%o", v); break; case (4): return printf("%s", toBin(&v, 4)); break; default: return printf("%u", v); break;} +} +inline int PIConsole::couts(const ulong v) { + switch (num_format) {case (1): return printf("0x%.16lX", v); break; case (2): return printf("%lo", v); break; case (4): return printf("%s", toBin(&v, sizeof(v))); break; default: return printf("%lu", v); break;} +} +inline int PIConsole::couts(const ullong v) { + switch (num_format) {case (1): return printf("0x%.16llX", v); break; case (2): return printf("%llo", v); break; case (4): return printf("%s", toBin(&v, sizeof(v))); break; default: return printf("%llu", v); break;} +} +inline int PIConsole::couts(const float v) { + switch (num_format) {case (3): return printf("%e", v); break; default: return printf("%.5g", v); break;} +} +inline int PIConsole::couts(const double v) { + switch (num_format) {case (3): return printf("%le", v); break; default: return printf("%.5lg", v); break;} +} +inline int PIConsole::couts(const PISystemTime & v) { + switch (systime_format) {case (1): return printf("%.6lg", v.toSeconds()); break; + default: return couts(v.seconds) + printf(" s, ") + couts(v.nanoseconds) + printf(" ns"); break;} +} + + +void PIConsole::begin() { +#ifdef WINDOWS + SetConsoleMode(hOut, ENABLE_WRAP_AT_EOL_OUTPUT); +#endif + max_y = 0; + __PICout_mutex__.lock(); + clearScreen(); + hideCursor(); + fillLabels(); + __PICout_mutex__.unlock(); +} + + +void PIConsole::run() { + if (pause_) return; + uint cx, clen = 0; + int j; +#ifdef WINDOWS + GetConsoleScreenBufferInfo(hOut, &sbi); + width = sbi.srWindow.Right - sbi.srWindow.Left; + height = sbi.srWindow.Bottom - sbi.srWindow.Top; +#else + winsize ws; + ioctl(0, TIOCGWINSZ, &ws); + width = ws.ws_col; + height = ws.ws_row; +#endif + //fflush(0); return; + __PICout_mutex__.lock(); + if (pwidth != width || pheight != height) { + clearScreen(); + fillLabels(); + } + pwidth = width; + pheight = height; + col_cnt = columns().size(); + col_wid = (col_cnt > 0) ? width / col_cnt : width; + for (uint i = 0; i < col_cnt; ++i) { + PIVector & cvars(tabs[cur_tab].columns[i].variables); + cx = col_wid * i; + toUpperLeft(); + if (max_y < cvars.size()) max_y = cvars.size(); + j = 0; + piForeachC (Variable & tv, cvars) { + if (j > height - 3) continue; + j++; + moveRight(cx); + if (tv.type == 15) { + newLine(); + continue; + } + moveRight(tv.offset); + const void * ptr = 0; + if (tv.remote) { + if (tv.type == 0) { + rstr.clear(); + rba = tv.rdata; + rba >> rstr; + rstr.trim(); + ptr = &rstr; + } else + ptr = tv.rdata.data(); + } else + ptr = tv.ptr; + switch (tv.type) { + case 0: clen = printValue(ptr != 0 ? *(const PIString*)ptr : PIString(), tv.format); break; + case 1: clen = printValue(ptr != 0 ? *(const bool*)ptr : false, tv.format); break; + case 2: clen = printValue(ptr != 0 ? *(const int*)ptr : 0, tv.format); break; + case 3: clen = printValue(ptr != 0 ? *(const long*)ptr : 0l, tv.format); break; + case 4: clen = printValue(ptr != 0 ? *(const char*)ptr : char(0), tv.format); break; + case 5: clen = printValue(ptr != 0 ? *(const float*)ptr : 0.f, tv.format); break; + case 6: clen = printValue(ptr != 0 ? *(const double*)ptr : 0., tv.format); break; + case 7: clen = printValue(ptr != 0 ? *(const short*)ptr : short(0), tv.format); break; + case 8: clen = printValue(ptr != 0 ? *(const uint*)ptr : 0u, tv.format); break; + case 9: clen = printValue(ptr != 0 ? *(const ulong*)ptr : 0ul, tv.format); break; + case 10: clen = printValue(ptr != 0 ? *(const ushort*)ptr : ushort(0), tv.format); break; + case 11: clen = printValue(ptr != 0 ? *(const uchar*)ptr : uchar(0), tv.format); break; + case 12: clen = printValue(ptr != 0 ? *(const llong*)ptr : 0l, tv.format); break; + case 13: clen = printValue(ptr != 0 ? *(const ullong*)ptr: 0ull, tv.format); break; + case 20: clen = printValue(ptr != 0 ? *(const PISystemTime*)ptr: PISystemTime(), tv.format); break; + case 14: clen = printValue(bitsValue(ptr, tv.bitFrom, tv.bitCount), tv.format); break; + } + if (clen + tv.offset < (uint)col_wid) { + PIString ts = PIString( +#if defined(QNX) || defined(FREE_BSD) + col_wid - clen - tv.offset - 1, ' '); +#else + col_wid - clen - tv.offset, ' '); +#endif + printf("%s", ts.data()); + } + newLine(); + } + } +#ifdef WINDOWS + moveTo(0, max_y + 1); +#else + moveTo(0, max_y + 2); +#endif + fflush(0); + __PICout_mutex__.unlock(); +} + + +void PIConsole::fillLabels() { + if (!isRunning()) return; + uint cx, cy, mx = 0, dx; +#ifdef WINDOWS + GetConsoleScreenBufferInfo(hOut, &sbi); + width = sbi.srWindow.Right - sbi.srWindow.Left; + height = sbi.srWindow.Bottom - sbi.srWindow.Top; +#else + winsize ws; + ioctl(0, TIOCGWINSZ, &ws); + width = ws.ws_col; + height = ws.ws_row; +#endif + max_y = 0; + col_cnt = columns().size(); + col_wid = (col_cnt > 0) ? width / col_cnt : width; + for (uint i = 0; i < col_cnt; ++i) { + Column & ccol(tabs[cur_tab].columns[i]); + PIVector & cvars(ccol.variables); + if (ccol.alignment != Nothing) { + mx = 0; + piForeachC (Variable & j, cvars) + if (!j.isEmpty()) + if (mx < j.name.size()) + mx = j.name.size(); + mx += 2; + } + cx = col_wid * i; + cy = 1; + toUpperLeft(); + for (uint j = 0; j < cvars.size(); ++j) { + if (int(j) > height - 3) continue; + if (max_y < j) max_y = j; + moveRight(cx); + Variable & tv(cvars[j]); + cvars[j].nx = cx; + cvars[j].ny = cy; + if (tv.name.isEmpty()) { + cvars[j].offset = 0; + clearLine(); + newLine(); + cy++; + continue; + } + clearLine(); + //piCout << tv.name << tv.type << tv.ptr; + if (tv.type == 15) { + cvars[j].offset = cvars[j].name.length(); + cvars[j].nx += cvars[j].offset; + printLine(tv.name, cx, tv.format); + newLine(); + cy++; + continue; + } + if (!tv.isEmpty()) { + switch (ccol.alignment) { + case Nothing: + cvars[j].offset = (tv.name + ": ").length(); + cvars[j].nx += cvars[j].offset; + printValue(tv.name + ": ", tv.format); + break; + case Left: + cvars[j].offset = mx; + cvars[j].nx += cvars[j].offset; + printValue(tv.name + ": ", tv.format); + break; + case Right: + cvars[j].offset = mx; + cvars[j].nx += cvars[j].offset; + dx = mx - (tv.name + ": ").length(); + moveRight(dx); + printValue(tv.name + ": ", tv.format); + moveLeft(dx); + break; + } + } + newLine(); + cy++; + } + } +#ifdef WINDOWS + moveTo(0, max_y + 1); +#else + moveTo(0, max_y + 2); +#endif + if (!tabs[cur_tab].status.isEmpty()) { + printValue(tabs[cur_tab].status); + newLine(); + } + status(); + //couts(fstr(Normal)); + //fflush(0); +} + + +void PIConsole::status() { + Tab * ctab; + //clearLine(); + for (uint i = 0; i < tabsCount(); ++i) { + ctab = &tabs[i]; + if (ctab->key == 0) continue; + printValue(ctab->key, PIConsole::White | PIConsole::Bold); + if (i == cur_tab) + printValue(ctab->name + " ", PIConsole::BackYellow | PIConsole::Black); + else + printValue(ctab->name + " ", PIConsole::Cyan | PIConsole::Inverse); + printValue(" "); + } + newLine(); +} + + +int PIConsole::bitsValue(const void * src, int offset, int count) const { + int ret = 0, stbyte = offset / 8, cbit = offset - stbyte * 8; + char cbyte = reinterpret_cast(src)[stbyte]; + for (int i = 0; i < count; i++) { + ret |= ((cbyte >> cbit & 1) << i); + cbit++; + if (cbit == 8) { + cbit = 0; + stbyte++; + cbyte = reinterpret_cast(src)[stbyte]; + } + } + return ret; +} + + +const char * PIConsole::toBin(const void * d, int s) { + binstr.clear(); + uchar cc, b; + for (int i = 0; i < s; ++i) { + cc = ((const uchar *)d)[i]; + b = 1; + for (int j = 0; j < 8; ++j) { + binstr << (cc & b ? "1" : "0"); + b <<= 1; + } + if (i < s - 1) binstr << " "; + } + binstr.reverse(); + return binstr.data(); +} + + +#define ADD_VAR_BODY vid++; tv.id = vid; tv.name = name; tv.bitFrom = tv.bitCount = 0; tv.format = format; tv.remote = false; checkColumn(col); + +void PIConsole::addString(const PIString & name, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 15; tv.size = 0; tv.ptr = 0; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const PIString * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 0; tv.size = 0; tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const bool * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 1; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const int * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 2; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const long * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 3; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const char * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 4; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const float * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 5; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const double * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 6; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const short * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 7; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const uint * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 8; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const ulong * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 9; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const ushort * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 10; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const uchar * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 11; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const llong * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 12; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const ullong * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 13; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +void PIConsole::addVariable(const PIString & name, const PISystemTime * ptr, int col, FormatFlags format) { + ADD_VAR_BODY tv.type = 20; tv.size = sizeof(*ptr); tv.ptr = ptr; column(col).push_back(tv);} +/** \brief Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + * \details This function add to column "column" next lines: + * * "protocol " + * * "Rec - receiverDeviceName": \a PIProtocol::receiverDeviceState + * * "Send - senderDeviceName": \a PIProtocol::senderDeviceState + * * "Received count": \a PIProtocol::receiveCount + * * "Invalid count": \a PIProtocol::wrongCount + * * "Missed count": \a PIProtocol::missedCount + * * "Sended count": \a PIProtocol::sendCount + * * "Immediate Frequency, Hz": \a PIProtocol::immediateFrequency + * * "Integral Frequency, Hz": \a PIProtocol::integralFrequency + * * "Receive speed": \a PIProtocol::receiveSpeed + * * "Send speed": \a PIProtocol::sendSpeed + * * "Receiver history size": \a PIProtocol::receiverHistorySize + * * "Sender history size": \a PIProtocol::senderHistorySize + * * "Disconnect Timeout, s": \a PIProtocol::disconnectTimeout + * * "Quality": \a PIProtocol::quality + * */ +void PIConsole::addVariable(const PIString & name, const PIProtocol * ptr, int col, FormatFlags format) { + addString("protocol " + name, col, format | PIConsole::Bold); + addVariable("Rec - " + ptr->receiverDeviceName(), ptr->receiverDeviceState_ptr(), col, format); + addVariable("Send - " + ptr->senderDeviceName(), ptr->senderDeviceState_ptr(), col, format); + addVariable("Received count", ptr->receiveCount_ptr(), col, format); + addVariable("Invalid count", ptr->wrongCount_ptr(), col, format); + addVariable("Missed count", ptr->missedCount_ptr(), col, format); + addVariable("Sended count", ptr->sendCount_ptr(), col, format); + addVariable("Immediate Frequency, Hz", ptr->immediateFrequency_ptr(), col, format); + addVariable("Integral Frequency, Hz", ptr->integralFrequency_ptr(), col, format); + addVariable("Receive speed", ptr->receiveSpeed_ptr(), col, format); + addVariable("Send speed", ptr->sendSpeed_ptr(), col, format); + addVariable("Receiver history size", ptr->receiverHistorySize_ptr(), col, format); + addVariable("Sender history size", ptr->senderHistorySize_ptr(), col, format); + addVariable("Disconnect Timeout, s", ptr->disconnectTimeout_ptr(), col, format); + addVariable("Quality", ptr->quality_ptr(), col, format); +} +/** \brief Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + * \details This function add to column "column" next lines: + * * " diagnostics" + * * "Received count": \a PIDiagnostics::receiveCount + * * "Invalid count": \a PIDiagnostics::wrongCount + * * "Sended count": \a PIDiagnostics::sendCount + * * "Immediate Frequency, Hz": \a PIDiagnostics::immediateFrequency + * * "Integral Frequency, Hz": \a PIDiagnostics::integralFrequency + * * "Receive speed": \a PIDiagnostics::receiveSpeed + * * "Send speed": \a PIDiagnostics::sendSpeed + * * "Quality": \a PIDiagnostics::quality + * */ +void PIConsole::addVariable(const PIString & name, const PIDiagnostics * ptr, int col, FormatFlags format) { + addString(name + " diagnostics", col, format | PIConsole::Bold); + addVariable("Received count", ptr->receiveCount_ptr(), col, format); + addVariable("Invalid count", ptr->wrongCount_ptr(), col, format); + addVariable("Sended count", ptr->sendCount_ptr(), col, format); + addVariable("Immediate Frequency, Hz", ptr->immediateFrequency_ptr(), col, format); + addVariable("Integral Frequency, Hz", ptr->integralFrequency_ptr(), col, format); + addVariable("Receive speed", ptr->receiveSpeed_ptr(), col, format); + addVariable("Send speed", ptr->sendSpeed_ptr(), col, format); + addVariable("Quality", ptr->quality_ptr(), col, format); +} +void PIConsole::addVariable(const PIString & name, const PISystemMonitor * ptr, int col, FormatFlags format) { + addString("monitor " + name, col, format | PIConsole::Bold); + addVariable("PID", &(ptr->statistic().ID), col, format); + //addVariable("state", &(ptr->statistic().state), col, format); + addVariable("threads", &(ptr->statistic().threads), col, format); + addVariable("priority", &(ptr->statistic().priority), col, format); + addVariable("memory physical", &(ptr->statistic().physical_memsize_readable), col, format); + addVariable("memory shared", &(ptr->statistic().share_memsize_readable), col, format); + addVariable("cpu load kernel", &(ptr->statistic().cpu_load_system), col, format); + addVariable("cpu load user", &(ptr->statistic().cpu_load_user), col, format); +} +void PIConsole::addBitVariable(const PIString & name, const void * ptr, int fromBit, int bitCount, int col, FormatFlags format) { + vid++; tv.id = vid; tv.size = sizeof(ullong); tv.name = name; tv.bitFrom = fromBit; tv.bitCount = bitCount; tv.type = 14; tv.ptr = ptr; tv.format = format; + checkColumn(col); column(col).push_back(tv);} +void PIConsole::addEmptyLine(int col, uint count) { + tv.id = 0; tv.size = 0; tv.name = ""; tv.type = 0; tv.ptr = 0; tv.format = Normal; + for (uint i = 0; i < count; ++i) { + checkColumn(col); + column(col).push_back(tv); + } +} + + +PIString PIConsole::getString(int x, int y) { + bool run = isRunning(); + if (run) PIThread::stop(true); + listener->setActive(false); + msleep(50); +#ifdef WINDOWS + moveTo(x - 1, y - 1); +#else + moveTo(x, y); +#endif + showCursor(); + PIByteArray ba(4096); +#ifdef CC_VC + int ret = scanf_s(" %s", ba.data()); +#else + int ret = scanf(" %s", ba.data()); +#endif + listener->setActive(true); + if (run) start(); + if (ret >= 1) return PIString(ba); + else return PIString(); +} + + +PIString PIConsole::getString(const PIString & name) { + piForeachC (Column & i, tabs[cur_tab].columns) + piForeachC (Variable & j, i.variables) + if (j.name == name) + return getString(j.nx + 1, j.ny); + return PIString(); +} + + +#define PRINT_VAR_BODY couts(fstr(format)); int ret = couts(value); couts(fstr(PIConsole::Dec)); return ret; + +inline void PIConsole::printLine(const PIString & value, int dx, FormatFlags format) { + int i = width - value.length() - dx; +#if defined(QNX) || defined(FREE_BSD) + --i; +#endif + PIString ts = fstr(format); + couts(ts); + if (i >= 0) ts = value + PIString(i, ' '); + else ts = value.left(value.size() + i); + couts(ts); + couts(fstr(Dec)); +} +inline int PIConsole::printValue(const PIString & value, FormatFlags format) { + couts(fstr(format)); + int ret = couts(value); + fstr(PIConsole::Dec); + return ret; +} +inline int PIConsole::printValue(const char * value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const bool value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const int value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const long value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const llong value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const float value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const double value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const char value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const short value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const uchar value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const ushort value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const uint value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const ulong value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const ullong value, FormatFlags format) {PRINT_VAR_BODY} +inline int PIConsole::printValue(const PISystemTime & value, FormatFlags format) {PRINT_VAR_BODY} + + + +void PIConsole::startServer(const PIString & name) { + stopPeer(); + server_mode = true; + peer = new PIPeer("_rcs_:" + name); + CONNECT2(void, const PIString & , const PIByteArray &, peer, dataReceivedEvent, this, peerReceived); + CONNECT1(void, const PIString & , peer, peerDisconnectedEvent, this, peerDisconnectedEvent); + peer_timer.start(50.); + serverSendInfo(); +} + + +void PIConsole::stopPeer() { + remote_clients.clear(); + peer_timer.stop(); + if (peer != 0) delete peer; + peer = 0; + state = Disconnected; +} + + +PIStringList PIConsole::clients() const { + PIStringList sl; + if (peer == 0) return sl; + piForeachC (PIPeer::PeerInfo & i, peer->allPeers()) { + if (i.name.left(6) != "_rcc_:") continue; + sl << i.name.right(i.name.length() - 6); + } + return sl; +} + + +void PIConsole::listenServers() { + stopPeer(); + server_mode = false; + server_name.clear(); + srand(PISystemTime::current().nanoseconds); + peer = new PIPeer("_rcc_:" + PIDateTime::current().toString("hhmmssddMMyy_") + PIString::fromNumber(rand())); + CONNECT2(void, const PIString & , const PIByteArray &, peer, dataReceivedEvent, this, peerReceived); + peer_timer.start(100.); +} + + +PIStringList PIConsole::availableServers() const { + PIStringList sl; + if (peer == 0) return sl; + piForeachC (PIPeer::PeerInfo & i, peer->allPeers()) { + if (i.name.left(6) != "_rcs_:") continue; + sl << i.name.right(i.name.length() - 6); + } + return sl; +} + + +void PIConsole::connectToServer(const PIString & name) { + if (peer == 0) listenServers(); + server_name = name; +} + + +void PIConsole::disconnect() { + stopPeer(); +} + + +void PIConsole::serverSendInfo() { + if (peer == 0) return; + PIByteArray ba; + ba << int(0xAA); + peer->sendToAll(ba); +} + + +void PIConsole::serverSendData() { + if (peer == 0) return; + PIByteArray ba; + PIVector content; + piForeach (Tab & t, tabs) + piForeach (Column & c, t.columns) + piForeach (Variable & v, c.variables) + if (!v.isEmpty() && v.id > 0) { + VariableContent vc; + vc.id = v.id; + v.writeData(vc.rdata); + content << vc; + } + piForeach (RemoteClient & rc, remote_clients) { + ba.clear(); + switch (rc.state) { + case FetchingData: + ba << int(0xCC) << tabs; + //piCout << "server send const data" << rc.name << ba.size_s(); + break; + case Committing: + ba << int(0xDD); + break; + case Connected: + ba << int(0xEE) << content; + //piCout << "send data" << ba.size(); + break; + default: break; + } + if (!ba.isEmpty()) + peer->send(rc.name, ba); + } +} + + +PIConsole::RemoteClient & PIConsole::remoteClient(const PIString & fname) { + piForeach (RemoteClient & i, remote_clients) + if (i.name == fname) + return i; + remote_clients << RemoteClient(fname); + return remote_clients.back(); +} + + +void PIConsole::peerReceived(const PIString & from, const PIByteArray & data) { + int type; + PIByteArray ba(data); + ba >> type; + //piCout << "rec packet from" << from << "type" << PICoutManipulators::Hex << type; + if (server_mode) { + if (from.left(5) != "_rcc_") return; + //PIString rcn = from.right(from.length() - 6); + RemoteClient & rc(remoteClient(from)); + switch (type) { + case 0xBB: // fetch const data request + //piCout << "fetch data request from" << from << rc.state; + if (rc.state != Connected) + rc.state = FetchingData; + break; + case 0xCC: // const data commit + //piCout << "commit from" << from; + if (rc.state != Connected) + rc.state = Connected; + break; + default: break; + } + } else { + PIVector content; + PIMap vids; + if (from.left(5) != "_rcs_") return; + //PIString rcn = from.right(from.length() - 6); + switch (type) { + case 0xAA: // new server + //piCout << "new server" << rcn; + break; + case 0xCC: // const data + //piCout << "received const data"; + state = Committing; + ba >> tabs; + cur_tab = tabs.isEmpty() ? -1 : 0; + piForeach (Tab & t, tabs) + piForeach (Column & c, t.columns) + piForeach (Variable & v, c.variables) + v.remote = true; + break; + case 0xDD: // const data commit + //piCout << "received commit"; + state = Connected; + break; + case 0xEE: // dynamic data + //piCout << "received data" << ba.size_s(); + piForeach (Tab & t, tabs) + piForeach (Column & c, t.columns) + piForeach (Variable & v, c.variables) + if (!v.isEmpty() && v.id > 0) + vids[v.id] = &v; + ba >> content; + piForeach (VariableContent & vc, content) { + if (vc.id <= 0) continue; + Variable * v = vids.at(vc.id); + if (v == 0) continue; + //piCout << "read" << v->name << vc.rdata.size_s(); + v->rdata = vc.rdata; + } + break; + default: break; + } + } +} + + +void PIConsole::peerTimer(void * data, int delim) { + if (peer == 0) return; + //piCout << "timer" << delim; + if (server_mode) { + if (delim == 20) + serverSendInfo(); + else + serverSendData(); + } else { + if (delim != 1 || server_name.isEmpty()) return; + const PIPeer::PeerInfo * p = peer->getPeerByName("_rcs_:" + server_name); + if (p == 0) return; + PIByteArray ba; + switch (state) { + case Disconnected: + peer_tm.reset(); + ba << int(0xBB); + //piCout << "send to" << server_name << "fetch request disc"; + peer->send(p, ba); + state = FetchingData; + break; + case FetchingData: + if (peer_tm.elapsed_s() < 3.) + return; + peer_tm.reset(); + ba << int(0xBB); + //piCout << "send to" << server_name << "fetch request fd"; + peer->send(p, ba); + break; + case Committing: + peer_tm.reset(); + ba << int(0xCC); + //piCout << "send to" << server_name << "committing"; + state = Connected; + peer->send(p, ba); + break; + default: break; + }; + } +} + + +void PIConsole::peerDisconnectedEvent(const PIString & name) { + for (int i = 0; i < remote_clients.size_s(); ++i) + if (remote_clients[i].name == name) { + remote_clients.remove(i); + --i; + } +} diff --git a/src/system/piconsole.h b/src/system/piconsole.h new file mode 100755 index 00000000..fa9d2fbe --- /dev/null +++ b/src/system/piconsole.h @@ -0,0 +1,508 @@ +/*! \file piconsole.h + * \brief Console output class +*/ +/* + PIP - Platform Independent Primitives + Console output/input + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PICONSOLE_H +#define PICONSOLE_H + +#include "pikbdlistener.h" +#include "piprotocol.h" +#include "pidiagnostics.h" +#include "pisystemmonitor.h" +#ifndef WINDOWS +# include +# include +#else +# define COMMON_LVB_UNDERSCORE 0x8000 +#endif + +class PIPeer; + +class PIP_EXPORT PIConsole: public PIThread +{ + PIOBJECT_SUBCLASS(PIConsole, PIThread) +public: + + //! Constructs %PIConsole with key handler "slot" and if "startNow" start it + PIConsole(bool startNow = true, KBFunc slot = 0); + + ~PIConsole(); + + + //! Variables output format + enum Format { + Normal /** Default console format */ = 0x01, + Bold /** Bold text */ = 0x02, + Faint = 0x04, + Italic = 0x08, + Underline /** Underlined text */ = 0x10, + Blink /** Blinked text */ = 0x20, + Inverse /** Swap text and background colors */ = 0x40, + Black /** Black text */ = 0x100, + Red /** Red text */ = 0x200, + Green /** Green text */ = 0x400, + Yellow /** Yellow text */ = 0x800, + Blue /** Blue text */ = 0x1000, + Magenta /** Magenta text */ = 0x2000, + Cyan /** Cyan text */ = 0x4000, + White /** White text */ = 0x8000, + BackBlack /** Black background */ = 0x10000, + BackRed /** Red background */ = 0x20000, + BackGreen /** Green background */ = 0x40000, + BackYellow /** Yellow background */ = 0x80000, + BackBlue /** Blue background */ = 0x100000, + BackMagenta /** Magenta background */ = 0x200000, + BackCyan /** Cyan background */ = 0x400000, + BackWhite /** White background */ = 0x800000, + Dec /** Decimal base for integers */ = 0x1000000, + Hex /** Hexadecimal base for integers */ = 0x2000000, + Oct /** Octal base for integers */ = 0x4000000, + Bin /** Binary base for integers */ = 0x8000000, + Scientific /** Scientific representation of floats */ = 0x10000000, + SystemTimeSplit /** PISystemTime split representation (* s, * ns) */ = 0x20000000, + SystemTimeSeconds /** PISystemTime seconds representation (*.* s) */ = 0x40000000 + }; + + //! Column labels alignment + enum Alignment { + Nothing /** No alignment */ , + Left /** Labels align left and variables align left */ , + Right /** Labels align right and variables align left */ + }; + + typedef PIFlags FormatFlags; + + //! Add to current tab to column "column" string "name" with format "format" + void addString(const PIString & name, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const PIString * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const char * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const bool * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const short * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const int * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const long * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const llong * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const uchar * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const ushort * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const uint * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const ulong * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const ullong * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const float * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const double * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" variable with label "name", pointer "ptr" and format "format" + void addVariable(const PIString & name, const PISystemTime * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + void addVariable(const PIString & name, const PIProtocol * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + void addVariable(const PIString & name, const PIDiagnostics * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + void addVariable(const PIString & name, const PISystemMonitor * ptr, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" bits field with label "name", pointer "ptr" and format "format" + void addBitVariable(const PIString & name, const void * ptr, int fromBit, int bitsCount, int column = 1, FormatFlags format = PIConsole::Normal); + + //! Add to current tab to column "column" "count" empty lines + void addEmptyLine(int column = 1, uint count = 1); + + PIString getString(int x, int y); + short getShort(int x, int y) {return getString(x, y).toShort();} + int getInt(int x, int y) {return getString(x, y).toInt();} + float getFloat(int x, int y) {return getString(x, y).toFloat();} + double getDouble(int x, int y) {return getString(x, y).toDouble();} + PIString getString(const PIString & name); + short getShort(const PIString & name) {return getString(name).toShort();} + int getInt(const PIString & name) {return getString(name).toInt();} + float getFloat(const PIString & name) {return getString(name).toFloat();} + double getDouble(const PIString & name) {return getString(name).toDouble();} + + + //! Returns tabs count + uint tabsCount() const {return tabs.size();} + + //! Returns current tab name + PIString currentTab() const {return tabs[cur_tab].name;} + + //! Returns current tab index + int currentTabIndex() const {return cur_tab;} + + //! Add new tab with name "name", bind key "bind_key" and returns this tab index + int addTab(const PIString & name, char bind_key = 0); + + //! Remove tab with index "index" + void removeTab(uint index); + + //! Remove tab with name "name" + void removeTab(const PIString & name); + + //! Clear content of tab with index "index" + void clearTab(uint index); + + //! Clear content of tab with name "name" + void clearTab(const PIString & name); + + //! Set current tab to tab with index "index", returns if tab exists + bool setTab(uint index); + + //! Set current tab to tab with name "name", returns if tab exists + bool setTab(const PIString & name); + + //! Set tab with index "index" bind key to "bind_key", returns if tab exists + bool setTabBindKey(uint index, char bind_key); + + //! Set tab with name "name" bind key to "bind_key", returns if tab exists + bool setTabBindKey(const PIString & name, char bind_key); + + //! Remove all tabs and if "clearScreen" clear the screen + void clearTabs(bool clearScreen = true) {if (clearScreen && isRunning()) {toUpperLeft(); clearScreenLower();} tabs.clear();} + + + //! Set custom status text of current tab to "str" + void addCustomStatus(const PIString & str) {tabs[cur_tab].status = str;} + + //! Clear custom status text of current tab + void clearCustomStatus() {tabs[cur_tab].status.clear();} + + //! Returns default alignment + Alignment defaultAlignment() const {return def_align;} + + //! Set default alignment to "align" + void setDefaultAlignment(Alignment align) {def_align = align;} + + //! Set column "col" alignment to "align" + void setColumnAlignment(int col, Alignment align) {if (col < 0 || col >= columns().size_s()) return; column(col).alignment = align;} + + //! Set all columns of all tabs alignment to "align" + void setColumnAlignmentToAll(Alignment align) {piForeach (Tab & i, tabs) piForeach (Column & j, i.columns) j.alignment = align; fillLabels();} + + + //! Directly call function from \a PIKbdListener + void enableExitCapture(char key = 'Q') {listener->enableExitCapture(key);} + + //! Directly call function from \a PIKbdListener + void disableExitCapture() {listener->disableExitCapture();} + + //! Directly call function from \a PIKbdListener + bool exitCaptured() const {return listener->exitCaptured();} + + //! Directly call function from \a PIKbdListener + char exitKey() const {return listener->exitKey();} + + + int windowWidth() const {return width;} + int windowHeight() const {return height;} + + PIString fstr(FormatFlags f); + void update(); + void pause(bool yes) {pause_ = yes;} + + // Server functions + void startServer(const PIString & name); + void stopPeer(); + bool isServerStarted() const {return peer != 0;} + PIStringList clients() const; + + // Client functions + void listenServers(); + PIStringList availableServers() const; + PIString selectedServer() const {return server_name;} + void connectToServer(const PIString & name); + void disconnect(); + bool isConnected() const {return state == Connected;} + +#ifdef WINDOWS + void toUpperLeft() {SetConsoleCursorPosition(hOut, ulcoord);} + void moveRight(int n = 1) {SetConsoleCursorPosition(hOut, getWinCoord(n));} + void moveLeft(int n = 1) {SetConsoleCursorPosition(hOut, getWinCoord(-n));} + void moveTo(int x = 0, int y = 0) {ccoord.X = x; ccoord.Y = ulcoord.Y + y; SetConsoleCursorPosition(hOut, ccoord);} + void clearScreen() {couts(fstr(Normal)); toUpperLeft(); FillConsoleOutputAttribute(hOut, dattr, width * (height + 1), ulcoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width * (height + 1), ulcoord, &written);} + void clearScreenLower() {couts(fstr(Normal)); getWinCurCoord(); FillConsoleOutputAttribute(hOut, dattr, width * height - width * ccoord.Y + ccoord.X, ccoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width * height - width * ccoord.Y + ccoord.X, ccoord, &written);} + void clearLine() {getWinCurCoord(); FillConsoleOutputAttribute(hOut, dattr, width - ccoord.X, ccoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width - ccoord.X, ccoord, &written);} + void newLine() {getWinCurCoord(); ccoord.X = 0; ccoord.Y++; SetConsoleCursorPosition(hOut, ccoord);} + void hideCursor() {curinfo.bVisible = false; SetConsoleCursorInfo(hOut, &curinfo);} + void showCursor() {curinfo.bVisible = true; SetConsoleCursorInfo(hOut, &curinfo);} +#else + void toUpperLeft() {printf("\e[H");} + void moveRight(int n = 1) {if (n > 0) printf("\e[%dC", n);} + void moveLeft(int n = 1) {if (n > 0) printf("\e[%dD", n);} + void moveTo(int x = 0, int y = 0) {printf("\e[%d;%dH", y, x);} + void clearScreen() {couts(fstr(Normal)); printf("\e[H\e[J");} + void clearScreenLower() {couts(fstr(Normal)); printf("\e[J");} + void clearLine() {printf("\e[K");} + void newLine() {printf("\eE");} + void hideCursor() {printf("\e[?25l");} + void showCursor() {printf("\e[?25h");} +#endif + + EVENT_HANDLER0(void, clearVariables) {clearVariables(true);} + EVENT_HANDLER1(void, clearVariables, bool, clearScreen); + + EVENT_HANDLER0(void, waitForFinish) {WAIT_FOR_EXIT} + EVENT_HANDLER0(void, start) {start(false);} + EVENT_HANDLER1(void, start, bool, wait) {PIThread::start(40); if (wait) waitForFinish();} + EVENT_HANDLER0(void, stop) {stop(false);} + EVENT_HANDLER1(void, stop, bool, clear); + + EVENT2(keyPressed, char, key, void * , data) + +//! \handlers +//! \{ + + //! \fn void waitForFinish() + //! \brief block until finished (exit key will be pressed) + + //! \fn void clearVariables(bool clearScreen = true) + //! \brief Remove all columns at current tab and if "clearScreen" clear the screen + + //! \fn void start(bool wait = false) + //! \brief Start console output and if "wait" block until finished (exit key will be pressed) + + //! \fn void stop(bool clear = false) + //! \brief Stop console output and if "clear" clear the screen + +//! \} +//! \events +//! \{ + + //! \fn void keyPressed(char key, void * data) + //! \brief Raise on key "key" pressed, "data" is pointer to %PIConsole object + +//! \} + +private: +#ifdef WINDOWS + void getWinCurCoord() {GetConsoleScreenBufferInfo(hOut, &csbi); ccoord = csbi.dwCursorPosition;} + COORD & getWinCoord(int dx = 0, int dy = 0) {getWinCurCoord(); ccoord.X += dx; ccoord.Y += dy; return ccoord;} +#endif + + void begin(); + void run(); + void fillLabels(); + void status(); + void checkColumn(uint col) {while (columns().size() < col) columns().push_back(Column(def_align));} + int bitsValue(const void * src, int offset, int count) const; + const char * toBin(const void * d, int s); + inline void printLine(const PIString & str, int dx = 0, FormatFlags format = PIConsole::Normal); + inline int printValue(const PIString & str, FormatFlags format = PIConsole::Normal); + inline int printValue(const char * str, FormatFlags format = PIConsole::Normal); + inline int printValue(const bool value, FormatFlags format = PIConsole::Normal); + inline int printValue(const int value, FormatFlags format = PIConsole::Normal); + inline int printValue(const long value, FormatFlags format = PIConsole::Normal); + inline int printValue(const llong value, FormatFlags format = PIConsole::Normal); + inline int printValue(const float value, FormatFlags format = PIConsole::Normal); + inline int printValue(const double value, FormatFlags format = PIConsole::Normal); + inline int printValue(const char value, FormatFlags format = PIConsole::Normal); + inline int printValue(const short value, FormatFlags format = PIConsole::Normal); + inline int printValue(const uchar value, FormatFlags format = PIConsole::Normal); + inline int printValue(const ushort value, FormatFlags format = PIConsole::Normal); + inline int printValue(const uint value, FormatFlags format = PIConsole::Normal); + inline int printValue(const ulong value, FormatFlags format = PIConsole::Normal); + inline int printValue(const ullong value, FormatFlags format = PIConsole::Normal); + inline int printValue(const PISystemTime & value, FormatFlags format = PIConsole::Normal); + static void key_event(char key, void * t); + + struct Variable { + Variable() {nx = ny = type = offset = bitFrom = bitCount = size = 0; format = Normal; remote = false; ptr = 0; id = 1;} + bool isEmpty() const {return (remote ? false : ptr == 0);} + const void * data() {return (remote ? rdata.data() : ptr);} + void writeData(PIByteArray & ba) { + if (remote) ba << rdata; + else { + if (type == 0) ba << (*(PIString * )ptr); + else ba << PIByteArray::RawData(ptr, size); + } + } + PIString name; + FormatFlags format; + int nx; + int ny; + int type; + int offset; + int bitFrom; + int bitCount; + int size; + int id; + bool remote; + const void * ptr; + PIByteArray rdata; + void operator =(const Variable & src) {remote = src.remote; name = src.name; format = src.format; type = src.type; offset = src.offset; size = src.size; + bitFrom = src.bitFrom; bitCount = src.bitCount; ptr = src.ptr; nx = src.nx; ny = src.ny; rdata = src.rdata; id = src.id;} + }; + + struct VariableContent { + int id; + PIByteArray rdata; + }; + + struct Column { + Column(Alignment align = PIConsole::Right) {variables.reserve(32); alignment = align;} + PIVector variables; + Alignment alignment; + uint size() const {return variables.size();} + Variable & operator [](int index) {return variables[index];} + const Variable & operator [](int index) const {return variables[index];} + void push_back(const Variable & v) {variables.push_back(v);} + void operator =(const Column & src) {variables = src.variables; alignment = src.alignment;} + }; + + struct Tab { + Tab(PIString n = "", char k = 0) {columns.reserve(8); name = n; key = k;} + PIVector columns; + PIString name; + PIString status; + char key; + }; + + enum ConnectedState {Disconnected, FetchingData, Committing, Connected}; + + friend PIByteArray & operator <<(PIByteArray & ba, const PIConsole::VariableContent & v); + friend PIByteArray & operator >>(PIByteArray & ba, PIConsole::VariableContent & v); + + friend PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Variable & v); + friend PIByteArray & operator >>(PIByteArray & ba, PIConsole::Variable & v); + + friend PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Column & v); + friend PIByteArray & operator >>(PIByteArray & ba, PIConsole::Column & v); + + friend PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Tab & v); + friend PIByteArray & operator >>(PIByteArray & ba, PIConsole::Tab & v); + + PIVector & columns() {return tabs[cur_tab].columns;} + Column & column(int index) {return tabs[cur_tab].columns[index - 1];} + inline int couts(const PIString & v) {return printf("%s", v.data());} + inline int couts(const char * v) {return printf("%s", v);} + inline int couts(const bool v); + inline int couts(const char v); + inline int couts(const short v); + inline int couts(const int v); + inline int couts(const long v); + inline int couts(const llong v); + inline int couts(const uchar v); + inline int couts(const ushort v); + inline int couts(const uint v); + inline int couts(const ulong v); + inline int couts(const ullong v); + inline int couts(const float v); + inline int couts(const double v); + inline int couts(const PISystemTime & v); + + struct RemoteClient; + + void serverSendInfo(); + void serverSendData(); + RemoteClient & remoteClient(const PIString & fname); + EVENT_HANDLER2(void, peerReceived, const PIString &, from, const PIByteArray &, data); + EVENT_HANDLER2(void, peerTimer, void * , data, int, delim); + EVENT_HANDLER1(void, peerDisconnectedEvent, const PIString &, name); + +#ifdef WINDOWS + void * hOut; + CONSOLE_SCREEN_BUFFER_INFO sbi, csbi; + CONSOLE_CURSOR_INFO curinfo; + COORD ccoord, ulcoord; + WORD dattr; + DWORD smode, written; +#else + struct termios sterm, vterm; +#endif + PIVector tabs; + PIString binstr, rstr; + PIByteArray rba; + Variable tv; + PIKbdListener * listener; + Alignment def_align; + KBFunc ret_func; + int width, height, pwidth, pheight, ret, col_wid, num_format, systime_format; + uint max_y; + int vid; + uint cur_tab, col_cnt; + + PIPeer * peer; + PITimer peer_timer; + PITimeMeasurer peer_tm; + PIString server_name; + bool server_mode, pause_; + ConnectedState state; + + /*struct RemoteData { + RemoteData() {msg_count = msg_rec = msg_send = 0;} + void clear() {msg_count = msg_rec = msg_send = 0; data.clear();} + bool isEmpty() const {return msg_count == 0;} + bool isReadyRec() const {return msg_count == msg_rec;} + bool isReadySend() const {return msg_count == msg_send;} + void setData(const PIByteArray & ba) {data = ba; msg_rec = msg_send = 0; msg_count = (data.size_s() - 1) / 4096 + 1;} + PIByteArray data; + int msg_count; + int msg_rec; + int msg_send; + };*/ + + struct RemoteClient { + RemoteClient(const PIString & n = "") {name = n; state = Disconnected;} + PIString name; + ConnectedState state; + }; + + PIVector remote_clients; + +}; + +inline PIByteArray & operator <<(PIByteArray & ba, const PIConsole::VariableContent & v) {ba << v.id << v.rdata; return ba;} +inline PIByteArray & operator >>(PIByteArray & ba, PIConsole::VariableContent & v) {ba >> v.id; ba >> v.rdata; return ba;} + +inline PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Variable & v) {ba << v.name << v.id << (int)v.format << v.type << v.size << v.bitFrom << v.bitCount; return ba;} +inline PIByteArray & operator >>(PIByteArray & ba, PIConsole::Variable & v) {ba >> v.name >> v.id >> (int & )v.format >> v.type >> v.size >> v.bitFrom >> v.bitCount; return ba;} + +inline PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Column & v) {ba << (int)v.alignment << v.variables; return ba;} +inline PIByteArray & operator >>(PIByteArray & ba, PIConsole::Column & v) {ba >> (int & )v.alignment >> v.variables; return ba;} + +inline PIByteArray & operator <<(PIByteArray & ba, const PIConsole::Tab & v) {ba << v.name << v.status << (uchar)v.key << v.columns; return ba;} +inline PIByteArray & operator >>(PIByteArray & ba, PIConsole::Tab & v) {ba >> v.name >> v.status >> (uchar&)v.key >> v.columns; return ba;} + +#endif // PICONSOLE_H diff --git a/src/system/pikbdlistener.cpp b/src/system/pikbdlistener.cpp new file mode 100755 index 00000000..1f7d674b --- /dev/null +++ b/src/system/pikbdlistener.cpp @@ -0,0 +1,176 @@ +/* + PIP - Platform Independent Primitives + Keyboard grabber for console + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pikbdlistener.h" + + +/** \class PIKbdListener + * \brief Keyboard console input listener + * \details This class provide listening of console keyboard input. + * There is two ways to receive pressed key: + * * external static function with format "void func(char key, void * data_)" + * * event \a keyPressed() + * + * Also there is static variable \a exiting which by default is set to + * \b false. If \a enableExitCapture() was called and listener was started + * with function \a start(), this variable will be set to \b true if exit + * key will be pressed. By default exit key is 'Q' = shift + 'q'. + * To wait for this variable changes to \b true there is WAIT_FOR_EXIT macro + * \snippet pikbdlistener.cpp main + * */ + + +bool PIKbdListener::exiting; + +PIKbdListener::PIKbdListener(KBFunc slot, void * _data): PIThread() { + setName("keyboard_listener"); +#ifdef WINDOWS + hIn = GetStdHandle(STD_INPUT_HANDLE); + GetConsoleMode(hIn, &smode); +#else + struct termios term; + tcgetattr(0, &term); + sterm = term; +#endif + is_active = true; + ret_func = slot; + data_ = _data; + PIKbdListener::exiting = exit_enabled = false; + start(); +} + + +void PIKbdListener::begin() { +#ifdef WINDOWS + GetConsoleMode(hIn, &tmode); + SetConsoleMode(hIn, ENABLE_PROCESSED_INPUT); +#else + struct termios term; + tcgetattr(0, &term); + term.c_lflag &= ~(ECHO | ICANON) | NOFLSH; + tterm = term; + tcsetattr(0, TCSANOW, &term); +#endif +} + + +void PIKbdListener::run() { + rc = 0; + char lc = 0; +#ifdef WINDOWS + INPUT_RECORD ir; + ReadConsoleInput(hIn, &ir, 1, &ret); + if (ir.EventType == KEY_EVENT) { + KEY_EVENT_RECORD ker = ir.Event.KeyEvent; + if (ker.bKeyDown) { + bool ctrl = ((ker.dwControlKeyState & LEFT_CTRL_PRESSED) || (ker.dwControlKeyState & RIGHT_CTRL_PRESSED)); + bool shift = (ker.dwControlKeyState & SHIFT_PRESSED); + if (ker.dwControlKeyState & CAPSLOCK_ON) shift = !shift; + //cout << "key " << int(ker.wVirtualKeyCode) << endl; + switch (ker.wVirtualKeyCode) { + case 37: ret = 1; lc = (ctrl ? CtrlLeftArrow : LeftArrow); break; + case 38: ret = 1; lc = (ctrl ? CtrlUpArrow : UpArrow); break; + case 39: ret = 1; lc = (ctrl ? CtrlRightArrow : RightArrow); break; + case 40: ret = 1; lc = (ctrl ? CtrlDownArrow : DownArrow); break; + default: ret = 1; lc = (shift ? char(toupper(ker.uChar.AsciiChar)) : ker.uChar.AsciiChar); break; + } + if (lc == 0) {piMSleep(10); return;} + } else {piMSleep(10); return;} + } else {piMSleep(10); return;} + /*if (lc == 0) { + ReadConsole(hIn, &rc, 1, &ret, 0); + //cout << "read console" << endl; + lc = char(rc); + }*/ + /*if (ret < 0 || ret > 3) return; + lc = char(((uchar * )&rc)[ret - 1]); + for (int i = 0; i < ret; ++i) + cout << std::hex << int(((uchar * )&rc)[i]) << ' '; + cout << endl << std::hex << rc << endl;*/ +#else + tcsetattr(0, TCSANOW, &tterm); + ret = read(0, &rc, 4); + if (rc == 0) {piMSleep(10); return;} + if (ret < 0 || ret > 3) {piMSleep(10); return;} + lc = char(((uchar * )&rc)[ret - 1]); + /*for (int i = 0; i < ret; ++i) + cout << std::hex << int(((uchar * )&rc)[i]) << ' '; + cout << endl << std::hex << rc << endl;*/ + if (((char * )&rc)[0] == '\e' && ret == 3) { + if (((char * )&rc)[1] == '[') { + switch (((char * )&rc)[2]) { + case 'A': lc = UpArrow; break; // up + case 'B': lc = DownArrow; break; // down + case 'C': lc = RightArrow; break; // right + case 'D': lc = LeftArrow; break; // left + case 'H': lc = Home; break; + case 'F': lc = End; break; + } + } + } + if (((char * )&rc)[0] == '5' && ret == 2) { + switch (((char * )&rc)[1]) { + case 'A': lc = CtrlUpArrow; break; // up + case 'B': lc = CtrlDownArrow; break; // down + case 'C': lc = CtrlRightArrow; break; // right + case 'D': lc = CtrlLeftArrow; break; // left + case 'H': lc = CtrlHome; break; + case 'F': lc = CtrlEnd; break; + } + } +#endif + if ((((char * )&rc)[0] == '\n' || ((char * )&rc)[0] == '\r') && ret == 1) + lc = Return; + if (exit_enabled && ret == 1 && lc == exit_key) { + PIKbdListener::exiting = true; + return; + } + if (ret > 0) { + keyPressed(lc, data_); + if (ret_func != 0) ret_func(lc, data_); + } +} + + +void PIKbdListener::end() { + //cout << "list end" << endl; +#ifdef WINDOWS + SetConsoleMode(hIn, smode); +#else + tcsetattr(0, TCSANOW, &sterm); +#endif +} + + +void PIKbdListener::setActive(bool yes) { + is_active = yes; + if (is_active) { +#ifdef WINDOWS + SetConsoleMode(hIn, tmode); +#else + tcsetattr(0, TCSANOW, &tterm); +#endif + } else { +#ifdef WINDOWS + SetConsoleMode(hIn, smode); +#else + tcsetattr(0, TCSANOW, &sterm); +#endif + } +} diff --git a/src/system/pikbdlistener.h b/src/system/pikbdlistener.h new file mode 100755 index 00000000..a6b908e3 --- /dev/null +++ b/src/system/pikbdlistener.h @@ -0,0 +1,139 @@ +/*! \file pikbdlistener.h + * \brief Keyboard console input listener +*/ +/* + PIP - Platform Independent Primitives + Keyboard grabber for console + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIKBDLISTENER_H +#define PIKBDLISTENER_H + +#include "pithread.h" +#ifndef WINDOWS +# include +#endif + +#define WAIT_FOR_EXIT while (!PIKbdListener::exiting) msleep(5); + +typedef void (*KBFunc)(char, void * ); + +class PIP_EXPORT PIKbdListener: public PIThread +{ + PIOBJECT(PIKbdListener) + PIOBJECT_PARENT(PIThread) + friend class PIConsole; +public: + + //! Special keyboard keys + enum SpecialSymbol { + UpArrow /** Up arrow key */ = -1, + DownArrow /** Down arrow key */ = -2, + RightArrow /** Right arrow key */ = -3, + LeftArrow /** Left arrow key */ = -4, + Home /** Home key */ = -9, + End /** End key */ = -10, + CtrlUpArrow /** Ctrl + Up arrow key */ = -5, + CtrlDownArrow /** Ctrl + Down arrow key */ = -6, + CtrlRightArrow /** Ctrl + Right arrow key */ = -7, + CtrlLeftArrow /** Ctrl + Left arrow key */ = -8, + CtrlHome /** Ctrl + Home key */ = -11, + CtrlEnd /** Ctrl + End key */ = -12, + Return /** Enter key */ = 0x0a, + Esc /** Escape key */ = 0x1b, + Space /** Space key */ = 0x20, + Backspace /** Backspace key */ = 0x7f + }; + + //! Constructs keyboard listener with external function "slot" and custom data "data" + PIKbdListener(KBFunc slot = 0, void * data = 0); + + ~PIKbdListener() {terminate(); end();} + + + //! Returns custom data + void * data() {return data_;} + + //! Set custom data to "_data" + void setData(void * _data) {data_ = _data;} + + //! Set external function to "slot" + void setSlot(KBFunc slot) {ret_func = slot;} + + //! Returns if exit key if awaiting + bool exitCaptured() const {return exit_enabled;} + + //! Returns exit key, default 'Q' + char exitKey() const {return exit_key;} + + + //! Returns if keyboard listening is active (not running!) + bool isActive() {return is_active;} + + EVENT_HANDLER( void, enableExitCapture) {enableExitCapture('Q');} + EVENT_HANDLER1(void, enableExitCapture, char, key) {exit_enabled = true; exit_key = key;} + EVENT_HANDLER(void, disableExitCapture) {exit_enabled = false;} + EVENT_HANDLER(void, setActive) {setActive(true);} + EVENT_HANDLER1(void, setActive, bool, yes); + + EVENT2(keyPressed, char, key, void * , data) + +//! \handlers +//! \{ + + //! \fn void enableExitCapture(char key = 'Q') + //! \brief Enable exit key "key" awaiting + + //! \fn void disableExitCapture() + //! \brief Disable exit key awaiting + + //! \fn void setActive(bool yes = true) + //! \brief Set keyboard listening is active or not + +//! \} +//! \events +//! \{ + + //! \fn void keyPressed(char key, void * data) + //! \brief Raise on key "key" pressed, "data" is custom data + +//! \} + + static bool exiting; + +private: + void begin(); + void run(); + void end(); + + KBFunc ret_func; + char exit_key; + bool exit_enabled, is_active; + void * data_; +#ifdef WINDOWS + DWORD ret, rc; + void * hIn; + DWORD smode, tmode; +#else + int rc; + int ret; + struct termios sterm, tterm; +#endif + +}; + +#endif // PIKBDLISTENER_H diff --git a/src/system/pimonitor.cpp b/src/system/pimonitor.cpp new file mode 100755 index 00000000..73ea3f1a --- /dev/null +++ b/src/system/pimonitor.cpp @@ -0,0 +1,26 @@ +/* + PIP - Platform Independent Primitives + Counter of some PIP types + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pimonitor.h" + +PIMonitor piMonitor; + +PIMonitor::PIMonitor() { + containers = strings = threads = timers = serials = ethernets = files = objects = 0; +} diff --git a/src/system/pimonitor.h b/src/system/pimonitor.h new file mode 100755 index 00000000..288e9634 --- /dev/null +++ b/src/system/pimonitor.h @@ -0,0 +1,39 @@ +/* + PIP - Platform Independent Primitives + Counter of some PIP types + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMONITOR_H +#define PIMONITOR_H + +#include "pip_export.h" + +#if defined(DOXYGEN) || defined(__GNUC__) +# undef PIP_EXPORT +# define PIP_EXPORT +#endif + +class PIP_EXPORT PIMonitor +{ +public: + PIMonitor(); + + int containers, strings, threads, timers, serials, ethernets, files, objects; + +}; + +#endif // PIMONITOR_H diff --git a/src/system/piprocess.cpp b/src/system/piprocess.cpp new file mode 100755 index 00000000..3f237575 --- /dev/null +++ b/src/system/piprocess.cpp @@ -0,0 +1,199 @@ +/* + PIP - Platform Independent Primitives + Process + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piprocess.h" + + +PIProcess::PIProcess(): PIThread() { + exit_code = -1; +#ifdef WINDOWS + pi.dwProcessId = 0; +#else + pid = 0; +#endif + is_exec = false; + g_in = g_out = g_err = false; + t_in = t_out = t_err = false; + env = PIProcess::currentEnvironment(); +} + + +PIProcess::~PIProcess() { + if (t_in) f_in.remove(); + if (t_out) f_out.remove(); + if (t_err) f_err.remove(); +} + + +void PIProcess::exec_() { + is_exec = false; + startOnce(); + //cout << "exec wait" << endl; + while (!is_exec) + msleep(1); + //cout << "exec end" << endl; +} + + +void PIProcess::run() { + //cout << "run" << endl; + string str; + /// arguments convertion + as = 0; +#ifdef WINDOWS + //args.pop_front(); + piForeachC (PIString & i, args) + as += i.lengthAscii() + 1; + char * a = new char[as]; + memset(a, ' ', as - 1); + as = 0; + for (int i = 0; i < args.size_s(); ++i) { + str = args[i].stdString(); + memcpy(&a[as], str.c_str(), str.size()); + as += str.length() + 1; + } + a[as - 1] = 0; +#else + char * a[args.size_s() + 1]; + for (int i = 0; i < args.size_s(); ++i) { + str = args[i].stdString(); + a[i] = new char[str.size() + 1]; + memcpy(a[i], str.c_str(), str.size()); + a[i][str.size()] = 0; + //cout << a[i] << endl; + } + a[args.size_s()] = 0; +#endif + /// environment convertion + char ** e = new char*[env.size_s() + 1]; + for (int i = 0; i < env.size_s(); ++i) { + str = env[i].stdString(); + e[i] = new char[str.size() + 1]; + memcpy(e[i], str.c_str(), str.size()); + e[i][str.size()] = 0; + //cout << e[i] << endl; + } + e[env.size_s()] = 0; + /// files for stdin/out/err + t_in = t_out = t_err = false; + if (f_in.path().isEmpty()) { + f_in = PIFile::openTemporary(PIIODevice::ReadWrite); + t_in = true; + } + //f_in.open(PIIODevice::ReadWrite); f_in.close(); + if (f_out.path().isEmpty()) { + f_out = PIFile::openTemporary(PIIODevice::ReadWrite); + t_out = true; + } + //f_out.open(PIIODevice::WriteOnly); f_out.close(); + if (f_err.path().isEmpty()) { + f_err = PIFile::openTemporary(PIIODevice::ReadWrite); + t_err = true; + } + //f_err.open(PIIODevice::WriteOnly); f_err.close(); + + str = args.front().stdString(); + is_exec = true; + execStarted(PIString(str)); +#ifndef WINDOWS + pid = fork(); + if (pid == 0) { +#endif + tf_in = tf_out = tf_err = 0; + //cout << "exec " << tf_in << ", " << tf_out << ", " << tf_err << endl; + //cout << f_out.path() << endl; + if (g_in) tf_in = freopen(f_in.path().data(), "r", stdin); + if (g_out) tf_out = freopen(f_out.path().data(), "w", stdout); + if (g_err) tf_err = freopen(f_err.path().data(), "w", stderr); +#ifndef WINDOWS + if (!wd.isEmpty()) as = chdir(wd.data()); +#endif +#ifdef WINDOWS + GetStartupInfoA(&si); + memset(&pi, 0, sizeof(pi)); + if(CreateProcessA(0, // No module name (use command line) + a, // Command line + 0, // Process handle not inheritable + 0, // Thread handle not inheritable + false, // Set handle inheritance to FALSE + 0, // No creation flags + 0,//e, // Use environment + wd.isEmpty() ? 0 : wd.data(), // Use working directory + &si, // Pointer to STARTUPINFO structure + &pi)) // Pointer to PROCESS_INFORMATION structure + { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + } else + piCoutObj << "\"CreateProcess\" error, " << errorString(); +#else + + //cout << "exec " << tf_in << ", " << tf_out << ", " << tf_err << endl; + if (execve(str.c_str(), a, e) < 0) + piCoutObj << "\"execve\" error, " << errorString(); + } else { + msleep(1); + //cout << "wait" << endl; + wait(&exit_code); + /*if (tf_in != 0) fclose(tf_in); + if (tf_out != 0) fclose(tf_out); + if (tf_err != 0) fclose(tf_err);*/ + pid = 0; + //cout << "wait done" << endl; + } +#endif + execFinished(PIString(str), exit_code); + is_exec = false; + for (int i = 0; i < env.size_s(); ++i) + delete e[i]; + delete e; +#ifdef WINDOWS + delete a; +#else + for (int i = 0; i < args.size_s(); ++i) + delete a[i]; +#endif + //cout << "end " << tf_in << ", " << tf_out << ", " << tf_err << endl; +} + + +void PIProcess::removeEnvironmentVariable(const PIString & variable) { + PIString s; + for (int i = 0; i < env.size_s(); ++i) { + s = env[i]; + if (s.left(s.find("=")).trimmed() == variable) { + env.remove(i); + --i; + } + } +} + + +void PIProcess::setEnvironmentVariable(const PIString & variable, const PIString & value) { + PIString s, v; + for (int i = 0; i < env.size_s(); ++i) { + s = env[i]; + v = s.left(s.find("=")).trimmed(); + if (v == variable) { + env[i] = v + "=" + value; + return; + } + } + env << variable + "=" + value; +} diff --git a/src/system/piprocess.h b/src/system/piprocess.h new file mode 100755 index 00000000..4feed9b0 --- /dev/null +++ b/src/system/piprocess.h @@ -0,0 +1,130 @@ +/*! \file piprocess.h + * \brief Process +*/ +/* + PIP - Platform Independent Primitives + Process + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIPROCESS_H +#define PIPROCESS_H + +#include "pithread.h" +#include "pifile.h" +#ifdef WINDOWS +//# include <.h> +#else +# include +#endif + +/// events: +/// execStarted(PIString program) +/// execFinished(PIString program, int exit_code) +/// +/// handlers: +/// bool exec(const PIString & program) +/// bool exec(const PIString & program, const PIString & arg1) +/// bool exec(const PIString & program, const PIString & arg1, const PIString & arg2) +/// bool exec(const PIString & program, const PIString & arg1, const PIString & arg2, const PIString & arg3) +/// bool exec(const PIString & program, const PIStringList & args) +/// void terminate() +/// bool waitForFinish(int timeout_msecs = 60000) +class PIP_EXPORT PIProcess: private PIThread +{ + PIOBJECT_SUBCLASS(PIProcess, PIThread) +public: + PIProcess(); + virtual ~PIProcess(); + + int exitCode() const {return exit_code;} + int pID() const { +#ifdef WINDOWS + return pi.dwProcessId; +#else + return pid; +#endif + } + + void setGrabInput(bool yes) {g_in = yes;} + void setGrabOutput(bool yes) {g_out = yes;} + void setGrabError(bool yes) {g_err = yes;} + void setInputFile(const PIString & path) {f_in.setPath(path);} + void setOutputFile(const PIString & path) {f_out.setPath(path);} + void setErrorFile(const PIString & path) {f_err.setPath(path);} + void unsetInputFile() {f_in.setPath("");} + void unsetOutputFile() {f_out.setPath("");} + void unsetErrorFile() {f_err.setPath("");} + PIString workingDirectory() const {return wd;} + void setWorkingDirectory(const PIString & path) {wd = path;} + void resetWorkingDirectory() {wd.clear();} + PIByteArray readOutput() {f_out.open(PIIODevice::ReadOnly); return f_out.readAll();} + PIByteArray readError() {f_err.open(PIIODevice::ReadOnly); return f_err.readAll();} + + PIStringList environment() {return env;} + void clearEnvironment() {env.clear();} + void removeEnvironmentVariable(const PIString & variable); + void setEnvironmentVariable(const PIString & variable, const PIString & value); + + EVENT_HANDLER1(void, exec, const PIString & , program) {args.clear(); args << program; exec_();} + EVENT_HANDLER2(void, exec, const PIString & , program, const PIString & , arg) {args.clear(); args << program << arg; exec_();} + EVENT_HANDLER3(void, exec, const PIString & , program, const PIString & , arg1, const PIString & , arg2) {args.clear(); args << program << arg1 << arg2; exec_();} + EVENT_HANDLER4(void, exec, const PIString & , program, const PIString & , arg1, const PIString & , arg2, const PIString & , arg3) {args.clear(); args << program << arg1 << arg2 << arg3; exec_();} + EVENT_HANDLER2(void, exec, const PIString & , program, const PIStringList & , args_) {args << program << args_; exec_();} + EVENT_HANDLER(void, terminate) { +#ifdef WINDOWS + if (is_exec) if (!TerminateProcess(pi.hProcess, 0)) return; pi.dwProcessId = 0; +#else + if (is_exec) kill(pid, SIGKILL); pid = 0; +#endif + } + EVENT_HANDLER(bool, waitForFinish) {return waitForFinish(60000);} + EVENT_HANDLER1(bool, waitForFinish, int, timeout_msecs) {return PIThread::waitForFinish(timeout_msecs);} + + EVENT1(execStarted, PIString, program) + EVENT2(execFinished, PIString, program, int, exit_code) + + static PIStringList currentEnvironment() {PIStringList l; int i = 0; while (environ[i] != 0) {l << environ[i]; ++i;} return l;} + static int currentPID() { +#ifdef WINDOWS + return GetCurrentProcessId(); +#else + return getpid(); +#endif + } + +private: + virtual void run(); + void exec_(); + + PIStringList args, env; + PIString wd; + PIByteArray out; + PIFile f_in, f_out, f_err; + bool g_in, g_out, g_err, t_in, t_out, t_err; +#ifdef WINDOWS + STARTUPINFOA si; + PROCESS_INFORMATION pi; +#else + pid_t pid; +#endif + FILE * tf_in, * tf_out, * tf_err; + int exit_code, sz, as; + bool is_exec; + +}; + +#endif // PIPROCESS_H diff --git a/src/system/piscreen.cpp b/src/system/piscreen.cpp new file mode 100644 index 00000000..e8ede7ea --- /dev/null +++ b/src/system/piscreen.cpp @@ -0,0 +1,208 @@ +/* + PIP - Platform Independent Primitives + Console output/input + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "piscreen.h" + + +/** \class PIScreen + * \brief Console output class + * \details + * \section PIScreen_sec0 Synopsis + * This class provides output to console with automatic alignment and update. + * It supports tabs, keyboard listening, formats and colors. + * + * \section PIScreen_sec1 Layout + * %PIScreen works with variable pointers. You should add your variables with + * functions \a addVariable() which receives label name, pointer to variable + * and optional column and format. Columns count is dynamically increased if + * new column used. E.g. if you add variable to empty tab to column 3, columns + * count will be increased to 3, but two firsts columns will be empty. Each column + * filled from top to bottom, but you can add just string with function + * \a addString() or add empty line with function \a addEmptyLine(). Layout scheme: + * \image html piconsole_layout.png + * + * \section PIScreen_sec2 Keyboard usage + * %PIScreen should to be single in application. %PIScreen aggregate PIKbdListener + * which grab keyboard and automatic switch tabs by theirs bind keys. If there is no + * tab binded to pressed key external function "slot" will be called + * + **/ + + +extern PIMutex __PICout_mutex__; + + +PIScreen::SystemConsole::SystemConsole() { + width = height = pwidth = pheight = 0; + int w, h; +#ifdef WINDOWS + ulcoord.X = 0; + hOut = GetStdHandle(STD_OUTPUT_HANDLE); + GetConsoleScreenBufferInfo(hOut, &sbi); + dattr = sbi.wAttributes; + w = sbi.srWindow.Right - sbi.srWindow.Left; + h = sbi.srWindow.Bottom - sbi.srWindow.Top; + ulcoord.Y = sbi.srWindow.Top; + GetConsoleMode(hOut, &smode); + GetConsoleCursorInfo(hOut, &curinfo); +#else + winsize ws; + ioctl(0, TIOCGWINSZ, &ws); + w = ws.ws_col; + h = ws.ws_row; +#endif + resize(w, h); +} + + +PIScreen::SystemConsole::~SystemConsole() { +#ifdef WINDOWS + SetConsoleMode(hOut, smode); + SetConsoleTextAttribute(hOut, dattr); +#endif +} + + +void PIScreen::SystemConsole::begin() { +#ifdef WINDOWS + SetConsoleMode(hOut, ENABLE_WRAP_AT_EOL_OUTPUT); + GetConsoleScreenBufferInfo(hOut, &sbi); + bc.X = 0; + bc.Y = 0; +#endif + clearScreen(); + hideCursor(); +} + + +void PIScreen::SystemConsole::end() { + showCursor(); +} + + +void PIScreen::SystemConsole::prepare() { + int w, h; +#ifdef WINDOWS + GetConsoleScreenBufferInfo(hOut, &sbi); + w = sbi.srWindow.Right - sbi.srWindow.Left + 1; + h = sbi.srWindow.Bottom - sbi.srWindow.Top + 1; +#else + winsize ws; + ioctl(0, TIOCGWINSZ, &ws); + w = ws.ws_col; + h = ws.ws_row; +#endif + resize(w, h); +} + + +void PIScreen::SystemConsole::resize(int w, int h) { + if (w == pwidth && h == pheight) return; + width = piMax(w, 0); + height = piMax(h, 0); + pwidth = width; + pheight = height; + cells.resize(height); + pcells.resize(height); + for (int i = 0; i < height; ++i) { + cells[i].resize(width); + pcells[i].resize(width, Cell(0)); + } +#ifdef WINDOWS + bs.X = width; + bs.Y = height; + chars.resize(width * height); +#endif +} + + +void PIScreen::SystemConsole::print() { +#ifdef WINDOWS + static int cnt = 0; + for (int i = 0; i < width; ++i) + for (int j = 0; j < height; ++j) { + int k = j * width + i; + chars[k].Char.UnicodeChar = 0; + chars[k].Char.AsciiChar = ((cnt + i + j / 3)%11 + '0'); + chars[k].Attributes = sbi.wAttributes; + if (i % 3 == 0) chars[k].Attributes |= BACKGROUND_RED; + //if (j % 3 == 1) chars[k].Attributes |= BACKGROUND_GREEN; + //if (j % 3 == 2) chars[k].Attributes |= BACKGROUND_BLUE; + /*if (i % 3 == 2) chars[k].Attributes |= FOREGROUND_INTENSITY; + if (i % 3 == 2) { + chars[k].Attributes |= FOREGROUND_INTENSITY; + chars[k].Attributes &= ~(FOREGROUND_RED | FOREGROUND_BLUE); + }*/ + } + srect = sbi.srWindow; + WriteConsoleOutput(hOut, chars.data(), bs, bc, &srect); +#else + for (int i = 0; i < height; ++i) + pcells[i] = cells[i]; +#endif +} + + + + +PIScreen::PIScreen(bool startNow, KBFunc slot): PIThread() { + setName("screen"); + setPriority(piLow); + needLockRun(true); + ret_func = slot; + listener = new PIKbdListener(key_event, this); + if (startNow) start(); +} + + +PIScreen::~PIScreen() { + if (isRunning()) + stop(); + delete listener; +} + + +void PIScreen::key_event(char key, void * t) { + PIScreen * p = (PIScreen * )t; + if (p->ret_func != 0) p->ret_func(key, t); + p->keyPressed(key, t); +} + + +void PIScreen::stop(bool clear) { + PIThread::stop(true); + if (clear) console.clearScreen(); + fflush(0); +} + + +void PIScreen::begin() { + console.begin(); +} + + +void PIScreen::run() { + console.prepare(); + console.print(); +} + + +void PIScreen::end() { + console.end(); +} diff --git a/src/system/piscreen.h b/src/system/piscreen.h new file mode 100644 index 00000000..d0576662 --- /dev/null +++ b/src/system/piscreen.h @@ -0,0 +1,194 @@ +/*! \file piscreen.h + * \brief Console output class +*/ +/* + PIP - Platform Independent Primitives + Console output/input + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PSCREEN_H +#define PSCREEN_H + +#include "pikbdlistener.h" +#include "piprotocol.h" +#include "pidiagnostics.h" +#include "pisystemmonitor.h" +#ifndef WINDOWS +# include +# include +#endif + + +class PIP_EXPORT PIScreen: public PIThread +{ + PIOBJECT_SUBCLASS(PIScreen, PIThread) +public: + + //! Constructs %PIScreen with key handler "slot" and if "startNow" start it + PIScreen(bool startNow = true, KBFunc slot = 0); + + ~PIScreen(); + + //! Color for chars or background + enum Color { + Default /** Default */, + Black /** Black */, + Red /** Red */, + Green /** Green */, + Yellow /** Yellow */, + Blue /** Blue */, + Magenta /** Magenta */, + Cyan /** Cyan */, + White /** White */ + }; + + //! Flags for chars + enum CharFlag { + Bold /** Bold flag */ = 0x1, + Blink /** Blink flag */ = 0x2, + }; + + //! Variables output format + enum __Format { + Dec /** Decimal base for integers */ = 0x1000000, + Hex /** Hexadecimal base for integers */ = 0x2000000, + Oct /** Octal base for integers */ = 0x4000000, + Bin /** Binary base for integers */ = 0x8000000, + Scientific /** Scientific representation of floats */ = 0x10000000, + SystemTimeSplit /** PISystemTime split representation (* s, * ns) */ = 0x20000000, + SystemTimeSeconds /** PISystemTime seconds representation (*.* s) */ = 0x40000000 + }; + + //! Column labels alignment + enum Alignment { + Nothing /** No alignment */ , + Left /** Labels align left and variables align left */ , + Right /** Labels align right and variables align left */, + Center /** */ + }; + + typedef PIFlags CharFlags; + + + //! Directly call function from \a PIKbdListener + void enableExitCapture(char key = 'Q') {listener->enableExitCapture(key);} + + //! Directly call function from \a PIKbdListener + void disableExitCapture() {listener->disableExitCapture();} + + //! Directly call function from \a PIKbdListener + bool exitCaptured() const {return listener->exitCaptured();} + + //! Directly call function from \a PIKbdListener + char exitKey() const {return listener->exitKey();} + + + EVENT_HANDLER0(void, waitForFinish) {WAIT_FOR_EXIT} + EVENT_HANDLER0(void, start) {start(false);} + EVENT_HANDLER1(void, start, bool, wait) {PIThread::start(40); if (wait) waitForFinish();} + EVENT_HANDLER0(void, stop) {stop(false);} + EVENT_HANDLER1(void, stop, bool, clear); + + EVENT2(keyPressed, char, key, void * , data) + +//! \handlers +//! \{ + + //! \fn void waitForFinish() + //! \brief block until finished (exit key will be pressed) + + //! \fn void clearVariables(bool clearScreen = true) + //! \brief Remove all columns at current tab and if "clearScreen" clear the screen + + //! \fn void start(bool wait = false) + //! \brief Start console output and if "wait" block until finished (exit key will be pressed) + + //! \fn void stop(bool clear = false) + //! \brief Stop console output and if "clear" clear the screen + +//! \} +//! \events +//! \{ + + //! \fn void keyPressed(char key, void * data) + //! \brief Raise on key "key" pressed, "data" is pointer to %PIConsole object + +//! \} + +private: + class SystemConsole { + public: + SystemConsole(); + ~SystemConsole(); + struct Cell { + Cell(char c = ' ') {color_back = color_char = flags = 0; symbol = c;} + uchar color_char; + uchar color_back; + ushort flags; + PIChar symbol; + }; + void begin(); + void end(); + void prepare(); + void print(); + void resize(int w, int h); +#ifdef WINDOWS + void getWinCurCoord() {GetConsoleScreenBufferInfo(hOut, &csbi); ccoord = csbi.dwCursorPosition;} + COORD & getWinCoord(int dx = 0, int dy = 0) {getWinCurCoord(); ccoord.X += dx; ccoord.Y += dy; return ccoord;} + void toUpperLeft() {SetConsoleCursorPosition(hOut, ulcoord);} + void moveTo(int x = 0, int y = 0) {ccoord.X = x; ccoord.Y = ulcoord.Y + y; SetConsoleCursorPosition(hOut, ccoord);} + void hideCursor() {curinfo.bVisible = false; SetConsoleCursorInfo(hOut, &curinfo);} + void showCursor() {curinfo.bVisible = true; SetConsoleCursorInfo(hOut, &curinfo);} + void clearScreen() {toUpperLeft(); FillConsoleOutputAttribute(hOut, dattr, width * (height + 1), ulcoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width * (height + 1), ulcoord, &written);} + void clearScreenLower() {getWinCurCoord(); FillConsoleOutputAttribute(hOut, dattr, width * height - width * ccoord.Y + ccoord.X, ccoord, &written); + FillConsoleOutputCharacter(hOut, ' ', width * height - width * ccoord.Y + ccoord.X, ccoord, &written);} +#else + void toUpperLeft() {printf("\e[H");} + void moveTo(int x = 0, int y = 0) {printf("\e[%d;%dH", y, x);} + void hideCursor() {printf("\e[?25l");} + void showCursor() {printf("\e[?25h");} + void clearScreen() {printf("\e[0m\e[H\e[J");} + void clearScreenLower() {printf("\e[0m\e[J");} +#endif +#ifdef WINDOWS + void * hOut; + CONSOLE_SCREEN_BUFFER_INFO sbi, csbi; + CONSOLE_CURSOR_INFO curinfo; + COORD ccoord, ulcoord, bs, bc; + SMALL_RECT srect; + WORD dattr; + DWORD smode, written; + PIVector chars; +#endif + int width, height, pwidth, pheight; + PIVector > cells, pcells, dcells; + }; + + void begin(); + void run(); + void end(); + static void key_event(char key, void * t); + + SystemConsole console; + PIKbdListener * listener; + KBFunc ret_func; + + +}; + +#endif // PSCREEN_H diff --git a/src/system/pisignals.cpp b/src/system/pisignals.cpp new file mode 100755 index 00000000..a06f58da --- /dev/null +++ b/src/system/pisignals.cpp @@ -0,0 +1,111 @@ +/* + PIP - Platform Independent Primitives + Signals + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pisignals.h" + +PISignals::SignalEvent PISignals::ret_func; + + +void PISignals::grabSignals(PIFlags signals_) { + if (signals_[PISignals::Interrupt]) signal(signalCode(PISignals::Interrupt), PISignals::signal_event); + if (signals_[PISignals::Illegal]) signal(signalCode(PISignals::Illegal), PISignals::signal_event); + if (signals_[PISignals::Abort]) signal(signalCode(PISignals::Abort), PISignals::signal_event); + if (signals_[PISignals::FPE]) signal(signalCode(PISignals::FPE), PISignals::signal_event); + if (signals_[PISignals::SegFault]) signal(signalCode(PISignals::SegFault), PISignals::signal_event); + if (signals_[PISignals::Termination]) signal(signalCode(PISignals::Termination), PISignals::signal_event); + if (signals_[PISignals::UserDefined1]) signal(signalCode(PISignals::UserDefined1), PISignals::signal_event); + if (signals_[PISignals::UserDefined2]) signal(signalCode(PISignals::UserDefined2), PISignals::signal_event); +#ifndef WINDOWS + if (signals_[PISignals::Hangup]) signal(signalCode(PISignals::Hangup), PISignals::signal_event); + if (signals_[PISignals::Quit]) signal(signalCode(PISignals::Quit), PISignals::signal_event); + if (signals_[PISignals::Kill]) signal(signalCode(PISignals::Kill), PISignals::signal_event); + if (signals_[PISignals::BrokenPipe]) signal(signalCode(PISignals::BrokenPipe), PISignals::signal_event); + if (signals_[PISignals::Timer]) signal(signalCode(PISignals::Timer), PISignals::signal_event); + if (signals_[PISignals::ChildStopped]) signal(signalCode(PISignals::ChildStopped), PISignals::signal_event); + if (signals_[PISignals::Continue]) signal(signalCode(PISignals::Continue), PISignals::signal_event); + if (signals_[PISignals::StopProcess]) signal(signalCode(PISignals::StopProcess), PISignals::signal_event); + if (signals_[PISignals::StopTTY]) signal(signalCode(PISignals::StopTTY), PISignals::signal_event); + if (signals_[PISignals::StopTTYInput]) signal(signalCode(PISignals::StopTTYInput), PISignals::signal_event); + if (signals_[PISignals::StopTTYOutput]) signal(signalCode(PISignals::StopTTYOutput), PISignals::signal_event); +#endif +} + + +int PISignals::signalCode(PISignals::Signal signal) { + switch (signal) { + case PISignals::Interrupt: return SIGINT; + case PISignals::Illegal: return SIGILL; + case PISignals::Abort: return SIGABRT; + case PISignals::FPE: return SIGFPE; + case PISignals::SegFault: return SIGSEGV; + case PISignals::Termination: return SIGTERM; + case PISignals::UserDefined1: return SIGUSR1; + case PISignals::UserDefined2: return SIGUSR2; +#ifndef WINDOWS + case PISignals::Hangup: return SIGHUP; + case PISignals::Quit: return SIGQUIT; + case PISignals::Kill: return SIGKILL; + case PISignals::BrokenPipe: return SIGPIPE; + case PISignals::Timer: return SIGALRM; + case PISignals::ChildStopped: return SIGCHLD; + case PISignals::Continue: return SIGCONT; + case PISignals::StopProcess: return SIGSTOP; + case PISignals::StopTTY: return SIGTSTP; + case PISignals::StopTTYInput: return SIGTTIN; + case PISignals::StopTTYOutput:return SIGTTOU; +#endif + default:; + } + return 0; +} + + +PISignals::Signal PISignals::signalFromCode(int signal) { + switch (signal) { + case SIGINT: return PISignals::Interrupt; + case SIGILL: return PISignals::Illegal; + case SIGABRT: return PISignals::Abort; + case SIGFPE: return PISignals::FPE; + case SIGSEGV: return PISignals::SegFault; + case SIGTERM: return PISignals::Termination; + case SIGUSR1: return PISignals::UserDefined1; + case SIGUSR2: return PISignals::UserDefined2; +#ifndef WINDOWS + case SIGHUP: return PISignals::Hangup; + case SIGQUIT: return PISignals::Quit; + case SIGKILL: return PISignals::Kill; + case SIGPIPE: return PISignals::BrokenPipe; + case SIGALRM: return PISignals::Timer; + case SIGCHLD: return PISignals::ChildStopped; + case SIGCONT: return PISignals::Continue; + case SIGSTOP: return PISignals::StopProcess; + case SIGTSTP: return PISignals::StopTTY; + case SIGTTIN: return PISignals::StopTTYInput; + case SIGTTOU: return PISignals::StopTTYOutput; +#endif + default:; + } + return PISignals::Termination; +} + + +void PISignals::signal_event(int signal) { + if (PISignals::ret_func == 0) return; + PISignals::ret_func(PISignals::signalFromCode(signal)); +} diff --git a/src/system/pisignals.h b/src/system/pisignals.h new file mode 100755 index 00000000..8ffce889 --- /dev/null +++ b/src/system/pisignals.h @@ -0,0 +1,78 @@ +/*! \file pisignals.h + * \brief System signals +*/ +/* + PIP - Platform Independent Primitives + Signals + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISIGNALS_H +#define PISIGNALS_H + +#include "picontainers.h" +#include +#ifdef WINDOWS +# define SIGUSR1 10 +# define SIGUSR2 12 +#endif + +class PIP_EXPORT PISignals +{ +public: + enum Signal { + Interrupt /** Interrupt from keyboard */ = 0x01, // Term Interrupt from keyboard + Illegal /** Illegal Instruction */ = 0x02, // Core Illegal Instruction + Abort /** Abort signal */ = 0x04, // Core Abort signal from abort + FPE /** Floating point exception */ = 0x08, // Core Floating point exception + SegFault /** Invalid memory reference */ = 0x10, // Core Invalid memory reference + Termination /** Termination signal */ = 0x20, // Term Termination signal + Hangup = 0x40, // Term Hangup detected on controlling terminal or death of controlling process + Quit = 0x80, // Core Quit from keyboard + Kill = 0x100, // Term Kill signal + BrokenPipe = 0x200, // Term Broken pipe: write to pipe with no readers + Timer = 0x400, // Term Timer signal from alarm + UserDefined1 = 0x800, // Term User-defined signal 1 + UserDefined2 = 0x1000, // Term User-defined signal 2 + ChildStopped = 0x2000, // Ign Child stopped or terminated + Continue = 0x4000, // Cont Continue if stopped + StopProcess = 0x8000, // Stop Stop process + StopTTY = 0x10000, // Stop Stop typed at tty + StopTTYInput = 0x20000, // Stop tty input for background process + StopTTYOutput = 0x40000, // Stop tty output for background process + All = 0xFFFFF + }; + + typedef void (*SignalEvent)(PISignals::Signal); + // slot is any function format "void (PISignals::Signal)" + static void setSlot(SignalEvent slot) {ret_func = slot;} + static void grabSignals(PIFlags signals_); + static void raiseSignal(PISignals::Signal signal) {raise(signalCode(signal));} + +private: + PISignals() {ret_func = 0;} + ~PISignals() {} + + static int signalCode(PISignals::Signal signal); + static PISignals::Signal signalFromCode(int signal); + static void signal_event(int signal); + + static SignalEvent ret_func; + +}; + + +#endif // PISIGNALS_H diff --git a/src/system/pisysteminfo.cpp b/src/system/pisysteminfo.cpp new file mode 100644 index 00000000..966b38b0 --- /dev/null +++ b/src/system/pisysteminfo.cpp @@ -0,0 +1,189 @@ +/* + PIP - Platform Independent Primitives + System information + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pisysteminfo.h" +#include "pidir.h" +#include "pitime.h" +#include "piprocess.h" +#include "pisysteminfo.h" +#include "pitime.h" + + +PISystemInfo::PISystemInfo() { + processorsCount = 1; +} + + +PISystemInfo * PISystemInfo::instance() { + static PISystemInfo ret; + return &ret; +} + + +PIStringList PISystemInfo::mountRoots() { + PIStringList ret; +#ifdef WINDOWS + char letters[1024]; + DWORD ll = GetLogicalDriveStrings(1023, letters); + PIString clet; + for (int i = 0; i < ll; ++i) { + if (letters[i] == '\0') { + if (clet.size_s() > 2) ret << clet.cutRight(1); + clet.clear(); + } else + clet += PIChar(letters[i]); + } +#else +# ifdef LINUX + PIString s_df, s_m; + char in[1024]; + memset(in, 0, 1024); + FILE * fp = popen("mount -l", "r"); + PIStringList tl; + if (fp) { + while (fgets(in, 1024, fp)) { + tl = PIString(in).trim().replaceAll(" ", " ").split(" "); + if (tl.size_s() < 2) continue; + for (int i = 0; i < tl.size_s() - 1; ++i) + if (tl[i] == "on") {if (!ret.contains(tl[i + 1])) ret << tl[i + 1]; break;} + } + pclose(fp); + } +# else +# endif +#endif + return ret; +} + + +struct String3 {PIString mp, type, label;}; + +PIVector PISystemInfo::mountInfo() { + static PIVector cache; + static PITimeMeasurer tm; + static bool first = true; + if (tm.elapsed_m() < piMountInfoRefreshIntervalMs && !first) + return cache; + first = false; + tm.reset(); + cache.clear(); + + PIVector ret; + MountInfo m; +#ifdef WINDOWS + char letters[1024], volname[1024], volfs[1024]; + DWORD ll = GetLogicalDriveStrings(1023, letters); + PIString clet; + for (int i = 0; i < ll; ++i) { + if (letters[i] == '\0') { + if (GetVolumeInformation(clet.data(), volname, 1023, 0, 0, 0, volfs, 1023)) { + m.mount_point = clet; + m.filesystem = volfs; + m.label = volname; + DWORD spc, bps, free_cl, all_cl; + if (GetDiskFreeSpace(clet.data(), &spc, &bps, &free_cl, &all_cl)) { + ullong bpc = ullong(spc) * ullong(bps); + m.space_all = bpc * ullong(all_cl); + m.space_free = bpc * ullong(free_cl); + m.space_used = m.space_all - m.space_free; + } else + m.space_all = m.space_free = m.space_used = 0U; + clet.cutRight(1); + int qdd = QueryDosDevice(clet.data(), volfs, 1023); + if (qdd > 0) + m.device = volfs; + else + m.device.clear(); + ret << m; + } + clet.clear(); + } else + clet += PIChar(letters[i]); + } + + /*HANDLE hVolume = FindFirstVolumeA(volGUID, 1024); + if (hVolume) { + do { + piCout << "Volume" << PIString(volGUID); + } while (FindNextVolumeA(hVolume, volGUID, 1024)) + FindVolumeClose(hVolume); + }*/ +#else +# ifdef LINUX + PIString s_df, s_m; + char in[1024]; + memset(in, 0, 1024); + //piCout << "mountInfo 0"; + FILE * fp = popen("df -B1", "r"); + PIStringList l_df; + PIMap fs; + if (fp) { + while (fgets(in, 1024, fp)) + l_df << PIString(in).trim(); + pclose(fp); + fp = 0; + } + //piCout << "mountInfo 1"; + memset(in, 0, 1024); + fp = popen("mount -l", "r"); + PIStringList tl; + if (fp) { + while (fgets(in, 1024, fp)) { + tl = PIString(in).trim().replaceAll(" ", " ").split(" "); + if (tl.size_s() < 2) continue; + String3 me; + PIString dev; + dev = tl.front(); + for (int i = 0; i < tl.size_s() - 1; ++i) { + if (tl[i] == "on") {me.mp = tl[i + 1]; ++i; continue;} + if (tl[i] == "type") {me.type = tl[i + 1]; ++i; continue;} + } + if (tl.back().startsWith("[")) { + me.label = tl.back(); + me.label.cutLeft(1).cutRight(1); + } + fs[dev] = me; + //piCout << fsmp << fstl; + } + pclose(fp); + fp = 0; + } + if (l_df.size_s() < 2) return ret; + l_df.pop_front(); + piForeachC (PIString & s, l_df) { + PIStringList ml(s.replaceAll(" ", " ").split(" ")); + if (ml.size_s() < 2) continue; + if (ml.front() == "none") continue; + m.space_all = ml[1].toULLong(); + m.space_used = ml[2].toULLong(); + m.space_free = m.space_all - m.space_used; + String3 s3 = fs.value(ml.front()); + m.device = ml.front(); + m.filesystem = s3.type; + m.mount_point = s3.mp; + m.label = s3.label; + ret << m; + //piCout << ml; + } +# else +# endif +#endif + cache = ret; + return ret; +} diff --git a/src/system/pisysteminfo.h b/src/system/pisysteminfo.h new file mode 100644 index 00000000..8ed2e15a --- /dev/null +++ b/src/system/pisysteminfo.h @@ -0,0 +1,61 @@ +/* + PIP - Platform Independent Primitives + System information + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISYSTEMINFO_H +#define PISYSTEMINFO_H + +#include "pitime.h" + +class PIP_EXPORT PISystemInfo { +public: + PISystemInfo(); + + struct MountInfo { + MountInfo() {space_all = space_used = space_free = 0;} + PIString mount_point; + PIString device; + PIString filesystem; + PIString label; + ullong space_all; + ullong space_used; + ullong space_free; + }; + + PIString ifconfigPath, execCommand, hostname, user, OS_name, OS_version, architecture; + PIDateTime execDateTime; + int processorsCount; + + static PIStringList mountRoots(); + static PIVector mountInfo(); + + static PISystemInfo * instance(); + +}; + +inline PICout operator <<(PICout s, const PISystemInfo::MountInfo & v) { + s.setControl(0, true); + s << "MountInfo(" << v.device << " mounted on \"" << v.mount_point << "\", type " << v.filesystem + << ", label \"" << v.label << "\", all " << PIString::readableSize(v.space_all) + << ", used " << PIString::readableSize(v.space_used) + << ", free " << PIString::readableSize(v.space_free) << ")"; + s.restoreControl(); + return s; +} + +#endif // PISYSTEMINFO_H diff --git a/src/system/pisystemmonitor.cpp b/src/system/pisystemmonitor.cpp new file mode 100755 index 00000000..a764b8d5 --- /dev/null +++ b/src/system/pisystemmonitor.cpp @@ -0,0 +1,203 @@ +/* + PIP - Platform Independent Primitives + Process resource monitor + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pisystemmonitor.h" +#include "pisysteminfo.h" +#ifdef WINDOWS +# include "TlHelp32.h" +#endif + + +PISystemMonitor::PISystemMonitor(): PIThread() { + pID_ = cycle = 0; + cpu_count = PISystemInfo::instance()->processorsCount; +#ifndef WINDOWS +# ifdef QNX + page_size = 4096; +# else + page_size = getpagesize(); +# endif +#else + hProc = 0; + mem_cnt.cb = sizeof(mem_cnt); +#endif + setName("system_monitor"); +} + + +PISystemMonitor::~PISystemMonitor() { + stop(); +} + + +PISystemMonitor::ProcessStats::ProcessStats() { + ID = parent_ID = group_ID = session_ID = priority = threads = 0; + physical_memsize = resident_memsize = share_memsize = virtual_memsize = data_memsize = 0; + cpu_load_user = cpu_load_system = 0.f; +} + + +bool PISystemMonitor::startOnProcess(int pID) { + stop(); + pID_ = pID; +#ifndef WINDOWS + file.open("/proc/" + PIString::fromNumber(pID_) + "/stat", PIIODevice::ReadOnly); + filem.open("/proc/" + PIString::fromNumber(pID_) + "/statm", PIIODevice::ReadOnly); + if (!file.isOpened()) { + piCoutObj << "Can`t find process with ID = " << pID_ << "!"; + return false; + } + cycle = -1; +#else + hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pID_); + if (hProc == 0) { + piCoutObj << "Can`t open process with ID = " << pID_ << "," << errorString(); + return false; + } + tm.reset(); +#endif + return start(1000); +} + + +void PISystemMonitor::stop() { + PIThread::stop(); +#ifdef WINDOWS + if (hProc != 0) { + CloseHandle(hProc); + hProc = 0; + } +#endif + +} + + +void PISystemMonitor::run() { +#ifndef WINDOWS + file.seekToBegin(); + PIString str(file.readAll(true)); + int si = str.find('(') + 1, fi = 0, cc = 1; + for (int i = si; i < str.size_s(); ++i) { + if (str[i] == '(') cc++; + if (str[i] == ')') cc--; + if (cc <= 0) { + fi = i; + break; + } + } + stat.exec_name = str.mid(si, fi - si); + str.cutMid(si - 1, fi - si + 3); + PIStringList sl = str.split(" "); + if (sl.size_s() < 19) return; + stat.ID = sl[0].toInt(); + stat.state = sl[1]; + stat.parent_ID = sl[2].toInt(); + stat.group_ID = sl[3].toInt(); + stat.session_ID = sl[4].toInt(); + if (cycle < 0) { + cpu_u_prev = cpu_u_cur = sl[12].toLLong(); + cpu_s_prev = cpu_s_cur = sl[13].toLLong(); + } + cycle++; + //if (cycle >= 4) { + cpu_u_prev = cpu_u_cur; + cpu_s_prev = cpu_s_cur; + cpu_u_cur = sl[12].toLLong(); + cpu_s_cur = sl[13].toLLong(); + stat.cpu_load_system = cpu_s_cur - cpu_s_prev; + stat.cpu_load_user = cpu_u_cur - cpu_u_prev; + stat.cpu_load_system /= cpu_count; + stat.cpu_load_user /= cpu_count; + cycle = 0; + //} + stat.priority = sl[16].toInt(); + stat.threads = sl[18].toInt(); + + filem.seekToBegin(); + str = filem.readAll(true); + sl = str.split(" "); + if (sl.size_s() < 6) return; + stat.virtual_memsize = sl[0].toLong() * page_size; + stat.resident_memsize = sl[1].toLong() * page_size; + stat.share_memsize = sl[2].toLong() * page_size; + stat.data_memsize = sl[5].toLong() * page_size; + stat.physical_memsize = stat.resident_memsize - stat.share_memsize; +#else + stat.ID = pID_; + HMODULE hMod; + DWORD cbNeeded; + if (GetProcessMemoryInfo(hProc, &mem_cnt, sizeof(mem_cnt)) != 0) { + stat.physical_memsize = mem_cnt.WorkingSetSize; + } + stat.priority = GetPriorityClass(hProc); + HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, pID_); + int thcnt = 0; + if (snap != 0) { + THREADENTRY32 thread; + thread.dwSize = sizeof(THREADENTRY32); + if (Thread32First(snap, &thread) == TRUE) { + if (thread.th32OwnerProcessID == pID_) + ++thcnt; + while (Thread32Next(snap, &thread) == TRUE) { + if (thread.th32OwnerProcessID == pID_) + ++thcnt; + } + } + stat.threads = thcnt; + CloseHandle(snap); + } + FILETIME ft0, ft1, ft_kernel, ft_user; + double el_s = tm.elapsed_s() * cpu_count / 100.; + if (GetProcessTimes(hProc, &ft0, &ft1, &ft_kernel, &ft_user) != 0) { + PISystemTime tm_kernel_c(ft_kernel), tm_user_c(ft_user); + if (cycle < 0) { + tm_kernel = tm_kernel_c; + tm_user = tm_user_c; + } + //cycle++; + cycle = 0; + if (el_s <= 0.) { + stat.cpu_load_system = 0.f; + stat.cpu_load_user = 0.f; + } else { + stat.cpu_load_system = (tm_kernel_c - tm_kernel).toSeconds() / el_s; + stat.cpu_load_user = (tm_user_c - tm_user).toSeconds() / el_s; + } + tm_kernel = tm_kernel_c; + tm_user = tm_user_c; + } else { + stat.cpu_load_system = 0.f; + stat.cpu_load_user = 0.f; + } + tm.reset(); +#endif + + stat.cpu_load_system = piClampf(stat.cpu_load_system, 0.f, 100.f); + stat.cpu_load_user = piClampf(stat.cpu_load_user, 0.f, 100.f); + makeStrings(); +} + + +void PISystemMonitor::makeStrings() { + stat.physical_memsize_readable.setReadableSize(stat.physical_memsize); + stat.resident_memsize_readable.setReadableSize(stat.resident_memsize); + stat.share_memsize_readable.setReadableSize(stat.share_memsize); + stat.virtual_memsize_readable.setReadableSize(stat.virtual_memsize); + stat.data_memsize_readable.setReadableSize(stat.data_memsize); +} diff --git a/src/system/pisystemmonitor.h b/src/system/pisystemmonitor.h new file mode 100755 index 00000000..0e3c0cdd --- /dev/null +++ b/src/system/pisystemmonitor.h @@ -0,0 +1,82 @@ +/* + PIP - Platform Independent Primitives + Process resource monitor + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISYSTEMMONITOR_H +#define PISYSTEMMONITOR_H + +#include "pithread.h" +#include "piprocess.h" + +class PIP_EXPORT PISystemMonitor: public PIThread +{ + PIOBJECT_SUBCLASS(PISystemMonitor, PIThread) +public: + PISystemMonitor(); + ~PISystemMonitor(); + + struct ProcessStats { + ProcessStats(); + PIString exec_name; + PIString state; + int ID; + int parent_ID; + int group_ID; + int session_ID; + int priority; + int threads; + ulong physical_memsize; + ulong resident_memsize; + ulong share_memsize; + ulong virtual_memsize; + ulong data_memsize; + PIString physical_memsize_readable; + PIString resident_memsize_readable; + PIString share_memsize_readable; + PIString virtual_memsize_readable; + PIString data_memsize_readable; + float cpu_load_system; + float cpu_load_user; + }; + + bool startOnProcess(int pID); + bool startOnSelf() {return startOnProcess(PIProcess::currentPID());} + + const ProcessStats & statistic() const {return stat;} + void setStatistic(const ProcessStats & s) {stat = s; makeStrings();} + +private: + void stop(); + void run(); + void makeStrings(); + + PIFile file, filem; + ProcessStats stat; + int pID_, page_size, cpu_count, cycle; +#ifndef WINDOWS + llong cpu_u_cur, cpu_u_prev, cpu_s_cur, cpu_s_prev; +#else + HANDLE hProc; + PROCESS_MEMORY_COUNTERS mem_cnt; + PISystemTime tm_kernel, tm_user; + PITimeMeasurer tm; +#endif + +}; + +#endif // PISYSTEMMONITOR_H diff --git a/src/system/pisystemtests.cpp b/src/system/pisystemtests.cpp new file mode 100755 index 00000000..cdb072fb --- /dev/null +++ b/src/system/pisystemtests.cpp @@ -0,0 +1,41 @@ +/* + PIP - Platform Independent Primitives + System tests results (see system_test folder) + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pisystemtests.h" + + +namespace PISystemTests { + long time_resolution_ns = 1; + long time_elapsed_ns = 0; + long usleep_offset_us = 60; + + PISystemTestReader pisystestreader; + +}; + + +PISystemTests::PISystemTestReader::PISystemTestReader() { +#ifndef WINDOWS + PIConfig conf("/etc/pip.conf", PIIODevice::ReadOnly); + //conf.setReopenEnabled(false); + time_resolution_ns = conf.getValue("time_resolution_ns", 1); + time_elapsed_ns = conf.getValue("time_elapsed_ns", 0); + usleep_offset_us = conf.getValue("usleep_offset_us", 60); +#endif +} diff --git a/src/system/pisystemtests.h b/src/system/pisystemtests.h new file mode 100755 index 00000000..ddf602d9 --- /dev/null +++ b/src/system/pisystemtests.h @@ -0,0 +1,39 @@ +/* + PIP - Platform Independent Primitives + System tests results (see system_test folder) + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PISYSTEMTESTS_H +#define PISYSTEMTESTS_H + +#include "piconfig.h" + +namespace PISystemTests { + PIP_EXPORT extern long time_resolution_ns; + PIP_EXPORT extern long time_elapsed_ns; + PIP_EXPORT extern long usleep_offset_us; + + class PISystemTestReader { + public: + PISystemTestReader(); + }; + + extern PISystemTestReader pisystestreader; + +}; + +#endif // PISYSTEMTESTS_H diff --git a/src/thread/pimutex.cpp b/src/thread/pimutex.cpp new file mode 100755 index 00000000..37f19baf --- /dev/null +++ b/src/thread/pimutex.cpp @@ -0,0 +1,59 @@ +/* + PIP - Platform Independent Primitives + Mutex + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pimutex.h" + + +/** \class PIMutex + * \brief Mutex + * \details + * \section PIMutex_sec0 Synopsis + * %PIMutex provides synchronization blocks between several threads. + * Using mutex guarantees execution of some code only one of threads. + * Mutex contains logic state and functions to change it: \a lock(), + * \a unlock() and \a tryLock(). + * + * \section PIMutex_sec1 Usage + * Block of code that should to be executed only one thread simultaniously + * should to be started with \a lock() and ended with \a unlock(). + * \snippet pimutex.cpp main + * "mutex" in this example is one for all threads. + * + * */ + + +PIMutex::PIMutex() { +#ifdef WINDOWS + mutex = CreateMutex(0, false, 0); +#else + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutex_init(&mutex, &attr); + pthread_mutexattr_destroy(&attr); +#endif +} + + +PIMutex::~PIMutex() { +#ifdef WINDOWS + if (mutex != 0) CloseHandle(mutex); +#else + pthread_mutex_destroy(&mutex); +#endif +} diff --git a/src/thread/pimutex.h b/src/thread/pimutex.h new file mode 100755 index 00000000..0228869f --- /dev/null +++ b/src/thread/pimutex.h @@ -0,0 +1,93 @@ +/*! \file pimutex.h + * \brief Mutex +*/ +/* + PIP - Platform Independent Primitives + Mutex + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PIMUTEX_H +#define PIMUTEX_H + +#include "piinit.h" + +class PIP_EXPORT PIMutex +{ +public: + + //! Constructs unlocked mutex + PIMutex(); + + ~PIMutex(); + + + //! \brief Lock mutex + //! \details If mutex is unlocked it set to locked state and returns immediate. + //! If mutex is already locked function blocks until mutex will be unlocked + void lock() { +#ifdef WINDOWS + WaitForSingleObject(mutex, INFINITE); +#else + pthread_mutex_lock(&mutex); +#endif + } + + + //! \brief Unlock mutex + //! \details In any case this function returns immediate + void unlock() { +#ifdef WINDOWS + ReleaseMutex(mutex); +#else + pthread_mutex_unlock(&mutex); +#endif + } + + + //! \brief Try to lock mutex + //! \details If mutex is unlocked it set to locked state and returns "true" immediate. + //! If mutex is already locked function returns immediate an returns "false" + bool tryLock() { +#ifdef WINDOWS + return (WaitForSingleObject(mutex, 0) == WAIT_OBJECT_0); +#else + return (pthread_mutex_trylock(&mutex) == 0); +#endif + } + +private: +#ifdef WINDOWS + void * +#else + pthread_mutex_t +#endif + mutex; + +}; + + +class PIP_EXPORT PIMutexLocker +{ +public: + PIMutexLocker(PIMutex * m): mutex(m) {mutex->lock();} + PIMutexLocker(PIMutex & m): mutex(&m) {mutex->lock();} + ~PIMutexLocker() {mutex->unlock();} +private: + PIMutex * mutex; +}; + +#endif // PIMUTEX_H diff --git a/src/thread/pithread.cpp b/src/thread/pithread.cpp new file mode 100755 index 00000000..532caaa7 --- /dev/null +++ b/src/thread/pithread.cpp @@ -0,0 +1,339 @@ +/* + PIP - Platform Independent Primitives + Thread + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pithread.h" +#include "pisystemtests.h" + + +/*! \class PIThread + * \brief Thread class + * \details This class allow you exec your code in separate thread. + * + * \section PIThread_sec0 Synopsis + * Multithreading allow you to write program which will be executed + * in several threads simultaneously. This trend allow you to use all + * cores of modern processors, but there are many dangers. + * + * This class provide virtual functions \a begin(), \a run() and \a end(), + * which describes start, execution and finish work of some process. + * These functions executes in \b separate thread. When you execute + * \a start(), %PIThread create separate system thread and sequentially + * executes function \a begin(), \a run() and \a end(). You can + * reimplement each function and write your own code to execute. + * Scheme of functions executing: +\code{.cpp} +begin(); +event started(); +while (isRunning()) { + run(); + ThreadFunc(); + msleep(timer_delay); +} +event stopped(); +end(); +\endcode + * Unlike from directly using "pthread" or some similar you doesn`t need + * to write your own main thread cycle and sleep at every cycle end. + * %PIThread make it for you, and your job is to set sleep value from + * contructor or when starting thread, and reimplement \a begin(), \a run() + * and \a end() functions. + * + * \section PIThread_sec1 Using without subclassing + * You can use %PIThread without subclassing by using "ThreadFunc" pointer + * that can be set from constructor or by overloaded function \a start(ThreadFunc func, int timer_delay). + * If "func" if not null this function will be executed as \a run(). ThreadFunc is any static + * function with format void func(void * data). "Data" is custom data set from constructor or + * with function \a setData(). \n Also you can connect to event \a started(), but + * in this case you should to white your thread main cycle, because this event raised only one time. + * + * \section PIThread_sec2 Locking + * %PIThread has inrternal mutex that can be locked and unlocked every \a run() if you set this flag + * with function \a needLockRun(bool). Also you can access to this mutex by functions \a lock(), \a unlock() + * and \a mutex(). Using this functions together with needLockRun(true) can guarantee one-thread access to + * some data. + * + */ + + +PIThread::PIThread(void * data, ThreadFunc func, bool startNow, int timer_delay): PIObject() { + piMonitor.threads++; + thread = 0; + data_ = data; + ret_func = func; + terminating = running_ = lockRun = false; + priority_ = piNormal; + delay_ = timer_delay; + if (startNow) start(timer_delay); +} + + +PIThread::PIThread(bool startNow, int timer_delay): PIObject() { + piMonitor.threads++; + thread = 0; + ret_func = 0; + terminating = running_ = lockRun = false; + priority_ = piNormal; + delay_ = timer_delay; + if (startNow) start(timer_delay); +} + + +PIThread::~PIThread() { + piMonitor.threads--; + if (!running_ || thread == 0) return; +#ifndef WINDOWS +# ifdef ANDROID + pthread_kill(thread, SIGSTOP); +# else + pthread_cancel(thread); +# endif +#else + TerminateThread(thread, 0); + CloseHandle(thread); +#endif + terminating = running_ = false; +} + + +bool PIThread::start(int timer_delay) { + if (running_) return false; + terminating = running_ = false; + delay_ = timer_delay; +#ifndef WINDOWS + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setschedparam(&attr, &sparam); + if (pthread_create(&thread, &attr, thread_function, this) == 0) { + setPriority(priority_); + running_ = true; + return true; +#else + thread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)thread_function, this, 0, 0); + if (thread != 0) { + setPriority(priority_); + running_ = true; + return true; +#endif + } else { + thread = 0; + piCoutObj << "Error: Can`t start new thread:" << errorString(); + } + return false; +} + + +bool PIThread::startOnce() { + if (running_) return false; + terminating = running_ = false; +#ifndef WINDOWS + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setschedparam(&attr, &sparam); + if (pthread_create(&thread, &attr, thread_function_once, this) == 0) { + setPriority(priority_); + running_ = true; + return true; +#else + thread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)thread_function_once, this, 0, 0); + if (thread != 0) { + setPriority(priority_); + running_ = true; + return false; +#endif + } else { + thread = 0; + piCoutObj << "Error: Can`t start new thread:" << errorString(); + } + return false; +} + + +void PIThread::terminate() { + if (thread == 0) return; + terminating = running_ = false; +#ifndef WINDOWS +# ifdef ANDROID + pthread_kill(thread, SIGKILL); +# else + //pthread_kill(thread, SIGKILL); + pthread_cancel(thread); +# endif +#else + TerminateThread(thread, 0); + CloseHandle(thread); +#endif + thread = 0; + end(); +} + + +void * PIThread::thread_function(void * t) { +#ifndef WINDOWS +# ifndef ANDROID + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); +# endif +#else + __PISetTimerResolution(); +#endif + PIThread & ct = *((PIThread * )t); + ct.running_ = true; + if (ct.lockRun) ct.mutex_.lock(); + ct.begin(); + if (ct.lockRun) ct.mutex_.unlock(); + ct.started(); + while (!ct.terminating) { + if (ct.lockRun) ct.mutex_.lock(); + ct.run(); + if (ct.ret_func != 0) ct.ret_func(ct.data_); + if (ct.lockRun) ct.mutex_.unlock(); + if (ct.delay_ > 0) { + ct.tmr_.reset(); + double sl(0.); + while (1) { + sl = piMind(ct.delay_ - ct.tmr_.elapsed_m(), 2.); + if (sl <= 0.) break; + piMSleep(sl); + if (ct.terminating) + break; + } + } + } + ct.stopped(); + if (ct.lockRun) ct.mutex_.lock(); + ct.end(); + if (ct.lockRun) ct.mutex_.unlock(); + ct.terminating = ct.running_ = false; + //cout << "thread " << t << " exiting ... " << endl; +#ifndef WINDOWS + pthread_exit(0); +#else + ExitThread(0); +#endif + ct.thread = 0; + return 0; +} + + +void * PIThread::thread_function_once(void * t) { +#ifndef WINDOWS +# ifndef ANDROID + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0); +# endif +#else + __PISetTimerResolution(); +#endif + PIThread & ct = *((PIThread * )t); + ct.running_ = true; + ct.begin(); + ct.started(); + if (ct.lockRun) ct.mutex_.lock(); + ct.run(); + if (ct.ret_func != 0) ct.ret_func(ct.data_); + if (ct.lockRun) ct.mutex_.unlock(); + ct.stopped(); + ct.end(); + ct.terminating = ct.running_ = false; + //cout << "thread " << t << " exiting ... " << endl; +#ifndef WINDOWS + pthread_exit(0); +#else + ExitThread(0); +#endif + ct.thread = 0; + return 0; +} + + +int PIThread::priority2System(PIThread::Priority p) { + switch (p) { +# ifdef QNX + case piLowerst: return 8; + case piLow: return 9; + case piNormal: return 10; + case piHigh: return 11; + case piHighest: return 12; +# else +# ifdef WINDOWS + case piLowerst: return -2; + case piLow: return -1; + case piNormal: return 0; + case piHigh: return 1; + case piHighest: return 2; +# else + case piLowerst: return 2; + case piLow: return 1; + case piNormal: return 0; + case piHigh: return -1; + case piHighest: return -2; +# endif +# endif + default: return 0; + } + return 0; +} + + +void PIThread::setPriority(PIThread::Priority prior) { + priority_ = prior; +#ifndef WINDOWS + if (!running_ && thread != 0) return; + pthread_getschedparam(thread, &policy_, &sparam); + sparam. +# ifndef LINUX + sched_priority +# else + __sched_priority +# endif + = priority2System(priority_); + pthread_setschedparam(thread, policy_, &sparam); +#else + if (!running_ && thread != 0) return; + SetThreadPriority(thread, priority2System(priority_)); +#endif +} + + +bool PIThread::waitForFinish(int timeout_msecs) { + if (!running_) return true; + if (timeout_msecs < 0) { + while (running_) + msleep(1); + return true; + } + tmf_.reset(); + while (running_ && tmf_.elapsed_m() < timeout_msecs) + msleep(1); + return tmf_.elapsed_m() < timeout_msecs; +} + + +bool PIThread::waitForStart(int timeout_msecs) { + if (running_) return true; + if (timeout_msecs < 0) { + while (!running_) + msleep(1); + return true; + } + tms_.reset(); + while (!running_ && tms_.elapsed_m() < timeout_msecs) + msleep(1); + return tms_.elapsed_m() < timeout_msecs; +} diff --git a/src/thread/pithread.h b/src/thread/pithread.h new file mode 100755 index 00000000..1bbd0b5e --- /dev/null +++ b/src/thread/pithread.h @@ -0,0 +1,208 @@ +/*! \file pithread.h + * \brief Thread + * + * This file declare thread class and some wait functions +*/ +/* + PIP - Platform Independent Primitives + Thread + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PITHREAD_H +#define PITHREAD_H + +#include +#include "piinit.h" +#include "pimutex.h" +#include "piobject.h" + +typedef void (*ThreadFunc)(void * ); + +class PIP_EXPORT PIThread: public PIObject +{ + PIOBJECT(PIThread) +public: + + //! Contructs thread with custom data "data", external function "func" and main loop delay "loop_delay". + PIThread(void * data, ThreadFunc func, bool startNow = false, int loop_delay = -1); + + //! Contructs thread with main loop delay "loop_delay". + PIThread(bool startNow = false, int loop_delay = -1); + + virtual ~PIThread(); + + //! Priority of thread + enum Priority { + piLowerst /** Lowest */, + piLow /** Low */, + piNormal /** Normal, this is default priority of threads and timers */, + piHigh /** High */, + piHighest /** Highest */ + }; + + EVENT_HANDLER0(bool, start) {return start(-1);} + EVENT_HANDLER1(bool, start, int, timer_delay); + EVENT_HANDLER1(bool, start, ThreadFunc, func) {ret_func = func; return start(-1);} + EVENT_HANDLER2(bool, start, ThreadFunc, func, int, timer_delay) {ret_func = func; return start(timer_delay);} + EVENT_HANDLER0(bool, startOnce); + EVENT_HANDLER1(bool, startOnce, ThreadFunc, func) {ret_func = func; return startOnce();} + EVENT_HANDLER0(void, stop) {stop(false);} + EVENT_HANDLER1(void, stop, bool, wait) {terminating = true; if (wait) waitForFinish();} + EVENT_HANDLER0(void, terminate); + + //! \brief Set common data passed to external function + void setData(void * d) {data_ = d;} + + //! \brief Set external function that will be executed after every \a run() + void setSlot(ThreadFunc func) {ret_func = func;} + + //! \brief Set priority of thread + void setPriority(PIThread::Priority prior); + + //! \brief Returns common data passed to external function + void * data() const {return data_;} + + //! \brief Return priority of thread + PIThread::Priority priority() const {return priority_;} + + //! \brief Return \c true if thread is running + bool isRunning() const {return running_;} + + bool isStopping() const {return running_ && terminating;} + + EVENT_HANDLER0(bool, waitForStart) {return waitForStart(-1);} + EVENT_HANDLER1(bool, waitForStart, int, timeout_msecs); + EVENT_HANDLER0(bool, waitForFinish) {return waitForFinish(-1);} + EVENT_HANDLER1(bool, waitForFinish, int, timeout_msecs); + + //! \brief Set necessity of lock every \a run with internal mutex + void needLockRun(bool need) {lockRun = need;} + EVENT_HANDLER0(void, lock) {mutex_.lock();} + EVENT_HANDLER0(void, unlock) {mutex_.unlock();} + + //! \brief Return internal mutex + PIMutex & mutex() {return mutex_;} + + EVENT(started) + EVENT(stopped) + +//! \handlers +//! \{ + + /** \fn bool start(int timer_delay = -1) + * \brief Start thread + * \details Start execution of \a run() in internal loop with + * "timer_delay" delay in milliseconds. If "timer_delay" <= 0 + * there is no delay in loop. Thread also exec external function + * set by \a setSlot() if it`s not null + * + * \return \c false if thread already started or can`t start thread */ + + /** \fn bool start(ThreadFunc func, int timer_delay = -1) + * \brief Start thread + * \details Overloaded function. Set external function "func" before start + * + * \return \c false if thread already started or can`t start thread */ + + /** \fn bool startOnce() + * \brief Start thread without internal loop + * \details Start execution of \a run() once. Thread also exec + * external function set by \a setSlot() if it`s not null + * + * \return \c false if thread already started or can`t start thread */ + + /** \fn bool startOnce(ThreadFunc func) + * \brief Start thread without internal loop + * \details Overloaded function. Set external function "func" before start + * + * \return \c false if thread already started or can`t start thread */ + + /** \fn void stop(bool wait = false) + * \brief Stop thread + * \details Stop execution of thread and wait for it finish + * if "wait" is \c true. This function can block for infinite + * time if "wait" is \c true and any of thread function is + * busy forever */ + + /** \fn void terminate() + * \brief Strongly stop thread + * \details Stop execution of thread immediately */ + + /** \fn bool waitForStart(int timeout_msecs = -1) + * \brief Wait for thread start + * \details This function block until thread finish for "timeout_msecs" + * or forever if "timeout_msecs" < 0 + * + * \return \c false if timeout is exceeded */ + + /** \fn bool waitForFinish(int timeout_msecs = -1) + * \brief Wait for thread finish + * \details This function block until thread start for "timeout_msecs" + * or forever if "timeout_msecs" < 0 + * + * \return \c false if timeout is exceeded */ + + //! \fn void lock() + //! \brief Lock internal mutex + + //! \fn void unlock() + //! \brief Unlock internal mutex + +//! \} +//! \events +//! \{ + + //! \fn void started() + //! \brief Raise on thread start + + //! \fn void stopped() + //! \brief Raise on thread stop + +//! \} + +protected: + static void * thread_function(void * t); + static void * thread_function_once(void * t); + static int priority2System(PIThread::Priority p); + + + //! Function executed once at the start of thread. + virtual void begin() {;} + + //! Function executed at every "timer_delay" msecs until thread was stopped. + virtual void run() {;} + + //! Function executed once at the end of thread. + virtual void end() {;} + + volatile bool terminating, running_, lockRun; + int delay_, policy_; + void * data_; + PIMutex mutex_; + PITimeMeasurer tmf_, tms_, tmr_; + PIThread::Priority priority_; + ThreadFunc ret_func; +#ifndef WINDOWS + pthread_t thread; + sched_param sparam; +#else + void * thread; +#endif + +}; + +#endif // PITHREAD_H diff --git a/src/thread/pitimer.cpp b/src/thread/pitimer.cpp new file mode 100755 index 00000000..c3f72986 --- /dev/null +++ b/src/thread/pitimer.cpp @@ -0,0 +1,428 @@ +/* + PIP - Platform Independent Primitives + Timer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pitimer.h" + + +/*! \class PITimer + * \brief Timer + * + * \section PITimer_sec0 Synopsis + * This class implements timer function. PIP timers supports 3 way to tick notify, + * frequency delimiters and time measurements. + * \section PITimer_sec1 Notify variants + * Notify variants: + * * "slot" - static function with format void func(void * data, int delimiter); + * * event - \a tickEvent(); + * * virtual function - \a tick(). + * + * All these variants are equivalent, use most applicable. + * \section PITimer_sec2 Frequency delimiters + * Frequency delimiter is an integer number and "slot" function. If "slot" function is null + * timer main "slot" will be used. Each delimiter numbers tick timer will be execute + * delimiters or timer main "slot" function with \b delimiter value = delimiter number. + * Example: \snippet pitimer.cpp delimiter + * \section PITimer_sec3 Time measurements + * PITimer can be used as time measurer. Function \a reset() set time mark to current + * system time, then functions double elapsed_*() returns time elapsed from this mark. + * These functions can returns nano-, micro-, milli- and seconds with suffixes "n", "u", "m" + * and "s" + * Example: \snippet pitimer.cpp elapsed +*/ + + +_PITimerBase::_PITimerBase() { + interval_ = deferred_delay = 0.; + running_ = deferred_ = deferred_mode = false; +} + + +void _PITimerBase::setInterval(double i) { + interval_ = i; + if (isRunning()) { + stop(); + start(); + } +} + + +bool _PITimerBase::start(double interval_ms) { + if (isRunning()) stop(); + deferred_ = false; + setInterval(interval_ms); + running_ = startTimer(interval_ms); + return running_; +} + + +void _PITimerBase::startDeferred(double interval_ms, PIDateTime start_datetime) { + if (isRunning()) stop(); + deferred_ = true; + deferred_mode = true; + deferred_datetime = start_datetime; + setInterval(interval_ms); + running_ = startTimer(interval_ms); +} + + +void _PITimerBase::startDeferred(double interval_ms, double delay_ms) { + if (isRunning()) stop(); + deferred_ = true; + deferred_mode = false; + deferred_delay = delay_ms; + setInterval(interval_ms); + running_ = startTimer(interval_ms); +} + + +bool _PITimerBase::stop() { + if (!isRunning()) return true; + running_ = !stopTimer(); + return !running_; +} + + + + +_PITimerImp_Thread::_PITimerImp_Thread() { + thread_.setName("__S__PITimerImp_Thread::thread"); + wait_dt = 100; + wait_dd = 200; + wait_tick = 10; + //piCout << "new _PITimerImp_Thread"; +} + + +_PITimerImp_Thread::~_PITimerImp_Thread() { + stop(); +} + + +void _PITimerImp_Thread::prepareStart(double interval_ms) { + st_inc = PISystemTime::fromMilliseconds(interval_ms); + st_odt = st_inc * 5; + if (st_odt.toSeconds() < 1.) st_odt = PISystemTime::fromSeconds(1.); + if (deferred_) { + if (!deferred_mode) + st_time = PISystemTime::current(true) + PISystemTime::fromMilliseconds(deferred_delay); + st_time -= st_inc; + } else + st_time = PISystemTime::current(true) + st_inc; +} + + +bool _PITimerImp_Thread::startTimer(double interval_ms) { + prepareStart(interval_ms); + thread_.setData(this); + return thread_.start(threadFuncS); +} + + +bool _PITimerImp_Thread::stopTimer() { + thread_.stop(); + if (!thread_.waitForFinish(10)) + if (thread_.isRunning()) + thread_.terminate(); + return true; +} + + +bool _PITimerImp_Thread::threadFunc() { + if (!running_) return false; + if (deferred_) { + PISystemTime dwt; + int wth(wait_dt); + if (deferred_mode) { + dwt = deferred_datetime.toSystemTime() - PISystemTime::current(); + wth = wait_dd; + } else + dwt = st_time - PISystemTime::current(true); + if (wth > 0) { + if (dwt.toMilliseconds() > wth + 1.) { + piMSleep(wth); + return false; + } else { + dwt.sleep(); + deferred_ = false; + st_time = PISystemTime::current(true); + } + } else { + if (dwt.toMilliseconds() > 0.1) + return false; + } + } + st_wait = st_time - PISystemTime::current(true); + //piCout << "wait" << this << st_wait; + if (st_wait.abs() > st_odt || st_wait.seconds <= -5) { + adjustTimes(); + return true; + } + if (wait_tick > 0) { + if (st_wait.toMilliseconds() > wait_tick + 1.) { + piMSleep(wait_tick); + return false; + } else { + st_wait.sleep(); + } + } else { + if (st_wait.toMilliseconds() > 0.1) + return false; + } + st_time += st_inc; + tfunc(parent); + return true; +} + + +void _PITimerImp_Thread::adjustTimes() { + PISystemTime cst = PISystemTime::current(true); + if (st_time < cst) { + while (st_time < cst) + st_time += st_inc; + } else { + cst += st_inc; + while (st_time > cst) + st_time -= st_inc; + } +} + + + + +#ifdef PIP_TIMER_RT + +_PITimerImp_RT::_PITimerImp_RT() { + //piCout << "new _PITimerImp_RT"; + ti = -1; + tt = 0; + memset(&se, 0, sizeof(se)); + se.sigev_notify = SIGEV_THREAD; + se.sigev_value.sival_ptr = this; + se.sigev_notify_function = threadFuncS; + se.sigev_notify_attributes = 0; +} + + +bool _PITimerImp_RT::startTimer(double interval_ms) { + int flags(0); + spec.it_interval.tv_nsec = ((int)(interval_ms * 1000) % 1000000) * 1000; + spec.it_interval.tv_sec = (time_t)(interval_ms / 1000); + if (deferred_) { + if (deferred_mode) { + PISystemTime dtm = deferred_datetime.toSystemTime(); + spec.it_value.tv_nsec = dtm.nanoseconds; + spec.it_value.tv_sec = dtm.seconds; + flags = TIMER_ABSTIME; + } else { + spec.it_value.tv_nsec = ((int)(deferred_delay * 1000) % 1000000) * 1000; + spec.it_value.tv_sec = (time_t)(deferred_delay / 1000); + } + } else { + spec.it_value = spec.it_interval; + } + ti = timer_create(CLOCK_REALTIME, &se, &tt); + //cout << "***create timer " << msecs << " msecs\n"; + if (ti == -1) { + piCout << "Can`t create RT timer for " << interval_ms << " msecs: " << errorString(); + return false; + } + timer_settime(tt, flags, &spec, 0); + return true; +} + + +bool _PITimerImp_RT::stopTimer() { + if (ti < 0) return true; + timer_delete(tt); + ti = -1; + tt = 0; + return true; +} + +#endif + + + + +_PITimerImp_Pool::_PITimerImp_Pool(): _PITimerImp_Thread() { + wait_dt = wait_dd = wait_tick = 0; + //piCout << "new _PITimerImp_Pool"; +} + + +_PITimerImp_Pool::Pool::Pool(): PIThread() { + setName("__S__PITimerImp_Pool::Pool"); + needLockRun(true); + timers.reserve(64); + start(2); +} + + +_PITimerImp_Pool::Pool::~Pool() { + stop(); + if (!waitForFinish(100)) + terminate(); + timers.clear(); +} + + +_PITimerImp_Pool::Pool * _PITimerImp_Pool::Pool::instance() { + static Pool pool; + return &pool; +} + + +void _PITimerImp_Pool::Pool::add(_PITimerImp_Pool * t) { + //piCout << "add ..."; + lock(); + if (!timers.contains(t)) + timers << t; + unlock(); + //piCout << "add done"; +} + + +void _PITimerImp_Pool::Pool::remove(_PITimerImp_Pool * t) { + //piCout << "remove ..."; + lock(); + timers.removeOne(t); + unlock(); + //piCout << "remove done"; +} + + +void _PITimerImp_Pool::Pool::run() { + piForeach (_PITimerImp_Pool * t, timers) + t->threadFunc(); + //while (t->threadFunc()); +} + + +bool _PITimerImp_Pool::startTimer(double interval_ms) { + prepareStart(interval_ms); + Pool::instance()->add(this); + return true; +} + + +bool _PITimerImp_Pool::stopTimer() { + Pool::instance()->remove(this); + return true; +} + + + + + +PITimer::PITimer(): PIObject() { + piMonitor.timers++; + imp_mode = PITimer::Thread; + initFirst(); +} + + +PITimer::PITimer(PITimer::TimerImplementation ti): PIObject() { + piMonitor.timers++; + imp_mode = ti; + initFirst(); +} + + +PITimer::PITimer(TimerEvent slot, void * data, PITimer::TimerImplementation ti): PIObject() { + piMonitor.timers++; + imp_mode = ti; + initFirst(); + data_t = data; + ret_func = slot; +} + + +PITimer::~PITimer() { + piMonitor.timers--; + destroy(); +} + + +void PITimer::initFirst() { + setProperty("interval", 0.); + lockRun = false; + data_t = 0; + ret_func = 0; + imp = 0; + init(); +} + + +void PITimer::init() { + destroy(); + switch (imp_mode) { + case PITimer::Pool: imp = new _PITimerImp_Pool(); break; + case PITimer::ThreadRT: +#ifdef PIP_TIMER_RT + imp = new _PITimerImp_RT(); + break; +#else + piCoutObj << "Warning: \"ThreadRT\" is not available at this system! Using \"Thread\"."; +#endif + case PITimer::Thread: imp = new _PITimerImp_Thread(); break; + default: piCout << "Fatal: invalid implementation() of" << this << "!"; abort(); + } + if (imp == 0) return; + imp->tfunc = tickImpS; + imp->parent = this; +} + + +void PITimer::destroy() { + //piCout << "destroy" << this << imp; + if (imp == 0) return; + delete imp; + imp = 0; +} + + +void PITimer::tickImp() { + if (!isRunning()) return; + if (lockRun) lock(); + if (ret_func != 0) ret_func(data_t, 1); + tick(data_t, 1); + tickEvent(data_t, 1); + piForeach (Delimiter & i, delims) { + if (i.delim > ++(i.tick)) continue; + i.tick = 0; + if (i.slot != 0) i.slot(data_t, i.delim); + else if (ret_func != 0) ret_func(data_t, i.delim); + tick(data_t, i.delim); + tickEvent(data_t, i.delim); + } + if (lockRun) unlock(); +} + + +bool PITimer::waitForFinish(int timeout_msecs) { + if (timeout_msecs < 0) { + while (isRunning()) + msleep(1); + return true; + } + PITimeMeasurer tm; + while (isRunning() && tm.elapsed_m() < timeout_msecs) + msleep(1); + return tm.elapsed_m() < timeout_msecs; +} diff --git a/src/thread/pitimer.h b/src/thread/pitimer.h new file mode 100755 index 00000000..452d9793 --- /dev/null +++ b/src/thread/pitimer.h @@ -0,0 +1,309 @@ +/*! \file pitimer.h + * \brief Timer +*/ +/* + PIP - Platform Independent Primitives + Timer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PITIMER_H +#define PITIMER_H + +#include "pithread.h" +#include "pitime.h" + + +typedef void (*TimerEvent)(void * , int ); + +class PITimer; + +class _PITimerBase { + friend class PITimer; +public: + _PITimerBase(); + virtual ~_PITimerBase() {stop();} + + double interval() const {return interval_;} + void setInterval(double i); + + // ! \brief Return \c true if thread is running + bool isRunning() const {return running_;} + + bool isStopped() const {return !running_;} + + bool start() {return start(interval_);} + bool start(double interval_ms); + void startDeferred(double delay_ms) {startDeferred(interval_, delay_ms);} + void startDeferred(double interval_ms, double delay_ms); + void startDeferred(PIDateTime start_datetime) {startDeferred(interval_, start_datetime);} + void startDeferred(double interval_ms, PIDateTime start_datetime); + + bool stop(); + +protected: + typedef void(*TickFunc)(PITimer*); + + virtual bool startTimer(double interval_ms) = 0; + virtual bool stopTimer() = 0; + + double interval_, deferred_delay; + bool deferred_, deferred_mode; // mode: true - date, false - delay + volatile bool running_; + PIDateTime deferred_datetime; + PITimer * parent; + TickFunc tfunc; +}; + + + +class _PITimerImp_Thread: public _PITimerBase { +public: + _PITimerImp_Thread(); + virtual ~_PITimerImp_Thread(); +protected: + void prepareStart(double interval_ms); + bool threadFunc(); // returns true if repeat is needed + int wait_dt, wait_dd, wait_tick; +private: + virtual bool startTimer(double interval_ms); + virtual bool stopTimer(); + static void threadFuncS(void * d) {((_PITimerImp_Thread*)d)->threadFunc();} + void adjustTimes(); + + PIThread thread_; + PISystemTime st_time, st_inc, st_wait, st_odt; +}; + + +#ifdef PIP_TIMER_RT +class _PITimerImp_RT: public _PITimerBase { +public: + _PITimerImp_RT(); + virtual ~_PITimerImp_RT() {stop();} +protected: +private: + virtual bool startTimer(double interval_ms); + virtual bool stopTimer(); + static void threadFuncS(sigval sv) {((_PITimerImp_RT * )sv.sival_ptr)->tfunc(((_PITimerImp_RT * )sv.sival_ptr)->parent);} + + int ti; + itimerspec spec; + timer_t tt; + sigevent se; +}; +#endif + + +class _PITimerImp_Pool: public _PITimerImp_Thread { +public: + _PITimerImp_Pool(); + virtual ~_PITimerImp_Pool() {stop();} +private: + class Pool: public PIThread { + public: + Pool(); + ~Pool(); + static Pool * instance(); + void add(_PITimerImp_Pool * t); + void remove(_PITimerImp_Pool * t); + void run(); + PIVector<_PITimerImp_Pool * > timers; + }; + virtual bool startTimer(double interval_ms); + virtual bool stopTimer(); +}; + + + + +class PITimer: public PIObject { + PIOBJECT(PITimer) +public: + + //! \brief Constructs timer with PITimer::Thread implementation + explicit PITimer(); + + //! \brief Timer implementations + enum TimerImplementation { + Thread /*! Timer works in his own thread. Intervals are measured by the system time */ = 0x01, + ThreadRT /*! Using POSIX timer with SIGEV_THREAD notification. \attention Doesn`t support on Windows and Mac OS! */ = 0x02, + // SignalRT /*! */ = 0x03, + Pool /*! Using single TimerPool for all timers with this implementation. TimerPool works as Thread implementation and + * sequentially executes all timers. \attention Use this implementation with care! */ = 0x04 + }; + + //! \brief Constructs timer with "ti" implementation + explicit PITimer(TimerImplementation ti); + + //! \brief Constructs timer with "slot" slot, "data" data and "ti" implementation + explicit PITimer(TimerEvent slot, void * data = 0, TimerImplementation ti = Thread); + + virtual ~PITimer(); + + + //! \brief Returns timer implementation + PITimer::TimerImplementation implementation() const {return imp_mode;} + + //! \brief Returns timer loop delay in milliseconds + double interval() const {return imp->interval_;} + + //! \brief Set timer loop delay in milliseconds + EVENT_HANDLER1(void, setInterval, double, ms) {setProperty("interval", ms); imp->setInterval(ms);} + + //! \brief Returns if timer is started + bool isRunning() const {return imp->running_;} + + //! \brief Returns if timer is not started + bool isStopped() const {return !imp->running_;} + + EVENT_HANDLER0(bool, start) {return imp->start();} + EVENT_HANDLER1(bool, start, int, interval_ms_i) {setInterval(double(interval_ms_i)); return imp->start(double(interval_ms_i));} + EVENT_HANDLER1(bool, start, double, interval_ms_d) {setInterval(interval_ms_d); return imp->start(interval_ms_d);} + EVENT_HANDLER0(bool, restart) {imp->stop(); return imp->start();} + EVENT_HANDLER1(void, startDeferred, double, delay_ms) {imp->startDeferred(delay_ms);} + EVENT_HANDLER2(void, startDeferred, double, interval_ms, double, delay_ms) {imp->startDeferred(interval_ms, delay_ms);} + EVENT_HANDLER1(void, startDeferred, PIDateTime, start_datetime) {startDeferred(imp->interval_, start_datetime);} + EVENT_HANDLER2(void, startDeferred, double, interval_ms, PIDateTime, start_datetime) {imp->startDeferred(interval_ms, start_datetime);} + + EVENT_HANDLER0(bool, stop) {return imp->stop();} + bool waitForFinish() {return waitForFinish(-1);} + bool waitForFinish(int timeout_msecs); + + //! \brief Set custom data + void setData(void * data_) {data_t = data_;} + + //! \brief Set timer tick function + void setSlot(TimerEvent slot) {ret_func = slot;} + + //! \brief Returns common data passed to tick functions + void * data() const {return data_t;} + + void needLockRun(bool need) {lockRun = need;} + EVENT_HANDLER0(void, lock) {mutex_.lock();} + EVENT_HANDLER0(void, unlock) {mutex_.unlock();} + + //! \brief Add frequency delimiter \b delim with optional delimiter slot \b slot. + void addDelimiter(int delim, TimerEvent slot = 0) {delims << Delimiter(slot, delim);} + + //! \brief Remove all frequency delimiters \b delim. + void removeDelimiter(int delim) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].delim == delim) {delims.remove(i); i--;}} + + //! \brief Remove all frequency delimiters with slot \b slot. + void removeDelimiter(TimerEvent slot) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].slot == slot) {delims.remove(i); i--;}} + + //! \brief Remove all frequency delimiters \b delim with slot \b slot. + void removeDelimiter(int delim, TimerEvent slot) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].slot == slot && delims[i].delim == delim) {delims.remove(i); i--;}} + + void setDelimiterValue(int delim, int value) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].delim == delim) delims[i].tick = value;} + void setDelimiterValue(TimerEvent slot, int value) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].slot == slot) delims[i].tick = value;} + void setDelimiterValue(int delim, TimerEvent slot, int value) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].slot == slot && delims[i].delim == delim) delims[i].tick = value;} + int delimiterValue(int delim) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].delim == delim) return delims[i].tick; return -1;} + int delimiterValue(int delim, TimerEvent slot) {for (int i = 0; i < delims.size_s(); ++i) if (delims[i].slot == slot && delims[i].delim == delim) return delims[i].tick; return -1;} + EVENT_HANDLER0(void, clearDelimiters) {delims.clear();} + + EVENT2(tickEvent, void * , data_, int, delimiter) + +//! \handlers +//! \{ + + /** \fn bool start() + * \brief Start timer with \a interval() loop delay + * \details Start execution of timer functions with frequency = 1 / msecs Hz. */ + + /** \fn bool start(int msecs) + * \brief Start timer with \b msecs loop delay + * \details Start execution of timer functions with frequency = 1 / msecs Hz. */ + + /** \fn bool start(double msecs) + * \brief Start timer with \b msecs loop delay + * \details Start execution of timer functions with frequency = 1. / msecs Hz. + * Instead of \a start(int msecs) function this variant allow start timer + * with frequencies more than 1 kHz */ + + //! \fn bool restart() + //! \brief Stop and start timer with \a interval() loop delay + + //! \fn bool stop() + //! \brief Stop timer + + /** \fn void deferredStart(double delay_msecs) + * \brief Start timer with \b interval() loop delay after \b delay_msecs delay. + * \details Timer wait \b delay_msecs milliseconds and then normally starts with + * \b interval() loop delay. */ + + /** \fn void deferredStart(const PIDateTime & start_datetime) + * \brief Start timer with \b interval() loop delay after \b start_datetime date and time. + * \details Timer wait until \b start_datetime and then normally starts with + * \b interval() loop delay. */ + + /** \fn void deferredStart(double interval_msecs, double delay_msecs) + * \brief Start timer with \b interval_msecs loop delay after \b delay_msecs delay. + * \details Timer wait \b delay_msecs milliseconds and then normally starts with + * \b interval_msecs loop delay. */ + + /** \fn void deferredStart(double interval_msecs, const PIDateTime & start_datetime) + * \brief Start timer with \b interval_msecs loop delay after \b start_datetime date and time. + * \details Timer wait until \b start_datetime and then normally starts with + * \b interval_msecs loop delay. */ + + //! \fn void clearDelimiters() + //! \brief Remove all frequency delimiters + +//! \} +//! \events +//! \{ + + /** \fn void tickEvent(void * data, int delimiter) + * \brief Raise on timer tick + * \details \b Data can be set with function \a setData(void * data) or from constructor. + * \b Delimiter if frequency delimiter, 1 for main loop. */ + + +//! \} + +protected: + struct Delimiter { + Delimiter(TimerEvent slot_ = 0, int delim_ = 1) {slot = slot_; delim = delim_; tick = 0;} + TimerEvent slot; + int delim; + int tick; + }; + + void initFirst(); + void init(); + void destroy(); + + static void tickImpS(PITimer * t) {t->tickImp();} + void tickImp(); + + //! Virtual timer execution function, similar to "slot" or event \a void timeout(void * data, int delimiter). + //! By default is empty. + virtual void tick(void * data_, int delimiter) {} + + void * data_t; + volatile bool lockRun; + PIMutex mutex_; + TimerEvent ret_func; + TimerImplementation imp_mode; + PIVector delims; + + _PITimerBase * imp; + +}; + + +#endif // PITIMER_H diff --git a/utils/code_model_generator/CMakeLists.txt b/utils/code_model_generator/CMakeLists.txt new file mode 100755 index 00000000..16a4e75f --- /dev/null +++ b/utils/code_model_generator/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(pip_cmg "main.cpp") +target_link_libraries(pip_cmg pip) +if (DEFINED LIB) + install(TARGETS pip_cmg DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) +endif () diff --git a/utils/code_model_generator/Makefile b/utils/code_model_generator/Makefile new file mode 100644 index 00000000..383b9f2a --- /dev/null +++ b/utils/code_model_generator/Makefile @@ -0,0 +1,209 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/andrey/linux_build/libs + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/andrey/linux_build/libs + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -E cmake_progress_start /home/andrey/linux_build/libs/CMakeFiles /home/andrey/linux_build/libs/pip/utils/code_model_generator/CMakeFiles/progress.marks + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/code_model_generator/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/andrey/linux_build/libs/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/code_model_generator/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/code_model_generator/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/code_model_generator/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/rule: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/rule +.PHONY : pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/rule + +# Convenience name for target. +pip_cmg: pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/rule +.PHONY : pip_cmg + +# fast build rule for target. +pip_cmg/fast: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/build.make pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/build +.PHONY : pip_cmg/fast + +main.o: main.cpp.o +.PHONY : main.o + +# target to build an object file +main.cpp.o: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/build.make pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/build.make pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/build.make pip/utils/code_model_generator/CMakeFiles/pip_cmg.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... pip_cmg" + @echo "... rebuild_cache" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/utils/code_model_generator/cmake_install.cmake b/utils/code_model_generator/cmake_install.cmake new file mode 100644 index 00000000..73365251 --- /dev/null +++ b/utils/code_model_generator/cmake_install.cmake @@ -0,0 +1,60 @@ +# Install script for directory: /home/andrey/linux_build/libs/pip/utils/code_model_generator + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}/usr/bin/pip_cmg" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/usr/bin/pip_cmg") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}/usr/bin/pip_cmg" + RPATH "") + ENDIF() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/usr/bin/pip_cmg") + IF (CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + ENDIF (CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + IF (CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + ENDIF (CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) +FILE(INSTALL DESTINATION "/usr/bin" TYPE EXECUTABLE FILES "/home/andrey/linux_build/libs/pip/utils/code_model_generator/pip_cmg") + IF(EXISTS "$ENV{DESTDIR}/usr/bin/pip_cmg" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/usr/bin/pip_cmg") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}/usr/bin/pip_cmg") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/usr/bin/pip_cmg") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + diff --git a/utils/code_model_generator/main.cpp b/utils/code_model_generator/main.cpp new file mode 100755 index 00000000..292ca1f4 --- /dev/null +++ b/utils/code_model_generator/main.cpp @@ -0,0 +1,263 @@ +/* + PIP - Platform Independent Primitives + Code model generator + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picli.h" +#include "picodeparser.h" + + +void usage() { + piCout << Bold << "PIP Code model generator"; + piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine; + piCout << Green << Bold << "Usage:" << Default << "\"pip_cmg [-hqPpEs] -o [-I] [-I] [...] [-D] [-D] [...] [] [] [...]\"" << NewLine; + piCout << Green << Bold << "Details:"; + piCout << "-h " << Green << "- display this message and exit"; + piCout << "-q " << Green << "- quiet, no debug output to console"; + piCout << "-P " << Green << "- print list of all parsed files to console before exit"; + piCout << "-p " << Green << "- print list of all parsed files without file with \"main\" function to console before exit"; + piCout << "-E " << Green << "- write only enums"; + piCout << "-s " << Green << "- single file (don`t follow includes)"; + piCout << "-o " << Green << "- output file for code model without extension (e.g. \"ccm\" - files \"ccm.h\" and \"ccm.cpp\" will be created)"; + piCout << "-I " << Green << "- add include dir (e.g. -I.. -I../some_dir -I/usr/include)"; + piCout << "-D " << Green << "- add define to preprocessor, define PICODE is always defined (e.g. -DMY_DEFINE will add MY_DEFINE define)"; + piCout << " " << Green << "- add file to code model, all includes of this file will be proceed (e.g. \"main.cpp\")"; +} + + +void makeClassInfo(PIFile & f, const PICodeParser::Entity * e) { + f << "\n\tci = new ClassInfo();\n"; + f << "\t(*classesInfo)[\"" << e->name << "\"] = ci;\n"; + f << "\tci->name = \"" << e->name << "\";\n"; + piForeachC (PICodeParser::Entity * p, e->parents) + f << "\tci->parents << \"" << p->name << "\";\n"; + piForeachC (PICodeParser::Member & m, e->members) { + f << "\tci->variables << TypeInfo(\"" << m.name << "\", \"" << m.type << "\""; + if (m.attributes != 0) { + bool fir = true; + f << ", "; + if (m.attributes[PICodeParser::Const]) {if (fir) fir = false; else f << " | "; f << "Const";} + if (m.attributes[PICodeParser::Static]) {if (fir) fir = false; else f << " | "; f << "Static";} + if (m.attributes[PICodeParser::Mutable]) {if (fir) fir = false; else f << " | "; f << "Mutable";} + if (m.attributes[PICodeParser::Volatile]) {if (fir) fir = false; else f << " | "; f << "Volatile";} + if (m.attributes[PICodeParser::Inline]) {if (fir) fir = false; else f << " | "; f << "Inline";} + if (m.attributes[PICodeParser::Virtual]) {if (fir) fir = false; else f << " | "; f << "Virtual";} + } + f << ");\n"; + } + PIString arg; + piForeachC (PICodeParser::Member & m, e->functions) { + if (e->name.findCWord(m.name) >= 0) continue; + f << "\tci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back());\n"; + f << "\tfi->name = \"" << m.name << "\";"; + f << " fi->return_type = TypeInfo(\"\", \"" << m.type << "\""; + if (m.attributes[PICodeParser::Const] || m.attributes[PICodeParser::Static]) { + bool fir = true; + f << ", "; + if (m.attributes[PICodeParser::Const]) {if (fir) fir = false; else f << " | "; f << "Const";} + if (m.attributes[PICodeParser::Static]) {if (fir) fir = false; else f << " | "; f << "Static";} + } + f << ");\n"; + //piCout << "write func" << m.name; + piForeachC (PIString & a, m.arguments_full) { + //piCout << "write arg" << a; + f << "\tfi->arguments << TypeInfo("; + arg = a; + bool con = false; + arg.prepend(" "); + if (arg.find(" const ") >= 0) { + arg.replaceAll(" const ", " "); + con = true; + } + arg.trim(); + int ts = 0; + for (ts = arg.size_s() - 1; ts > 0; --ts) + if (!_isCChar(arg[ts]) && !(arg[ts].isDigit())) break; + f << "\"" << arg.takeRight(arg.size_s() - ts - 1).trim() << "\", "; + f << "\"" << arg.trim() << "\""; + if (con) f << ", Const"; + f << ");\n"; + } + } +} + + +void makeEnumInfo(PIFile & f, const PICodeParser::Enum * e) { + if (e->name.isEmpty()) { + f << "\n\tei = (*enumsInfo)[\"\"];\n"; + } else { + f << "\n\tei = new EnumInfo();\n"; + f << "\t(*enumsInfo)[\"" << e->name << "\"] = ei;\n"; + f << "\tei->name = \"" << e->name << "\";\n"; + } + piForeachC (PICodeParser::Enumerator & m, e->members) + f << "\tei->members << PICodeInfo::EnumeratorInfo(\"" << m.first << "\", " << m.second << ");\n"; +} + + +void writeModel(PICodeParser & parser, const PIString out, bool only_enums) { + PIVector ventities; + PIString defname = out.replaceAll(".", "_").replaceAll("/", "_").toUpperCase() + "_H"; + + PISet inc_files; + piForeachC (PICodeParser::Entity * e, parser.entities) + if (e->name.find("::") < 0 && !e->name.startsWith("_PI")) + inc_files << e->file; + + PIFile f(out + ".cpp"); + f.clear(); + f.open(PIIODevice::WriteOnly); + f << "// Generated by \"PIP Code model generator\" " << PIDateTime::current().toString("dd.MM.yyyy hh:mm:ss\n\n"); + f << "#include \n#include \"" << out << ".h\"\n\nusing namespace PICodeInfo;\n\n"; + if (!only_enums) { + PIVector incf = inc_files.toVector(); + piForeachC (PIString & i, incf) { + if (i != parser.mainFile()) + f << "#include \"" << i << "\"\n"; + } + f << "\n"; + PIString entry, argtype, rettype, args; + piForeachC (PICodeParser::Entity * e, parser.entities) { + if (e->name.find("::") >= 0 || e->name.startsWith("_PI")) continue; + entry.clear(); + entry << "\nPIVariant execFunction(" << e->name << " * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) {\n"; + const PIVector & fl(e->functions); + bool efunc = true; + piForeachC (PICodeParser::Member & m, fl) { + if (m.name.startsWith("__stat") || m.attributes[PICodeParser::Static]) continue; + //piCout << e->name << m.name << m.visibility; + args.clear(); + rettype = m.type; + if (rettype.startsWith("const") && rettype.endsWith("&")) + rettype.cutLeft(5).cutRight(1).trim(); + if (rettype.endsWith("&")) continue; + bool aok = true, ret = (m.type != "void"); + if (m.arguments_full.size() > 4 || m.visibility != PICodeParser::Public) continue; + for (int i = 0; i < m.arguments_full.size_s(); ++i) { + if (i > 0) args << ", "; + argtype = m.arguments_type[i]; + if (argtype.startsWith("const") && argtype.endsWith("&")) + argtype.cutLeft(5).cutRight(1).trim(); + if (argtype.endsWith("&")) { + aok = false; + continue; + } + //entry << "(" << m.arguments_type[i] << ")"; + //if (parser.isEnum(m.arguments_type[i])) entry << "(int)"; + args << "arg" << i << ".toValue<" << argtype << " >()"; + } + if (!aok) continue; + efunc = false; + entry << "\tif (strcmp(function, \"" << m.name << "\") == 0) {"; + if (ret) entry << "return PIVariant::fromValue<" << rettype << " >("; + entry << "object->" << m.name << "(" << args << ")"; + if (ret) entry << ");"; + else entry << "; return PIVariant();"; + entry << "}\n"; + } + if (efunc) continue; + f << entry << "\tPICout(AddNewLine) << \"Can`t find function \\\"\" << function << \"\\\" in " + << e->type << " \\\"" << e->name << "\\\"!\";\n\treturn PIVariant();\n}\n"; + ventities << e; + } + } + + f << "\n\n__ClassInfo_" << defname << "_Initializer__::__ClassInfo_" << defname << "_Initializer__() {\n"; + f << "\tif (_inited_) return;\n\t_inited_ = true;\n\n"; + if (!only_enums) + f << "\tClassInfo * ci;\n\tTypeInfo * ni;\n\tFunctionInfo * fi;\n"; + f << "\tEnumInfo * ei;\n"; + f << "\t(*enumsInfo)[\"\"] = new EnumInfo();\n"; + if (!only_enums) { + f << "\n\n// Classes\n"; + piForeachC (PICodeParser::Entity * e, parser.entities) { + if (e->name.startsWith("_PI")) continue; + makeClassInfo(f, e); + } + } + f << "\n// Enums\n"; + piForeachC (PICodeParser::Enum & e, parser.enums) + makeEnumInfo(f, &e); + f << "}\n"; + f << "\n\nbool __ClassInfo_" << defname << "_Initializer__::_inited_ = false;\n"; + f.close(); + + + f.setPath(out + ".h"); + f.clear(); + f.open(PIIODevice::WriteOnly); + f << "// Generated by \"PIP Code model generator\" " << PIDateTime::current().toString("dd.MM.yyyy hh:mm:ss\n\n"); + f << "#ifndef " << defname << "\n#define " << defname << "\n\n"; + f << "#include \"pivariant.h\"\n#include \"picodeinfo.h\""; + if (!only_enums) { + f << "\n\n"; + piForeachC (PICodeParser::Entity * e, ventities) + f << e->type << " " << e->name << ";\n"; + f << "\n"; + piForeachC (PICodeParser::Entity * e, ventities) { + f << "\nPIVariant execFunction(" << e->name << " * object, const char * function, const PIVariant & arg0 = PIVariant(), \ +const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant());"; + } + } + f << "\n\n\nclass __ClassInfo_" << defname << "_Initializer__ {\n"; + f << "public:\n\t__ClassInfo_" << defname << "_Initializer__();\n\tstatic bool _inited_;\n};\n"; + f << "\nstatic __ClassInfo_" << defname << "_Initializer__ __classinfo_" << defname.toLowerCase() << "_initializer__;\n"; + f << "\n\n#endif // " << defname << "\n"; + f.close(); +} + + +int main(int argc, char * argv[]) { + PICLI cli(argc, argv); + cli.setOptionalArgumentsCount(-1); + cli.addArgument("output", true); + cli.addArgument("help"); + cli.addArgument("quiet"); + cli.addArgument("Enum"); + cli.addArgument("print"); + cli.addArgument("Print"); + cli.addArgument("single"); + if (cli.hasArgument("help") || cli.argumentValue("output").isEmpty() || cli.optionalArguments().isEmpty()) { + usage(); + return 0; + } + piDebug = !cli.hasArgument("quiet"); + PICodeParser parser; + piForeachC (PIString & a, cli.rawArguments()) { + if (a.startsWith("-I")) parser.includeDirectory(a.mid(2)); + if (a.startsWith("-D")) parser.addDefine(a.mid(2), PIString()); + } + PIStringList files; + piForeachC (PIString & a, cli.optionalArguments()) + if (!a.startsWith("-")) files << a; + piCout << Cyan << Bold << "Parse files" << files << "..."; + parser.parseFiles(files, !cli.hasArgument("single")); + piCout << Cyan << Bold << "Parsing done"; + piCout << Cyan << Bold << "Writing code model ..."; + writeModel(parser, cli.argumentValue("output"), cli.hasArgument("Enum")); + piCout << Cyan << Bold << "Writing done"; + if (cli.hasArgument("print") || cli.hasArgument("Print")) { + bool womain = cli.hasArgument("print"); + piDebug = true; + PIStringList pf(parser.parsedFiles()); + piForeachC (PIString & f, pf) { + if ((womain && (f != parser.mainFile())) || !womain) + piCout << f; + } + } + return 0; +}; diff --git a/utils/code_model_generator/main_test.cpp b/utils/code_model_generator/main_test.cpp new file mode 100755 index 00000000..103aeb4f --- /dev/null +++ b/utils/code_model_generator/main_test.cpp @@ -0,0 +1,48 @@ +/* + PIP - Platform Independent Primitives + Code model generator + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pitimer.h" +#include "test.h" + +void event(void * , int d) { + piCout << "tick" << d; +} + +PITimer tm; + +int main(int argc, char * argv[]) { + //tm.setSlot(event); + //tm.start(200); + /*execFunction(&tm, "setSlot", PIVariant::fromValue(event)); + execFunction(&tm, "start", 200); + piMSleep(1000); + execFunction(&tm, "addDelimiter", 2); + piMSleep(1000); + execFunction(&tm, "stop"); + execFunction(&tm, "stop_"); + piMSleep(1000);*/ + typedef PIMap::value_type mpair; + piForeachC (mpair & i, *(PICodeInfo::classesInfo)) + piCout << *i.second; + piCout << "\n\n"; + typedef PIMap::value_type epair; + piForeachC (epair & i, *(PICodeInfo::enumsInfo)) + piCout << *i.second; + return 0; +}; diff --git a/utils/code_model_generator/pip_cmg b/utils/code_model_generator/pip_cmg new file mode 100755 index 0000000000000000000000000000000000000000..b89cb56285f7738a1a640f20d61185f1023fe726 GIT binary patch literal 92888 zcmd443v^UP);8RM1Y1QC6%`dFYE--@iV6xEg>X^PhCpsOG=T&<5J)5)42l>`4yJ7n z;w2-aMp035L}e5ZFVS!@LB$aPov5e?j8kn;8AQwsX#VHfRp)f4W#)bVfBoNDAFNK* zuG;t7bv@Om@65VkXhK4Q$NAUA)73+0Q*)xX9}6ezx_+Ki&*7fFo<5%5o^B{+UB7DJ z;FAgzev(j@h)-91#sD5OFVV}-v4Htu9g5|H#Nz=iKUZFo;Nge#o)lfb?WzRNw!bEM z`6=q+@$>>Q<+2{2XE*A1qmG{xFy)8!l)+B`Z~(IT83LFer_T5HV9~~-6FeL5PxA7! z8@T*9^`lS^^xyp>e~9;tMt!V)X`tnY^hi7xm6lArsI=&U(vlgKRToy2U3jssBQ5KP z-8dG1wH@S{iVtaf;zQrDKCxSu121N+nsCgpo=068`sv`)Q$P5n5Ovq%lZwv~Oi%J8 zrX>0nBb$_(S=|@By+?rIr1Sy3z-zcCvx}$iHAkcjuj}F&QrolZU1>u+Uhg#tiC*t< zo`jU1bv{q;BN7u6pj2v#7hF7vnG?EPn^-$PAfZf0Z>q;reVW(P%ahpK+uX~O zp5aMNJiJ%J;$EJy=@Y2S4J0%FMk2k*w+M0H1MgiO$>{1OEYee+)bU z`H3;G(>MW?mEbcqrfwSY)A1?Crvjf!d}iU}{G07$klv2ZTmx4looDhjNave;Y!Wtr z9aFdf`TOu$h|m4_Jc!Rj`0(E!@p%}ZMfm&)pGWX{6racNX~5@ke4fB(F+NY?!+%ff z#IwYt&meu)0&DDwL z?*E}~dPnKJA?oAL*UY+kLiL8dtGd7UAh`Zs(K909(vIczpU!MxckBMYqLJtJ$uBoRX^W4>ew%n z@4NTX)+6>0JnH7NAH41T8KobcoUs3^9VuVD{rrLMJ$F2Q+e1(M@WqEaA75X7(FysO9da*t-^xd0&8?Y@B|_ z#MRfyV62%?-lP}-g#Qso-x^o{EC)36kN7>};2+}n_c_YJHulBUUl^^H@h>9|-|5Fh zqrB_l@UMxp@8~#vyK*2l|41LiVCwuMyf2RaNlrrMAL}pUz-|5!{yq->*f@W6jkE8C zIQ(UC`t_9YSqmV4f1E$BkAwYj_;U_7${`{B3vv3Y!#dahAx{2VasF8nr+=5Y_6WxD zKM-f%m2vzZjpP4%9RJtj=ns$6cTb%CN5r+?%Te>h{s-geo8s_Kh_mOWxcbaE|DG79 z-#c;k9UjN;qB#2=iNo&|S6>syzavinPvYRW;^J+8oPP%*ez#wrj&^#I4;RsX6WBU8tbq5fMe~up7sOZX^+du-?T>x+G7Izmi}j~pYf0VxeE+m zJUz*Kp3!Fq^owm@>bYrJl6RA-FNc1y_Ai5e+rb~z;=jAt-p@t(S0SE!G5+ce{7o~G zyuA#+6VV>qtt2naVtalBcsbgW>o5Al&-Orlp{f4`?MZtadH17!`xvy3@y{UGQ+)vO z0X@m@YSeR20&;=R0RLU!r{Nx+64Wnw#;HHjQw+wj?XwX6Sbl$!w>Jn*^CWv-VSJ8G z@*ZvE-OhNrEy+99wBKX!??LeAuyQo;2X*rQNuKwi{}S+H*puHUs88*llcJ( zd(dC14F59dxBQMIFZH57c0=BT;Yr?|peMWv^|9?Y0{r$No>7fG$4Qsja@sU}`d2hI@C$F^q$V9)p@@AW4BZw5aPtQ zfqm)dua_A7TR0xV{_~O0o?(c;^8wQ#giio|>dYkXBJibtAAn!1zX!md&iKXtatr(! z>u>gxSpVh2zV?{*-UdOLke3R198V4hzu58aeDGTce-1vE$hi$WMiT8IRQeAK)MB-+l18wg6~V%pLBHSQziyU)bn%pu zieT}~!KH;26~z@E|A;Xo{YAwyP4SqKgG4qa1lV@A4f#E`;Z@tBh7 z#g|X2oH?_2MlfrZ$6s(`f8U7g;LMU4Q!blS85~(slvPr~;_C>n)C z7@FWR--y9wmBGOoS(p1p3@t63QZeGj3~*uL$if*V<&~v{!LpeZ8J8HuvKhgdWu;kJ z!qycxU~ZNt7KAf|4D^2a%YwVi?s^Z zyEbKH1k1*jmqTh{g{jOAURqRqOJ(th|Ci3nE*z14i9aiAKzU_Fz(28Y(lom15?VNB z#HFzCh7r`u6+QT3aU-j9jMGg0O%taUPYPyST0XN3ngwSM4iwIqQcSPA#Ki3Ek$zb- zDyPTzn6Amlm{eL;QLKHSO$Ub@FfW@q0y2GtB{N63JhL;Py~6><4-qfi2-QaxmPgT| zEt=Jz6*G#8t6=q{K=Gt$BgS?RQnmlj_KqM$2igAN_ELyg-j5a zRyge9^$KKNRx$(e6D03+|LE%j6ngQ+em~-1MoG}mKP82wCASsN^!uGCGxAN4{hp`e z5AE#IQuwZ41O67EnH$$RbkzMxEit@rqrk6ycpfKB2JlewjI96ntK_Xgw$#i$Pa%~E@)Nic8-U5amU3uDIw$4ybrappQ;RQ-NMg~39%AL(}MhoN}7 zl$BPPNQiMao7l9&rMJoeBjGV5CvHsKkA25lN$Bl*4jjs&@M;{|4>W48onyynk zWu(t6E-yuUT~k^r_M>|f;riH#B|1^W>FjDJ(W8fHw+x}GyEIw(a*AhGpi9W$-#H%j zkYr-WZSUU=D1rZB9Qp6#Rp$`J@Nnp!2k{Ky?DFDC7z3me!5d?;qn?buDpO6oTEVg#%5IHa zQs}me4y$^$8N)eMHxfCx+%qo4M1t{b=*+U|^t;S>GG@4%nC1diboA=nQ%$FFnYyuu z#+0Q&I!%mS8E7Rhm338|H=T*KL{@BE{{{myiwleR1Sj2N0RQyLU~!edaz<&{q-j_h zJH^wAXZt4sJ6IftDR^L35iFW?-g)G88T>HgRy4DJQdOaUW-+9c-HNg?IheLsSXDT& zWLCz-$XAs3Wt8*>XO|bF9VeHe5ru3bmfAD?lL~{AWC4&}0mmQ~pnBnmNo;9E=;eOD z@J5Ih`3p;-iL`WfuzyKeg~V+?#tA5Oc||`g?8_lH+h07rJUAP=m1EgoHnVVwOq@lf zJ|K#CG+d1EIEGI5%+?HH6gLMISZ&Yd7_AlbPpPW%qsvy5&A@5}!e*s&&oO1vB!30H zl;QD@opCGXSLjrMd771zjQd911htA_e`Q5+k!Ld7*i%wbSXv$^gnk%nCQb8C3QY4) zE-WeapiyYLQ5+3aRT2a+xg48|;AG-?rWa42R6g4?S=N!B=^B5s%w*)(8FM;Te<-Co zW=}M|uw;g3^2}ls7jy1J?Zk=-U5TO@MV^ZSWz&l0%X^LZzcS%j?7{ zW|k*bbl2fnKB=P8kJXPe$(xRNV+J~2)~v$PN^Z5rAZRQ4%We%DL1)!Hx!fOMxO2tO zd1)TVazgQXSdv{Fj4sEsFo$ay;*E?;rWZ~tmeGC$I>l(y-F?@``!H)p5V6JnKyjQK zGx}jvgL1`#&Hhik+u0Rnuy?e9Xa0BgNk{TC1f0fq*F~6JV_GZLiyZ!`pKR}<8^nwZ z8Ka8y<}Wq`E-5q%*BtnndknYb4(ZjBEGL9I8|lp8hiV2BbHA$sFFjaXT3LZX;SjDf zeLv%3HV`*!|FwN&?UdyiHh8fA5{$9KZWwXxVE@I)4bIEE=Gqbdj0-Q(g?V{E=;tCt za~W<~Y(44pKi+5HKb}kJC+JLopb${{u%Ej?6@n1{KPw86omhEASoXDGHN znye+gc&4)e{{#yqPJK#A2~Nun^HjR^T|76M`gGuLd3hSt>E^i; z^+XAt^8gwk$#aj3pX7PK$Rq!r!tZd;9}WJ|0((7+9r_bX&>)GPKO4BB58%|nI(3>eNO=SwFr!hsq^<@hA=QBm9q%(zo`Z0yw{h7jp z1DWESGLtFJ3x_a;O~aWUjk_33@i4&0^jO@#V2X<%c}($~?}6!A9?xQ?XXE^wXTP5&GZ6~=Pjle z;@qC;MIO(3rs*Ef2BsMv&qk&fNMgli6V zbaYrv!6dZ+%G9j)j$4OR|LeFk5n6Vf>BV1`be!28xd5|~?I7zoGlekgBAW#6Nf=S& zi8Kk^i!h?W6Im{BZ^EgB7Ym$9xG&*_0;ds1D|jN+0{0~huX-Zo0-sMflkfzA(+LkJ z>=U>jVISd4f%_BABb+YqK*AFUrwW`&mZxVP6;e~{o1kNM8i12cOZzjB$@M3`{5MD}np}<9imlLiQI6!zc;c|gX2{#d* zAaFV14TOCH2MKQ?oGEY>;a0-w0?#45op7qa)r1w{6oG3A?;-3FxQ=i;;XS|7{(A{y zOosgeFC@(8Zjns_KSY?<=ORr4FCxsxdXePR10DdB|z?;^aM zaJ9gS@M^;40`Df=M0kS0dkAkJ>=Sq&;Z1}y1#TzYN;qBMgM_yeP8FD=Pe2h)5tyS; zU=LxBz#NSN?S%Inp#2<`0$8cQet|hU1^8SqvPoc$Qh^l0O#*YY3iKkpTwsn`fmFha z1?K1#;A8N}LV-Do1=0yu3(V0h(4TO*z#P>AnS>_@%+W0{oUl(|j&cD$zKmo7wr@yF ztl71vm)AOo-ux@TkP%@F2`-p3oh;GCD^4Y->2I_NgMY zeg3$>tb3BYIW1N#BLV-Ktvciq)MdD4r!i~Rcb}S&<5NSHuw)TfhZ57&P+Y|e^-Hr? zE=7T=0+d$}xP!dZ0RT}_4@eIe($$9aNKL8+BOPzA+<;<#;4UF;`W@+CpC+?bL%IoT z2a&2MwF|IeL7k9VzaxE6NZSo*y+i8#8KffC2Jr=`?31#hygDiGG}?(S1dNZC70Z9|G$)ic|b$LceeNpVI~_>Nu0 zmq>slTT8GOvWxfRj~nm*gI#!Vo!wXmb~!l`CAsP}s=RV36_g-CXyp2G)cemN(5z(? zyuQ2Dlx+F2L}GvT*!8QmI(1ep+F`UxHs%aNYS%A9WvFMG`q!gSbzqvxkWyN}(w!`Y z0Vkt0d6h5_E0Zlwb2&K(9blTsnGd9Vt<^Y0+zHRXx;+U`WumJfe8>?Ec|SS!OH=P5 zwXJ&*=q&w!ok;8<^y@Dj9WB;YltF(_i`8m!w$&Z@E!H--W|zr9sTNDQ#k)-|T+h+A zCTR%Px(PKGaOs;6vf5D_vi9I_MpKKm$>3U>TdeIS-)tRZuG#vPNsG15lviF8>6?h9 zVs)cbXtadn+TC5@{d)2ZUz-@JCu_qZB(&kti38R;XspHBD12S_gbi!9Cw1)-Sd3r{ zt+Oo!ANkbP@C*WrK!Gn?HT@gfHrrOaaiH%JI*zq;)m?x>dvu%B{)^3RdG~j8OzoK3 z1yQ*kv|)=YjBvdde-RsDJCT{DgoL#rsTuHo^8E9$)6f_Rn-Dw;N{=8+M2(*C{(w!% zcdrsGmI9i;l#nGjEBQB}SwjQ%B-d{AidMV5u+P`A@*t*owG?WF1T$o@06K?lDiyA$ zg7!m4b|fXN4IZnlfR}uu)sOH8kZr3MI7qh|iF?T!gD$ue5bIa=m3nXBY3bYT zDE8;&WUD*>1;H)0)t?FgKN%H_z+p_=jqA>ZMhHNli0fLc$4ry^TCBw;+hQ$pb4%RZ zQa88ED>FE|=Ni`CDq z9O&ja_Y)0H8e*~`86?y_*m35M%gI&qkO^Clp&N$l7qc^>rScL6Y)QWR;lo(72xXxL zsh7X=)*%eKuG!fwVO{W41VG11j#}9&g4W8j2d5U~`qY=mOGMBfiHIw4W1XW{1yTeG zirLa<0ve|osC=o(GcjEQd&uNKWeY;cs^+}=`QF%gi3W>p zoezh`hKCarFeNq=oL0v)2QP%{xokCoYp<+Akvm*67D5&yio+#?f$DO&bRw@=2S>AY zDJxqnCypvFjJyKW$qT_AH8M7mkHHTKq8S@QKn&Njw)5EdEIM;`sKtcU8E{-)L3XbC zGsnLcHd7`7j8jwQ!gVsv$*sH24?BwM#~tkEJx9ixRb95vR82%3(0G@K(?$COWP z!M7wBXGcO9V`C5}H&3!PAA@0R``8V2aN(#?vd+j>r9d}pg#rxAzhVx@%!tuAc~uh@ zgPa9BRMv+mEb&ZaPNF;*_bAd>dEcV%_&}+ECyOti@w{1Q{!SsWwc3=fWhor; zZ={%`OzAR#s2rpHD?l;I*Mfn^Zd{GIY1Am)J9SuL67}S&>Yq9~u*%|rT(0_QPe%uq zdwYPJmz$&Zz0Of(YD$j!92I$XLtpgS0*vurpu)DeREI5rR>q7kWL2@JEQUinR!a60 z5Yd|-GKDGcGKKPuNTHy;(u>~a^O+^-YfyWfc90+57>?BqkZPNfYr7%35D`F@zWw$C z+B5r+l1;<#D4T3m4mRTr8?=1_*wk5fLNhEgfoC_;-*nThWCQJ9MyhRTPGWc^6y)dn z7>HuSUz#~oI1@#*S{+3@c(i+m8rgfT&7He>$jn)8 zXTKnFHyUuE9Xtyi`M>w~O+mlz>(NC}bt8S^3AH3!$yj2!J&RXqJNM+uC;z8jys7d@ z-C?D9`rsQ*elrVXBcErY;cSFEnhQ9(@2TTa5M7ckeNn0-H$bhhtXLv9z-ih(Svl3T zcb)Zjy?W70pEat>fVCBy^-9XDyKF9Q5;hE2J2TZO*J~zOl}YV6d(J`qtVhDKI?{CK zU^T_X(Z@dwXbx68LSzlMJ27l?0fn^{S4$g4`$Bt=PgpZb1sTvQWl`mp*`FdFp`Ofio#(P%Nn^ZK|ApVchUy8TvY^$YwF(wiOE6q17vun7XvuN1n ztZEj%oOHSHeHA=)wO;tvKuEZrh#Flle0eQdmvZ5I5g|)(8u>S&MMDGHgMLgv&Z3vI zxq7t?RtZ)}W^b4swndwIst~*AO|HEji$ZtBGg|$E<2|~mAByc2XVFh#Vbb=Nwu|xi zeOMT24Rri{ZtT^z+mz$PpGY>Uvpg)d=d?@wJrx#3HScp^6tO@4aX?G3&Jn_r8pa=u zi;2H>6My@@r@2}RQK)`*M6twQFx_q6nD%>z&AR0uk=2N3w?3mIvJ|k?MIM)>`8NE8 zbFd-$8V>{V$72n!iq6H(s0xxefL>UCAMVTST9F_&bQftZ^Sw8aA118u~&w=6N1PWUE?8j+y6=!)ir# z9!A0Xd$oceBGvN;)xMLZ;QJa=X8}XzkyqIAE8EdceCS792S+E$9F>bM<`1p;99LL*^oqH9gn zP!Q-E+Orh)px(#U?1a_V2JDn{rt;=pGgGlkFIL&_)~Eeq+GGpjvViIZ7hJo5oU=zv)x^1v#HjTh_Q zLZhgM>HT$W+j(-a2(c-X?JJ}P`|pr~x@~P}9m=s@1Oib7XeF@40PO^t4bThPw7qVC z{sfj8AdkQkp_a%rj3<%n@CU5)t{__-{1#)Gb2>$R=s3}52Wp^)X$IP`Ntd8DSFLyR zIcl|=H_L&;^!`t;2!vTZPqg5(?>JViYg>fRv-qsQ=dBoRW`I+SHX^CO<({K%)cLlD zK(_;*?_y{#J_PNlF|^0%d}J&f0Mf7V`G+&ah>jU`x`|4VYQqu3QgZ@p&@?ycn$Q7x z6cuV|`-1Y<<)~GEcYGzgF!*X0R&-b{apY0GKvrOuPP_H?C-M;;VMbt)@hS)qAfcZW z7lRCdzd*wmiNnRN;N0ipysL2{bzl>zphYc_;?6C5I&|vn%N*51>j`GLs*BD?vUHPZ ze;@$3YY}OuQ5vky*Ru4^MQRRX4SK}YP7QZ2QuFTO!&Tq;f{IOH#ZTsvVGa=H<;N3p{|#;5Kj29#Pag3L^*JAdSME#`yJI(Za@#vRNx zs!!z_wg;5$u#KL7pv0_-WiJk)VcD|dfopf6K73c_#*IDD;bI+QW6aLory>?cJJa;1 zh?;q{Pu9ym^#N)zE}(>C%dddMOdg?#v=>l919v(#JXxj7R_eJFi(IK+r|TmRLjxEr zu0-p(c1kmsSFa5tZ$y29)F z+#P3N>;P<+CCFffi@$E`Oxq!KEmEhOVlnDW*81{iv0_=Qy)11TAzaB--ntaEu1BAW=bUm=kppF3FPdl2mB?? zy&9g7+P6^4=H7=?Y8L4lJO)F?ryeu)TXlWJ#?|m_-Ng(+k6R>VUmmyEq;*odP(!Cw5jv$Bf7QNkV$`E90e;(5-SIVxu{PSy)1b-= z;FIPg<`brNSKEaqrG>8dv}9sCi}z(HRJQ1EW5e8a8Q+f&eS-&xzA>W%{61=cUpgI? z6X19CR5Fa;H+f;~|8VcLb+Pd3!QgiR4-0DAyUjX@&+$Eojid22vSxSB04q8+LBscc zS||Ib)hrSGHSJwOYu9|&Ct=ga?ZK1Z5W>yDV}vlprztmUN;Z_)A65@4hw+}uV+GHv z=Ae@_C$TI6A|@|ft?+`Ia0>R9No^0>vpf#py;>n(hp>!Pf{bP?%zmBU^2BP~dM|kF z>nQEmle}g)pt;A$MUn7uubtmvy%);!-uVO2M*CF$*Wz=jUWiAo)vNJt97N%|;NknL zy~uW{JUrBjhiK~{KU|&ORXp-NnkMw=Xmv7tihvEZs3*VDZTF^-2RH7o5#r#w@Pk6L zIr#eM+^GpT|B=v4(L5KL4Vm!=%z_FWAM&z`pX^CJvUX)OsYEKtgFYM^)zwf!Fb!~c zBp&x2MYLq=7yPx0_wi}pI(PqLXRU{o86AP6=3``07tBNFAKV>mTC!FEA8mW*RS_&t zJkGvwXkQwZH>YFP`5ngtulmhu;)RFyZONR&T;&a9(2`J-wW8mEmOI9WD_3-_@M<|e zdnkkiv?FSpDnBvQ!KI)F-n)RG#;BPx?E9mh2 z^G>LkwO-br$R@86A3(pze$3ZuEO=tTHpsU|k(VLMb>hg z&6TIb`uHbcJ3f~9cm3N<{QDuq{U7(Q7mkuZIJAFH)b9VCf9GxcFa8}e*Y)pgWMlmM zEB*U3L`MC4LKOK1Wa;015E}LGyxl9%OTt;+Ku@?Ov@T>#z!VYA!ZQ12WI`=5p>115 z9UR#o04F^2B`_X)^DVbSp_M^EoDQD31CZ1)0{#XlA6q5j1}+fCkD(szw%rd!HBG4@ z%Lh5wH(rj~QR*_(=IP3UQQ7KN@GiiTgg8D`B9Lv9+bEwZpkR9l1$R$V=Toq7B{Uuo z)j3{DNx;(KfWVz#L12Ukd>2Lenl3LeQi@)QDS{3^-G(z^%?f*Wf_fV=!gphlz_mc=58IlvwtJeh zzVU?qu(c(Ncf>G$CD%^vM!^qZwVTltvhzS6`s=i&@~&NBbf6rD#{QRP!7p$Ks|21VlnGg)N&Q&plyWN86TOvDqJv)M@S#O2J`_2iO|38XK;{Bd}i z*aw+$1vupyhzr(xeaHRK&J@FS!;Y zIOtaZhvw~}!t7vUXx@$BjfYxB--T7gTyMBdBscWbN61aQAx%)U6c4mcM{ix)CE4ON zt)+>{)|I%9wA7ny^RJ(IVan z;+^6WCy0*&KEzkw@eSH@dqQ~Zw&dC~Q=k|wJ&fHN%4)?UG&VNxI)tG__zzpdE7`J< zGcX)+X&z+Yab~zj`x+oU_!b~qS@gL^llUasq)zhd0YN?(F- z(+ug2B!w#Tk#>rS#NeIw%6^8AR$(u2a0|ky&`|{sx{srohYPfhP0m{E!CuvBSrL9(hhmWZ-S!5Y_Un zAf2}!7?iTWNNGkY25vQ^FNlIygEZRo^MrJlAne-+0WfF?o(+uU)Na3PL1&lKUZ0pDwY;eth zVG}tv3a61_SHk+RaR}hH7u~7Kr+%z~HZo!9!WOFv+|imI_u|eRQ-IcLv8tU~=N3<$ zDX{%PT;DK2ixqTpwQg>q$*DiXG2vlVu;o8Yh`}kgO%9w4Iq8|HFmbBK&Pxq7BVM`Y zP^W(k56N<&ZVfcX5X_O7BXV%o?}p(`!Ba5=x2>q%oNTQGb)*u1FbLzXo>^nO^4VQ% zIcm-jZG*ZP3uX50gK&Vza27T#Nj)Jn**YHATAc-TIIERcD6(4H>SQ>E=cNhjIx&0% z46$|-hJQt#5jATowRs348BU7lYyl`;jchhpbQe$m&yvSK^mFMOLy17h~g9a@Y&&Y_1g$!~n)(tM2&*Z{6L*g$OP@v{d zMKt-%$nk=~1eP>gg-nub`8r11UI7R+B49fT>A-kE7Cm^+QW%8 zH7dQP{qW@ZZ==|5a0a*^Wq@l#(}q{FpF{6+eyjN*!P=j^;2B}SQa$(OoU;d>VvOdh z5IS03ScZmzXt~<_S7Ct&&sF=8&&TbQei&h-_4Pg}N8JHwc?Hg-`_2qDc*javBCEd$ zgyrZ`WUyNRExmsmT82aAE7C$mrnHEqh{4CCwAPf~$Wlbee58o96(}Ar^0QS}NOrne zF4V&ro{ZPnQ^}HA?Ep=_yBebU}?=HjR9>ZfTQt*hb54bYTR#$>FIw9R5 zq#Wq!s+$by-I}zzQKCi1P6DJCF;O5aTTg(K!-CE@f2SpNZ5u~GP1&X zI4AceY+182scWym2QVNH+^_J^}(J z_%uUyE!99<+=di>L{!&ZjrCV_IY}L|RU4`qs{6oSxaO!4#J*(X`KZ za5>F89axZNO1H8U(ztK5X9e*Ao4s; zdMzl>ar@QesPo^KUd3(UX}|+v<+ezFDz>9+`(@r+E@9$~syhIg zy%L%ylHIPGkFhM+ccC60#rkYDa_k9FPLn%vTBPeEen1~D?mohEe36- zL0jUW^%As)4BB-D?Rucu4gFvO`z`mS+3Ic7MLQo~R1Kv}U~ZnKBj5<&gxz__hW{`R z)mGtLA9J(e#+{7pav3Em0E+06|Ia1ly2NmuW4NwBN;mNu1EV}qIAI?+P9wlg_iGfy zq*He_>jvWfoFV3Q5W8WFQ9>{J+fbM9F8VJJ;YCJx2MlCTU#{u*4=sWvFNt4*hKXJ! zKMRDYUsQk=)EXvl7$$p>(gL1u;(-=VN!VEHomO~&cu@9zgU7jpmJSg~u=Ezq2$nu) zP?qxf6&J@2%8jVNg*Nf(T?VO!NP0m`yV_P6fcmvPFAFnBl6Xm`1gJ2~ke={Qm$Vi* zkrrIQ6rCM;U%_2i404oI#~7j=ylG}u@W6{aAVlD=hmgpCePj}8Alkaf3MB42G4kn; zS^%ei(dZ6o52wq#42UkgGb%##`iP;cMRGifyb}Y1Q{-jB>==&TX9?S_0NF9}4BJNy z+Ik1A0}VOen0JXmnk7h)G9+!k@IlxT$9o?G8v|qLH+7iC6`R*np$mbn=52sD5F|PT zi(P_Gk)vS)7!<~Lq?2ch&1fr-!ooj&}7xKOKl9Cr@%p)RE6sE?*F@QY{! z+?oJnbEsQjPIc#!epo7QvvAAeoTutD-HF1RO|5xf%lizx&r@B9)DDG5u8)@pJTD-+u1W_%Hg4mcd)8C4K?Vjsy znoP(E)-K>gE#8n)$0@r3MbCBL!06Z_XLp=u!m_;!4+}tGxObiQq@3^iaHgxS5d-v@ zoSg6a)P*Pt>)3E~R!3-!v0|G5?QpC~(LB~1)k)biIw?CA5S2Zuld@L>suA@Pw9ZT2`nmQfma-5^zeClS1#44#LfN|zPcLa(MNBa=M z_W0BSeWt4}L8)Ups}M9Qd6zU6OfQ}!?Idilf6D54het(o5Gk9 zIfSkiD9zOE6X%g1>&}w8AqHxdIaXbG*dLgQfvk!t$W0C=sc1ockP+aGaY6_eLiP<+YR;N?k6H=hbAx?3*1H%zQM5ZZ>twESCL(lu-(<0-IgMetzlJ)Qo z(C9Nkds@&Or+oqlk~xY*&unJ(F_Xeu z6E*97NMT@f_o)war^iu`6zW9eTgFJlN$zeg?{LHzMkv`0&hkz#itdkN ze2Xw%;so7OhVkb}>6w+zl8T49IV!so^V^CTJ)AfK;Mjh17Th`doKP9Q81*s6$<4sF!PMEJNY(6QNBc1SLByY(@gbS&+@s z=#gW^HMGmoJ6rvXx>$Wb`HHrs2@aN;-B8UAag}C)J-E@AC%f6|wK(dBg*wrp-r(2N z9-_%0Ca-4TAiv(RX^FBtF`EnZdp)ioFCpd65u9 z0SHLC*Z@TY9*j;?{-94CDce?d{r_^hYrf$YJ>kW;gKyzMrU(CG4|Jo4ytQuaLX%S; z{Q(a6|KVtN*qdm(|LxK4+L)u==b%ZX2!H;=(e7{9c}0(QQ^rg15MK>J9wNgrN4x3> zAe;Lr?vg$3X!pfV4BvtM&ROwK$TOrKeVf{FEM_$7qunVG7H;G-+33=%U0t({nC>7x z6AYrOt0jPVWndqg*qrX3M)lD_QBokMyFS$eMRq+)U`wbyBr=rxLWEA1tEO<5G0#PCn+OzI!sUtP(jz*n1P0Lmf0r2A?HtO=^uy<7G zqmV5##%xqY``*7*zE%h4zAqPWbppMfMMh5|6jKE;T+A=0IQLo6M3%y#k01@ZONFyB z`*W$#M^*t&x7DivPba~jtL=EEYDc#tM;nGCDCYmJ*gzwoqsJWgPUwQ~l+{~8AnkPCYg3v#FYHy*Karr$epcN$4(OiXRp>;>u$${s-|9}{K35YU zF6IE_e#7QHq+o;PgrU~adu<%`=|a6ka4=yQxZ zwLkrhX6%A9WHI_aJjTZB0<@Up-v@Iz)W|&#=lHiA80O}OIsW}&rFaCaqQ}3tNeiqn zzFr2%J^sB&Y}LoVyd23HHqDGpgQ*4@<#wd-CXatJ6WARd5=Ale%JJ`RRP*>Zh*ER> z`od3q0$Ks(B6w|YEKapzlIG zT*~ubj@3-X{Jn?D>PEf@_nKvhkq6s20?wiE9BmQ-UD=x(_!}(8pVa77jr1W|%z0*V6sG2pjwn7gi2N7_H|*<7Z%1Kj61gJ^uO~d6Fw|TEK-|&|iecsu z&tGAb+^7$1pV7(Noz87{@!VD`T!fg9^o|M;_(Bw#`X#JCH41aQiu5211=b@K1*~lP z$r7b2A1s-b37VH6o^a+q6y`usWY2k;2arVlIOa!C>8>2K1YYQ}; zcs~(nk$J#TTVK%xwT`HtMmq%O7(o|ATV*|Ej=&$BvATz~X%6XXO{(@FjXA6x;?yr< zJtp=|NNFb9L?6~pUg(_9&f8su(Yw>d<~7R^ruIg*S*MHSA$uXpl520_aBscEdQ8Cw zu=>IG0ja{^G)Tb{HS20jhxSVS{aGB}rod*@*o}{A8hj)3%a_<)`0(DR{yB>L2GVN8 zZr2Hf&Nt8}QrFu+hd~P7$Yh|`QK!GUuD>iV!p(P&?3YC(oZqpMTDQpHrH6A5=$TVh z!kmUs@Sg$ETU|g}kRR~Klhh>mB2>d``L?ypAYNk-XH&k^#Y(PlCAUZ&B{j<>bWgTA zOMAk(GcL+zE1zzkaLk@4L=T!hk-k6fINZIWe-FjWHF$ja2C7jIZs}hcxgVK@`X2p% zy`MjZ)VQB7)V!iUE-X*(c}w4srZ4KhgVutLxTwF;xv2j{%tif8+T^w{p0mQ^a(REC zCTV-r`Pzad0fifuA&U*74%|eaI?lhqr$clJVpr^CFe$v>hL$DQy^P|FjV-0YCd?=(z zj;+D&_E20}BHy-$7UK072pj3**T7sS)+^I>g%j;we5L#2NwiGR&3D(X)|*}#XJQSj zS_`96bo)B?%z5d5Wy@RI=V+35|FbO*zi12&9vQV|k-=}a6ZeNJ;Gp?h`EX_`zL&G( zFgx+Cu7i8Rj>BO`P&I8YUl#Iufn<2F8;p=6XClk9ORRtg$)f@~ObXF^m`%<^C zuW@(_RYotDSH@m0zY?QjXivsw`;LY7N*_43^^tWPZiHlQB83UmjYtDXa#KOUC| zg-K*MYPqT3j!c0)b~zuuZAIR$T+HTqp3M!{e}fc@7ZFy^hSVYbKC+^ee)6ZTBlEmK zZ;>ZoNScZ~#awH|+=evr_Cd6mhpvk4_kD;0)Lf(p0>q5;ZT_fX zG-$4HDi=#-8(c)~&(Ouuc-V{zV*+3D%z@@*2m}I0k`;z*H&TddYr%-J4xgoM``h+G zsjMb)=NJ6txl7xwwy)Z@VH(lvpLx6az#(SnFfW^^OpT4Xi@ngmos3tUg}#FQF8yoE z`*YA|^!frp<-x0=(x1nvjelxNwtDti9E#YDL7?&#V$bnjR@O3p-PBLF`&132~(K(7*h5h^SZCvqruyjn@8fU2GYqDC4Etek`bu-VUkb1gle8*a`FoBy;ity zC#pzE0cJ!F<(P`cAWp&#FdEa2x z@dj?LdX)Y~FI@)Dj8+#wCAevnS`T!3<}If1%nGLP%rc~oXBH!`)uQze5E5hPr&>U< zzUYEU4)Le8ZINb`C{!;%KDsx}&rzq6JKtJ%CX~#FvDxZKDdPP;6q%sBTL%8xWvhF@BtH)d++XS{kb1B5 z3csVkAAv&!7BGbZ^O-_{xkzKZ@Ed0Zvphj8Fu3UjUyh0J$H9<#Jf-#MfE}(LUBC-> zta8=i)MKpl&P?htTKx@p(rP^@7kYGK3O#;%O6##7X{;X22LKesPih7BA&pgl?|(g{0w)^q_KLuiBqRTI^r0kKr&w8fId+XtH3NU5l6`VG(A(K+Tw`o zsQ^RaE((MrZet1sW-^5WQ<26haK(R8;C^tT2Ts!p?1e$D2Y!CSc;FzW4TvM&y;_0y zfhP(i7zO?XTq^KSrcfY)G**GvaolxC52P3cF3}3y601NEOvD4XM-|wh6&T?tP)&jG zKowIcP|g$z1dzrm(4XgRhZ+^s0Cy^k9g{0o<$j0^fLkTz%mp19yQ z;8278OrgOKOrgQINTEUGZJZb?{tkp3PGzgVn)>~ei-k*bu6k3W@_jmb-jjL#@0pM( z(>$la6Ry$gop(S+G|p6lHrEipE8jRWQ&ov6{F@Z!sC)x|8EOGhcIbc_W=ghG2g~;x zzjbg4%EFDzL-DpxDMsdZei!lt)X}`Fpwaakm5ls|DRkt2X5gs&7E=-{|5cQA zk`LW-R0B#W`Ca1&Q(DnXWpnUBMw2n z|1l~bFMT^osk}Fq`~wtH#V=!&f9;UuPa5*~7}k#M_a1`0>X76U4f#E>Ja3E4oQBtA-^e>{FpnT4zXK)%<2-@uk^ z3U0(A6SMcQt>Jqx4q1y0C0@;Aaz52CNOq=HUtk3CF>2xa%qYV9_Y`o(i;!G(D~j^) znq3qX1U`k_992ZDyllI{3(9PD+|{z2#j8WqxoA@@5+fmY1Z0hU@3AP(=MEu2Sk(#^ z^Rm5I3f4aL(N&aV5hw_Z6K!rr@4ySGG@d$jAcrwSrF;VQGId=5F+#48(pK=`P`CR^ zlwt%;lhSrm`YB5Xrl}rM+TUG`Cge_{#VR)d z?&`R?Ic~1nuPRvW$kJwWSqG4yiqQdALM1EnD~`we7QDr4?cx=+;$a&Ig$X#3^U7=VFznp!s~eXc|JmwyQvbm!6@Ld*sFNAzQH(srZK#i1>E)%6gik)k>&t6s3}D z-@ODi{2dM2hI3c^<%=b>@_e_%LFf{e+DI89pO5_5zc82kR0hSNIZCuRrv*^+i#)Gd zO|=k4hofE(nuM+dgg3OIj-9H0F*5GE)joPiO2Iuk2Sn$ET=g?vV<{<-@2RrCtFOoxiNv++WB+8t{ z!4&Y6#euMjJOEa>2h$E563+%P1Mx3R_kax^p~y8ay!8<_V>CKm=kP!ha5PNAE9niW zuB!tJWLznLrhZ=TKwXaNem|Cx;{pd|^1B*Ucr6bq+^%eo4=Qg41UKA^21L}GW`r8y zp;e)VhX6NQi&)xh{fUXR;*p?e&A`|8XMazgI7~iW5(MRdJrTF8W z?)$p`j0mo76xV1+;hX66T5|0sC?K~H>00B&P(3{y)(;>B!D4MVUHb>-PTO1_c#g&; ze5&xP;xNyq=j@@W1*7n!pp=R|yD(~JEx#lX7PSy4mYv`!?J`{E+B^b&``w}=%%cLWu_^wg%Hk%C}C5syU#HZ ztK661W6XG{lG$Mx^wOBpe*m#58#hS3ZpvJ>7sc`@jndVaduiSrWHAK*kAxnYhxJK+ zq{*x5SqVOPWlHV09F<`3x&&>IXFzN6f>W?gLJwbX4$a4S!CQ5B+bg+$d!LX-=o#G) zFm}aggWvmu48|@?F{X%4O<^5gtBpS87t$?-;sPEDHX zF^tcKu?Re__Y-QqOTgpF<4{62gOD;D`1)q&IdfnOBEcAPiZ%ph%4-tr#$7;!&$H#x zt^6z}o};K71dDAwEDr09749PBa7bK6xdPaY!x?5=z}|oi+=(S8i*$}J>DIYClj|to z=gV!e#u(7OzIn4#;9TFF;F1=ZoXWdLjM9>8RQEv>@H*0D>l*z?29Ir}jk-WNJgNf` z9g&CtWZMs9Ao>HJMO|}c zOgZXOO@CsDtOJ@fO7W9Wj6yLd0xhvCD8_3Pf8b=HOE)a(o*cCUUW7{D3hi;4rO_t2 zHdp&HkPgBQnRe7(9ZKv8H%3dh=~6v0cp^J7w&{B{Iv{}jHweg8W6sy((l`!Y9G4o0 zBeuzm197hEhk9%*w7u$&b!aurzIi78hn}ZfZ!S_j#IsG)1?p>XCIVu2MkpT-EwH)P zJw!(Kq)>bh`H3RH^r_ z`<=_uUQmNh_?D$uexE9({Y~j6mZHyiQ5s&k7;N!IYy5?~?C}W$*5OxP043iYLD$w> zD!rew$1FT3KS*g|Xsz2%CsNhW5s}*gu+2}22GFAj!w9dR$!ZH)iYv!LwC%1S?gm7m za?~L8$LTFN>_TgyB=ogUodzs~zjS_0&lNV!kiJTK#>hdaXMGX8M!O+gPiG`-8n7;T{#v*IKV7q5|8z~NKF$fP<*%RY*`lnb z%AchsRL@an%TCPz<47&1^G&=jocrU!aIl3-+XAEHqY%8VT#!8dx!rn$|hHb1ZoRPbh?~F7ZZyO%iMvgV~ zt&W*P4gFjrV6Vgrr0W5`?MrhRxe5f4snDGY<~h_}L!GIqYrm)*ANncsl8L$14%#=k zU=p2g6fP>Z)?=HYB=#_T#Y%G zB+a66+n$*4z6^U*vh2a0$O8x2USN|w2n^`!1FFJE{ntUNrWm#V>kXCLZG39?nbHBI z)1->7PN&(78Z-Z>Zc^iPn$@U5*I+0MeYDd&jvCzXmrg@^eg4HRxFS;r;L17)KyP5I zjD55RzY7yUVL_k-MK~Wvkss3oit+;UQIxAr5b@5={@>~sJj%6g9)qLL;KJRoGt9lI zt0beV`29ZtF*Kfq3<84Qgf8v4Lc(z^T{NsRr8`*4FJ3K0f$AxBi%eZJ>(GsULpt6c z*eHYaJV9}^`dk%KD{D1Kq+2|o`KkAjqAjZ%CqQ3MCB8+qK~V4`*uv(DI5sBD8R{&goMXJW$R9{wNI$QQqkKvzdjUbz z-vXC$WH}OOQT3B+(|SW-LqO2HfoDaDTjN;e3acuIRh?nggj7ym!i_wA9N!|FLJocS zMPCFkbMkwr&KZR5Pm3Ne;J0}VPK%8Cnl5@Y;T(e2@P|;N=M?8-jwY%cP2jqi0kJfv z$k?MQIrr1gcGo$f_BEi(0MWaq#(dQ=-dZ1uIsDJ~J!#8kFaJ3A_3FnGF- zsAWjQ!}`L*p#~o~H(O&UyxAJdBqYC>gf%q*{NrByU?Qd(yl&(Cu3baT*jS>>`XiQW z=xZ|EI=60jfHMwwQRc>ndK*thvAuPM@bIJ}>8*ySW^7@c0aT@%~5Xk0q?Wo4Z$xak}GPwfPAd9Z#w`rH)7=a#5wm#-eY|}l)SF-Gkx=RpZhVXO1%vtyR z!C@@nqk}0ST<;^}+KDH^%{*=Avw@HVm7KOq#IYToL>Pr7LNdsMLxXho2?Q-@5VL8y@B12xqRjrS9tJar!o=}CMmzaJ?=B8|Rx4=Os;dwORPqOjht;NZF-s{_QRrqs z5X$$>XREQ00GVDGnP;y4UK=O$bXRBH$ue9P zGa!RQLcgdlkb@qGPbesLA=Y6gS)*&P@M*#CgMpgf6pSe@b%Vx1DP~esw>1IzpGMt9 zEO^;f2O)tO#-~O=DL9&&(rmRG45Cf>x!NdCLl-$y(Xa3*b-5I1oDVmkB9JHZ;VUS@ z!^5R0DG0m+W;yDKPR#bIJIO3&-SN>$3?+;(&B#DukTNH zFfo zt#wE>wq_2IE!HNNY@^BfY-<~`E!I}Iim(>k>L9gP+ug$5Zf=*!xd%GRDR2&S_PDqQ z-P}Gm*BwVGT2Q-N)*EGb#0slDZf&BQ^SZedH`mk6^)flNvzNZfu@oVzzdWb!1gJMo z#-L|y03Ljqv7giFu_ghWudftU&FG=y!g zb&=GqCw;xR`n!YypC;e++!16;EfPMpd+x_~aj?Da?euW|1n4$t9hyVC@V&C=Bgza+ zXBw5AZjwN)@DZWo0AWrPPmSQTC$1$6`KndzU2K)E7TZia8C?PWc~Vc#A2GXA5+whlroLK|dz!ahLg5vki|pp62tXR&TBAl(6>5Xzts`l$Zdw$ZZ$ zu5RS}yJLEIwAUwF6Aq``b{Q?O8@x!EbC@9WLV=ut<-vDp3L&+05v}a|Gx%fv{j*8sp2Gv&JDs9G-|Q z9)smQ<|T7b77?3I04q*SC@csZKoNewwiEZgYS%-ZZSL38Oikw@1ARftcKH>SQr}A< z70Q^>f3TDb7cWjM)rqLXd>Xi)aq<`doL4Gf`U6MH)wYn(I_}=9O5#MnjteXz5Kj&amHTrvm)k7O{I{&EZz?+%m^J2D9=DI0us+{K!N&N>Z(lL{j7tpHT@z}dOJ(eGhRjN&ofsSE`z>&YsXR` z1xm!rXV3(5jf)qTy2h!W4ISk@-q(q;s}1|!M(7x%Xkb&?jim_QtEAK!BGSoHi{J&0 zk0qpdjfr-?iYW?l1Gf`;SDKQIKp|l#862Ev&(c_G`uX097RAOIR5vgNFFYt~`<7nN|_JbJhU{5yKkH=uMb4CUkZ0spy;PA@8n5~kaQ#3k0 zSAWL?Vn}xem*dF~X5WZZHxzW>o^1o%uGV6hE(J=96xi9PJM;lDiTTO*o~YM-&7o3A-ZA9LqX&=5{vp^-~?!; zW}sd~YVHeAt3^)zSk^;dJBIygs&YNdg@mp6eCKfOs@Otx6dPveRReGd_s;Oe?}L5x>^#U9-Il9tx3x z8Z`~nva$}j9ACotkntWi48c*l4~DkznbX=W-{BWIe-6orCr_TX?2OF#f7*K&@TQ9N ze|*yBl+c#6NP&tKBNS+%lokrMP_ZRVOQD58%SA4R(gs>6ZEX@R3cF%yAs(Zs;NqQC zbY*o{T!F2o^s&b%}8 z&ilUe&h^Y8+@t>aWK#G5ANRBH%J5gT`(8^;Or>-xka#+OHhj%T#l(hozG&(rd+5Jz zAMJci#1a{HzTWP*^RQGEawu-~f?#OQ zp}3Y=K}eap98%^+e9Dt^q;Wzx$M9zFcQ^tbDbbxec-Fm3@LqI`x_xvL3U5(l3Y2-|a>xng(x&30yf3DXk-naZ@;?PCGjRf*K+2!fEHx z`JAB8ic)C4>7R^(MU{jmglc>CVs+bCt<=rg&HZzeU*~?yKLAz8JmY`nq?%Er&{1yD zpk}xQMSK4VZ|nXA+!{lSFg?89MVR)I-Tot7Fb`oE+9J~5yB!?DV9Ngl)f-||)>BmN z7!4MYl>KOP>LMbg`|@joWwA`MEf0xlAn*(XLhbkgxS2;q?;<){_dYow+WX8YDvkWhk*n=gq^43=$|G ziEd5y<{hJeoF4=Uam`D>ML}#ZlVp)eP;o;WO`6>&pV6RIW-0)kkFvV)eJ6~}#K6qg zA2GzI!EXooMEjWjm;3~y-^R)-ukwpXBsQ9;yZROoB|E~=xLB4FdshR-f&&+yq54@q zhb`lUZz5F&vyS+NwE(A?dKaE?6|$lZ|3SFQ8DFqSoFVpnPD+H~9+2C6iTxM_r;We) z(-ya?1~^KXc=IQBi}I$<5#%`CQ)HqWJZ^xpi}w{UFhp)tiLawX$$fwqx1A4EKp~C_ zKPW~5SWx)O!zkFJC=jLdKOR~{rz-f@bJ%|nj?6b!s7Z5=|GqC#4h^1EqqK|)gf>45 z7bSrbHO7VzvA0Ep-KEB7tMS)SN`$h-@tSN)bwd<@JqoWwEJ=dsl*&=tVk1pH|z1r7Pji0W@zry3k z0;Kx<1PFP{d^X~L<8@McGNN4R$>Se^F#lyRTl^C!{w&^;Dc{KPR}ltQH{B2VnvUs2$};p>@~q@| zIa0lf$(5w+^X>o{0enMVd}iDwzCRBcs`nZ>`>K1L&daRbz9R`?&heJTL$H(mOgLo z+F*U@E-q&mT*)PyW4&ew6e0sF%zCOxneX@H3$y z2q7V6kx%YYfWyOJw%#)-Lhh0Wz?;Xpy|TMIp(#DJXVQ6Z9`D_~d6+d5lIZgD zOac<)fV>O=C6nXsF0xJ$VR^#Ap;t<66;76Ls)Um*oH@eD6;7>i3dm{8t47+fBBVq( z<-(aRoLS^_l&?lVpcrywa6oZrHW!H3ECwTHbk`tFQJlR7RZT9L{+|CheFBs#$zv|Z z`EiKDV=f?*f?G=9%_1*}&0|g`FOFuz8&6&{yl!YEly;_nF#sV)+$S})OrC9kZY#uk zp?XBQQUM_#wN^rEW+5&!ms7wMTc+$*DxV4PbrRa;v7eoJ!|Xj6SC-M3bF%McnuEal z(m4pSv5(kPGE}8f?)S`u-j&NPgZ3?R%iiiJ*e>i>gLt_RW+2{c*-EtH_Q;X`d*GpS zGUgN% znps?w7{a`(q;@_j^5s`V-X|p0zD_ycfk0$u_34mI&?T~7{y3e7w!8y+tiHV%L8Ak^2yQf|9)gXU0nJ1KNH@w8W1vhA!_J2oyf&mxEFK|wfa1D_H`F#RP zRmllAX#bYO{@G0Ol4N={;*Vf^^BHG-<~M6)bAoJ6lFgxgyZdJ-4To!!SJf@9X~O(! zTG=9j-1Lg>;tg$2a?X#g2T(HhL8()~_c28ZPZ6o0w@BEJB5qUgy(p^C@?`1+$O`&z z0Nk-c;=Z+}6VuT~G}`EmTyv22PD&~F4!6xZua%o}skgVDUipi7v4Xl(PRk!>hDkoI zc@W}M>GN~_To0?ea80*?99S7BOJ*RX>!baD0zZ}aW934w@6(qD7N-SzkiNfg3u5s$ zjz-_beW|LxySCCzsfxZALf<#QVjv~gcaa+U&hzE^zFBba0)6j_WP-Yj=sO*KQ1rdC zn6vol)tI%^b*7Odjt%idcoH$-XD1bBg?J2$aX3^V}G4 zHvq5wJzoik!CFERjEd5-7KBQA1YT-cTmb6vXs5w5Wsh&~QbdtH{0gc`cl$yXqQB?% zw9I!I$_g4t%QT?~ialC+Vjc0+6)Rif?eevxo9-3IGXqcxc`6324P=s{$z-c`aLnvq3nm!r3I8Cx!F0aJC9(hj4ZZXRmPf z3FmckL?=DfYk5Zm9uUr9;e1GrCqGj3-u%F*C;vB(hpI5iQ@W9#{B(Pq0DT`}B^Q@5 zZgj7BaK==;UB?6WArLb^Vgk6|X8Dw@u^hvQ1F9|GlSK;NK&KT}Q+aYz8UozUiAehI zS<$-i?P`xRegjNIsfTlpOfmM)p*YiJ%Y!rAg(gp7GL9pl1QbdI`63Z{y{E7M*G{%# z%aKmN#BH}60|9FatKj=|O`+XmIRKgCeDhg|HW%w3aFr_=v*4w5FUpFa@wD7dw)slJ z;3N<<5fIg=iM|w|3mNRV=D!ikf>$fzeVpbqqE1)>M6|Pd>MibHS8^MepbSdEIox}C#}8&fYeM% zlwd_Hh`EVk&<}k!jc52KW={&6k3kPS{NhnxcOa?vcOn$)B%IUdIR@wSbL0(j`U^mm zsRx;A4KTI8sbwoqQ0t+_=89E~@afFfGT-^hXm@-B>ft=ORP#f{ycVVD@rLM`q^P^s zqO?J!Me;VNj8-kY33?{|=CvrzZzHkVYf)OE(olJ0RK}-bK;pHu3Ph!4D(#IoP--4t z3vZ-!p{&=!8>-uK!fWAewas!0fl5Qww$L`qcW6%3V%(PFUW<=PpcjO;!Oc9n@Mv{p zBD4j!u{;k&L4`4$GsJD5X~*jt18-UJ9lot_3MzcUxk8?~ zPSO8Rlkse$#*g)1EK?{FHFGb&Wcci93gy@44(6d;pr0X>G^Q7VP`q4v+CHpH0*G@T zcBLyr3CtHteV*%eD7<~8+SFq+k6L}nB31i7=%?hHhbjc4alQnRq#gBBI%)^ax7=S~ z#cN{ayD{x`t5o?%^aQgvtSm|2SQuv&Tk2IxuX)std;~IUrg(t9ZHS!AU zuIdZdFs?6Lje@$x^~h`4C{l7wQ}snrEJc+R#cCCZT(R0L2cZvJDWuJE0A8+BZp(*W zi=t1YL>Dpoq-d(X1TTDszK~9Z^aY2q-DpHYU!rcg+0I;9+RKmmVlLO1cigk-B4|=t z+IYGP+2Ath_U*y*-A#K6@Lu#n$O%%6i`6&2 z;NmSbaJVpDII%ojTn6JUBwc0dm(B_k1xgY*e7?jL^NmRz3aL|weQ&a=nCkq$7USO) zdeTS>+x5Am+v9XK2b?!z8CJ}*FB}KoJ&{+~D`r*y!#LP3kek{rH4ZlAoX0rWg1M1$ zJZ_khy@glWYZ08Va0aQ10GjcT$85#A^}Wnf&Y_g=P|szyl6Nx?<)wVgy}Xor;FZnEcyR$*5Ujp4+kaO%-oDu`{NPMdz-7NUZF z^50GH$@iwv|CS{Dr(HsRd^4;08)pWt=n{GY?h<`8zg(%7iSzUDQkmbnJ`t&d3@TB} zq@3yJZAlLLs7(6FEeY_+E%EptOnI4_GBJoxSRDWFdcwaqmj1WU6=FeZM}XR)IR6sj zXOP~5*t9}RZrX$OZ!Nu)K3M95B?^xyZ~A##Xu2ePR4V=Cmb3i-Y5WhSoGVg#T8<+W zJo2`jgNJ@zj!r(D4>$)sYk3EL5*y9$JS}?_h<|grg-k2O^#Qq_mQ4y&&Y^V*6vd%c z3Y1M1!-AYTYuo`!)Ip1??`6J5nk1_WEtMUM%jLum(o>27p@k9}Mm&GQfqgIEc(i zaL+!DP4y;BpaSksc6}w0{dNBu+1rUG^uJ#{iVt5sa*yXK(d0EXS&r+J+Ls>B+0}S= zh&yXlJNgH`d_!#H?ASpoVqs@N%uuxO^vqTaark(Kw;!vo-~@;!Wi!b`6BRcPt$3NoEnRGd4e8CH+DBB%6|X|w(EhI zx-azr4pz0iL1=#<(WZJq`oVAMTD=`SEeVoNH5kF=U7tz1eUq*3v+(P7P4az#I=lZs zGkw1dWLh}dIRN5;UKo&_&g-8df-`Z12R<%4e?EMe2rE^rpv_$LocEE7fmlA&GN^AQ z@`~7wOBiw|ccfgTcVmUS$lx{`Nq*D#ANkZu~H`&rFqR+gpay;&DrGhnsdpK zr)7D~8RT=D(`0k5JU-i9mWB7h_rNN<4 zet)gQJ!rJx!skJnb2I9E3fQOOR&_#-G(KLyd}FbU?RI3l&1k{#vLj2Lm`idg%Z;3v zF;#Z}?-$%V7BVpB&A?lWmaU$myz4O=y&G!dam?|WtB7Q;xmq~2+!3RA^rOls-ix6c ze(vwQ78-A1g!Z9uj*%l5Rk>YTJg&W7^BjVM<2SNXY^rrq*m|lLb6qTVkd<0aTg4FW zR=Bdc3Kf7soRE1Y*dC_U%H~?#Dc$#UcZ_)s6fJVv9C@rBYc5^j$YW!b^?5J@Fz!0J z9F?W4+W6fZZH+sL$&sfyW%F`*{8F#Efnax;Q;6zc6lq>AL^X)ZZ7I-H zQ7t7=9T297L=_JVsQ1O>v=o!xC5ntTSx81p-R1@^Bd0uZIhWD$$cYU?M&B2L?A5oR zbYQrf$fKR1w~@(HKe$2b!dcX=S04ddW~)C6El13g%}#_bxgoQ){XVi6Sc8BrrpRR} zs2#MLI&8r3w)7KT*^#1a3-)(F%xum1K5kVc%)LUpuYhPz!P^#~%>Om|9Jvh4Tgoko zW4&CqTsAx9@lM5x5V%x!P)O>jRA_iyOC4Ds$5NoBwt=??Pon%)WOsQ+#EHq!$Squt zk(zkqe;-wn%d*fo6pPiJf!?tXxsn2Wn>2GN`Nq zUKUbQoAG<8PDJ!lU7O!bxRh%)fIAR_MtM@_94+>>(BCLGI4JGWzaRKG(^5s4XZ#W% z9^?NN927qKa+vTvgjnBnNE&N?X6$w9;a;w;{58CuWw%!9AnN>axW6&`64~hs~OL$^N|p}&MDAwOXfGi zUJ8bY@$VPJHWOKysocv)x-szbjx*1f2QO*@3iit(3XY5s^}8qq9rgqMGk)Es%0M=h-4%G>v)X(&}sAp z-evPA}X3& z0Tbs+IJ8B9&L5+=jS7^(*c1F+w8#v{nG->&7%hdy=OZ*1C=2nBgtCzX5NUu{D{0J z651%7h9g#3dHe|VI_OrpSRF;Q_|OAI`xH(zw2F-T= zoO;mx%C4UyQr~F$O}CgTQ%yG2SBcuY(T`9d`HfF-|CaiOyCgYw*KZM?QeD$45daLHlEExz-{R@1z9z5!pwE+bD|jE9Q0zwD&Z#n0byP)D6H@-XAvs{ z_+1ybnzHfeUnI_v0Z+prtb{4PbP?o7VSz!*lVjCd ztr~~`6%E-YcnX?X>REhmRtVf5jd))MQmf|+axpnqrh)1X*YV6&anG`{8zjyWg&og{ zYZ(btuV)IKjhXCwQb~9WE{+P( z$HUfB5Y{r@AU7B1HNiJpVp}`qUo@)Wn?6k^Qm}9%ufPgTC(m?UQ)^_?Swq~I-OytG zO2=I!(rJ2kCkQn4$ic7i7J(;g1J;FdPC1gXYbn+Xg8C0^cVyEZ5`WIeOTNNf(p{7w zGezyOI5I8XGxeN%TC$A)MFteDoF|-?)O75R`1+`OqRCy9sMe8d;U7kFR*af`d@&aM zj+3g5@cBoeq*EvcdWcH^EytG}_x(s=dwfR1r&9_Rc%}!g@x6#}FAi42ET}{Kc;7yO z{3$5r$kTzWu0N{!R8FkH0V>U51!coX*_@2q9^Y1|)3p^wgq9!n@q)xYq_TpcY(=i= zfeVN_DvMX>i5rV#Rs&AxyQdo5g|QyXPFw=*qtz|rf9P=#E=ltNfg60pT3d5jnzN1-OMWAvgWXnzjTYdXP5H!#} zOd^J94v2ZNJ396nRC3BroDa z#6@~CrUb zf?s)6-Dg8vxpB?sNgKrK9Bt%6FFbRA?S9qmNrEc~O+AR(;PS4fT@h}N3BkJkIs4q} zX)7{rbvqYf+^P|jQvr*(7NOU`Fy2e0;Eb*Dn!ReQy3*a51or7%%AX_0Ocdc#fPf%7uRwUKD_DlyO`tK*oD4 z)8UFCO!F)X;MK@ zTJ?jPDOX$u!v}Gzx&jcj3NIM1I;I}L_*cz@isY{}`ff!-z-pf4OQksK^yVOvY|9!1 zbnMSoo;XZo!aljcXwC!JC)|Zb*-g{hrxMEbtYVko!XoWI&08)l&KGf`RQ(;jYi{*z zffRX@{%Q!w$Hos0eB)NVhN3c$dS1*$-tFDheI`Wj(c$1j%hN;&-^mg8vqvrH6WGS- z5a!a?8QIdy{?st6!kVG5dwxNy5YUVTeaNU-eV-s1_sjzUA-gvn5H%!gkSz3wRP++$ z2z>Auv?%wfQ^|P$M9nEFm<9<}mm^Yskx)dk>S?0p+g0>$(nV3tZz^q;cstFv{U^~f z&dO8J2X*ItkTKL=aTMZm-)`hVZ_YT80^+m!{*1i9LT(GzQ@$9#y$D{YqU7T@dOJdo z*-Jczk63tLJY6osoI`A~ImXLnu?UyP^9?qKS$5DUla{4pX<6Dih)42Gv~GC$k(#$h zzaK*{IA_T5Jw!w~XdkU=;7HRAt9>gt*CFIAtp{m z%fm@O+^*x9XOt69_(U9(!fmQ4iSjr|7+ap6 z+XNV z3FIlaH@7a0k;lbj)AjaSxc$dhEWbL3>^KLAAcYAnzakoMzK_>C`+zs{csgzH{*nps z=e)nTh!)Pu47vkuuUHo_)2V{1L#GOc`3|O{IyW0I$-)lObI6R3XCnPi!W$fa(+OF= zx$S(B=R^C1%54lgAOv>k7dNgeB7{2_6W`khsWZy&33Ccx$7h+Fi zE7&^C=M@`G?o**5qbp9+{aCiPclM3J8Vfq2Ug|2sT!pav;o_YhFcx{?JmO&?2#46m z@(mgkGGF0EKc`#;kR zSOdXb9IM}sKv*ZYO)r<;jySM7ZhL2}gRCiuhYUB$HhsXg){6Tie60{69p=YZGs%cN zOA;-jg);Z-W1eZTxcM-y+t$Mzx}X@*4yRMb#i_p#w70iM7+;WZ>?e(W38N@ zAQva%giz_8RC=Z3j%vtSp1n>UpCHdn(0!1zZ;6qJotOY)vw9FBmD5Rff#?1N&6?W# zoM>?$9w5h!SuO0E$b%xTa||My-G+;gs=O_gGwQ0{Res>s?g${8+k# zpiHnv+$4fKH)LC)JTVcM%N$j162Z7(EzXBwl7guuD($}-Db^CbIR7#}5hSBxx?MRR z#I<}PD(%jXmnS8P3mrFt0(lZDoIq!;;#!gcE7f_7qE@U^)|W!|OI+1)mTL65ptqSe zxn&Eu8|%LtWzakb(9-y(Z*|M!{e{TL&*S=fl*X5j;pPSTQfjV2g#)#&>hCDGDV5FGKe;T-Ck!lCBfJ^FHyG- zYR@nKSn1y7(Z4NES%a*xd296~{Auze-(jj2`kp+v#9FjD%UVH`|5MbG_q)*Z(zPV= z@$n1TWd8n)c$v%p5>SHuG4X@>pT!(rneU^`U5^(H^zOIN*r6B~yT2(jcz;tD)K+O; z^!_6F3u2}vP>XpJ#lYOiwglZC_gQgFh9V6l*a4*PSY)*saAnW697urS@FeNnKl{H2 zHSS%?3mrdwzz>ulU-wz}uiy?A8uAkSS3yddIM}z&e;3NZIg@uW|Ke%_4fbzA4gvr| z0}yAh*o{i0w~b*sm<|orT5K*UX7vsBI(rqXtgUyz ziSArkW4hK(xrvoIE1WfztkmTs z3^ujC7BD=;b+t8hfNL6^u8LX|$U4vKP#!@Qjq_cL)DnXkGgD=Kox^D&3Rs%SOaN=B za8|P=qEdFHQuaF6qF|Le+qK#EBgWW?F)0JJXnkg*=1L5)%z`X}9J3Z%QCgMVvu_=y<`Sy{l!0xQ5sdbEGgR4y)e{ArL9Ro~ku=RqFh6_S0 z7lfFWG}bunruw?tWhPz$HrR0iQoSj+-sNm?Ic@X6^U)}*IJc&*ves2)w^h|Njy55r zAh*gs5266Te=JwvhB9L-@GUsoST=GbvssH-dSycctEx&bElppBpQ*Zf`U#Hg|50vC%BZtY&Hk9f^jLb{%mo5O%>~0GtZRba5h#h zYDk%sCC(MnQ3%ND(jPKy7pRAMyly%RzG)vz0x^&G;6dwU5$07 zV3{LF&TFh+6iUTLnZi-f4A`tbS3}u5UnDAeMKm+b>cecsbv4eKirSi+?2R^C3JQ%5 z3mZAoW(&408;g$a0CrY&$TZNzH8Xn15Uy7aXd3x>Qagv{*4NjXI;2joX3>3xgiK)W zygK+zVdWD=(b3Vo4R=i4;F?=oQ#mrabB8=_HQE|M;X76lS@5iCU@1@=l2uJ*$9$us z``YWOATp58go?3hdu;=|(N$x2GO96aXsoGoGAsY@sHvNeMnAY1`o;z`Yel2OZX!K% za6e*ARrN3j)1cG@REAnvdU|>=nB&0Kanqz~i6gzi<*2sJt*Bg>qUxAvvZzZ#8vNbvDxy`L78Jf6YO|>;J!S(Y@6}7b{^b6=}gg`a8rn&Zc^^JBl@Bbm) zk{V|Am!olrLMajtHc?uo)r0p9jrNAd`bvna zzA;S=hZ0UKu$UmnirOU=%N$C0m0C_g>Gie(OJVT@iy)7(3T{{yvyX{^q0!MUlA(zP9FB&H zO1q|!jY8KF>R58oO8_&ydUUj=vth8VqAy6}s_HaVR#!A4P}LqaIM_j$`kT zAN(NG3r0P_>)1b_yQ2;SWC49%MXduwXygOq#|MOUP7-TKL=81$)oVZi!eMv+m-0fH zK@p~;UP2m~{}I;E{|IYXM=XpP!uUa>>CQ?oDLQb4J)@#mh(5-E>yS3##l$qY!^I#S zTou0!2tPGlGBnJT4Dq<$>6Aq>Fu1xaB1h4I&Rn4B69NG`cDgq)5cm)`ChM~TfehRv zt;e4CQiK=4JxlR$t+)EDwFdcg0bCad z?87a(z(vjW*xO9%U9Bvg{C)_P?kHam&q@!vZ?gWFo2`;UX ztlJ(4WMO@0)jtD)v2gdob;8x}Ks?-XxO8{iakz<~GvQyjVG!;nxI5uGUqE@FyZl9j z!*#-a8t&;<%%JI%LD$gvE)yaQDLX!OgLBQVn}yBmv&09uV{vI|)ggq#EqDi;4Om#!A3-_b&pSs0flb6GtcWInPstyH zKH}Fg&+;XfC-vW1)FA&%P_jo(qdV=t8z*q41INS!fn|^=``6ZkN z{p2dTpu1@@(=CVSWA*wqki7}vw1056Yaq}HzA>Yr&=@-|F2<=}%C74*YT(f1KD76c zhv)ROfdE*x@RlRYhcGIKepz_d;#q}#+3P4E-)Lxx7;B85 z5^Xf(?=kB0W30x+d}C6+(S%U52n6qdx)0AzRy2IZ&dPG9g%O0ZHde`#y9DwMei}j=C`3(uTftRQ))~y8%>jq z@w1Hy`8-dBE)5n-Mm|-@b1i6dQJzRr8Ew>$iy3E38)wWYF`BB3;BN||ZU-LmV;JG_ zx}y#=jfq7{jSXh-08zvvTC_X|+|Lx;W}x++3Zf8dV&4{%M$Y6oy<0e74x-z1Q| zRLN1*Dcw!h60X^uSO#tcVyb>;ARWo38hNaQt6#fGGJwA3h%sHHF)fiz`iP0?@g>oF z^4s!XL7T{jf{=dFiRHaWLtBaZ2Q_KTt0PP}S?&%s^lkrQ330 zx)quv<6@Sl6F-SY((6^Qd7Q>Qnsk?-k?4B|_V5_e?1rCselgvsQRQ5vdV(Q^#W?V>XPR_{f^Sp6wsD%I7Vz5y^2v7Z zg>A>@g@XE%1m!JJ2}k`|a_s4laBdkX!>G9TdhPD#1L^zM7vvGjF6VB#z7BP>bM2-hnfLh1@ zyEOiYVh!Nn{)m~HpoqB|AaV{d_s$NKMpUM=hV=LvQDn1l>QVBKK>dRt>rN4BR|$w% z#xn(Nk^hJQYQ8Af$(^PAe;VpR}2a!eY(6+w< zYJa4cPa@5_85oP8o$F_4(yIDpN77tv(n8*rb{J4UjJ^JbJTArOphXL|rD~PolP=^K z`Y&V^Ph&QW<^K3@^0je+)EG^r|28{54x%rCRUyCsH|d-O+IAq{oyhmtzo9dzLc#h6 zIa2ZOC{KhvO~e>AcONbQAlY8rR%O&1a|?`lWyXw2#@u{k-dJNsu`$6E@U zVkKz(UQ26XOyn;*DwdaPfF5VrP*<8;)nAytT2o|k42+GEE)VHWyc-DYp}KzlbjU8M zS^&#CRtSRixLAphnbgG;tBb^@|ybbghi7~)ZJ|c*`8==rx>YZ3*{|NXt z8$^gsN@rH!x1_Trd?X;oEDN~*X8u32I}Jltr8CeK@q$Qp92o%zgArsKu}}n-1Oq8Y zb2`IFH?lzAfgm|p95P38!bEa%{v@1dgoETX(ps#MLw-!;7!(nK`Zb7xZw53U{j?}Q zrZd1AQ8eUb#Y5{0$D**#ffg=F^-AlN&Ri7EMTx&qbbN(QsbB8fy}e3Ff#oL?3HRuox39+#j)4 z17Pl6VoWOL6YyD>(b5=V4brE58VFRtud%6UH_CjLj3#mnpOR90-HU&7kd}sA>JNwb z4dqfLTMm7K-`EFkNiJRo_;UpHXcQLL6CM8Ty4)8c*!vV1mL%@#G2zjd_m5q+ME zru-RuF;d#vnH`M0^7hW`VM+QZg*_`t@1-!WBs~+&j!Hu?RQN55!sSlVT`BBLC-UEB zkiJi0t2@&h4DUr#$nj{YErs0`L;go%q*uDK54iuU80p=vY+WpcKN>3?8^BI+|M^&H zTUYi}7YcvAi}ZL`*3SJucagTIu!BYl|HLT05yx(iBmezz(&=~>;C@fMv@(VLE1tsl z#Y?NYvd!HjZvy)<0Tpt0C+|burT6=?*SY_b?$VaN?3?aae$=16+Jj<0>LIM1=qkR7{RT0fB8-AlSJm2K`Ny)}q!>(%?ULF~g`NiBoezAGs9ohy3X zI*9#rMbC!^vUigxQUuk`A@VGujn>&im|+0iQ~_Nyy;K|r@BCAO!s_9P1V zHA#9IqP&v)&tEBd`m%rYCjai<(zB_|*Exj^bcYS>kl}isDCT9I^ox!?p_sNxGx92zUNf*2@Eq4k`wi@t2+3<;o(QSc zz#fQrCSqeJcATg=rI)rD*wbW@UX-Ng4D2|0PfHTYx;3iT-wf@kH2 z1BUd+fjnKe^9J^WZYX0%b$3U=|F%AXu}`HZBH_QMGg5&m-|A<=V^8=hp0((Vzr?dY z=_L3c(IqqXkxsg;D?6n#J=+znM)G!LPe&NBebE*no#@Kmi7=k;%D&+KZz3dw|HyGx zMoPfHGm_FCrB-$_ve$;o*gg8opS_H|pqIRtv3+{uhnKNqdg;Vv?4;g!{xTNe{?(F% zaI{3=JODmj#x_e5(*6@83HFU-+|Z5P5@md<8+#zi_+mHqbd&`D)+h<#JEMSdI!b!K z8(Z1Q_;ok-U?=0bZtQQJB>1;=qVN|x4aaJ4C+Xe<<~A5NC$LQh;|mFFn?ZvAMFWMu zf}soh%^$)>J+W435?1^aO^WE7$ zqb2xXj;3&LG*AN3(xL9`_823+&ij`bh(#`Ix=06mu=QPx$9u3XU5saXuw7jw`1kYhgI$2)HcD%IvU`oj z$9l47jmB*~*>0l*|EoOwZ6i=_i<92!$^H~){H!PYN1X9=Pqrscg8wxhekg7Tx@ee^ zM0Q`i@z04cF2?5)*(>o9{BQ8^cjF<)AL-xIUFqLt`1eFN{QH9bZ6ee2IsJRIJN|u2 z|2Fo(zfb7j!#(luBl`CsZ5cu5t{y^rBl~pH`bhSn&iHU7`+@s^)nUEhB~lq6QN#O5 z#~xD}UQ(g7TVfyRq}T8tc07u$k1T&nV(Y010loVGxaj6LMX-}P>F*Kjn3C}Fg^0LG zIv34$=u;W{mn7X1!?wqWR8MxgL27ld8>O8Nwn``MaFF^x>p-iK{_0@Q>ZHdVpfh2k z1FNIb0}d9@Ni8=bBkArgY_DGWE|&eo{TOzfjA4hROoZPRC9S%VJr*UMZoqY>$=@_U zEwAu5u!lNHUo=1=mDk7KvROIz#N{qfR0^{h2P`mCP4pCG+Z&(?J(KLqgEV79V{3I3x! zrTv51NtpP-?6;oMJ%iaxi4^jBqO>}Vy>U7Dzqnj_bpU&&7x{PelFkfdPh3I%=dX}n z7)(9=KL_IrOce5`B__3hQo3_6d+JK*r8Ksx_X@eACb7b9}N@U?I)ca$o&1TJ(9YmwW9~n8jkLLrox4VQypFlEr9aoP`?7zIcw!Oz=O{vL z9VP7<&3@wk)w$9a*Rf}FDSU6P^yzi%o!rD7*RdzArI6>Zm9}2T_FtR$%V>6I9u@pZ zp7hshwx9by%#&`dW+(D`AD+)%&hLfTukxjqYW8G-bj;3n6-bBd%wHh+s@OJ*Bv-Su z7V@tyl)kBCpA<=ZtJoW3DP+SqQlnSKUGe5Dc5MVACT->>t?4$8i;;He{*_o`V zL^?f_-BU8+iJ9!aQVQQ(D&01N9q0a^N~O=Iu+ zOr(%+CrYakVwIYvu=Q5y+j6$qnsKs>y)ubn4^NVQDrde)z4w-}7ba84tCOi2oS8!Y zmZ{PQGuRhX$-i=%^zIC{ep>(gXRzC*Q^@_(rF&lK*eDQhO~s&i!cO59+T$i zhB=VE#{KB9o*YO6e1va^khTqEySV>QgtU7gJIDQZMA8`ZpOJ*KKT`T|Ap1U2@(*My z_0p+<>@Ru>-%kA~MieinvXzpwV+3oCqTqE=(wD5^W4`W9S(zCw0f`5BY3E?mGB%F78O8e5;=RKu8>Fj|-3i)fIv@xB1&He9~sN55M zqzBX4kA0+byuHGIxNp~&2eT7>DSUM@8G(B-1W#k9lPQOl{StmjWB2zeuz< zH1>8s3H~GfB!qv~Zy0bM>YwmJ8r$AK;hzZa-?b@?o$N2cf2O~L@bmqz0nYvbrobTf z%K+1_gV@d#>8C;L;}q$KLG1gKu0KM6spMamO5u;DO2GMRss#Lhq!JC^rb0NkWl38{ zunk$#yTjRw!^!{q?{^OT&Vk=K@H+>7=fLkA_?-j4bKrLl{LX>@4{>0lS8q7*ir#Pw zTp|lgK%ocwj|5LpTo?A43BDUHj^DBg*lUBAZF*d9fR`O_mJFA}{qRl6Kxf)0!(J2) zn9eL>o16W3K2ZPkN$4u!8}JHiJ(YV3?vah6jsX9w-wDvK zCioI{J%cCe3B92Qp8j}7;3>p270*08i}AGJxfjn9c(&td!}A`VFY%ng6ZIFQ$I~Cr z2t0*&rsA20XEB}@Jon;x0?&3lZFt_p^Cg}$c%q&}dOZE{jKEWfXDXg~coySn!E-O3 zC-7{?(}w3gJYV8DgC}Y;(&OomX9S)?JX7(^!?PGq3!Z!NJb`CBo;E!1;rSBJ89Y%q zaM}Y;e>@}b6ylkRXC9u#cv|qNJS#GrN19Tm%yrc{U8bz`ob=4WnIl{r9FZylSQt)r z`mn*7Lj?}r0m({70AuNnWsC5_D_m!zaH~}xUW&6fHn8-%dZ#@-e@yXUXT^L4nqTKi zpX;irts0CMBGU<~u5eVd^r~fb$WOS=MiH}EdF7O&DS!=ejrLl?7oLV%CrhW75%2;f zUTb3Mc+s;4QT0_7&I*=pueQx=#QQe3>MEpEA>?0KX|pe_v^O|y;;mhthpnQqv0|CX zL-jAHL_!o-u?X+@rq8cO5%`zR%N1qJbvW?GX#FC3jaOxJ2e%w;i~=Hgi^W;sAS`y0 z*92kS!WgwlflsYPv`GPDUXLHORRN3B@M>F%WH^Y2AGI|R&mG<-1&l*3_)%LGFtv1H zGXzX69!(r=O2A}MaHdAlpGZcQMc5W{BbkvLb{4jV+(>STus@IYJp@d<<~T!kj|!88 zKz=wnOKv11OCf9&xslvr2pc6}vM_WONW~YHNVNfxtOt)j_m&z@mIy!CC~_iMA~`Jk zpbC>k#95LcOcpWpi)2?Q5)xs0_FaHDpq8&=-5KQ&?-l%s06(yI!16S3K48^;Q~Wf* z4R|L;*z#U%9$>P;a8OnP^S~v$PcY%%2bXL%!8-6`2YHkq(X$Kw1Hh;E76|_JG*?1TJ!16K9Vg#1zgXW(6^aY{Vhi85!bWcXZxD*>-v zDjDdU6Q!riSMnxG20C+2u(&Q6k@!*T`GD|?B?G_-XklW4@T4$!A>b|JBm=#NKE=UjUCbKHZK<8vBJ?&MgKdOIo z7`#yfn-Kp@7`z8C*(($a?TKTrYT_xskHTOkOe|sqzY+kOmPrOWFGutY0Zd~p5pQI} z!|*4C!3)FS<}moLVem(Qtv5*qI%h}aoezs21(SaZ_@nY~n&<+8^wx&OuL0aJO)}8C z0hHfkVfd{SUm_WHEAdAuJ@mCkfxjXA8zjSc@QKn#@R}nGKjL3kzz3j@s(z;cHvL7F zH)Ew5d=v0%0B308-GHsH=?(P$0O`k0z~?mb!np#r1^VPdS}NZMnBFaO81FY3YoOcNROz`~~u-cyE(VqXViKqG>0eoz{WLOD5(Q^`T zMv-KocdaTLFRp3k zAlJufh}Y_SV;FuD;A0woKTY`1w+dvz^$+lt6_SC@t5SI%ho%1>un*~lJ?X`|h#^vt zo<4xJ?I8#7v2xgVh5j4D@NWjZagk)8v({AJyXrS2X9O@>;{q3Rug(E@H?Xq<3H#d@aGKKiJLdKR+yf1>pF3l7ZgO zApYC~_%!IJ3`zbQ0Bh-gDlGl0fVKVQ7h&-_VxsaR?*ROpgZ!zQ#Gk2Q@i&ISEn)Dc zF!%+)CT0H82YDU^9Ma#**=K)&((6+zcfa$$<>h?%}sesiV;pYQBP>1oa z(q8{e@tXc|dl>#}1Z&1KKT!IB-azjSkiGdW3_l)IAew*C8ET5}4w%+>h=$9sLUV!{N@lZ-Gf%da6ql9TY^=)O zXrGS@QE)?$a}jRO!Cf{Ec99^Pt*YKOzqWpEMXjw0H%B>a6|SWW)8mF(J1$g6ACY~{ zHOToQNVvhNu0~9|ZJ0_oE@NWqUgcV}Xc>}dAbvYT2UPW94rZG%q0EtGn{02$%&?W> z4k$+hE(x-0FjBQnmOJ z5A>_5V*oCC~5-MkSvQCE%?yQUW5wO=qR01etS|u zCh#s5X&x#fudx;v*l%>%izlFv(u#)SpaSLuZ~m}kQv@!> z=7O}$Ok8-AuUsIf)nX0KaDH)7SgBAjGp>%Y6e#2<3a65;=8mPgi{;L1hgMO5dw|Mo z7TK?SwUaxtImjuhWUYg$g1cxYk0&hAhD%_jP;70@+)7)e!^O=C6{gg3IM3Q* z9lsb#9F!%por+u5>KltEWCGE$7Y;!VuGjrDq{({-XLi zK{vIMaf@N*;FO&1GV>PNRW?l!r+zRG~_>qlF9n)~R6=#Pcf80J+-B`aQFV8%EI#z^j ziu{ArjHsz|*c+Xe8e$;{tIU~QQ}4i)XAXN-G1@Jab}_2Rgd}b$mp~ zElrRCUX+CX%`kmIMGdbi*O3_$LhV_VUWYz0ST#0}I@eH{ zoP!EM9S6Wv{ov>%nBFo14G6b`S{9%_8Nxt21i$``u1(|@m#XICBDtz29|Y87F=L7E^KIO zXU%nC^7v}Oc+H3~G?uw!D2iN=0Zw$Z zUKiRfGQ+~QWM<&X$y!{)m|t7VX~D=0H7TEp0R#; z57XLlAfr$WVSp*TeQ1Zaq6ttHDi_j_&NdI1Cx_~cQ5|e52onv4*cqe};#YGdJrWq1 zSq@hNECk(Xt;|f2MrDIyV#jMK$gZrYqnl?#76sR6D=m}otjhh)T2&g(FR2vT6*4qx za}I?l8dyG6=s$Xe(t0#UTpA6cf_e!1+)-1J43Ynhd8PbB8C=w&%8Jro+(4rMiZ5%h zS7LO*=R6&VBC+v_P#9?)nXc#y4D%EWnN`CKJH7}LvXB_n@wFnO;j})0G3_#xP&eOB zvxA^iiHMH9quPu+h6-l$$!bSdsxl7dn3=)HgW7@j#YgQtC7+WaTU%v?v$8r&naiA+ z*Vr(j#&{j$?_ft z;snmc#HQ||BxieX24>p${GQKWivLSBS4R<$LaAmI z21ES@%L39IP1C!WqRtO>R8S9PR(nB>#5`2!QD{9#9Wf8T(S^f1X!|t3V4MmnSuru0 z88n>Gj;zAeR`4owD6MO$cY|MYS&I)0d1o8cX7tU5taSu_ViAU7OC| zlmpN#t@1d^t1li}+a)|Yms1Tq6a4Cr_I2o&iATkw^EzvQm&{|tKNYV4;2Ckv6+g%G zH1Hn8-mSW=OnCH6z(ZSIR4$#l8w-R3*n6XW3MAn;v<5yE50Y~{I`@-^KsuYJ{s@;5+0rD(}PiC z;aBq`Tv~)~!b5mt@X)!U65!FDXbFD1@naFKO`TT-4fR z9eYZ%N2cPDj3}6NfzF?NI9kW~50L*G*Wo{nWxLghy|{6UzS zAMLki=U=?O(Lkc|i9Xub$phY2O@4U@r(c|sUxok~;f+=NZvQ>W@$LRQ8XKw`L;h{Q^xT$Su^P4kC$2MvdP|ffE0EEVRA^-pY literal 0 HcmV?d00001 diff --git a/utils/code_model_generator/pip_cmg.exe b/utils/code_model_generator/pip_cmg.exe new file mode 100644 index 0000000000000000000000000000000000000000..1361e1b34ba2290b55971ecb022e3aaa993e09ea GIT binary patch literal 2244092 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

w?#Em)<+=>%++V(pQb_25x$%v=Y1qq= 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 YBn+?i=%VYd@xFkqS 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 z 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

XiumfRIoA3N?a8X&v5 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 literal 0 HcmV?d00001 diff --git a/utils/code_model_generator/test.cpp b/utils/code_model_generator/test.cpp new file mode 100755 index 00000000..c3242a40 --- /dev/null +++ b/utils/code_model_generator/test.cpp @@ -0,0 +1,7084 @@ +// Generated by "PIP Code model generator" 29.04.2014 18:03:05 + +#include +#include "test.h" + +using namespace PICodeInfo; + +#include "piusb.h" +#include "picli.h" +#include "pitime.h" +#include "pipeer.h" +#include "pimath.h" +#include "pifile.h" +#include "pichar.h" +#include "pitimer.h" +#include "pimutex.h" +#include "picodec.h" +#include "pithread.h" +#include "pistring.h" +#include "piserial.h" +#include "piobject.h" +#include "piconfig.h" +#include "pivariant.h" +#include "pisignals.h" +#include "piprocess.h" +#include "pimonitor.h" +#include "piconsole.h" +#include "piprotocol.h" +#include "piiodevice.h" +#include "piincludes.h" +#include "piethernet.h" +#include "pibitarray.h" +#include "pievaluator.h" +#include "pibytearray.h" +#include "pibinarylog.h" +#include "picollection.h" +#include "pikbdlistener.h" +#include "pidiagnostics.h" +#include "pisystemmonitor.h" +#include "pimultiprotocol.h" +#include "pipacketextractor.h" + + +PIVariant execFunction(PIMutex * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "lock") == 0) {object->lock(); return PIVariant();} + if (strcmp(function, "unlock") == 0) {object->unlock(); return PIVariant();} + if (strcmp(function, "tryLock") == 0) {return PIVariant::fromValue(object->tryLock());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIMutex\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIBitArray * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "bitSize") == 0) {return PIVariant::fromValue(object->bitSize());} + if (strcmp(function, "byteSize") == 0) {return PIVariant::fromValue(object->byteSize());} + if (strcmp(function, "data") == 0) {return PIVariant::fromValue(object->data());} + if (strcmp(function, "toUChar") == 0) {return PIVariant::fromValue(object->toUChar());} + if (strcmp(function, "toUShort") == 0) {return PIVariant::fromValue(object->toUShort());} + if (strcmp(function, "toUInt") == 0) {return PIVariant::fromValue(object->toUInt());} + if (strcmp(function, "toULong") == 0) {return PIVariant::fromValue(object->toULong());} + if (strcmp(function, "toULLong") == 0) {return PIVariant::fromValue(object->toULLong());} + if (strcmp(function, "at") == 0) {return PIVariant::fromValue(object->at(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIBitArray\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIHuffman * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "compress") == 0) {return PIVariant::fromValue >(object->compress(arg0.toValue >()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIHuffman\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIByteArray * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "resized") == 0) {return PIVariant::fromValue(object->resized(arg0.toValue()));} + if (strcmp(function, "toBase64") == 0) {return PIVariant::fromValue(object->toBase64());} + if (strcmp(function, "fromBase64") == 0) {return PIVariant::fromValue(object->fromBase64());} + if (strcmp(function, "compressedRLE") == 0) {return PIVariant::fromValue(object->compressedRLE(arg0.toValue()));} + if (strcmp(function, "decompressedRLE") == 0) {return PIVariant::fromValue(object->decompressedRLE(arg0.toValue()));} + if (strcmp(function, "checksumPlain8") == 0) {return PIVariant::fromValue(object->checksumPlain8());} + if (strcmp(function, "checksumPlain32") == 0) {return PIVariant::fromValue(object->checksumPlain32());} + if (strcmp(function, "checksumCRC8") == 0) {return PIVariant::fromValue(object->checksumCRC8());} + if (strcmp(function, "checksumCRC16") == 0) {return PIVariant::fromValue(object->checksumCRC16());} + if (strcmp(function, "checksumCRC32") == 0) {return PIVariant::fromValue(object->checksumCRC32());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIByteArray\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIChar * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "isDigit") == 0) {return PIVariant::fromValue(object->isDigit());} + if (strcmp(function, "isHex") == 0) {return PIVariant::fromValue(object->isHex());} + if (strcmp(function, "isGraphical") == 0) {return PIVariant::fromValue(object->isGraphical());} + if (strcmp(function, "isControl") == 0) {return PIVariant::fromValue(object->isControl());} + if (strcmp(function, "isLower") == 0) {return PIVariant::fromValue(object->isLower());} + if (strcmp(function, "isUpper") == 0) {return PIVariant::fromValue(object->isUpper());} + if (strcmp(function, "isPrint") == 0) {return PIVariant::fromValue(object->isPrint());} + if (strcmp(function, "isSpace") == 0) {return PIVariant::fromValue(object->isSpace());} + if (strcmp(function, "isAlpha") == 0) {return PIVariant::fromValue(object->isAlpha());} + if (strcmp(function, "isAscii") == 0) {return PIVariant::fromValue(object->isAscii());} + if (strcmp(function, "toInt") == 0) {return PIVariant::fromValue(object->toInt());} + if (strcmp(function, "toWCharPtr") == 0) {return PIVariant::fromValue(object->toWCharPtr());} + if (strcmp(function, "toCharPtr") == 0) {return PIVariant::fromValue(object->toCharPtr());} + if (strcmp(function, "toWChar") == 0) {return PIVariant::fromValue(object->toWChar());} + if (strcmp(function, "toAscii") == 0) {return PIVariant::fromValue(object->toAscii());} + if (strcmp(function, "unicode16Code") == 0) {return PIVariant::fromValue(object->unicode16Code());} + if (strcmp(function, "toUpper") == 0) {return PIVariant::fromValue(object->toUpper());} + if (strcmp(function, "toLower") == 0) {return PIVariant::fromValue(object->toLower());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIChar\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIString * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "mid") == 0) {return PIVariant::fromValue(object->mid(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "left") == 0) {return PIVariant::fromValue(object->left(arg0.toValue()));} + if (strcmp(function, "right") == 0) {return PIVariant::fromValue(object->right(arg0.toValue()));} + if (strcmp(function, "trimmed") == 0) {return PIVariant::fromValue(object->trimmed());} + if (strcmp(function, "replaced") == 0) {return PIVariant::fromValue(object->replaced(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "replaced") == 0) {return PIVariant::fromValue(object->replaced(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "replaceAll") == 0) {return PIVariant::fromValue(object->replaceAll(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "reversed") == 0) {return PIVariant::fromValue(object->reversed());} + if (strcmp(function, "takeMid") == 0) {return PIVariant::fromValue(object->takeMid(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "takeLeft") == 0) {return PIVariant::fromValue(object->takeLeft(arg0.toValue()));} + if (strcmp(function, "takeRight") == 0) {return PIVariant::fromValue(object->takeRight(arg0.toValue()));} + if (strcmp(function, "takeSymbol") == 0) {return PIVariant::fromValue(object->takeSymbol());} + if (strcmp(function, "takeWord") == 0) {return PIVariant::fromValue(object->takeWord());} + if (strcmp(function, "takeCWord") == 0) {return PIVariant::fromValue(object->takeCWord());} + if (strcmp(function, "takeLine") == 0) {return PIVariant::fromValue(object->takeLine());} + if (strcmp(function, "takeNumber") == 0) {return PIVariant::fromValue(object->takeNumber());} + if (strcmp(function, "takeRange") == 0) {return PIVariant::fromValue(object->takeRange(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "lengthAscii") == 0) {return PIVariant::fromValue(object->lengthAscii());} + if (strcmp(function, "data") == 0) {return PIVariant::fromValue(object->data());} + if (strcmp(function, "stdString") == 0) {return PIVariant::fromValue(object->stdString());} + if (strcmp(function, "toByteArray") == 0) {return PIVariant::fromValue(object->toByteArray());} + if (strcmp(function, "split") == 0) {return PIVariant::fromValue(object->split(arg0.toValue()));} + if (strcmp(function, "toUpperCase") == 0) {return PIVariant::fromValue(object->toUpperCase());} + if (strcmp(function, "toLowerCase") == 0) {return PIVariant::fromValue(object->toLowerCase());} + if (strcmp(function, "toNativeDecimalPoints") == 0) {return PIVariant::fromValue(object->toNativeDecimalPoints());} + if (strcmp(function, "find") == 0) {return PIVariant::fromValue(object->find(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "find") == 0) {return PIVariant::fromValue(object->find(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "find") == 0) {return PIVariant::fromValue(object->find(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "find") == 0) {return PIVariant::fromValue(object->find(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findLast") == 0) {return PIVariant::fromValue(object->findLast(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findLast") == 0) {return PIVariant::fromValue(object->findLast(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findLast") == 0) {return PIVariant::fromValue(object->findLast(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findLast") == 0) {return PIVariant::fromValue(object->findLast(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findWord") == 0) {return PIVariant::fromValue(object->findWord(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "findCWord") == 0) {return PIVariant::fromValue(object->findCWord(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "startsWith") == 0) {return PIVariant::fromValue(object->startsWith(arg0.toValue()));} + if (strcmp(function, "endsWith") == 0) {return PIVariant::fromValue(object->endsWith(arg0.toValue()));} + if (strcmp(function, "length") == 0) {return PIVariant::fromValue(object->length());} + if (strcmp(function, "isEmpty") == 0) {return PIVariant::fromValue(object->isEmpty());} + if (strcmp(function, "toBool") == 0) {return PIVariant::fromValue(object->toBool());} + if (strcmp(function, "toChar") == 0) {return PIVariant::fromValue(object->toChar());} + if (strcmp(function, "toShort") == 0) {return PIVariant::fromValue(object->toShort(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toUShort") == 0) {return PIVariant::fromValue(object->toUShort(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toInt") == 0) {return PIVariant::fromValue(object->toInt(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toUInt") == 0) {return PIVariant::fromValue(object->toUInt(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toLong") == 0) {return PIVariant::fromValue(object->toLong(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toULong") == 0) {return PIVariant::fromValue(object->toULong(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toLLong") == 0) {return PIVariant::fromValue(object->toLLong(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toULLong") == 0) {return PIVariant::fromValue(object->toULLong(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "toFloat") == 0) {return PIVariant::fromValue(object->toFloat());} + if (strcmp(function, "toDouble") == 0) {return PIVariant::fromValue(object->toDouble());} + if (strcmp(function, "toLDouble") == 0) {return PIVariant::fromValue(object->toLDouble());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIString\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIStringList * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "join") == 0) {return PIVariant::fromValue(object->join(arg0.toValue()));} + if (strcmp(function, "contentSize") == 0) {return PIVariant::fromValue(object->contentSize());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIStringList\"!"; + return PIVariant(); +} + +PIVariant execFunction(PISystemTime * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "toSeconds") == 0) {return PIVariant::fromValue(object->toSeconds());} + if (strcmp(function, "toMilliseconds") == 0) {return PIVariant::fromValue(object->toMilliseconds());} + if (strcmp(function, "toMicroseconds") == 0) {return PIVariant::fromValue(object->toMicroseconds());} + if (strcmp(function, "toNanoseconds") == 0) {return PIVariant::fromValue(object->toNanoseconds());} + if (strcmp(function, "sleep") == 0) {object->sleep(); return PIVariant();} + if (strcmp(function, "abs") == 0) {return PIVariant::fromValue(object->abs());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PISystemTime\"!"; + return PIVariant(); +} + +PIVariant execFunction(PITime * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "toString") == 0) {return PIVariant::fromValue(object->toString(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in struct \"PITime\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIDate * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "toString") == 0) {return PIVariant::fromValue(object->toString(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in struct \"PIDate\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIDateTime * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "normalized") == 0) {return PIVariant::fromValue(object->normalized());} + if (strcmp(function, "normalize") == 0) {object->normalize(); return PIVariant();} + if (strcmp(function, "toString") == 0) {return PIVariant::fromValue(object->toString(arg0.toValue()));} + if (strcmp(function, "toSecondSinceEpoch") == 0) {return PIVariant::fromValue(object->toSecondSinceEpoch());} + if (strcmp(function, "toSystemTime") == 0) {return PIVariant::fromValue(object->toSystemTime());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in struct \"PIDateTime\"!"; + return PIVariant(); +} + +PIVariant execFunction(Solver * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "solve") == 0) {object->solve(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "fromTF") == 0) {object->fromTF(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setMethod") == 0) {object->setMethod(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setTime") == 0) {object->setTime(arg0.toValue()); return PIVariant();} + if (strcmp(function, "solveEyler1") == 0) {object->solveEyler1(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solveEyler2") == 0) {object->solveEyler2(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solveRK4") == 0) {object->solveRK4(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solveABM2") == 0) {object->solveABM2(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solveABM3") == 0) {object->solveABM3(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solveABM4") == 0) {object->solveABM4(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solvePA") == 0) {object->solvePA(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "solvePA2") == 0) {object->solvePA2(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solvePA3") == 0) {object->solvePA3(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solvePA4") == 0) {object->solvePA4(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "solvePA5") == 0) {object->solvePA5(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"Solver\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIFFT * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "calcFFT") == 0) {return PIVariant::fromValue * >(object->calcFFT(arg0.toValue >()));} + if (strcmp(function, "calcFFT") == 0) {return PIVariant::fromValue * >(object->calcFFT(arg0.toValue >()));} + if (strcmp(function, "calcFFTinverse") == 0) {return PIVariant::fromValue * >(object->calcFFTinverse(arg0.toValue >()));} + if (strcmp(function, "calcHilbert") == 0) {return PIVariant::fromValue * >(object->calcHilbert(arg0.toValue >()));} + if (strcmp(function, "getAmplitude") == 0) {return PIVariant::fromValue >(object->getAmplitude());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIFFT\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIVariant * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue()); return PIVariant();} + if (strcmp(function, "toBool") == 0) {return PIVariant::fromValue(object->toBool());} + if (strcmp(function, "toInt") == 0) {return PIVariant::fromValue(object->toInt());} + if (strcmp(function, "toLLong") == 0) {return PIVariant::fromValue(object->toLLong());} + if (strcmp(function, "toFloat") == 0) {return PIVariant::fromValue(object->toFloat());} + if (strcmp(function, "toDouble") == 0) {return PIVariant::fromValue(object->toDouble());} + if (strcmp(function, "toLDouble") == 0) {return PIVariant::fromValue(object->toLDouble());} + if (strcmp(function, "toComplexd") == 0) {return PIVariant::fromValue(object->toComplexd());} + if (strcmp(function, "toComplexld") == 0) {return PIVariant::fromValue(object->toComplexld());} + if (strcmp(function, "toTime") == 0) {return PIVariant::fromValue(object->toTime());} + if (strcmp(function, "toDate") == 0) {return PIVariant::fromValue(object->toDate());} + if (strcmp(function, "toDateTime") == 0) {return PIVariant::fromValue(object->toDateTime());} + if (strcmp(function, "toSystemTime") == 0) {return PIVariant::fromValue(object->toSystemTime());} + if (strcmp(function, "toString") == 0) {return PIVariant::fromValue(object->toString());} + if (strcmp(function, "toStringList") == 0) {return PIVariant::fromValue(object->toStringList());} + if (strcmp(function, "toBitArray") == 0) {return PIVariant::fromValue(object->toBitArray());} + if (strcmp(function, "toByteArray") == 0) {return PIVariant::fromValue(object->toByteArray());} + if (strcmp(function, "type") == 0) {return PIVariant::fromValue(object->type());} + if (strcmp(function, "typeName") == 0) {return PIVariant::fromValue(object->typeName());} + if (strcmp(function, "isValid") == 0) {return PIVariant::fromValue(object->isValid());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIVariant\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIObject * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "name") == 0) {return PIVariant::fromValue(object->name());} + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "debug") == 0) {return PIVariant::fromValue(object->debug());} + if (strcmp(function, "setName") == 0) {object->setName(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setDebug") == 0) {object->setDebug(arg0.toValue()); return PIVariant();} + if (strcmp(function, "properties") == 0) {return PIVariant::fromValue >(object->properties());} + if (strcmp(function, "propertiesCount") == 0) {return PIVariant::fromValue(object->propertiesCount());} + if (strcmp(function, "property") == 0) {return PIVariant::fromValue(object->property(arg0.toValue()));} + if (strcmp(function, "setProperty") == 0) {object->setProperty(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "isPropertyExists") == 0) {return PIVariant::fromValue(object->isPropertyExists(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIObject\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIThread * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "start") == 0) {return PIVariant::fromValue(object->start());} + if (strcmp(function, "start") == 0) {return PIVariant::fromValue(object->start(arg0.toValue()));} + if (strcmp(function, "start") == 0) {return PIVariant::fromValue(object->start(arg0.toValue()));} + if (strcmp(function, "start") == 0) {return PIVariant::fromValue(object->start(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "startOnce") == 0) {return PIVariant::fromValue(object->startOnce());} + if (strcmp(function, "startOnce") == 0) {return PIVariant::fromValue(object->startOnce(arg0.toValue()));} + if (strcmp(function, "stop") == 0) {object->stop(); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(arg0.toValue()); return PIVariant();} + if (strcmp(function, "terminate") == 0) {object->terminate(); return PIVariant();} + if (strcmp(function, "setData") == 0) {object->setData(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSlot") == 0) {object->setSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setPriority") == 0) {object->setPriority(arg0.toValue()); return PIVariant();} + if (strcmp(function, "priority") == 0) {return PIVariant::fromValue(object->priority());} + if (strcmp(function, "isRunning") == 0) {return PIVariant::fromValue(object->isRunning());} + if (strcmp(function, "isStopping") == 0) {return PIVariant::fromValue(object->isStopping());} + if (strcmp(function, "waitForStart") == 0) {return PIVariant::fromValue(object->waitForStart());} + if (strcmp(function, "waitForStart") == 0) {return PIVariant::fromValue(object->waitForStart(arg0.toValue()));} + if (strcmp(function, "waitForFinish") == 0) {return PIVariant::fromValue(object->waitForFinish());} + if (strcmp(function, "waitForFinish") == 0) {return PIVariant::fromValue(object->waitForFinish(arg0.toValue()));} + if (strcmp(function, "needLockRun") == 0) {object->needLockRun(arg0.toValue()); return PIVariant();} + if (strcmp(function, "lock") == 0) {object->lock(); return PIVariant();} + if (strcmp(function, "unlock") == 0) {object->unlock(); return PIVariant();} + if (strcmp(function, "started") == 0) {object->started(); return PIVariant();} + if (strcmp(function, "stopped") == 0) {object->stopped(); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIThread\"!"; + return PIVariant(); +} + +PIVariant execFunction(PITimer * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "setData") == 0) {object->setData(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSlot") == 0) {object->setSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "interval") == 0) {return PIVariant::fromValue(object->interval());} + if (strcmp(function, "reset") == 0) {object->reset(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(arg0.toValue()); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(arg0.toValue()); return PIVariant();} + if (strcmp(function, "deferredStart") == 0) {object->deferredStart(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "deferredStart") == 0) {object->deferredStart(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(); return PIVariant();} + if (strcmp(function, "addDelimiter") == 0) {object->addDelimiter(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "removeDelimiter") == 0) {object->removeDelimiter(arg0.toValue()); return PIVariant();} + if (strcmp(function, "removeDelimiter") == 0) {object->removeDelimiter(arg0.toValue()); return PIVariant();} + if (strcmp(function, "removeDelimiter") == 0) {object->removeDelimiter(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setDelimiterValue") == 0) {object->setDelimiterValue(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setDelimiterValue") == 0) {object->setDelimiterValue(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setDelimiterValue") == 0) {object->setDelimiterValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "delimiterValue") == 0) {return PIVariant::fromValue(object->delimiterValue(arg0.toValue()));} + if (strcmp(function, "delimiterValue") == 0) {return PIVariant::fromValue(object->delimiterValue(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "clearDelimiters") == 0) {object->clearDelimiters(); return PIVariant();} + if (strcmp(function, "elapsed_n") == 0) {return PIVariant::fromValue(object->elapsed_n());} + if (strcmp(function, "elapsed_u") == 0) {return PIVariant::fromValue(object->elapsed_u());} + if (strcmp(function, "elapsed_m") == 0) {return PIVariant::fromValue(object->elapsed_m());} + if (strcmp(function, "elapsed_s") == 0) {return PIVariant::fromValue(object->elapsed_s());} + if (strcmp(function, "reset_time_n") == 0) {return PIVariant::fromValue(object->reset_time_n());} + if (strcmp(function, "reset_time_u") == 0) {return PIVariant::fromValue(object->reset_time_u());} + if (strcmp(function, "reset_time_m") == 0) {return PIVariant::fromValue(object->reset_time_m());} + if (strcmp(function, "reset_time_s") == 0) {return PIVariant::fromValue(object->reset_time_s());} + if (strcmp(function, "reset_time") == 0) {return PIVariant::fromValue(object->reset_time());} + if (strcmp(function, "timeout") == 0) {object->timeout(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PITimer\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIKbdListener * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "data") == 0) {return PIVariant::fromValue(object->data());} + if (strcmp(function, "setData") == 0) {object->setData(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSlot") == 0) {object->setSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "exitCaptured") == 0) {return PIVariant::fromValue(object->exitCaptured());} + if (strcmp(function, "exitKey") == 0) {return PIVariant::fromValue(object->exitKey());} + if (strcmp(function, "isActive") == 0) {return PIVariant::fromValue(object->isActive());} + if (strcmp(function, "enableExitCapture") == 0) {object->enableExitCapture(); return PIVariant();} + if (strcmp(function, "enableExitCapture") == 0) {object->enableExitCapture(arg0.toValue()); return PIVariant();} + if (strcmp(function, "disableExitCapture") == 0) {object->disableExitCapture(); return PIVariant();} + if (strcmp(function, "setActive") == 0) {object->setActive(); return PIVariant();} + if (strcmp(function, "setActive") == 0) {object->setActive(arg0.toValue()); return PIVariant();} + if (strcmp(function, "keyPressed") == 0) {object->keyPressed(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIKbdListener\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIIODevice * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "mode") == 0) {return PIVariant::fromValue(object->mode());} + if (strcmp(function, "path") == 0) {return PIVariant::fromValue(object->path());} + if (strcmp(function, "setPath") == 0) {object->setPath(arg0.toValue()); return PIVariant();} + if (strcmp(function, "isReadable") == 0) {return PIVariant::fromValue(object->isReadable());} + if (strcmp(function, "isWriteable") == 0) {return PIVariant::fromValue(object->isWriteable());} + if (strcmp(function, "isInitialized") == 0) {return PIVariant::fromValue(object->isInitialized());} + if (strcmp(function, "isOpened") == 0) {return PIVariant::fromValue(object->isOpened());} + if (strcmp(function, "isClosed") == 0) {return PIVariant::fromValue(object->isClosed());} + if (strcmp(function, "canRead") == 0) {return PIVariant::fromValue(object->canRead());} + if (strcmp(function, "canWrite") == 0) {return PIVariant::fromValue(object->canWrite());} + if (strcmp(function, "setReopenEnabled") == 0) {object->setReopenEnabled(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setReopenTimeout") == 0) {object->setReopenTimeout(arg0.toValue()); return PIVariant();} + if (strcmp(function, "isReopenEnabled") == 0) {return PIVariant::fromValue(object->isReopenEnabled());} + if (strcmp(function, "reopenTimeout") == 0) {return PIVariant::fromValue(object->reopenTimeout());} + if (strcmp(function, "setThreadedReadSlot") == 0) {object->setThreadedReadSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setThreadedReadData") == 0) {object->setThreadedReadData(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setThreadedReadBufferSize") == 0) {object->setThreadedReadBufferSize(arg0.toValue()); return PIVariant();} + if (strcmp(function, "threadedReadBufferSize") == 0) {return PIVariant::fromValue(object->threadedReadBufferSize());} + if (strcmp(function, "threadedReadBuffer") == 0) {return PIVariant::fromValue(object->threadedReadBuffer());} + if (strcmp(function, "isThreadedRead") == 0) {return PIVariant::fromValue(object->isThreadedRead());} + if (strcmp(function, "startThreadedRead") == 0) {object->startThreadedRead(); return PIVariant();} + if (strcmp(function, "startThreadedRead") == 0) {object->startThreadedRead(arg0.toValue()); return PIVariant();} + if (strcmp(function, "stopThreadedRead") == 0) {object->stopThreadedRead(); return PIVariant();} + if (strcmp(function, "isThreadedWrite") == 0) {return PIVariant::fromValue(object->isThreadedWrite());} + if (strcmp(function, "startThreadedWrite") == 0) {object->startThreadedWrite(); return PIVariant();} + if (strcmp(function, "stopThreadedWrite") == 0) {object->stopThreadedWrite(); return PIVariant();} + if (strcmp(function, "clearThreadedWriteQueue") == 0) {object->clearThreadedWriteQueue(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(arg0.toValue()); return PIVariant();} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue()));} + if (strcmp(function, "readForTime") == 0) {return PIVariant::fromValue(object->readForTime(arg0.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue()));} + if (strcmp(function, "writeThreaded") == 0) {return PIVariant::fromValue(object->writeThreaded(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "writeThreaded") == 0) {return PIVariant::fromValue(object->writeThreaded(arg0.toValue()));} + if (strcmp(function, "configure") == 0) {return PIVariant::fromValue(object->configure(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "open") == 0) {return PIVariant::fromValue(object->open());} + if (strcmp(function, "open") == 0) {return PIVariant::fromValue(object->open(arg0.toValue()));} + if (strcmp(function, "open") == 0) {return PIVariant::fromValue(object->open(arg0.toValue()));} + if (strcmp(function, "open") == 0) {return PIVariant::fromValue(object->open(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "close") == 0) {return PIVariant::fromValue(object->close());} + if (strcmp(function, "initialize") == 0) {return PIVariant::fromValue(object->initialize());} + if (strcmp(function, "flush") == 0) {object->flush(); return PIVariant();} + if (strcmp(function, "opened") == 0) {object->opened(); return PIVariant();} + if (strcmp(function, "closed") == 0) {object->closed(); return PIVariant();} + if (strcmp(function, "threadedReadEvent") == 0) {object->threadedReadEvent(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "threadedWriteEvent") == 0) {object->threadedWriteEvent(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIIODevice\"!"; + return PIVariant(); +} + +PIVariant execFunction(PISerial * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "setSpeed") == 0) {object->setSpeed(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setOutSpeed") == 0) {object->setOutSpeed(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setInSpeed") == 0) {object->setInSpeed(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setDevice") == 0) {object->setDevice(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setParameters") == 0) {object->setParameters(arg0.toValue >()); return PIVariant();} + if (strcmp(function, "setParameter") == 0) {object->setParameter(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "isParameterSet") == 0) {return PIVariant::fromValue(object->isParameterSet(arg0.toValue()));} + if (strcmp(function, "parameters") == 0) {return PIVariant::fromValue >(object->parameters());} + if (strcmp(function, "setDataBitsCount") == 0) {object->setDataBitsCount(arg0.toValue()); return PIVariant();} + if (strcmp(function, "dataBitsCount") == 0) {return PIVariant::fromValue(object->dataBitsCount());} + if (strcmp(function, "setPin") == 0) {return PIVariant::fromValue(object->setPin(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "isPin") == 0) {return PIVariant::fromValue(object->isPin(arg0.toValue()));} + if (strcmp(function, "setLE") == 0) {return PIVariant::fromValue(object->setLE(arg0.toValue()));} + if (strcmp(function, "setDTR") == 0) {return PIVariant::fromValue(object->setDTR(arg0.toValue()));} + if (strcmp(function, "setRTS") == 0) {return PIVariant::fromValue(object->setRTS(arg0.toValue()));} + if (strcmp(function, "setCTS") == 0) {return PIVariant::fromValue(object->setCTS(arg0.toValue()));} + if (strcmp(function, "setST") == 0) {return PIVariant::fromValue(object->setST(arg0.toValue()));} + if (strcmp(function, "setSR") == 0) {return PIVariant::fromValue(object->setSR(arg0.toValue()));} + if (strcmp(function, "setCAR") == 0) {return PIVariant::fromValue(object->setCAR(arg0.toValue()));} + if (strcmp(function, "setRNG") == 0) {return PIVariant::fromValue(object->setRNG(arg0.toValue()));} + if (strcmp(function, "setDSR") == 0) {return PIVariant::fromValue(object->setDSR(arg0.toValue()));} + if (strcmp(function, "isLE") == 0) {return PIVariant::fromValue(object->isLE());} + if (strcmp(function, "isDTR") == 0) {return PIVariant::fromValue(object->isDTR());} + if (strcmp(function, "isRTS") == 0) {return PIVariant::fromValue(object->isRTS());} + if (strcmp(function, "isCTS") == 0) {return PIVariant::fromValue(object->isCTS());} + if (strcmp(function, "isST") == 0) {return PIVariant::fromValue(object->isST());} + if (strcmp(function, "isSR") == 0) {return PIVariant::fromValue(object->isSR());} + if (strcmp(function, "isCAR") == 0) {return PIVariant::fromValue(object->isCAR());} + if (strcmp(function, "isRNG") == 0) {return PIVariant::fromValue(object->isRNG());} + if (strcmp(function, "isDSR") == 0) {return PIVariant::fromValue(object->isDSR());} + if (strcmp(function, "setVTime") == 0) {object->setVTime(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setReadIsBlocking") == 0) {object->setReadIsBlocking(arg0.toValue()); return PIVariant();} + if (strcmp(function, "device") == 0) {return PIVariant::fromValue(object->device());} + if (strcmp(function, "outSpeed") == 0) {return PIVariant::fromValue(object->outSpeed());} + if (strcmp(function, "inSpeed") == 0) {return PIVariant::fromValue(object->inSpeed());} + if (strcmp(function, "VTime") == 0) {return PIVariant::fromValue(object->VTime());} + if (strcmp(function, "flush") == 0) {object->flush(); return PIVariant();} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "readData") == 0) {return PIVariant::fromValue(object->readData(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PISerial\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIFile * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "flush") == 0) {object->flush(); return PIVariant();} + if (strcmp(function, "seek") == 0) {object->seek(arg0.toValue()); return PIVariant();} + if (strcmp(function, "seekToBegin") == 0) {object->seekToBegin(); return PIVariant();} + if (strcmp(function, "seekToEnd") == 0) {object->seekToEnd(); return PIVariant();} + if (strcmp(function, "seekToLine") == 0) {object->seekToLine(arg0.toValue()); return PIVariant();} + if (strcmp(function, "readChar") == 0) {return PIVariant::fromValue(object->readChar());} + if (strcmp(function, "readLine") == 0) {return PIVariant::fromValue(object->readLine());} + if (strcmp(function, "readAll") == 0) {return PIVariant::fromValue(object->readAll(arg0.toValue()));} + if (strcmp(function, "readAll") == 0) {return PIVariant::fromValue(object->readAll(arg0.toValue()));} + if (strcmp(function, "setPath") == 0) {object->setPath(arg0.toValue()); return PIVariant();} + if (strcmp(function, "size") == 0) {return PIVariant::fromValue(object->size());} + if (strcmp(function, "pos") == 0) {return PIVariant::fromValue(object->pos());} + if (strcmp(function, "isEnd") == 0) {return PIVariant::fromValue(object->isEnd());} + if (strcmp(function, "isEmpty") == 0) {return PIVariant::fromValue(object->isEmpty());} + if (strcmp(function, "precision") == 0) {return PIVariant::fromValue(object->precision());} + if (strcmp(function, "setPrecision") == 0) {object->setPrecision(arg0.toValue()); return PIVariant();} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "clear") == 0) {object->clear(); return PIVariant();} + if (strcmp(function, "remove") == 0) {object->remove(); return PIVariant();} + if (strcmp(function, "resize") == 0) {object->resize(arg0.toValue()); return PIVariant();} + if (strcmp(function, "resize") == 0) {object->resize(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIFile\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIProcess * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "exitCode") == 0) {return PIVariant::fromValue(object->exitCode());} + if (strcmp(function, "pID") == 0) {return PIVariant::fromValue(object->pID());} + if (strcmp(function, "setGrabInput") == 0) {object->setGrabInput(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setGrabOutput") == 0) {object->setGrabOutput(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setGrabError") == 0) {object->setGrabError(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setInputFile") == 0) {object->setInputFile(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setOutputFile") == 0) {object->setOutputFile(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setErrorFile") == 0) {object->setErrorFile(arg0.toValue()); return PIVariant();} + if (strcmp(function, "unsetInputFile") == 0) {object->unsetInputFile(); return PIVariant();} + if (strcmp(function, "unsetOutputFile") == 0) {object->unsetOutputFile(); return PIVariant();} + if (strcmp(function, "unsetErrorFile") == 0) {object->unsetErrorFile(); return PIVariant();} + if (strcmp(function, "workingDirectory") == 0) {return PIVariant::fromValue(object->workingDirectory());} + if (strcmp(function, "setWorkingDirectory") == 0) {object->setWorkingDirectory(arg0.toValue()); return PIVariant();} + if (strcmp(function, "resetWorkingDirectory") == 0) {object->resetWorkingDirectory(); return PIVariant();} + if (strcmp(function, "readOutput") == 0) {return PIVariant::fromValue(object->readOutput());} + if (strcmp(function, "readError") == 0) {return PIVariant::fromValue(object->readError());} + if (strcmp(function, "environment") == 0) {return PIVariant::fromValue(object->environment());} + if (strcmp(function, "clearEnvironment") == 0) {object->clearEnvironment(); return PIVariant();} + if (strcmp(function, "removeEnvironmentVariable") == 0) {object->removeEnvironmentVariable(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setEnvironmentVariable") == 0) {object->setEnvironmentVariable(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "exec") == 0) {object->exec(arg0.toValue()); return PIVariant();} + if (strcmp(function, "exec") == 0) {object->exec(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "exec") == 0) {object->exec(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "exec") == 0) {object->exec(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()); return PIVariant();} + if (strcmp(function, "exec") == 0) {object->exec(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "terminate") == 0) {object->terminate(); return PIVariant();} + if (strcmp(function, "waitForFinish") == 0) {return PIVariant::fromValue(object->waitForFinish());} + if (strcmp(function, "waitForFinish") == 0) {return PIVariant::fromValue(object->waitForFinish(arg0.toValue()));} + if (strcmp(function, "execStarted") == 0) {object->execStarted(arg0.toValue()); return PIVariant();} + if (strcmp(function, "execFinished") == 0) {object->execFinished(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIProcess\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIEthernet * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "setReadAddress") == 0) {object->setReadAddress(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setReadAddress") == 0) {object->setReadAddress(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setReadIP") == 0) {object->setReadIP(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setReadPort") == 0) {object->setReadPort(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSendAddress") == 0) {object->setSendAddress(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setSendAddress") == 0) {object->setSendAddress(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSendIP") == 0) {object->setSendIP(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSendPort") == 0) {object->setSendPort(arg0.toValue()); return PIVariant();} + if (strcmp(function, "readAddress") == 0) {return PIVariant::fromValue(object->readAddress());} + if (strcmp(function, "readIP") == 0) {return PIVariant::fromValue(object->readIP());} + if (strcmp(function, "readPort") == 0) {return PIVariant::fromValue(object->readPort());} + if (strcmp(function, "sendAddress") == 0) {return PIVariant::fromValue(object->sendAddress());} + if (strcmp(function, "sendIP") == 0) {return PIVariant::fromValue(object->sendIP());} + if (strcmp(function, "sendPort") == 0) {return PIVariant::fromValue(object->sendPort());} + if (strcmp(function, "setParameters") == 0) {object->setParameters(arg0.toValue >()); return PIVariant();} + if (strcmp(function, "setParameter") == 0) {object->setParameter(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "isParameterSet") == 0) {return PIVariant::fromValue(object->isParameterSet(arg0.toValue()));} + if (strcmp(function, "parameters") == 0) {return PIVariant::fromValue >(object->parameters());} + if (strcmp(function, "type") == 0) {return PIVariant::fromValue(object->type());} + if (strcmp(function, "joinMulticastGroup") == 0) {return PIVariant::fromValue(object->joinMulticastGroup(arg0.toValue()));} + if (strcmp(function, "leaveMulticastGroup") == 0) {return PIVariant::fromValue(object->leaveMulticastGroup(arg0.toValue()));} + if (strcmp(function, "multicastGroups") == 0) {return PIVariant::fromValue(object->multicastGroups());} + if (strcmp(function, "connect") == 0) {return PIVariant::fromValue(object->connect());} + if (strcmp(function, "connect") == 0) {return PIVariant::fromValue(object->connect(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "connect") == 0) {return PIVariant::fromValue(object->connect(arg0.toValue()));} + if (strcmp(function, "isConnected") == 0) {return PIVariant::fromValue(object->isConnected());} + if (strcmp(function, "listen") == 0) {return PIVariant::fromValue(object->listen());} + if (strcmp(function, "listen") == 0) {return PIVariant::fromValue(object->listen(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "listen") == 0) {return PIVariant::fromValue(object->listen(arg0.toValue()));} + if (strcmp(function, "client") == 0) {return PIVariant::fromValue(object->client(arg0.toValue()));} + if (strcmp(function, "clientsCount") == 0) {return PIVariant::fromValue(object->clientsCount());} + if (strcmp(function, "clients") == 0) {return PIVariant::fromValue >(object->clients());} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue()));} + if (strcmp(function, "newConnection") == 0) {object->newConnection(arg0.toValue()); return PIVariant();} + if (strcmp(function, "connected") == 0) {object->connected(); return PIVariant();} + if (strcmp(function, "disconnected") == 0) {object->disconnected(arg0.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIEthernet\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIPacketExtractor * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "device") == 0) {return PIVariant::fromValue(object->device());} + if (strcmp(function, "setDevice") == 0) {object->setDevice(arg0.toValue()); return PIVariant();} + if (strcmp(function, "bufferSize") == 0) {return PIVariant::fromValue(object->bufferSize());} + if (strcmp(function, "setBufferSize") == 0) {object->setBufferSize(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setHeaderCheckSlot") == 0) {object->setHeaderCheckSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setPacketData") == 0) {object->setPacketData(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "missedBytes") == 0) {return PIVariant::fromValue(object->missedBytes());} + if (strcmp(function, "missedPackets") == 0) {return PIVariant::fromValue(object->missedPackets());} + if (strcmp(function, "missedBytes_ptr") == 0) {return PIVariant::fromValue(object->missedBytes_ptr());} + if (strcmp(function, "missedPackets_ptr") == 0) {return PIVariant::fromValue(object->missedPackets_ptr());} + if (strcmp(function, "lastHeader") == 0) {return PIVariant::fromValue(object->lastHeader());} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "packetReceived") == 0) {object->packetReceived(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIPacketExtractor\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIConfig * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "getValues") == 0) {return PIVariant::fromValue(object->getValues(arg0.toValue()));} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "entriesCount") == 0) {return PIVariant::fromValue(object->entriesCount());} + if (strcmp(function, "isEntryExists") == 0) {return PIVariant::fromValue(object->isEntryExists(arg0.toValue()));} + if (strcmp(function, "allTree") == 0) {return PIVariant::fromValue(object->allTree());} + if (strcmp(function, "allLeaves") == 0) {return PIVariant::fromValue(object->allLeaves());} + if (strcmp(function, "entryIndex") == 0) {return PIVariant::fromValue(object->entryIndex(arg0.toValue()));} + if (strcmp(function, "getName") == 0) {return PIVariant::fromValue(object->getName(arg0.toValue()));} + if (strcmp(function, "getValue") == 0) {return PIVariant::fromValue(object->getValue(arg0.toValue()));} + if (strcmp(function, "getType") == 0) {return PIVariant::fromValue(object->getType(arg0.toValue()));} + if (strcmp(function, "getComment") == 0) {return PIVariant::fromValue(object->getComment(arg0.toValue()));} + if (strcmp(function, "addEntry") == 0) {object->addEntry(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()); return PIVariant();} + if (strcmp(function, "setName") == 0) {object->setName(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setValue") == 0) {object->setValue(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setType") == 0) {object->setType(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setComment") == 0) {object->setComment(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "removeEntry") == 0) {object->removeEntry(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "removeEntry") == 0) {object->removeEntry(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "clear") == 0) {object->clear(); return PIVariant();} + if (strcmp(function, "readAll") == 0) {object->readAll(); return PIVariant();} + if (strcmp(function, "writeAll") == 0) {object->writeAll(); return PIVariant();} + if (strcmp(function, "delimiter") == 0) {return PIVariant::fromValue(object->delimiter());} + if (strcmp(function, "setDelimiter") == 0) {object->setDelimiter(arg0.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIConfig\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIMultiProtocolBase * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIMultiProtocolBase\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIProtocol * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "startReceive") == 0) {object->startReceive(); return PIVariant();} + if (strcmp(function, "startReceive") == 0) {object->startReceive(arg0.toValue()); return PIVariant();} + if (strcmp(function, "stopReceive") == 0) {object->stopReceive(); return PIVariant();} + if (strcmp(function, "setExpectedFrequency") == 0) {object->setExpectedFrequency(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setReceiverDevice") == 0) {object->setReceiverDevice(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setReceiverData") == 0) {object->setReceiverData(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setReceiverDataHeader") == 0) {object->setReceiverDataHeader(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setReceiverAddress") == 0) {object->setReceiverAddress(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setReceiverParameters") == 0) {object->setReceiverParameters(arg0.toValue >()); return PIVariant();} + if (strcmp(function, "setReceiveSlot") == 0) {object->setReceiveSlot(arg0.toValue()); return PIVariant();} + if (strcmp(function, "expectedFrequency") == 0) {return PIVariant::fromValue(object->expectedFrequency());} + if (strcmp(function, "startSend") == 0) {object->startSend(); return PIVariant();} + if (strcmp(function, "startSend") == 0) {object->startSend(arg0.toValue()); return PIVariant();} + if (strcmp(function, "stopSend") == 0) {object->stopSend(); return PIVariant();} + if (strcmp(function, "setSenderFrequency") == 0) {object->setSenderFrequency(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setSenderDevice") == 0) {object->setSenderDevice(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setSenderData") == 0) {object->setSenderData(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setSenderAddress") == 0) {object->setSenderAddress(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setSenderIP") == 0) {object->setSenderIP(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setSenderPort") == 0) {object->setSenderPort(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setSenderParameters") == 0) {object->setSenderParameters(arg0.toValue >()); return PIVariant();} + if (strcmp(function, "senderFrequency") == 0) {return PIVariant::fromValue(object->senderFrequency());} + if (strcmp(function, "start") == 0) {object->start(); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(); return PIVariant();} + if (strcmp(function, "send") == 0) {object->send(); return PIVariant();} + if (strcmp(function, "send") == 0) {object->send(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "send") == 0) {object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "setName") == 0) {object->setName(arg0.toValue()); return PIVariant();} + if (strcmp(function, "name") == 0) {return PIVariant::fromValue(object->name());} + if (strcmp(function, "setDisconnectTimeout") == 0) {object->setDisconnectTimeout(arg0.toValue()); return PIVariant();} + if (strcmp(function, "disconnectTimeout") == 0) {return PIVariant::fromValue(object->disconnectTimeout());} + if (strcmp(function, "disconnectTimeout_ptr") == 0) {return PIVariant::fromValue(object->disconnectTimeout_ptr());} + if (strcmp(function, "immediateFrequency") == 0) {return PIVariant::fromValue(object->immediateFrequency());} + if (strcmp(function, "integralFrequency") == 0) {return PIVariant::fromValue(object->integralFrequency());} + if (strcmp(function, "immediateFrequency_ptr") == 0) {return PIVariant::fromValue(object->immediateFrequency_ptr());} + if (strcmp(function, "integralFrequency_ptr") == 0) {return PIVariant::fromValue(object->integralFrequency_ptr());} + if (strcmp(function, "receiveCountPerSec") == 0) {return PIVariant::fromValue(object->receiveCountPerSec());} + if (strcmp(function, "receiveCountPerSec_ptr") == 0) {return PIVariant::fromValue(object->receiveCountPerSec_ptr());} + if (strcmp(function, "sendCountPerSec") == 0) {return PIVariant::fromValue(object->sendCountPerSec());} + if (strcmp(function, "sendCountPerSec_ptr") == 0) {return PIVariant::fromValue(object->sendCountPerSec_ptr());} + if (strcmp(function, "receiveBytesPerSec") == 0) {return PIVariant::fromValue(object->receiveBytesPerSec());} + if (strcmp(function, "receiveBytesPerSec_ptr") == 0) {return PIVariant::fromValue(object->receiveBytesPerSec_ptr());} + if (strcmp(function, "sendBytesPerSec") == 0) {return PIVariant::fromValue(object->sendBytesPerSec());} + if (strcmp(function, "sendBytesPerSec_ptr") == 0) {return PIVariant::fromValue(object->sendBytesPerSec_ptr());} + if (strcmp(function, "receiveCount") == 0) {return PIVariant::fromValue(object->receiveCount());} + if (strcmp(function, "receiveCount_ptr") == 0) {return PIVariant::fromValue(object->receiveCount_ptr());} + if (strcmp(function, "wrongCount") == 0) {return PIVariant::fromValue(object->wrongCount());} + if (strcmp(function, "wrongCount_ptr") == 0) {return PIVariant::fromValue(object->wrongCount_ptr());} + if (strcmp(function, "sendCount") == 0) {return PIVariant::fromValue(object->sendCount());} + if (strcmp(function, "sendCount_ptr") == 0) {return PIVariant::fromValue(object->sendCount_ptr());} + if (strcmp(function, "missedCount") == 0) {return PIVariant::fromValue(object->missedCount());} + if (strcmp(function, "missedCount_ptr") == 0) {return PIVariant::fromValue(object->missedCount_ptr());} + if (strcmp(function, "quality") == 0) {return PIVariant::fromValue(object->quality());} + if (strcmp(function, "quality_ptr") == 0) {return PIVariant::fromValue(object->quality_ptr());} + if (strcmp(function, "receiverDeviceName") == 0) {return PIVariant::fromValue(object->receiverDeviceName());} + if (strcmp(function, "senderDeviceName") == 0) {return PIVariant::fromValue(object->senderDeviceName());} + if (strcmp(function, "receiverDeviceState") == 0) {return PIVariant::fromValue(object->receiverDeviceState());} + if (strcmp(function, "receiverDeviceState_ptr") == 0) {return PIVariant::fromValue(object->receiverDeviceState_ptr());} + if (strcmp(function, "senderDeviceState") == 0) {return PIVariant::fromValue(object->senderDeviceState());} + if (strcmp(function, "senderDeviceState_ptr") == 0) {return PIVariant::fromValue(object->senderDeviceState_ptr());} + if (strcmp(function, "receiveSpeed") == 0) {return PIVariant::fromValue(object->receiveSpeed());} + if (strcmp(function, "receiveSpeed_ptr") == 0) {return PIVariant::fromValue(object->receiveSpeed_ptr());} + if (strcmp(function, "sendSpeed") == 0) {return PIVariant::fromValue(object->sendSpeed());} + if (strcmp(function, "sendSpeed_ptr") == 0) {return PIVariant::fromValue(object->sendSpeed_ptr());} + if (strcmp(function, "receiverHistorySize") == 0) {return PIVariant::fromValue(object->receiverHistorySize());} + if (strcmp(function, "receiverHistorySize_ptr") == 0) {return PIVariant::fromValue(object->receiverHistorySize_ptr());} + if (strcmp(function, "senderHistorySize") == 0) {return PIVariant::fromValue(object->senderHistorySize());} + if (strcmp(function, "senderHistorySize_ptr") == 0) {return PIVariant::fromValue(object->senderHistorySize_ptr());} + if (strcmp(function, "writeReceiverHistory") == 0) {return PIVariant::fromValue(object->writeReceiverHistory());} + if (strcmp(function, "writeReceiverHistory_ptr") == 0) {return PIVariant::fromValue(object->writeReceiverHistory_ptr());} + if (strcmp(function, "writeSenderHistory") == 0) {return PIVariant::fromValue(object->writeSenderHistory());} + if (strcmp(function, "writeSenderHistory_ptr") == 0) {return PIVariant::fromValue(object->writeSenderHistory_ptr());} + if (strcmp(function, "receiveData") == 0) {return PIVariant::fromValue(object->receiveData());} + if (strcmp(function, "sendData") == 0) {return PIVariant::fromValue(object->sendData());} + if (strcmp(function, "packetExtractor") == 0) {return PIVariant::fromValue(object->packetExtractor());} + if (strcmp(function, "lastHeader") == 0) {return PIVariant::fromValue(object->lastHeader());} + if (strcmp(function, "receiverStarted") == 0) {object->receiverStarted(); return PIVariant();} + if (strcmp(function, "receiverStopped") == 0) {object->receiverStopped(); return PIVariant();} + if (strcmp(function, "senderStarted") == 0) {object->senderStarted(); return PIVariant();} + if (strcmp(function, "senderStopped") == 0) {object->senderStopped(); return PIVariant();} + if (strcmp(function, "received") == 0) {object->received(arg0.toValue()); return PIVariant();} + if (strcmp(function, "qualityChanged") == 0) {object->qualityChanged(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIProtocol\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIDiagnostics * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "immediateFrequency") == 0) {return PIVariant::fromValue(object->immediateFrequency());} + if (strcmp(function, "integralFrequency") == 0) {return PIVariant::fromValue(object->integralFrequency());} + if (strcmp(function, "receiveCountPerSec") == 0) {return PIVariant::fromValue(object->receiveCountPerSec());} + if (strcmp(function, "sendCountPerSec") == 0) {return PIVariant::fromValue(object->sendCountPerSec());} + if (strcmp(function, "receiveBytesPerSec") == 0) {return PIVariant::fromValue(object->receiveBytesPerSec());} + if (strcmp(function, "sendBytesPerSec") == 0) {return PIVariant::fromValue(object->sendBytesPerSec());} + if (strcmp(function, "receiveCount") == 0) {return PIVariant::fromValue(object->receiveCount());} + if (strcmp(function, "wrongCount") == 0) {return PIVariant::fromValue(object->wrongCount());} + if (strcmp(function, "sendCount") == 0) {return PIVariant::fromValue(object->sendCount());} + if (strcmp(function, "quality") == 0) {return PIVariant::fromValue(object->quality());} + if (strcmp(function, "receiveSpeed") == 0) {return PIVariant::fromValue(object->receiveSpeed());} + if (strcmp(function, "sendSpeed") == 0) {return PIVariant::fromValue(object->sendSpeed());} + if (strcmp(function, "immediateFrequency_ptr") == 0) {return PIVariant::fromValue(object->immediateFrequency_ptr());} + if (strcmp(function, "integralFrequency_ptr") == 0) {return PIVariant::fromValue(object->integralFrequency_ptr());} + if (strcmp(function, "receiveCountPerSec_ptr") == 0) {return PIVariant::fromValue(object->receiveCountPerSec_ptr());} + if (strcmp(function, "sendCountPerSec_ptr") == 0) {return PIVariant::fromValue(object->sendCountPerSec_ptr());} + if (strcmp(function, "receiveBytesPerSec_ptr") == 0) {return PIVariant::fromValue(object->receiveBytesPerSec_ptr());} + if (strcmp(function, "sendBytesPerSec_ptr") == 0) {return PIVariant::fromValue(object->sendBytesPerSec_ptr());} + if (strcmp(function, "receiveCount_ptr") == 0) {return PIVariant::fromValue(object->receiveCount_ptr());} + if (strcmp(function, "wrongCount_ptr") == 0) {return PIVariant::fromValue(object->wrongCount_ptr());} + if (strcmp(function, "sendCount_ptr") == 0) {return PIVariant::fromValue(object->sendCount_ptr());} + if (strcmp(function, "quality_ptr") == 0) {return PIVariant::fromValue(object->quality_ptr());} + if (strcmp(function, "receiveSpeed_ptr") == 0) {return PIVariant::fromValue(object->receiveSpeed_ptr());} + if (strcmp(function, "sendSpeed_ptr") == 0) {return PIVariant::fromValue(object->sendSpeed_ptr());} + if (strcmp(function, "start") == 0) {object->start(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(arg0.toValue()); return PIVariant();} + if (strcmp(function, "reset") == 0) {object->reset(); return PIVariant();} + if (strcmp(function, "received") == 0) {object->received(arg0.toValue()); return PIVariant();} + if (strcmp(function, "received") == 0) {object->received(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "sended") == 0) {object->sended(arg0.toValue()); return PIVariant();} + if (strcmp(function, "qualityChanged") == 0) {object->qualityChanged(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIDiagnostics\"!"; + return PIVariant(); +} + +PIVariant execFunction(PISystemMonitor * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "startOnProcess") == 0) {return PIVariant::fromValue(object->startOnProcess(arg0.toValue()));} + if (strcmp(function, "startOnSelf") == 0) {return PIVariant::fromValue(object->startOnSelf());} + if (strcmp(function, "statistic") == 0) {return PIVariant::fromValue(object->statistic());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PISystemMonitor\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIConsole * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "addString") == 0) {object->addString(arg0.toValue(), arg1.toValue(), arg2.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue >()); return PIVariant();} + if (strcmp(function, "addEmptyLine") == 0) {object->addEmptyLine(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "getString") == 0) {return PIVariant::fromValue(object->getString(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "getShort") == 0) {return PIVariant::fromValue(object->getShort(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "getInt") == 0) {return PIVariant::fromValue(object->getInt(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "getFloat") == 0) {return PIVariant::fromValue(object->getFloat(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "getDouble") == 0) {return PIVariant::fromValue(object->getDouble(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "getString") == 0) {return PIVariant::fromValue(object->getString(arg0.toValue()));} + if (strcmp(function, "getShort") == 0) {return PIVariant::fromValue(object->getShort(arg0.toValue()));} + if (strcmp(function, "getInt") == 0) {return PIVariant::fromValue(object->getInt(arg0.toValue()));} + if (strcmp(function, "getFloat") == 0) {return PIVariant::fromValue(object->getFloat(arg0.toValue()));} + if (strcmp(function, "getDouble") == 0) {return PIVariant::fromValue(object->getDouble(arg0.toValue()));} + if (strcmp(function, "tabsCount") == 0) {return PIVariant::fromValue(object->tabsCount());} + if (strcmp(function, "currentTab") == 0) {return PIVariant::fromValue(object->currentTab());} + if (strcmp(function, "addTab") == 0) {return PIVariant::fromValue(object->addTab(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "removeTab") == 0) {object->removeTab(arg0.toValue()); return PIVariant();} + if (strcmp(function, "removeTab") == 0) {object->removeTab(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setTab") == 0) {return PIVariant::fromValue(object->setTab(arg0.toValue()));} + if (strcmp(function, "setTab") == 0) {return PIVariant::fromValue(object->setTab(arg0.toValue()));} + if (strcmp(function, "setTabBindKey") == 0) {return PIVariant::fromValue(object->setTabBindKey(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "setTabBindKey") == 0) {return PIVariant::fromValue(object->setTabBindKey(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "clearTabs") == 0) {object->clearTabs(arg0.toValue()); return PIVariant();} + if (strcmp(function, "addCustomStatus") == 0) {object->addCustomStatus(arg0.toValue()); return PIVariant();} + if (strcmp(function, "clearCustomStatus") == 0) {object->clearCustomStatus(); return PIVariant();} + if (strcmp(function, "defaultAlignment") == 0) {return PIVariant::fromValue(object->defaultAlignment());} + if (strcmp(function, "setDefaultAlignment") == 0) {object->setDefaultAlignment(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setColumnAlignment") == 0) {object->setColumnAlignment(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setColumnAlignmentToAll") == 0) {object->setColumnAlignmentToAll(arg0.toValue()); return PIVariant();} + if (strcmp(function, "fstr") == 0) {return PIVariant::fromValue(object->fstr(arg0.toValue >()));} + if (strcmp(function, "enableExitCapture") == 0) {object->enableExitCapture(arg0.toValue()); return PIVariant();} + if (strcmp(function, "disableExitCapture") == 0) {object->disableExitCapture(); return PIVariant();} + if (strcmp(function, "exitCaptured") == 0) {return PIVariant::fromValue(object->exitCaptured());} + if (strcmp(function, "exitKey") == 0) {return PIVariant::fromValue(object->exitKey());} + if (strcmp(function, "startServer") == 0) {object->startServer(arg0.toValue()); return PIVariant();} + if (strcmp(function, "stopPeer") == 0) {object->stopPeer(); return PIVariant();} + if (strcmp(function, "isServerStarted") == 0) {return PIVariant::fromValue(object->isServerStarted());} + if (strcmp(function, "clients") == 0) {return PIVariant::fromValue(object->clients());} + if (strcmp(function, "listenServers") == 0) {object->listenServers(); return PIVariant();} + if (strcmp(function, "availableServers") == 0) {return PIVariant::fromValue(object->availableServers());} + if (strcmp(function, "selectedServer") == 0) {return PIVariant::fromValue(object->selectedServer());} + if (strcmp(function, "connectToServer") == 0) {object->connectToServer(arg0.toValue()); return PIVariant();} + if (strcmp(function, "disconnect") == 0) {object->disconnect(); return PIVariant();} + if (strcmp(function, "isConnected") == 0) {return PIVariant::fromValue(object->isConnected());} + if (strcmp(function, "toUpperLeft") == 0) {object->toUpperLeft(); return PIVariant();} + if (strcmp(function, "moveRight") == 0) {object->moveRight(arg0.toValue()); return PIVariant();} + if (strcmp(function, "moveLeft") == 0) {object->moveLeft(arg0.toValue()); return PIVariant();} + if (strcmp(function, "moveTo") == 0) {object->moveTo(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "clearScreen") == 0) {object->clearScreen(); return PIVariant();} + if (strcmp(function, "clearScreenLower") == 0) {object->clearScreenLower(); return PIVariant();} + if (strcmp(function, "clearLine") == 0) {object->clearLine(); return PIVariant();} + if (strcmp(function, "newLine") == 0) {object->newLine(); return PIVariant();} + if (strcmp(function, "hideCursor") == 0) {object->hideCursor(); return PIVariant();} + if (strcmp(function, "showCursor") == 0) {object->showCursor(); return PIVariant();} + if (strcmp(function, "clearVariables") == 0) {object->clearVariables(); return PIVariant();} + if (strcmp(function, "clearVariables") == 0) {object->clearVariables(arg0.toValue()); return PIVariant();} + if (strcmp(function, "waitForFinish") == 0) {object->waitForFinish(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(arg0.toValue()); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(arg0.toValue()); return PIVariant();} + if (strcmp(function, "keyPressed") == 0) {object->keyPressed(arg0.toValue(), arg1.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIConsole\"!"; + return PIVariant(); +} + +PIVariant execFunction(PICLI * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "addArgument") == 0) {object->addArgument(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "addArgument") == 0) {object->addArgument(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "addArgument") == 0) {object->addArgument(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "addArgument") == 0) {object->addArgument(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()); return PIVariant();} + if (strcmp(function, "addArgument") == 0) {object->addArgument(arg0.toValue(), arg1.toValue(), arg2.toValue(), arg3.toValue()); return PIVariant();} + if (strcmp(function, "rawArgument") == 0) {return PIVariant::fromValue(object->rawArgument(arg0.toValue()));} + if (strcmp(function, "mandatoryArgument") == 0) {return PIVariant::fromValue(object->mandatoryArgument(arg0.toValue()));} + if (strcmp(function, "optionalArgument") == 0) {return PIVariant::fromValue(object->optionalArgument(arg0.toValue()));} + if (strcmp(function, "rawArguments") == 0) {return PIVariant::fromValue(object->rawArguments());} + if (strcmp(function, "mandatoryArguments") == 0) {return PIVariant::fromValue(object->mandatoryArguments());} + if (strcmp(function, "optionalArguments") == 0) {return PIVariant::fromValue(object->optionalArguments());} + if (strcmp(function, "programCommand") == 0) {return PIVariant::fromValue(object->programCommand());} + if (strcmp(function, "hasArgument") == 0) {return PIVariant::fromValue(object->hasArgument(arg0.toValue()));} + if (strcmp(function, "argumentValue") == 0) {return PIVariant::fromValue(object->argumentValue(arg0.toValue()));} + if (strcmp(function, "argumentShortKey") == 0) {return PIVariant::fromValue(object->argumentShortKey(arg0.toValue()));} + if (strcmp(function, "argumentFullKey") == 0) {return PIVariant::fromValue(object->argumentFullKey(arg0.toValue()));} + if (strcmp(function, "shortKeyPrefix") == 0) {return PIVariant::fromValue(object->shortKeyPrefix());} + if (strcmp(function, "fullKeyPrefix") == 0) {return PIVariant::fromValue(object->fullKeyPrefix());} + if (strcmp(function, "mandatoryArgumentsCount") == 0) {return PIVariant::fromValue(object->mandatoryArgumentsCount());} + if (strcmp(function, "optionalArgumentsCount") == 0) {return PIVariant::fromValue(object->optionalArgumentsCount());} + if (strcmp(function, "setShortKeyPrefix") == 0) {object->setShortKeyPrefix(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setFullKeyPrefix") == 0) {object->setFullKeyPrefix(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setMandatoryArgumentsCount") == 0) {object->setMandatoryArgumentsCount(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setOptionalArgumentsCount") == 0) {object->setOptionalArgumentsCount(arg0.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PICLI\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIEvaluatorContent * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "addFunction") == 0) {object->addFunction(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "addVariable") == 0) {object->addVariable(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "addCustomFunction") == 0) {object->addCustomFunction(arg0.toValue(), arg1.toValue(), arg2.toValue()); return PIVariant();} + if (strcmp(function, "functionsCount") == 0) {return PIVariant::fromValue(object->functionsCount());} + if (strcmp(function, "variablesCount") == 0) {return PIVariant::fromValue(object->variablesCount());} + if (strcmp(function, "customVariablesCount") == 0) {return PIVariant::fromValue(object->customVariablesCount());} + if (strcmp(function, "findFunction") == 0) {return PIVariant::fromValue(object->findFunction(arg0.toValue()));} + if (strcmp(function, "findVariable") == 0) {return PIVariant::fromValue(object->findVariable(arg0.toValue()));} + if (strcmp(function, "function") == 0) {return PIVariant::fromValue(object->function(arg0.toValue()));} + if (strcmp(function, "variable") == 0) {return PIVariant::fromValue(object->variable(arg0.toValue()));} + if (strcmp(function, "function") == 0) {return PIVariant::fromValue(object->function(arg0.toValue()));} + if (strcmp(function, "variable") == 0) {return PIVariant::fromValue(object->variable(arg0.toValue()));} + if (strcmp(function, "customVariable") == 0) {return PIVariant::fromValue(object->customVariable(arg0.toValue()));} + if (strcmp(function, "setVariableValue") == 0) {return PIVariant::fromValue(object->setVariableValue(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "setVariableName") == 0) {return PIVariant::fromValue(object->setVariableName(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "setVariableValue") == 0) {return PIVariant::fromValue(object->setVariableValue(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "setVariableName") == 0) {return PIVariant::fromValue(object->setVariableName(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "removeVariable") == 0) {object->removeVariable(arg0.toValue()); return PIVariant();} + if (strcmp(function, "removeVariable") == 0) {object->removeVariable(arg0.toValue()); return PIVariant();} + if (strcmp(function, "clearCustomVariables") == 0) {object->clearCustomVariables(); return PIVariant();} + if (strcmp(function, "sortVariables") == 0) {object->sortVariables(); return PIVariant();} + if (strcmp(function, "getBaseFunction") == 0) {return PIVariant::fromValue(object->getBaseFunction(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIEvaluatorContent\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIEvaluator * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "data") == 0) {return PIVariant::fromValue(object->data());} + if (strcmp(function, "setData") == 0) {object->setData(arg0.toValue()); return PIVariant();} + if (strcmp(function, "check") == 0) {return PIVariant::fromValue(object->check(arg0.toValue()));} + if (strcmp(function, "isCorrect") == 0) {return PIVariant::fromValue(object->isCorrect());} + if (strcmp(function, "setVariable") == 0) {return PIVariant::fromValue(object->setVariable(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "setVariable") == 0) {object->setVariable(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "setCustomVariableValue") == 0) {object->setCustomVariableValue(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "evaluate") == 0) {return PIVariant::fromValue(object->evaluate());} + if (strcmp(function, "removeVariable") == 0) {object->removeVariable(arg0.toValue()); return PIVariant();} + if (strcmp(function, "clearCustomVariables") == 0) {object->clearCustomVariables(); return PIVariant();} + if (strcmp(function, "variableIndex") == 0) {return PIVariant::fromValue(object->variableIndex(arg0.toValue()));} + if (strcmp(function, "unknownVariables") == 0) {return PIVariant::fromValue(object->unknownVariables());} + if (strcmp(function, "expression") == 0) {return PIVariant::fromValue(object->expression());} + if (strcmp(function, "error") == 0) {return PIVariant::fromValue(object->error());} + if (strcmp(function, "lastResult") == 0) {return PIVariant::fromValue(object->lastResult());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIEvaluator\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIMultiProtocol * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "addProtocol") == 0) {object->addProtocol(arg0.toValue()); return PIVariant();} + if (strcmp(function, "protocol") == 0) {return PIVariant::fromValue(object->protocol(arg0.toValue()));} + if (strcmp(function, "protocol") == 0) {return PIVariant::fromValue(object->protocol(arg0.toValue()));} + if (strcmp(function, "startSend") == 0) {object->startSend(); return PIVariant();} + if (strcmp(function, "startReceive") == 0) {object->startReceive(); return PIVariant();} + if (strcmp(function, "start") == 0) {object->start(); return PIVariant();} + if (strcmp(function, "stopSend") == 0) {object->stopSend(); return PIVariant();} + if (strcmp(function, "stopReceive") == 0) {object->stopReceive(); return PIVariant();} + if (strcmp(function, "stop") == 0) {object->stop(); return PIVariant();} + if (strcmp(function, "worseQuality") == 0) {return PIVariant::fromValue(object->worseQuality());} + if (strcmp(function, "bestQuality") == 0) {return PIVariant::fromValue(object->bestQuality());} + if (strcmp(function, "count") == 0) {return PIVariant::fromValue(object->count());} + if (strcmp(function, "clear") == 0) {object->clear(); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIMultiProtocol\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIRepeater * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "firstChannelName") == 0) {return PIVariant::fromValue(object->firstChannelName());} + if (strcmp(function, "secondChannelName") == 0) {return PIVariant::fromValue(object->secondChannelName());} + if (strcmp(function, "receiveCount") == 0) {return PIVariant::fromValue(object->receiveCount());} + if (strcmp(function, "receiveCount_ptr") == 0) {return PIVariant::fromValue(object->receiveCount_ptr());} + if (strcmp(function, "sendCount") == 0) {return PIVariant::fromValue(object->sendCount());} + if (strcmp(function, "sendCount_ptr") == 0) {return PIVariant::fromValue(object->sendCount_ptr());} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIRepeater\"!"; + return PIVariant(); +} + +PIVariant execFunction(PICodec * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "setFromCoding") == 0) {object->setFromCoding(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setToCoding") == 0) {object->setToCoding(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setCodings") == 0) {object->setCodings(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "availableCodecs") == 0) {return PIVariant::fromValue(object->availableCodecs());} + if (strcmp(function, "encode") == 0) {return PIVariant::fromValue(object->encode(arg0.toValue()));} + if (strcmp(function, "decode") == 0) {return PIVariant::fromValue(object->decode(arg0.toValue()));} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PICodec\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIPeer * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "send") == 0) {return PIVariant::fromValue(object->send(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "sendToAll") == 0) {object->sendToAll(arg0.toValue()); return PIVariant();} + if (strcmp(function, "sendToAll") == 0) {object->sendToAll(arg0.toValue()); return PIVariant();} + if (strcmp(function, "sendToAll") == 0) {object->sendToAll(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "isMulticastReceive") == 0) {return PIVariant::fromValue(object->isMulticastReceive());} + if (strcmp(function, "isBroadcastReceive") == 0) {return PIVariant::fromValue(object->isBroadcastReceive());} + if (strcmp(function, "allPeers") == 0) {return PIVariant::fromValue >(object->allPeers());} + if (strcmp(function, "isPeerExists") == 0) {return PIVariant::fromValue(object->isPeerExists(arg0.toValue()));} + if (strcmp(function, "getPeerByName") == 0) {return PIVariant::fromValue(object->getPeerByName(arg0.toValue()));} + if (strcmp(function, "lock") == 0) {object->lock(); return PIVariant();} + if (strcmp(function, "unlock") == 0) {object->unlock(); return PIVariant();} + if (strcmp(function, "dataReceivedEvent") == 0) {object->dataReceivedEvent(arg0.toValue(), arg1.toValue()); return PIVariant();} + if (strcmp(function, "peerConnectedEvent") == 0) {object->peerConnectedEvent(arg0.toValue()); return PIVariant();} + if (strcmp(function, "peerDisconnectedEvent") == 0) {object->peerDisconnectedEvent(arg0.toValue()); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIPeer\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIBinaryLog * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "playMode") == 0) {return PIVariant::fromValue(object->playMode());} + if (strcmp(function, "logDir") == 0) {return PIVariant::fromValue(object->logDir());} + if (strcmp(function, "filePrefix") == 0) {return PIVariant::fromValue(object->filePrefix());} + if (strcmp(function, "defaultID") == 0) {return PIVariant::fromValue(object->defaultID());} + if (strcmp(function, "playSpeed") == 0) {return PIVariant::fromValue(object->playSpeed());} + if (strcmp(function, "rapidStart") == 0) {return PIVariant::fromValue(object->rapidStart());} + if (strcmp(function, "setPlayMode") == 0) {object->setPlayMode(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setLogDir") == 0) {object->setLogDir(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setFilePrefix") == 0) {object->setFilePrefix(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setDefaultID") == 0) {object->setDefaultID(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setRapidStart") == 0) {object->setRapidStart(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setPlaySpeed") == 0) {object->setPlaySpeed(arg0.toValue()); return PIVariant();} + if (strcmp(function, "writeBinLog") == 0) {return PIVariant::fromValue(object->writeBinLog(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "writeBinLog") == 0) {return PIVariant::fromValue(object->writeBinLog(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "readBinLog") == 0) {return PIVariant::fromValue(object->readBinLog(arg0.toValue()));} + if (strcmp(function, "readBinLog") == 0) {return PIVariant::fromValue(object->readBinLog(arg0.toValue(), arg1.toValue(), arg2.toValue()));} + if (strcmp(function, "isEnd") == 0) {return PIVariant::fromValue(object->isEnd());} + if (strcmp(function, "isEmpty") == 0) {return PIVariant::fromValue(object->isEmpty());} + if (strcmp(function, "lastReadedID") == 0) {return PIVariant::fromValue(object->lastReadedID());} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "restart") == 0) {object->restart(); return PIVariant();} + if (strcmp(function, "createNewFile") == 0) {return PIVariant::fromValue(object->createNewFile());} + if (strcmp(function, "fileEnd") == 0) {object->fileEnd(); return PIVariant();} + if (strcmp(function, "fileError") == 0) {object->fileError(); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIBinaryLog\"!"; + return PIVariant(); +} + +PIVariant execFunction(PIUSB * object, const char * function, const PIVariant & arg0, const PIVariant & arg1, const PIVariant & arg2, const PIVariant & arg3) { + if (strcmp(function, "className") == 0) {return PIVariant::fromValue(object->className());} + if (strcmp(function, "currentDescriptor") == 0) {return PIVariant::fromValue(object->currentDescriptor());} + if (strcmp(function, "currentConfiguration") == 0) {return PIVariant::fromValue(object->currentConfiguration());} + if (strcmp(function, "currentInterface") == 0) {return PIVariant::fromValue(object->currentInterface());} + if (strcmp(function, "vendorID") == 0) {return PIVariant::fromValue(object->vendorID());} + if (strcmp(function, "productID") == 0) {return PIVariant::fromValue(object->productID());} + if (strcmp(function, "deviceNumber") == 0) {return PIVariant::fromValue(object->deviceNumber());} + if (strcmp(function, "timeoutRead") == 0) {return PIVariant::fromValue(object->timeoutRead());} + if (strcmp(function, "timeoutWrite") == 0) {return PIVariant::fromValue(object->timeoutWrite());} + if (strcmp(function, "endpointRead") == 0) {return PIVariant::fromValue(object->endpointRead());} + if (strcmp(function, "endpointWrite") == 0) {return PIVariant::fromValue(object->endpointWrite());} + if (strcmp(function, "endpoints") == 0) {return PIVariant::fromValue >(object->endpoints());} + if (strcmp(function, "endpointsRead") == 0) {return PIVariant::fromValue >(object->endpointsRead());} + if (strcmp(function, "endpointsWrite") == 0) {return PIVariant::fromValue >(object->endpointsWrite());} + if (strcmp(function, "getEndpointByAddress") == 0) {return PIVariant::fromValue(object->getEndpointByAddress(arg0.toValue()));} + if (strcmp(function, "setVendorID") == 0) {object->setVendorID(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setProductID") == 0) {object->setProductID(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setConfiguration") == 0) {return PIVariant::fromValue(object->setConfiguration(arg0.toValue()));} + if (strcmp(function, "setInterface") == 0) {return PIVariant::fromValue(object->setInterface(arg0.toValue()));} + if (strcmp(function, "setEndpointRead") == 0) {object->setEndpointRead(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setEndpointWrite") == 0) {object->setEndpointWrite(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setDeviceNumber") == 0) {object->setDeviceNumber(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setTimeoutRead") == 0) {object->setTimeoutRead(arg0.toValue()); return PIVariant();} + if (strcmp(function, "setTimeoutWrite") == 0) {object->setTimeoutWrite(arg0.toValue()); return PIVariant();} + if (strcmp(function, "read") == 0) {return PIVariant::fromValue(object->read(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "write") == 0) {return PIVariant::fromValue(object->write(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "controlWrite") == 0) {return PIVariant::fromValue(object->controlWrite(arg0.toValue(), arg1.toValue()));} + if (strcmp(function, "flush") == 0) {object->flush(); return PIVariant();} + PICout(AddNewLine) << "Can`t find function \"" << function << "\" in class \"PIUSB\"!"; + return PIVariant(); +} + + +__ClassInfo_TEST_H_Initializer__::__ClassInfo_TEST_H_Initializer__() { + if (_inited_) return; + _inited_ = true; + + ClassInfo * ci; + TypeInfo * ni; + FunctionInfo * fi; + EnumInfo * ei; + +// Classes + + ci = new ClassInfo(); + (*classesInfo)["PIMonitor"] = ci; + ci->name = "PIMonitor"; + ci->variables << TypeInfo("containers", "int"); + ci->variables << TypeInfo("strings", "int"); + ci->variables << TypeInfo("threads", "int"); + ci->variables << TypeInfo("timers", "int"); + ci->variables << TypeInfo("serials", "int"); + ci->variables << TypeInfo("ethernets", "int"); + ci->variables << TypeInfo("files", "int"); + ci->variables << TypeInfo("objects", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIInit"] = ci; + ci->name = "PIInit"; + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fileExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("p", "string &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PICout"] = ci; + ci->name = "PICout"; + ci->variables << TypeInfo("fo_", "bool"); + ci->variables << TypeInfo("cc_", "bool"); + ci->variables << TypeInfo("fc_", "bool"); + ci->variables << TypeInfo("cnb_", "int"); + ci->variables << TypeInfo("attr_", "int"); + ci->variables << TypeInfo("co_", "PICoutControls"); + ci->variables << TypeInfo("cos_", "std::stack"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setControl"; fi->return_type = TypeInfo("", "PICout &"); + fi->arguments << TypeInfo("c", "PICoutControl"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setControl"; fi->return_type = TypeInfo("", "PICout &"); + fi->arguments << TypeInfo("c", "PICoutControls"); + fi->arguments << TypeInfo("save", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "saveControl"; fi->return_type = TypeInfo("", "PICout &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "restoreControl"; fi->return_type = TypeInfo("", "PICout &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "space"; fi->return_type = TypeInfo("", "PICout &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quote"; fi->return_type = TypeInfo("", "PICout &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "newLine"; fi->return_type = TypeInfo("", "PICout &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "applyFormat"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("f", "PICoutFormat"); + + ci = new ClassInfo(); + (*classesInfo)["PIMutex"] = ci; + ci->name = "PIMutex"; + ci->variables << TypeInfo("mutex", "pthread_mutex_t"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unlock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "tryLock"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIMutexLocker"] = ci; + ci->name = "PIMutexLocker"; + ci->variables << TypeInfo("mutex", "PIMutex*"); + + ci = new ClassInfo(); + (*classesInfo)["PIBitArray"] = ci; + ci->name = "PIBitArray"; + ci->variables << TypeInfo("data_", "PIVector"); + ci->variables << TypeInfo("size_", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "bitSize"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "byteSize"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "resize"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("size", "uint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearBit"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setBit"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBit"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + fi->arguments << TypeInfo("value", "bool &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBit"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + fi->arguments << TypeInfo("value", "uchar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "push_back"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("value", "bool &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "push_back"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("value", "uchar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + fi->arguments << TypeInfo("value", "bool &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("index", "uint &", Const); + fi->arguments << TypeInfo("value", "uchar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "push_front"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("value", "bool &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "push_front"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("value", "uchar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "pop_back"; fi->return_type = TypeInfo("", "PIBitArray &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "pop_front"; fi->return_type = TypeInfo("", "PIBitArray &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "append"; fi->return_type = TypeInfo("", "PIBitArray &"); + fi->arguments << TypeInfo("ba", "PIBitArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "data"; fi->return_type = TypeInfo("", "uchar *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUChar"; fi->return_type = TypeInfo("", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUShort"; fi->return_type = TypeInfo("", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUInt"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toULong"; fi->return_type = TypeInfo("", "ulong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toULLong"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "at"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("index", "uint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "bytesInBits"; fi->return_type = TypeInfo("", "uint"); + fi->arguments << TypeInfo("bits", "uint &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIHuffman"] = ci; + ci->name = "PIHuffman"; + ci->variables << TypeInfo("nodes", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "compress"; fi->return_type = TypeInfo("", "PIVector"); + fi->arguments << TypeInfo("src", "PIVector &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "nodeCompare"; fi->return_type = TypeInfo("", "int", Static); + fi->arguments << TypeInfo("f", "void *", Const); + fi->arguments << TypeInfo("s", "void *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calcFrequencies"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("src", "PIVector &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIHuffman::node"] = ci; + ci->name = "PIHuffman::node"; + ci->variables << TypeInfo("freq", "int"); + ci->variables << TypeInfo("word", "PIVector"); + ci->variables << TypeInfo("path", "PIBitArray"); + ci->variables << TypeInfo("parent", "node*"); + ci->variables << TypeInfo("right", "node*"); + ci->variables << TypeInfo("left", "node*"); + + ci = new ClassInfo(); + (*classesInfo)["PIByteArray"] = ci; + ci->name = "PIByteArray"; + ci->variables << TypeInfo("base64HelpStruct", "union"); + ci->variables << TypeInfo("base64Table", "char[64]", Const | Static); + ci->variables << TypeInfo("base64InvTable", "char[256]", Const | Static); + ci->variables << TypeInfo("huffman", "PIHuffman", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "resized"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("new_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "convertToBase64"; fi->return_type = TypeInfo("", "PIByteArray &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "convertFromBase64"; fi->return_type = TypeInfo("", "PIByteArray &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toBase64"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromBase64"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "compressRLE"; fi->return_type = TypeInfo("", "PIByteArray &"); + fi->arguments << TypeInfo("threshold", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "decompressRLE"; fi->return_type = TypeInfo("", "PIByteArray &"); + fi->arguments << TypeInfo("threshold", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "compressedRLE"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("threshold", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "decompressedRLE"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("threshold", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "compressHuffman"; fi->return_type = TypeInfo("", "PIByteArray &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "append"; fi->return_type = TypeInfo("", "PIByteArray &"); + fi->arguments << TypeInfo("data_", "void *", Const); + fi->arguments << TypeInfo("size_", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "append"; fi->return_type = TypeInfo("", "PIByteArray &"); + fi->arguments << TypeInfo("data_", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksumPlain8"; fi->return_type = TypeInfo("", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksumPlain32"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksumCRC8"; fi->return_type = TypeInfo("", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksumCRC16"; fi->return_type = TypeInfo("", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksumCRC32"; fi->return_type = TypeInfo("", "uint"); + + ci = new ClassInfo(); + (*classesInfo)["PIByteArray::RawData"] = ci; + ci->name = "PIByteArray::RawData"; + ci->variables << TypeInfo("d", "void*"); + ci->variables << TypeInfo("s", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIChar"] = ci; + ci->name = "PIChar"; + ci->variables << TypeInfo("ch", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isDigit"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isHex"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isGraphical"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isControl"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isLower"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isUpper"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isPrint"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isSpace"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isAlpha"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isAscii"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toInt"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toWCharPtr"; fi->return_type = TypeInfo("", "const wchar_t *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toCharPtr"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toWChar"; fi->return_type = TypeInfo("", "wchar_t"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toAscii"; fi->return_type = TypeInfo("", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unicode16Code"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUpper"; fi->return_type = TypeInfo("", "PIChar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLower"; fi->return_type = TypeInfo("", "PIChar"); + + ci = new ClassInfo(); + (*classesInfo)["PIString"] = ci; + ci->name = "PIString"; + ci->variables << TypeInfo("toBaseN", "char[]", Const | Static); + ci->variables << TypeInfo("fromBaseN", "int[]", Const | Static); + ci->variables << TypeInfo("data_", "PIByteArray", Mutable); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mid"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("start", "int", Const); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "left"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "right"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "cutMid"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("start", "int", Const); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "cutLeft"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "cutRight"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "trim"; fi->return_type = TypeInfo("", "PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "trimmed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replace"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("from", "int", Const); + fi->arguments << TypeInfo("count", "int", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replaced"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("from", "int", Const); + fi->arguments << TypeInfo("count", "int", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replace"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("what", "PIString &", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replaced"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("what", "PIString &", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replaceAll"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("what", "PIString &", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replaceAll"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("what", "PIString &", Const); + fi->arguments << TypeInfo("with", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("index", "int", Const); + fi->arguments << TypeInfo("c", "PIChar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("index", "int", Const); + fi->arguments << TypeInfo("c", "char &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("index", "int", Const); + fi->arguments << TypeInfo("str", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "insert"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("index", "int", Const); + fi->arguments << TypeInfo("c", "char *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "expandRightTo"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("len", "int", Const); + fi->arguments << TypeInfo("c", "PIChar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "expandLeftTo"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("len", "int", Const); + fi->arguments << TypeInfo("c", "PIChar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reverse"; fi->return_type = TypeInfo("", "PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reversed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeMid"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("start", "int", Const); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeLeft"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeRight"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("len", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeSymbol"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeWord"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeCWord"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeLine"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeNumber"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "takeRange"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("start", "PIChar &", Const); + fi->arguments << TypeInfo("end", "PIChar &", Const); + fi->arguments << TypeInfo("shield", "PIChar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lengthAscii"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "data"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stdString"; fi->return_type = TypeInfo("", "std::string"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toByteArray"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "split"; fi->return_type = TypeInfo("", "PIStringList"); + fi->arguments << TypeInfo("delim", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUpperCase"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLowerCase"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toNativeDecimalPoints"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "find"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "char", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "find"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "PIString", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "find"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "char *", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "find"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "string", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findLast"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "char", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findLast"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "PIString", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findLast"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "char *", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findLast"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "string", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findWord"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("word", "PIString &", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findCWord"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("word", "PIString &", Const); + fi->arguments << TypeInfo("start", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startsWith"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("str", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endsWith"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("str", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "length"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEmpty"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toBool"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toChar"; fi->return_type = TypeInfo("", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toShort"; fi->return_type = TypeInfo("", "short"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUShort"; fi->return_type = TypeInfo("", "ushort"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toInt"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUInt"; fi->return_type = TypeInfo("", "uint"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLong"; fi->return_type = TypeInfo("", "long"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toULong"; fi->return_type = TypeInfo("", "ulong"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLLong"; fi->return_type = TypeInfo("", "llong"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toULLong"; fi->return_type = TypeInfo("", "ullong"); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toFloat"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toDouble"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLDouble"; fi->return_type = TypeInfo("", "ldouble"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "short", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "ushort", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "int", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "uint", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "long", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "ulong", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "llong &", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "ullong &", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "float", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "double &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setNumber"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("value", "ldouble &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadableSize"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("bytes", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "short", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "ushort", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "int", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "uint", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "long", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "ulong", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "llong &", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "ullong &", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "float", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "double &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumber"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "ldouble &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromBool"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "bool", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readableSize"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("bytes", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeAll"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("v", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeAll"; fi->return_type = TypeInfo("", "PIString &"); + fi->arguments << TypeInfo("v", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumberBaseS"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "llong", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNumberBaseU"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("value", "ullong", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toNumberBase"; fi->return_type = TypeInfo("", "llong", Static); + fi->arguments << TypeInfo("value", "PIString &", Const); + fi->arguments << TypeInfo("base", "int"); + fi->arguments << TypeInfo("ok", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "appendFromChars"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("c", "char *", Const); + fi->arguments << TypeInfo("s", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "convertToStd"; fi->return_type = TypeInfo("", "string"); + + ci = new ClassInfo(); + (*classesInfo)["PIStringList"] = ci; + ci->name = "PIStringList"; + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "join"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("delim", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeStrings"; fi->return_type = TypeInfo("", "PIStringList &"); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "remove"; fi->return_type = TypeInfo("", "PIStringList &"); + fi->arguments << TypeInfo("num", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "remove"; fi->return_type = TypeInfo("", "PIStringList &"); + fi->arguments << TypeInfo("num", "uint"); + fi->arguments << TypeInfo("count", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeDuplicates"; fi->return_type = TypeInfo("", "PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "trim"; fi->return_type = TypeInfo("", "PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "contentSize"; fi->return_type = TypeInfo("", "uint"); + + ci = new ClassInfo(); + (*classesInfo)["PISystemTime"] = ci; + ci->name = "PISystemTime"; + ci->variables << TypeInfo("seconds", "long"); + ci->variables << TypeInfo("nanoseconds", "long"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toSeconds"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toMilliseconds"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toMicroseconds"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toNanoseconds"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addSeconds"; fi->return_type = TypeInfo("", "PISystemTime &"); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addMilliseconds"; fi->return_type = TypeInfo("", "PISystemTime &"); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addMicroseconds"; fi->return_type = TypeInfo("", "PISystemTime &"); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addNanoseconds"; fi->return_type = TypeInfo("", "PISystemTime &"); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sleep"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "abs"; fi->return_type = TypeInfo("", "PISystemTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromSeconds"; fi->return_type = TypeInfo("", "PISystemTime", Static); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromMilliseconds"; fi->return_type = TypeInfo("", "PISystemTime", Static); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromMicroseconds"; fi->return_type = TypeInfo("", "PISystemTime", Static); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromNanoseconds"; fi->return_type = TypeInfo("", "PISystemTime", Static); + fi->arguments << TypeInfo("v", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checkOverflows"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PITime"] = ci; + ci->name = "PITime"; + ci->variables << TypeInfo("milliseconds", "int"); + ci->variables << TypeInfo("seconds", "int"); + ci->variables << TypeInfo("minutes", "int"); + ci->variables << TypeInfo("hours", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toString"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("format", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIDate"] = ci; + ci->name = "PIDate"; + ci->variables << TypeInfo("day", "int"); + ci->variables << TypeInfo("month", "int"); + ci->variables << TypeInfo("year", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toString"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("format", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIDateTime"] = ci; + ci->name = "PIDateTime"; + ci->variables << TypeInfo("milliseconds", "int"); + ci->variables << TypeInfo("seconds", "int"); + ci->variables << TypeInfo("minutes", "int"); + ci->variables << TypeInfo("hours", "int"); + ci->variables << TypeInfo("day", "int"); + ci->variables << TypeInfo("month", "int"); + ci->variables << TypeInfo("year", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "normalized"; fi->return_type = TypeInfo("", "PIDateTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "normalize"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toString"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("format", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toSecondSinceEpoch"; fi->return_type = TypeInfo("", "time_t"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toSystemTime"; fi->return_type = TypeInfo("", "PISystemTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromSecondSinceEpoch"; fi->return_type = TypeInfo("", "PIDateTime", Static); + fi->arguments << TypeInfo("sec", "time_t", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromSystemTime"; fi->return_type = TypeInfo("", "PIDateTime", Static); + fi->arguments << TypeInfo("st", "PISystemTime &", Const); + + ci = new ClassInfo(); + (*classesInfo)["TransferFunction"] = ci; + ci->name = "TransferFunction"; + ci->variables << TypeInfo("vector_Bm", "PIVector"); + ci->variables << TypeInfo("vector_An", "PIVector"); + + ci = new ClassInfo(); + (*classesInfo)["Solver"] = ci; + ci->name = "Solver"; + ci->variables << TypeInfo("X", "PIMathVectord"); + ci->variables << TypeInfo("method_global", "Solver::Method", Static); + ci->variables << TypeInfo("methods_desc", "char[]", Const | Static); + ci->variables << TypeInfo("A", "PIMathMatrixd"); + ci->variables << TypeInfo("M", "PIMathMatrixd"); + ci->variables << TypeInfo("d", "PIMathVectord"); + ci->variables << TypeInfo("a1", "PIMathVectord"); + ci->variables << TypeInfo("b1", "PIMathVectord"); + ci->variables << TypeInfo("k1", "PIMathVectord"); + ci->variables << TypeInfo("k2", "PIMathVectord"); + ci->variables << TypeInfo("k3", "PIMathVectord"); + ci->variables << TypeInfo("k4", "PIMathVectord"); + ci->variables << TypeInfo("xx", "PIMathVectord"); + ci->variables << TypeInfo("XX", "PIMathVectord"); + ci->variables << TypeInfo("Y", "PIMathVectord"); + ci->variables << TypeInfo("pY", "PIMathVectord"); + ci->variables << TypeInfo("F", "PIVector"); + ci->variables << TypeInfo("times", "PIVector"); + ci->variables << TypeInfo("size", "uint"); + ci->variables << TypeInfo("step", "uint"); + ci->variables << TypeInfo("method", "Solver::Method"); + ci->variables << TypeInfo("sum", "double"); + ci->variables << TypeInfo("td", "double"); + ci->variables << TypeInfo("ct", "double"); + ci->variables << TypeInfo("lp", "double"); + ci->variables << TypeInfo("dh", "double"); + ci->variables << TypeInfo("t", "double"); + ci->variables << TypeInfo("x1", "double"); + ci->variables << TypeInfo("x0", "double"); + ci->variables << TypeInfo("ok", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solve"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fromTF"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("TF", "TransferFunction &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setMethod"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("m", "Method"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTime"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("time", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveEyler1"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveEyler2"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveRK4"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveABM2"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveABM3"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solveABM4"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solvePA"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + fi->arguments << TypeInfo("deg", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solvePA2"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solvePA3"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solvePA4"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "solvePA5"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("u", "double"); + fi->arguments << TypeInfo("h", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "moveF"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIFFT"] = ci; + ci->name = "PIFFT"; + ci->variables << TypeInfo("result", "PIVector"); + ci->variables << TypeInfo("prepared", "bool"); + ci->variables << TypeInfo("curplan", "PIFFT::ftplan"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calcFFT"; fi->return_type = TypeInfo("", "PIVector *"); + fi->arguments << TypeInfo("val", "PIVector &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calcFFT"; fi->return_type = TypeInfo("", "PIVector *"); + fi->arguments << TypeInfo("val", "PIVector &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calcFFTinverse"; fi->return_type = TypeInfo("", "PIVector *"); + fi->arguments << TypeInfo("val", "PIVector &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calcHilbert"; fi->return_type = TypeInfo("", "PIVector *"); + fi->arguments << TypeInfo("val", "PIVector &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getAmplitude"; fi->return_type = TypeInfo("", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calc_coefs"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("cnt2", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calc_indexes"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("cnt2", "uint"); + fi->arguments << TypeInfo("deep2", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "coef"; fi->return_type = TypeInfo("", "complexd"); + fi->arguments << TypeInfo("n", "uint"); + fi->arguments << TypeInfo("k", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fftc1d"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector &", Const); + fi->arguments << TypeInfo("n", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fftc1r"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector &", Const); + fi->arguments << TypeInfo("n", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fftc1dinv"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector &", Const); + fi->arguments << TypeInfo("n", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "createPlan"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbasegeneratecomplexfftplan"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "uint"); + fi->arguments << TypeInfo("plan", "ftplan *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_ftbasegenerateplanrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("tasktype", "int"); + fi->arguments << TypeInfo("plan", "ftplan *"); + fi->arguments << TypeInfo("plansize", "int *"); + fi->arguments << TypeInfo("precomputedsize", "int *"); + fi->arguments << TypeInfo("planarraysize", "int *"); + fi->arguments << TypeInfo("tmpmemsize", "int *"); + fi->arguments << TypeInfo("stackmemsize", "int *"); + fi->arguments << TypeInfo("stackptr", "ae_int_t"); + fi->arguments << TypeInfo("debugi", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_ftbaseprecomputeplanrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("plan", "ftplan *"); + fi->arguments << TypeInfo("entryoffset", "int"); + fi->arguments << TypeInfo("stackptr", "ae_int_t"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbasefactorize"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("n1", "int *"); + fi->arguments << TypeInfo("n2", "int *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_ftbasefindsmoothrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("seed", "int"); + fi->arguments << TypeInfo("leastfactor", "int"); + fi->arguments << TypeInfo("best", "int *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbasefindsmooth"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("n", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbaseexecuteplan"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("aoffset", "int"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("plan", "ftplan *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbaseexecuteplanrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("aoffset", "int"); + fi->arguments << TypeInfo("plan", "ftplan *"); + fi->arguments << TypeInfo("entryoffset", "int"); + fi->arguments << TypeInfo("stackptr", "ae_int_t"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_internalcomplexlintranspose"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("m", "int"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("astart", "int"); + fi->arguments << TypeInfo("buf", "PIVector *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_ffticltrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("astart", "int"); + fi->arguments << TypeInfo("astride", "int"); + fi->arguments << TypeInfo("b", "PIVector *"); + fi->arguments << TypeInfo("bstart", "int"); + fi->arguments << TypeInfo("bstride", "int"); + fi->arguments << TypeInfo("m", "int"); + fi->arguments << TypeInfo("n", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_internalreallintranspose"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("m", "int"); + fi->arguments << TypeInfo("n", "int"); + fi->arguments << TypeInfo("astart", "int"); + fi->arguments << TypeInfo("buf", "PIVector *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_fftirltrec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("astart", "int"); + fi->arguments << TypeInfo("astride", "int"); + fi->arguments << TypeInfo("b", "PIVector *"); + fi->arguments << TypeInfo("bstart", "int"); + fi->arguments << TypeInfo("bstride", "int"); + fi->arguments << TypeInfo("m", "int"); + fi->arguments << TypeInfo("n", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ftbase_ffttwcalc"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("a", "PIVector *"); + fi->arguments << TypeInfo("aoffset", "int"); + fi->arguments << TypeInfo("n1", "int"); + fi->arguments << TypeInfo("n2", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIFFT::ftplan"] = ci; + ci->name = "PIFFT::ftplan"; + ci->variables << TypeInfo("plan", "PIVector"); + ci->variables << TypeInfo("precomputed", "PIVector"); + ci->variables << TypeInfo("tmpbuf", "PIVector"); + ci->variables << TypeInfo("stackbuf", "PIVector"); + + ci = new ClassInfo(); + (*classesInfo)["PIVariant"] = ci; + ci->name = "PIVariant"; + ci->variables << TypeInfo("nion", "u"); + ci->variables << TypeInfo("_vbitarray", "PIBitArray"); + ci->variables << TypeInfo("_vbytearray", "PIByteArray"); + ci->variables << TypeInfo("_vstring", "PIString"); + ci->variables << TypeInfo("_vstringlist", "PIStringList"); + ci->variables << TypeInfo("_vcustom", "PIByteArray"); + ci->variables << TypeInfo("type_", "PIVariant::Type"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "char *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "bool", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "char", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "uchar", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "short", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "ushort", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "int &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "uint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "long &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "ulong &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "llong &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "ullong &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "float &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "double &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "ldouble &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "complexd &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "complexld &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIBitArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PITime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIDate &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PIDateTime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "PISystemTime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toBool"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toInt"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLLong"; fi->return_type = TypeInfo("", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toFloat"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toDouble"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toLDouble"; fi->return_type = TypeInfo("", "ldouble"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toComplexd"; fi->return_type = TypeInfo("", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toComplexld"; fi->return_type = TypeInfo("", "complexld"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toTime"; fi->return_type = TypeInfo("", "PITime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toDate"; fi->return_type = TypeInfo("", "PIDate"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toDateTime"; fi->return_type = TypeInfo("", "PIDateTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toSystemTime"; fi->return_type = TypeInfo("", "PISystemTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toString"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toStringList"; fi->return_type = TypeInfo("", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toBitArray"; fi->return_type = TypeInfo("", "PIBitArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toByteArray"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "type"; fi->return_type = TypeInfo("", "PIVariant::Type"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "typeName"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isValid"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "typeFromName"; fi->return_type = TypeInfo("", "PIVariant::Type", Static); + fi->arguments << TypeInfo("tname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "typeName"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("type", "PIVariant::Type"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "destroy"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIObject"] = ci; + ci->name = "PIObject"; + ci->variables << TypeInfo("connections", "PIVector"); + ci->variables << TypeInfo("properties_", "PIMap"); + ci->variables << TypeInfo("objects", "PIVector", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "name"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "debug"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setName"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDebug"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("debug", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "properties"; fi->return_type = TypeInfo("", "const PIMap &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "propertiesCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "property"; fi->return_type = TypeInfo("", "PIVariant"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setProperty"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "PIVariant &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isPropertyExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piConnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "void *"); + fi->arguments << TypeInfo("ev_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piConnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "void *"); + fi->arguments << TypeInfo("ev_h", "void *"); + fi->arguments << TypeInfo("e_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piConnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIString &", Const); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "void *"); + fi->arguments << TypeInfo("ev_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piConnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "PIString &", Const); + fi->arguments << TypeInfo("ev_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piConnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIString &", Const); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "PIString &", Const); + fi->arguments << TypeInfo("ev_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piDisconnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "void *"); + fi->arguments << TypeInfo("ev_h", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piDisconnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + fi->arguments << TypeInfo("dest", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piDisconnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + fi->arguments << TypeInfo("sig", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piDisconnect"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("src", "PIObject *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "raiseEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("sender", "PIObject *"); + fi->arguments << TypeInfo("event", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "raiseEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("destObject", "PIString &", Const); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findByName"; fi->return_type = TypeInfo("", "PIObject *", Static); + fi->arguments << TypeInfo("name", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIObject::Connection"] = ci; + ci->name = "PIObject::Connection"; + ci->variables << TypeInfo("slot", "void*"); + ci->variables << TypeInfo("signal", "void*"); + ci->variables << TypeInfo("event", "PIString"); + ci->variables << TypeInfo("dest", "void*"); + + ci = new ClassInfo(); + (*classesInfo)["PIThread"] = ci; + ci->name = "PIThread"; + ci->parents << "PIObject"; + ci->variables << TypeInfo("terminating", "bool", Volatile); + ci->variables << TypeInfo("running", "bool", Volatile); + ci->variables << TypeInfo("lockRun", "bool", Volatile); + ci->variables << TypeInfo("timer", "int"); + ci->variables << TypeInfo("policy", "int"); + ci->variables << TypeInfo("data_", "void*"); + ci->variables << TypeInfo("mutex_", "PIMutex"); + ci->variables << TypeInfo("priority_", "PIThread::Priority"); + ci->variables << TypeInfo("ret_func", "ThreadFunc"); + ci->variables << TypeInfo("thread", "pthread_t"); + ci->variables << TypeInfo("sparam", "sched_param"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("timer_delay", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("timer_delay", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + fi->arguments << TypeInfo("timer_delay", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + fi->arguments << TypeInfo("timer_delay", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startOnce__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startOnce"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startOnce__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startOnce"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_terminate__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "terminate"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("d", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("func", "ThreadFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPriority"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prior", "PIThread::Priority"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "priority"; fi->return_type = TypeInfo("", "PIThread::Priority"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isRunning"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isStopping"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForStart__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForStart"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForStart__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForStart"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForFinish__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForFinish"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForFinish__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForFinish"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "needLockRun"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("need", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_lock__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_unlock__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unlock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mutex"; fi->return_type = TypeInfo("", "PIMutex &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_started__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "started"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stopped__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopped"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "thread_function"; fi->return_type = TypeInfo("", "void *", Static); + fi->arguments << TypeInfo("t", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "thread_function_once"; fi->return_type = TypeInfo("", "void *", Static); + fi->arguments << TypeInfo("t", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "begin"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "end"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PITimer"] = ci; + ci->name = "PITimer"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("st_time", "PISystemTime"); + ci->variables << TypeInfo("inc_time", "PISystemTime"); + ci->variables << TypeInfo("deferred_", "bool"); + ci->variables << TypeInfo("running_", "bool"); + ci->variables << TypeInfo("interval_", "double"); + ci->variables << TypeInfo("t_st", "timespec"); + ci->variables << TypeInfo("t_cur", "timespec"); + ci->variables << TypeInfo("data", "void*"); + ci->variables << TypeInfo("ret_func", "TimerEvent"); + ci->variables << TypeInfo("ret_funcs", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data_", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "interval"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_reset__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_deferredStart__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("interval_msecs", "double"); + fi->arguments << TypeInfo("delay_msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "deferredStart"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("interval_msecs", "double"); + fi->arguments << TypeInfo("delay_msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_deferredStart__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("interval_msecs", "double"); + fi->arguments << TypeInfo("start_datetime", "PIDateTime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "deferredStart"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("interval_msecs", "double"); + fi->arguments << TypeInfo("start_datetime", "PIDateTime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addDelimiter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("delim", "int"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeDelimiter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeDelimiter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeDelimiter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("delim", "int"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDelimiterValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("delim", "int"); + fi->arguments << TypeInfo("value", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDelimiterValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + fi->arguments << TypeInfo("value", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDelimiterValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("delim", "int"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + fi->arguments << TypeInfo("value", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "delimiterValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "delimiterValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("delim", "int"); + fi->arguments << TypeInfo("slot", "TimerEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_clearDelimiters__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearDelimiters"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_n"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_u"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_m"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_s"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset_time_n"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset_time_u"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset_time_m"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset_time_s"; fi->return_type = TypeInfo("", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset_time"; fi->return_type = TypeInfo("", "PISystemTime"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_system_n"; fi->return_type = TypeInfo("", "double", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_system_u"; fi->return_type = TypeInfo("", "double", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_system_m"; fi->return_type = TypeInfo("", "double", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "elapsed_system_s"; fi->return_type = TypeInfo("", "double", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_timeout__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delimiter", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "timeout"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delimiter", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "tick"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delimiter", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "end"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PITimer::TimerSlot"] = ci; + ci->name = "PITimer::TimerSlot"; + ci->variables << TypeInfo("slot", "TimerEvent"); + ci->variables << TypeInfo("delim", "int"); + ci->variables << TypeInfo("tick", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIKbdListener"] = ci; + ci->name = "PIKbdListener"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("exiting", "bool", Static); + ci->variables << TypeInfo("ret_func", "KBFunc"); + ci->variables << TypeInfo("exit_key", "char"); + ci->variables << TypeInfo("exit_enabled", "bool"); + ci->variables << TypeInfo("is_active", "bool"); + ci->variables << TypeInfo("data_", "void*"); + ci->variables << TypeInfo("rc", "int"); + ci->variables << TypeInfo("ret", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "data"; fi->return_type = TypeInfo("", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("_data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("slot", "KBFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exitCaptured"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exitKey"; fi->return_type = TypeInfo("", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isActive"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_enableExitCapture__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "enableExitCapture"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_enableExitCapture__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "enableExitCapture"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_disableExitCapture__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disableExitCapture"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_setActive__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setActive"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_setActive__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setActive"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_keyPressed__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("key", "char"); + fi->arguments << TypeInfo("data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "keyPressed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("key", "char"); + fi->arguments << TypeInfo("data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "begin"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "end"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PICollection"] = ci; + ci->name = "PICollection"; + ci->variables << TypeInfo("_groups", "PIVector*", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "groups"; fi->return_type = TypeInfo("", "PIStringList", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "groupElements"; fi->return_type = TypeInfo("", "PIVector", Static); + fi->arguments << TypeInfo("group", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addToGroup"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("group", "PIString &", Const); + fi->arguments << TypeInfo("element", "PIObject *", Const); + + ci = new ClassInfo(); + (*classesInfo)["PICollection::CollectionAdder"] = ci; + ci->name = "PICollection::CollectionAdder"; + + ci = new ClassInfo(); + (*classesInfo)["PICollection::Group"] = ci; + ci->name = "PICollection::Group"; + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("elements", "PIVector"); + + ci = new ClassInfo(); + (*classesInfo)["__PICollectionInitializer"] = ci; + ci->name = "__PICollectionInitializer"; + ci->variables << TypeInfo("_inited_", "bool", Static); + + ci = new ClassInfo(); + (*classesInfo)["PIIODevice"] = ci; + ci->name = "PIIODevice"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("mode_", "PIIODevice::DeviceMode"); + ci->variables << TypeInfo("ret_func_", "ReadRetFunc"); + ci->variables << TypeInfo("init_", "bool"); + ci->variables << TypeInfo("opened_", "bool"); + ci->variables << TypeInfo("thread_started_", "bool"); + ci->variables << TypeInfo("raise_threaded_read_", "bool"); + ci->variables << TypeInfo("ret_data_", "void*"); + ci->variables << TypeInfo("timer", "PITimer"); + ci->variables << TypeInfo("write_thread", "PIThread"); + ci->variables << TypeInfo("buffer_in", "PIByteArray"); + ci->variables << TypeInfo("buffer_tr", "PIByteArray"); + ci->variables << TypeInfo("write_queue", "PIQueue >"); + ci->variables << TypeInfo("tri", "ullong"); + ci->variables << TypeInfo("readed_", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mode"; fi->return_type = TypeInfo("", "PIIODevice::DeviceMode"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "path"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isReadable"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isWriteable"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isInitialized"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isOpened"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isClosed"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "canRead"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "canWrite"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReopenEnabled"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReopenTimeout"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isReopenEnabled"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reopenTimeout"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setThreadedReadSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("func", "ReadRetFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setThreadedReadData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("d", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setThreadedReadBufferSize"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedReadBufferSize"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedReadBuffer"; fi->return_type = TypeInfo("", "const uchar *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isThreadedRead"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startThreadedRead"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startThreadedRead"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("func", "ReadRetFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopThreadedRead"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isThreadedWrite"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startThreadedWrite"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopThreadedWrite"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearThreadedWriteQueue"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readForTime"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("timeout_ms", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeThreaded"; fi->return_type = TypeInfo("", "ullong"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeThreaded"; fi->return_type = TypeInfo("", "ullong"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configure"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("config_file", "PIString &", Const); + fi->arguments << TypeInfo("section", "PIString &", Const); + fi->arguments << TypeInfo("parent_section", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "createFromFullPath"; fi->return_type = TypeInfo("", "PIIODevice *", Static); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_open__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "open"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_open__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "open"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_open__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("_type", "DeviceMode &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "open"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("_type", "DeviceMode &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_open__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("_path", "PIString &", Const); + fi->arguments << TypeInfo("_mode", "DeviceMode &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "open"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("_path", "PIString &", Const); + fi->arguments << TypeInfo("_mode", "DeviceMode &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_close__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "close"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_initialize__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "initialize"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_flush__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "flush"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_opened__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "opened"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_closed__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closed"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_threadedReadEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedReadEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_threadedWriteEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("id", "ullong"); + fi->arguments << TypeInfo("written_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedWriteEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("id", "ullong"); + fi->arguments << TypeInfo("written_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "init"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureDevice"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e_main", "void *", Const); + fi->arguments << TypeInfo("e_parent", "void *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedRead"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "constructFullPath"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "terminate"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_check_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "check_start"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_write_func__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write_func"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "_init"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "begin"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "end"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PISerial"] = ci; + ci->name = "PISerial"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("desc", "termios"); + ci->variables << TypeInfo("sdesc", "termios"); + ci->variables << TypeInfo("readed", "uint"); + ci->variables << TypeInfo("fd", "int"); + ci->variables << TypeInfo("vtime", "int"); + ci->variables << TypeInfo("block_read", "bool"); + ci->variables << TypeInfo("timer", "PITimer"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSpeed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setOutSpeed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setInSpeed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDevice"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("dev", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setParameters"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameters_", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setParameter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameter", "PISerial::Parameters"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isParameterSet"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("parameter", "PISerial::Parameters"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parameters"; fi->return_type = TypeInfo("", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDataBitsCount"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("bits", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "dataBitsCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPin"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("number", "int"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isPin"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("number", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setLE"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDTR"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setRTS"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setCTS"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setST"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSR"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setCAR"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setRNG"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDSR"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isLE"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isDTR"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isRTS"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isCTS"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isST"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isSR"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isCAR"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isRNG"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isDSR"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVTime"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("t", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadIsBlocking"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "device"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "outSpeed"; fi->return_type = TypeInfo("", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "inSpeed"; fi->return_type = TypeInfo("", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "VTime"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "flush"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + fi->arguments << TypeInfo("timeout_ms", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("timeout_ms", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readData"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("timeout_ms", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "PIString &", Const); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "availableSpeeds"; fi->return_type = TypeInfo("", "PIVector", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "availableDevices"; fi->return_type = TypeInfo("", "PIStringList", Static); + fi->arguments << TypeInfo("test", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureDevice"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e_main", "void *", Const); + fi->arguments << TypeInfo("e_parent", "void *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "_init"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "applySettings"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "convertSpeed"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setBit"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("bit", "int"); + fi->arguments << TypeInfo("on", "bool"); + fi->arguments << TypeInfo("bname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isBit"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("bit", "int"); + fi->arguments << TypeInfo("bname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIFile"] = ci; + ci->name = "PIFile"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("fd", "FILE*"); + ci->variables << TypeInfo("ret", "int"); + ci->variables << TypeInfo("prec_", "int"); + ci->variables << TypeInfo("prec_str", "string"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "flush"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "seek"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("position", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "seekToBegin"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "seekToEnd"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "seekToLine"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("line", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readChar"; fi->return_type = TypeInfo("", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readLine"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readAll"; fi->return_type = TypeInfo("", "llong"); + fi->arguments << TypeInfo("data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readAll"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("forceRead", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "size"; fi->return_type = TypeInfo("", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "pos"; fi->return_type = TypeInfo("", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEnd"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEmpty"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "precision"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPrecision"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prec", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeToBinLog"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("id", "ushort"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "char", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "short", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "long", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "llong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "uchar", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "ushort", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "uint", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "ulong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "ullong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "float", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinary"; fi->return_type = TypeInfo("", "PIFile &"); + fi->arguments << TypeInfo("v", "double", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_clear__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clear"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_remove__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "remove"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_resize__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("new_size", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "resize"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_size", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_resize__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("new_size", "llong"); + fi->arguments << TypeInfo("fill", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "resize"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_size", "llong"); + fi->arguments << TypeInfo("fill", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openTemporary"; fi->return_type = TypeInfo("", "PIFile", Static); + fi->arguments << TypeInfo("mode", "PIIODevice::DeviceMode"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isExists"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "remove"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "strType"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("type", "PIIODevice::DeviceMode", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIProcess"] = ci; + ci->name = "PIProcess"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("args", "PIStringList"); + ci->variables << TypeInfo("env", "PIStringList"); + ci->variables << TypeInfo("wd", "PIString"); + ci->variables << TypeInfo("out", "PIByteArray"); + ci->variables << TypeInfo("f_in", "PIFile"); + ci->variables << TypeInfo("f_out", "PIFile"); + ci->variables << TypeInfo("f_err", "PIFile"); + ci->variables << TypeInfo("g_in", "bool"); + ci->variables << TypeInfo("g_out", "bool"); + ci->variables << TypeInfo("g_err", "bool"); + ci->variables << TypeInfo("t_in", "bool"); + ci->variables << TypeInfo("t_out", "bool"); + ci->variables << TypeInfo("t_err", "bool"); + ci->variables << TypeInfo("pid", "pid_t"); + ci->variables << TypeInfo("tf_in", "FILE*"); + ci->variables << TypeInfo("tf_out", "FILE*"); + ci->variables << TypeInfo("tf_err", "FILE*"); + ci->variables << TypeInfo("exit_code", "int"); + ci->variables << TypeInfo("sz", "int"); + ci->variables << TypeInfo("as", "int"); + ci->variables << TypeInfo("is_exec", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exitCode"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "pID"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setGrabInput"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setGrabOutput"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setGrabError"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("yes", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setInputFile"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setOutputFile"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setErrorFile"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unsetInputFile"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unsetOutputFile"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unsetErrorFile"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "workingDirectory"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setWorkingDirectory"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "resetWorkingDirectory"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readOutput"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readError"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "environment"; fi->return_type = TypeInfo("", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearEnvironment"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeEnvironmentVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("variable", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setEnvironmentVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("variable", "PIString &", Const); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_exec__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_exec__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_exec__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg1", "PIString &", Const); + fi->arguments << TypeInfo("arg2", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg1", "PIString &", Const); + fi->arguments << TypeInfo("arg2", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_exec__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg1", "PIString &", Const); + fi->arguments << TypeInfo("arg2", "PIString &", Const); + fi->arguments << TypeInfo("arg3", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("arg1", "PIString &", Const); + fi->arguments << TypeInfo("arg2", "PIString &", Const); + fi->arguments << TypeInfo("arg3", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_exec__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("args_", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString &", Const); + fi->arguments << TypeInfo("args_", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_terminate__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "terminate"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForFinish__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForFinish"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForFinish__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForFinish"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("timeout_msecs", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_execStarted__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "execStarted"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_execFinished__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("program", "PIString"); + fi->arguments << TypeInfo("exit_code", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "execFinished"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("program", "PIString"); + fi->arguments << TypeInfo("exit_code", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentEnvironment"; fi->return_type = TypeInfo("", "PIStringList", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentPID"; fi->return_type = TypeInfo("", "int", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec_"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIEthernet"] = ci; + ci->name = "PIEthernet"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("sock", "int"); + ci->variables << TypeInfo("sock_s", "int"); + ci->variables << TypeInfo("port_", "int"); + ci->variables << TypeInfo("port_s", "int"); + ci->variables << TypeInfo("port_c", "int"); + ci->variables << TypeInfo("wrote", "int"); + ci->variables << TypeInfo("connected_", "bool"); + ci->variables << TypeInfo("connecting_", "bool"); + ci->variables << TypeInfo("addr_", "sockaddr_in"); + ci->variables << TypeInfo("saddr_", "sockaddr_in"); + ci->variables << TypeInfo("ip_", "PIString"); + ci->variables << TypeInfo("ip_s", "PIString"); + ci->variables << TypeInfo("ip_c", "PIString"); + ci->variables << TypeInfo("server_thread_", "PIThread"); + ci->variables << TypeInfo("clients_", "PIVector"); + ci->variables << TypeInfo("mcast_queue", "PIQueue"); + ci->variables << TypeInfo("mcast_groups", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip_port", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadIP"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReadPort"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSendAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSendAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip_port", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSendIP"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSendPort"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readAddress"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readIP"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readPort"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendAddress"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendIP"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendPort"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setParameters"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameters_", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setParameter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameter", "PIEthernet::Parameters"); + fi->arguments << TypeInfo("on", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isParameterSet"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("parameter", "PIEthernet::Parameters"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parameters"; fi->return_type = TypeInfo("", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "type"; fi->return_type = TypeInfo("", "PIEthernet::Type"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "joinMulticastGroup"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("group", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "leaveMulticastGroup"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("group", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "multicastGroups"; fi->return_type = TypeInfo("", "const PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "connect"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "connect"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "connect"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip_port", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isConnected"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "listen"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "listen"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "listen"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip_port", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "client"; fi->return_type = TypeInfo("", "PIEthernet *"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clientsCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clients"; fi->return_type = TypeInfo("", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("threaded", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ip_port", "PIString &", Const); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("threaded", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("threaded", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + fi->arguments << TypeInfo("threaded", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_newConnection__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("client", "PIEthernet *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "newConnection"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("client", "PIEthernet *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_connected__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "connected"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_disconnected__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("withError", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disconnected"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("withError", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "interfaces"; fi->return_type = TypeInfo("", "PIEthernet::InterfaceList", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "interfaceAddress"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("interface_", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allAddresses"; fi->return_type = TypeInfo("", "PIStringList", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parseAddress"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("ipp", "PIString &", Const); + fi->arguments << TypeInfo("ip", "PIString *"); + fi->arguments << TypeInfo("port", "int *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "macFromBytes"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("mac", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "macToBytes"; fi->return_type = TypeInfo("", "PIByteArray", Static); + fi->arguments << TypeInfo("mac", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "applyMask"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("mask", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getBroadcast"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("mask", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureDevice"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e_main", "void *", Const); + fi->arguments << TypeInfo("e_parent", "void *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "init"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeSocket"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("sd", "int &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getSockAddr"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("s", "sockaddr *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "server_func"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("eth", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setType"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("t", "Type"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "ethErrorString"; fi->return_type = TypeInfo("", "std::string", Static); + + ci = new ClassInfo(); + (*classesInfo)["PIEthernet::Interface"] = ci; + ci->name = "PIEthernet::Interface"; + ci->variables << TypeInfo("index", "int"); + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("mac", "PIString"); + ci->variables << TypeInfo("address", "PIString"); + ci->variables << TypeInfo("netmask", "PIString"); + ci->variables << TypeInfo("broadcast", "PIString"); + ci->variables << TypeInfo("ptp", "PIString"); + ci->variables << TypeInfo("flags", "InterfaceFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isActive"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isRunning"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isBroadcast"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isMulticast"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isLoopback"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isPTP"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIEthernet::InterfaceList"] = ci; + ci->name = "PIEthernet::InterfaceList"; + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getByIndex"; fi->return_type = TypeInfo("", "const Interface *"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getByName"; fi->return_type = TypeInfo("", "const Interface *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getByAddress"; fi->return_type = TypeInfo("", "const Interface *"); + fi->arguments << TypeInfo("address", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getLoopback"; fi->return_type = TypeInfo("", "const Interface *"); + + ci = new ClassInfo(); + (*classesInfo)["PIPacketExtractor"] = ci; + ci->name = "PIPacketExtractor"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("dev", "PIIODevice*"); + ci->variables << TypeInfo("mheader", "PIByteArray"); + ci->variables << TypeInfo("buffer", "PIByteArray"); + ci->variables << TypeInfo("sbuffer", "PIByteArray"); + ci->variables << TypeInfo("ret_func_header", "HeaderCheckFunc"); + ci->variables << TypeInfo("headerPtr", "void*"); + ci->variables << TypeInfo("data", "void*"); + ci->variables << TypeInfo("buffer_size", "int"); + ci->variables << TypeInfo("dataSize", "int"); + ci->variables << TypeInfo("headerSize", "int"); + ci->variables << TypeInfo("packetSize", "int"); + ci->variables << TypeInfo("allReaded", "int"); + ci->variables << TypeInfo("addSize", "int"); + ci->variables << TypeInfo("curInd", "int"); + ci->variables << TypeInfo("missed", "ullong"); + ci->variables << TypeInfo("missed_packets", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "device"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDevice"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("device_", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "bufferSize"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setBufferSize"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setHeaderCheckSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("f", "HeaderCheckFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPacketData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("recHeaderPtr", "void *"); + fi->arguments << TypeInfo("recHeaderSize", "int"); + fi->arguments << TypeInfo("recDataSize", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedBytes"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedPackets"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedBytes_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedPackets_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lastHeader"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_packetReceived__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "packetReceived"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "packetHeaderValidate"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("src", "uchar *"); + fi->arguments << TypeInfo("rec", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "packetValidate"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("rec", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedRead"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIConfig"] = ci; + ci->name = "PIConfig"; + ci->parents << "PIFile"; + ci->variables << TypeInfo("centry", "int"); + ci->variables << TypeInfo("delim", "PIString"); + ci->variables << TypeInfo("root", "PIConfig::Entry"); + ci->variables << TypeInfo("empty", "PIConfig::Entry"); + ci->variables << TypeInfo("lines", "uint"); + ci->variables << TypeInfo("other", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValues"; fi->return_type = TypeInfo("", "PIConfig::Branch"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "PIString &", Const); + fi->arguments << TypeInfo("type", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "PIStringList &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "char *", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "bool", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "short", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "int", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "long", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "uchar", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "ushort", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "uint", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "ulong", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "float", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "double", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "rootEntry"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entriesCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEntryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allTree"; fi->return_type = TypeInfo("", "PIConfig::Branch"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allLeaves"; fi->return_type = TypeInfo("", "PIConfig::Branch"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entryIndex"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getName"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("number", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("number", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getType"; fi->return_type = TypeInfo("", "PIChar"); + fi->arguments << TypeInfo("number", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getComment"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("number", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addEntry"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "PIString &", Const); + fi->arguments << TypeInfo("type", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setName"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("number", "uint"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("number", "uint"); + fi->arguments << TypeInfo("value", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setType"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("number", "uint"); + fi->arguments << TypeInfo("type", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setComment"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("number", "uint"); + fi->arguments << TypeInfo("comment", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeEntry"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeEntry"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("number", "uint"); + fi->arguments << TypeInfo("write", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clear"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readAll"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeAll"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "delimiter"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDelimiter"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("d", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "childCount"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("e", "Entry *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e", "Entry *", Const); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "buildFullNames"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("e", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allLeaves"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("b", "Branch &"); + fi->arguments << TypeInfo("e", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setEntryDelim"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("e", "Entry *"); + fi->arguments << TypeInfo("d", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entryByIndex"; fi->return_type = TypeInfo("", "PIConfig::Entry &"); + fi->arguments << TypeInfo("index", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeEntry"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("b", "Branch &"); + fi->arguments << TypeInfo("e", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "deleteEntry"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("e", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getPrefixFromLine"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("line", "PIString"); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parse"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIConfig::Branch"] = ci; + ci->name = "PIConfig::Branch"; + ci->variables << TypeInfo("_empty", "Entry", Static); + ci->variables << TypeInfo("delim", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allLeaves"; fi->return_type = TypeInfo("", "Branch"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValues"; fi->return_type = TypeInfo("", "Branch"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getLeaves"; fi->return_type = TypeInfo("", "Branch"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getBranches"; fi->return_type = TypeInfo("", "Branch"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "filter"; fi->return_type = TypeInfo("", "Branch &"); + fi->arguments << TypeInfo("f", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEntryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "indexOf"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("e", "Entry *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e", "Entry *", Const); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allLeaves"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("b", "Branch &"); + fi->arguments << TypeInfo("e", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "coutt"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("s", "std::ostream &"); + fi->arguments << TypeInfo("p", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piCoutt"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("s", "PICout"); + fi->arguments << TypeInfo("p", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIConfig::Entry"] = ci; + ci->name = "PIConfig::Entry"; + ci->variables << TypeInfo("_empty", "PIConfig::Entry::EntryPtr", Static); + ci->variables << TypeInfo("_parent", "PIConfig::Entry::EntryPtr*"); + ci->variables << TypeInfo("_children", "Branch"); + ci->variables << TypeInfo("_tab", "PIString"); + ci->variables << TypeInfo("_name", "PIString"); + ci->variables << TypeInfo("_value", "PIString"); + ci->variables << TypeInfo("_type", "PIString"); + ci->variables << TypeInfo("_comment", "PIString"); + ci->variables << TypeInfo("_all", "PIString"); + ci->variables << TypeInfo("_full_name", "PIString"); + ci->variables << TypeInfo("delim", "PIString"); + ci->variables << TypeInfo("_line", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parent"; fi->return_type = TypeInfo("", "Entry *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "childCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "children"; fi->return_type = TypeInfo("", "Branch &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "child"; fi->return_type = TypeInfo("", "Entry *"); + fi->arguments << TypeInfo("index", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findChild"; fi->return_type = TypeInfo("", "Entry *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findChild"; fi->return_type = TypeInfo("", "const Entry *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isLeaf"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "name"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "value"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "type"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "comment"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullName"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setName"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setType"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setComment"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "char *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "bool", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "char", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "short", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "long", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "uchar", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "ushort", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "uint", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "ulong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "float", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("value", "double", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIString &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "char *", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "PIStringList &", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "bool", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "short", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "int", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "long", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uchar", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ushort", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "uint", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "ulong", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "float", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValue"; fi->return_type = TypeInfo("", "Entry &"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + fi->arguments << TypeInfo("def", "double", Const); + fi->arguments << TypeInfo("exists", "bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getValues"; fi->return_type = TypeInfo("", "Branch"); + fi->arguments << TypeInfo("vname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEntryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "compare"; fi->return_type = TypeInfo("", "int", Static); + fi->arguments << TypeInfo("f", "EntryPtr *", Const); + fi->arguments << TypeInfo("s", "EntryPtr *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "entryExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e", "Entry *", Const); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "buildLine"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clear"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "coutt"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("s", "std::ostream &"); + fi->arguments << TypeInfo("p", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "piCoutt"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("s", "PICout"); + fi->arguments << TypeInfo("p", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "deleteBranch"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIMultiProtocolBase"] = ci; + ci->name = "PIMultiProtocolBase"; + ci->parents << "PIObject"; + ci->variables << TypeInfo("mutex_receive", "PIMutex"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prot", "PIProtocol *"); + fi->arguments << TypeInfo("corrected", "bool"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("p", "PIMultiProtocolBase *"); + fi->arguments << TypeInfo("prot", "PIProtocol *"); + fi->arguments << TypeInfo("corrected", "bool"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIProtocol"] = ci; + ci->name = "PIProtocol"; + ci->parents << "PIObject"; + ci->variables << TypeInfo("ser", "PISerial*"); + ci->variables << TypeInfo("eth", "PIEthernet*"); + ci->variables << TypeInfo("dataSize", "uint"); + ci->variables << TypeInfo("headerSize", "uint"); + ci->variables << TypeInfo("sendDataSize", "uint"); + ci->variables << TypeInfo("dataPtr", "uchar*"); + ci->variables << TypeInfo("headerPtr", "uchar*"); + ci->variables << TypeInfo("sendDataPtr", "uchar*"); + ci->variables << TypeInfo("ret_func", "ReceiveFunc"); + ci->variables << TypeInfo("packet_ext", "PIPacketExtractor*"); + ci->variables << TypeInfo("diagTimer", "PITimer*"); + ci->variables << TypeInfo("sendTimer", "PITimer*"); + ci->variables << TypeInfo("secTimer", "PITimer*"); + ci->variables << TypeInfo("mp_owner", "PIMultiProtocolBase*"); + ci->variables << TypeInfo("type_send", "PIProtocol::Type"); + ci->variables << TypeInfo("type_rec", "PIProtocol::Type"); + ci->variables << TypeInfo("net_diag", "PIProtocol::Quality"); + ci->variables << TypeInfo("last_freq", "PIDeque"); + ci->variables << TypeInfo("last_packets", "PIDeque"); + ci->variables << TypeInfo("protName", "PIString"); + ci->variables << TypeInfo("devReceiverName", "PIString"); + ci->variables << TypeInfo("devReceiverState", "PIString"); + ci->variables << TypeInfo("devSenderName", "PIString"); + ci->variables << TypeInfo("devSenderState", "PIString"); + ci->variables << TypeInfo("speedIn", "PIString"); + ci->variables << TypeInfo("speedOut", "PIString"); + ci->variables << TypeInfo("history_path_rec", "PIString"); + ci->variables << TypeInfo("history_path_send", "PIString"); + ci->variables << TypeInfo("history_rsize_rec", "PIString"); + ci->variables << TypeInfo("history_rsize_send", "PIString"); + ci->variables << TypeInfo("history_file_rec", "PIFile"); + ci->variables << TypeInfo("history_file_send", "PIFile"); + ci->variables << TypeInfo("history_id_rec", "ushort"); + ci->variables << TypeInfo("history_id_send", "ushort"); + ci->variables << TypeInfo("work", "bool"); + ci->variables << TypeInfo("new_mp_prot", "bool"); + ci->variables << TypeInfo("history_write_rec", "bool"); + ci->variables << TypeInfo("history_write_send", "bool"); + ci->variables << TypeInfo("exp_freq", "float"); + ci->variables << TypeInfo("send_freq", "float"); + ci->variables << TypeInfo("ifreq", "float"); + ci->variables << TypeInfo("immediate_freq", "float"); + ci->variables << TypeInfo("integral_freq", "float"); + ci->variables << TypeInfo("timeout_", "float"); + ci->variables << TypeInfo("packets", "int[2]"); + ci->variables << TypeInfo("pckt_cnt", "int"); + ci->variables << TypeInfo("pckt_cnt_max", "int"); + ci->variables << TypeInfo("cur_pckt", "char"); + ci->variables << TypeInfo("wrong_count", "ullong"); + ci->variables << TypeInfo("receive_count", "ullong"); + ci->variables << TypeInfo("send_count", "ullong"); + ci->variables << TypeInfo("missed_count", "ullong"); + ci->variables << TypeInfo("packets_in_sec", "ullong"); + ci->variables << TypeInfo("packets_out_sec", "ullong"); + ci->variables << TypeInfo("bytes_in_sec", "ullong"); + ci->variables << TypeInfo("bytes_out_sec", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startReceive__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startReceive"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startReceive__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("exp_frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startReceive"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("exp_frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stopReceive__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopReceive"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setExpectedFrequency"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiverDevice"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("device", "PIString &", Const); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiverData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("dataPtr", "void *"); + fi->arguments << TypeInfo("dataSize", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiverDataHeader"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("headerPtr", "void *"); + fi->arguments << TypeInfo("headerSize", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiverAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiverParameters"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameters", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setReceiveSlot"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("slot", "ReceiveFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "expectedFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startSend__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startSend"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_startSend__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startSend"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stopSend__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopSend"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderFrequency"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("frequency", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderDevice"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("device", "PIString &", Const); + fi->arguments << TypeInfo("speed", "PISerial::Speed"); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("dataPtr", "void *"); + fi->arguments << TypeInfo("dataSize", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderAddress"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("port", "int"); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderIP"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ip", "PIString &", Const); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderPort"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("port", "int"); + fi->arguments << TypeInfo("force", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSenderParameters"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("parameters", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_send__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_send__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_send__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("direct", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("direct", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setName"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "name"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDisconnectTimeout"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("timeout", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disconnectTimeout"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disconnectTimeout_ptr"; fi->return_type = TypeInfo("", "const float *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "immediateFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "integralFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "immediateFrequency_ptr"; fi->return_type = TypeInfo("", "const float *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "integralFrequency_ptr"; fi->return_type = TypeInfo("", "const float *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCountPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCountPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCountPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCountPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveBytesPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveBytesPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendBytesPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendBytesPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "wrongCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "wrongCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "missedCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quality"; fi->return_type = TypeInfo("", "PIProtocol::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quality_ptr"; fi->return_type = TypeInfo("", "const int *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverDeviceName"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderDeviceName"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverDeviceState"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverDeviceState_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderDeviceState"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderDeviceState_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveSpeed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveSpeed_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSpeed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSpeed_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverHistorySize"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverHistorySize_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderHistorySize"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderHistorySize_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeReceiverHistory"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeReceiverHistory_ptr"; fi->return_type = TypeInfo("", "const bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeSenderHistory"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeSenderHistory_ptr"; fi->return_type = TypeInfo("", "const bool *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveData"; fi->return_type = TypeInfo("", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendData"; fi->return_type = TypeInfo("", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "packetExtractor"; fi->return_type = TypeInfo("", "PIPacketExtractor *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lastHeader"; fi->return_type = TypeInfo("", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_receiverStarted__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverStarted"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_receiverStopped__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiverStopped"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_senderStarted__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderStarted"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_senderStopped__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "senderStopped"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_received__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("validate_is_ok", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("validate_is_ok", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_qualityChanged__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("new_quality", "PIProtocol::Quality"); + fi->arguments << TypeInfo("old_quality", "PIProtocol::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "qualityChanged"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_quality", "PIProtocol::Quality"); + fi->arguments << TypeInfo("old_quality", "PIProtocol::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receive"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "validate"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "headerValidate"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("src", "uchar *"); + fi->arguments << TypeInfo("rec", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksum_i"; fi->return_type = TypeInfo("", "uint"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checksum_c"; fi->return_type = TypeInfo("", "uchar"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "aboutSend"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "init"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "init_sender"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("b", "PIConfig::Entry &"); + fi->arguments << TypeInfo("sb", "PIConfig::Entry &"); + fi->arguments << TypeInfo("config", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "init_receiver"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("b", "PIConfig::Entry &"); + fi->arguments << TypeInfo("rb", "PIConfig::Entry &"); + fi->arguments << TypeInfo("config", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "check_state"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calc_freq"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "calc_diag"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("e", "void *"); + fi->arguments << TypeInfo("nt", "i"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveEvent"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("t", "void *"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "headerValidateEvent"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("t", "void *"); + fi->arguments << TypeInfo("src", "uchar *"); + fi->arguments << TypeInfo("rec", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "diagEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("t", "void *"); + fi->arguments << TypeInfo("nt", "i"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "secEvent"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("t", "void *"); + fi->arguments << TypeInfo("nt", "i"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setMultiProtocolOwner"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("mp", "PIMultiProtocolBase *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "multiProtocolOwner"; fi->return_type = TypeInfo("", "PIMultiProtocolBase *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "changeDisconnectTimeout"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIDiagnostics"] = ci; + ci->name = "PIDiagnostics"; + ci->parents << "PITimer"; + ci->variables << TypeInfo("qual", "PIDiagnostics::Quality"); + ci->variables << TypeInfo("speedIn", "PIString"); + ci->variables << TypeInfo("speedOut", "PIString"); + ci->variables << TypeInfo("ifreq", "float"); + ci->variables << TypeInfo("immediate_freq", "float"); + ci->variables << TypeInfo("integral_freq", "float"); + ci->variables << TypeInfo("packets", "int[2]"); + ci->variables << TypeInfo("cur_pckt", "char"); + ci->variables << TypeInfo("rec_once", "char"); + ci->variables << TypeInfo("wrong_count", "ullong"); + ci->variables << TypeInfo("receive_count", "ullong"); + ci->variables << TypeInfo("send_count", "ullong"); + ci->variables << TypeInfo("packets_in_sec", "ullong"); + ci->variables << TypeInfo("packets_out_sec", "ullong"); + ci->variables << TypeInfo("bytes_in_sec", "ullong"); + ci->variables << TypeInfo("bytes_out_sec", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "immediateFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "integralFrequency"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCountPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCountPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveBytesPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendBytesPerSec"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "wrongCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quality"; fi->return_type = TypeInfo("", "PIDiagnostics::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveSpeed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSpeed"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "immediateFrequency_ptr"; fi->return_type = TypeInfo("", "const float *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "integralFrequency_ptr"; fi->return_type = TypeInfo("", "const float *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCountPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCountPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveBytesPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendBytesPerSec_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "wrongCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quality_ptr"; fi->return_type = TypeInfo("", "const int *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveSpeed_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSpeed_ptr"; fi->return_type = TypeInfo("", "const PIString *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("msecs", "double"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_reset__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "reset"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_received__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_received__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("correct", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("size", "int"); + fi->arguments << TypeInfo("correct", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_sended__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sended"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_qualityChanged__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("new_quality", "PIDiagnostics::Quality"); + fi->arguments << TypeInfo("old_quality", "PIDiagnostics::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "qualityChanged"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("new_quality", "PIDiagnostics::Quality"); + fi->arguments << TypeInfo("old_quality", "PIDiagnostics::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "tick"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delimiter", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "changeDisconnectTimeout"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PISystemMonitor"] = ci; + ci->name = "PISystemMonitor"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("file", "PIFile"); + ci->variables << TypeInfo("filem", "PIFile"); + ci->variables << TypeInfo("stat", "PISystemMonitor::ProcessStats"); + ci->variables << TypeInfo("pID_", "int"); + ci->variables << TypeInfo("page_size", "int"); + ci->variables << TypeInfo("cpu_count", "int"); + ci->variables << TypeInfo("cycle", "int"); + ci->variables << TypeInfo("cpu_u_cur", "llong"); + ci->variables << TypeInfo("cpu_u_prev", "llong"); + ci->variables << TypeInfo("cpu_s_cur", "llong"); + ci->variables << TypeInfo("cpu_s_prev", "llong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startOnProcess"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("pID", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startOnSelf"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "statistic"; fi->return_type = TypeInfo("", "const PISystemMonitor::ProcessStats &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PISystemMonitor::ProcessStats"] = ci; + ci->name = "PISystemMonitor::ProcessStats"; + ci->variables << TypeInfo("exec_name", "PIString"); + ci->variables << TypeInfo("state", "PIString"); + ci->variables << TypeInfo("ID", "int"); + ci->variables << TypeInfo("parent_ID", "int"); + ci->variables << TypeInfo("group_ID", "int"); + ci->variables << TypeInfo("session_ID", "int"); + ci->variables << TypeInfo("priority", "int"); + ci->variables << TypeInfo("threads", "int"); + ci->variables << TypeInfo("physical_memsize", "ulong"); + ci->variables << TypeInfo("resident_memsize", "ulong"); + ci->variables << TypeInfo("share_memsize", "ulong"); + ci->variables << TypeInfo("virtual_memsize", "ulong"); + ci->variables << TypeInfo("data_memsize", "ulong"); + ci->variables << TypeInfo("physical_memsize_readable", "PIString"); + ci->variables << TypeInfo("resident_memsize_readable", "PIString"); + ci->variables << TypeInfo("share_memsize_readable", "PIString"); + ci->variables << TypeInfo("virtual_memsize_readable", "PIString"); + ci->variables << TypeInfo("data_memsize_readable", "PIString"); + ci->variables << TypeInfo("cpu_load_system", "float"); + ci->variables << TypeInfo("cpu_load_user", "float"); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole"] = ci; + ci->name = "PIConsole"; + ci->parents << "PIThread"; + ci->variables << TypeInfo("tabs", "PIVector"); + ci->variables << TypeInfo("binstr", "PIString"); + ci->variables << TypeInfo("rstr", "PIString"); + ci->variables << TypeInfo("rba", "PIByteArray"); + ci->variables << TypeInfo("tv", "PIConsole::Variable"); + ci->variables << TypeInfo("listener", "PIKbdListener*"); + ci->variables << TypeInfo("def_align", "PIConsole::Alignment"); + ci->variables << TypeInfo("ret_func", "KBFunc"); + ci->variables << TypeInfo("width", "int"); + ci->variables << TypeInfo("height", "int"); + ci->variables << TypeInfo("pwidth", "int"); + ci->variables << TypeInfo("pheight", "int"); + ci->variables << TypeInfo("ret", "int"); + ci->variables << TypeInfo("col_wid", "int"); + ci->variables << TypeInfo("num_format", "int"); + ci->variables << TypeInfo("systime_format", "int"); + ci->variables << TypeInfo("max_y", "uint"); + ci->variables << TypeInfo("vid", "int"); + ci->variables << TypeInfo("cur_tab", "uint"); + ci->variables << TypeInfo("col_cnt", "uint"); + ci->variables << TypeInfo("peer", "PIPeer*"); + ci->variables << TypeInfo("peer_timer", "PITimer"); + ci->variables << TypeInfo("server_name", "PIString"); + ci->variables << TypeInfo("server_mode", "bool"); + ci->variables << TypeInfo("state", "PIConsole::ConnectedState"); + ci->variables << TypeInfo("remote_clients", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addString"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "PIString *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "char *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "bool *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "short *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "int *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "long *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "llong *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "uchar *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "ushort *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "uint *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "ulong *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "ullong *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "float *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "double *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "PISystemTime *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "PIProtocol *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "PIDiagnostics *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "PISystemMonitor *", Const); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addBitVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("ptr", "void *", Const); + fi->arguments << TypeInfo("fromBit", "int"); + fi->arguments << TypeInfo("bitsCount", "int"); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addEmptyLine"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("column", "int"); + fi->arguments << TypeInfo("count", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getString"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getShort"; fi->return_type = TypeInfo("", "short"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getInt"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getFloat"; fi->return_type = TypeInfo("", "float"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getDouble"; fi->return_type = TypeInfo("", "double"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getString"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getShort"; fi->return_type = TypeInfo("", "short"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getInt"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getFloat"; fi->return_type = TypeInfo("", "float"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getDouble"; fi->return_type = TypeInfo("", "double"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "tabsCount"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentTab"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addTab"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("bind_key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeTab"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("index", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeTab"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTab"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("index", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTab"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTabBindKey"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("index", "uint"); + fi->arguments << TypeInfo("bind_key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTabBindKey"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("bind_key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearTabs"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("clearScreen", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addCustomStatus"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("str", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearCustomStatus"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "defaultAlignment"; fi->return_type = TypeInfo("", "PIConsole::Alignment"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDefaultAlignment"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("align", "Alignment"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setColumnAlignment"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("col", "int"); + fi->arguments << TypeInfo("align", "Alignment"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setColumnAlignmentToAll"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("align", "Alignment"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fstr"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("f", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "enableExitCapture"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("key", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disableExitCapture"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exitCaptured"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exitKey"; fi->return_type = TypeInfo("", "char"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startServer"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopPeer"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isServerStarted"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clients"; fi->return_type = TypeInfo("", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "listenServers"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "availableServers"; fi->return_type = TypeInfo("", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "selectedServer"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "connectToServer"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "disconnect"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isConnected"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toUpperLeft"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "moveRight"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "moveLeft"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "moveTo"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("x", "int"); + fi->arguments << TypeInfo("y", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearScreen"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearScreenLower"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearLine"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "newLine"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "hideCursor"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "showCursor"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_clearVariables__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearVariables"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_clearVariables__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("clearScreen", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearVariables"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("clearScreen", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_waitForFinish__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "waitForFinish"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_start__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("wait", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_stop__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("clear", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("clear", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_keyPressed__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("key", "char"); + fi->arguments << TypeInfo("data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "keyPressed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("key", "char"); + fi->arguments << TypeInfo("data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "begin"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "run"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fillLabels"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "status"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checkColumn"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("col", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "bitsValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("src", "void *", Const); + fi->arguments << TypeInfo("offset", "int"); + fi->arguments << TypeInfo("count", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "toBin"; fi->return_type = TypeInfo("", "const char *"); + fi->arguments << TypeInfo("d", "void *", Const); + fi->arguments << TypeInfo("s", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printLine"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("str", "PIString &", Const); + fi->arguments << TypeInfo("dx", "int"); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "PIString &", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("str", "char *", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "bool", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "int", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "long", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "llong", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "float", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "double", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "char", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "short", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "uchar", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "ushort", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "uint", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "ulong", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "ullong", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "printValue"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("value", "PISystemTime &", Const); + fi->arguments << TypeInfo("format", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "key_event"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("key", "char"); + fi->arguments << TypeInfo("t", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "columns"; fi->return_type = TypeInfo("", "PIVector &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "column"; fi->return_type = TypeInfo("", "PIConsole::Column &"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "char *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "bool", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "char", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "short", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "long", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "llong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "uchar", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "ushort", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "uint", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "ulong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "ullong", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "float", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "double", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "couts"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("v", "PISystemTime &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "serverSendInfo"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "serverSendData"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "remoteClient"; fi->return_type = TypeInfo("", "RemoteClient &"); + fi->arguments << TypeInfo("fname", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_peerReceived__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerReceived"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_peerTimer__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerTimer"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_peerDisconnectedEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerDisconnectedEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole::Variable"] = ci; + ci->name = "PIConsole::Variable"; + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("format", "PIFlags"); + ci->variables << TypeInfo("nx", "int"); + ci->variables << TypeInfo("ny", "int"); + ci->variables << TypeInfo("type", "int"); + ci->variables << TypeInfo("offset", "int"); + ci->variables << TypeInfo("bitFrom", "int"); + ci->variables << TypeInfo("bitCount", "int"); + ci->variables << TypeInfo("size", "int"); + ci->variables << TypeInfo("id", "int"); + ci->variables << TypeInfo("remote", "bool"); + ci->variables << TypeInfo("ptr", "void*", Const); + ci->variables << TypeInfo("rdata", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEmpty"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "data"; fi->return_type = TypeInfo("", "const void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ba", "PIByteArray &"); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole::VariableContent"] = ci; + ci->name = "PIConsole::VariableContent"; + ci->variables << TypeInfo("id", "int"); + ci->variables << TypeInfo("rdata", "PIByteArray"); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole::Column"] = ci; + ci->name = "PIConsole::Column"; + ci->variables << TypeInfo("variables", "PIVector"); + ci->variables << TypeInfo("alignment", "Alignment"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "size"; fi->return_type = TypeInfo("", "uint"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "push_back"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("v", "Variable &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole::Tab"] = ci; + ci->name = "PIConsole::Tab"; + ci->variables << TypeInfo("columns", "PIVector"); + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("status", "PIString"); + ci->variables << TypeInfo("key", "char"); + + ci = new ClassInfo(); + (*classesInfo)["PIConsole::RemoteClient"] = ci; + ci->name = "PIConsole::RemoteClient"; + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("state", "ConnectedState"); + + ci = new ClassInfo(); + (*classesInfo)["PICLI"] = ci; + ci->name = "PICLI"; + ci->parents << "PIObject"; + ci->variables << TypeInfo("_prefix_short", "PIString"); + ci->variables << TypeInfo("_prefix_full", "PIString"); + ci->variables << TypeInfo("_args_raw", "PIStringList"); + ci->variables << TypeInfo("_args_mand", "PIStringList"); + ci->variables << TypeInfo("_args_opt", "PIStringList"); + ci->variables << TypeInfo("keys_full", "PISet"); + ci->variables << TypeInfo("keys_short", "PISet"); + ci->variables << TypeInfo("_args", "PIVector"); + ci->variables << TypeInfo("_count_mand", "int"); + ci->variables << TypeInfo("_count_opt", "int"); + ci->variables << TypeInfo("needParse", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addArgument"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addArgument"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("shortKey", "PIChar &", Const); + fi->arguments << TypeInfo("value", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addArgument"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("shortKey", "char *", Const); + fi->arguments << TypeInfo("value", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addArgument"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("shortKey", "PIChar &", Const); + fi->arguments << TypeInfo("fullKey", "PIString &", Const); + fi->arguments << TypeInfo("value", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addArgument"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("shortKey", "char *", Const); + fi->arguments << TypeInfo("fullKey", "PIString &", Const); + fi->arguments << TypeInfo("value", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "rawArgument"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mandatoryArgument"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "optionalArgument"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "rawArguments"; fi->return_type = TypeInfo("", "const PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mandatoryArguments"; fi->return_type = TypeInfo("", "const PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "optionalArguments"; fi->return_type = TypeInfo("", "const PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "programCommand"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "hasArgument"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "argumentValue"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "argumentShortKey"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "argumentFullKey"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "shortKeyPrefix"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullKeyPrefix"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "mandatoryArgumentsCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "optionalArgumentsCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setShortKeyPrefix"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prefix", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setFullKeyPrefix"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prefix", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setMandatoryArgumentsCount"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("count", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setOptionalArgumentsCount"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("count", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parse"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PICLI::Argument"] = ci; + ci->name = "PICLI::Argument"; + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("short_key", "PIChar"); + ci->variables << TypeInfo("full_key", "PIString"); + ci->variables << TypeInfo("value", "PIString"); + ci->variables << TypeInfo("has_value", "bool"); + ci->variables << TypeInfo("found", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["Instruction"] = ci; + ci->name = "Instruction"; + ci->variables << TypeInfo("operation", "Operation"); + ci->variables << TypeInfo("out", "int"); + ci->variables << TypeInfo("function", "int"); + + ci = new ClassInfo(); + (*classesInfo)["Function"] = ci; + ci->name = "Function"; + ci->variables << TypeInfo("identifier", "PIString"); + ci->variables << TypeInfo("type", "BaseFunctions"); + ci->variables << TypeInfo("handler", "FuncFunc"); + ci->variables << TypeInfo("arguments", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIEvaluatorContent"] = ci; + ci->name = "PIEvaluatorContent"; + ci->variables << TypeInfo("functions", "PIVector"); + ci->variables << TypeInfo("variables", "PIVector"); + ci->variables << TypeInfo("cv_count", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addFunction"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("args", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("val", "complexd &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addCustomFunction"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("args_count", "int"); + fi->arguments << TypeInfo("func", "FuncFunc"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "functionsCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "variablesCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "customVariablesCount"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findFunction"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findVariable"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("var_name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "function"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Function"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "variable"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Variable"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "function"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Function"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "variable"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Variable"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "customVariable"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Variable"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariableValue"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("index", "int"); + fi->arguments << TypeInfo("new_value", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariableName"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("index", "int"); + fi->arguments << TypeInfo("new_name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariableValue"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("var_name", "PIString &", Const); + fi->arguments << TypeInfo("new_value", "complexd &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariableName"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("var_name", "PIString &", Const); + fi->arguments << TypeInfo("new_name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("index", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("var_name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearCustomVariables"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sortVariables"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getBaseFunction"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::BaseFunctions"); + fi->arguments << TypeInfo("name", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIEvaluator"] = ci; + ci->name = "PIEvaluator"; + ci->variables << TypeInfo("content", "PIEvaluatorContent"); + ci->variables << TypeInfo("elements", "PIVector"); + ci->variables << TypeInfo("currentVariables", "PIVector"); + ci->variables << TypeInfo("variables", "PIVector"); + ci->variables << TypeInfo("tmpvars", "PIVector"); + ci->variables << TypeInfo("kvars", "PIVector*"); + ci->variables << TypeInfo("instructions", "PIVector"); + ci->variables << TypeInfo("unknownVars", "PIStringList"); + ci->variables << TypeInfo("currentString", "PIString"); + ci->variables << TypeInfo("lastError", "PIString"); + ci->variables << TypeInfo("out", "complexd"); + ci->variables << TypeInfo("correct", "bool"); + ci->variables << TypeInfo("data_", "void*"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "data"; fi->return_type = TypeInfo("", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("_data", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "check"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("string", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isCorrect"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariable"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("value", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("index", "int"); + fi->arguments << TypeInfo("value", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setCustomVariableValue"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("index", "int"); + fi->arguments << TypeInfo("value", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "evaluate"; fi->return_type = TypeInfo("", "complexd"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeVariable"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clearCustomVariables"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "variableIndex"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unknownVariables"; fi->return_type = TypeInfo("", "const PIStringList &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "expression"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "error"; fi->return_type = TypeInfo("", "const PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lastResult"; fi->return_type = TypeInfo("", "const complexd &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "prepare"; fi->return_type = TypeInfo("", "const PIString &"); + fi->arguments << TypeInfo("string", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "preprocess"; fi->return_type = TypeInfo("", "const PIString &"); + fi->arguments << TypeInfo("string", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parse"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("string", "PIString &", Const); + fi->arguments << TypeInfo("offset", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "convert"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checkBrackets"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeSpaces"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findUnknownVariables"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeJunk"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "replaceOperators"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "makeOutput"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("string", "PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fillElements"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSignes"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isSign"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("ch", "PIChar &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "inverse"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("string", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "check"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "execInstructions"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "inBrackets"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("string", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "operationChar"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("operation", "PIEvaluatorTypes::Operation &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "operationInOrder"; fi->return_type = TypeInfo("", "PIEvaluatorTypes::Operation"); + fi->arguments << TypeInfo("index", "int &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "value"; fi->return_type = TypeInfo("", "complexd"); + fi->arguments << TypeInfo("index", "int &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "residue"; fi->return_type = TypeInfo("", "complexd"); + fi->arguments << TypeInfo("f", "complexd &", Const); + fi->arguments << TypeInfo("s", "complexd &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "execFunction"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ci", "PIEvaluatorTypes::Instruction &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIMultiProtocol"] = ci; + ci->name = "PIMultiProtocol"; + ci->parents << "PIMultiProtocolBase"; + ci->variables << TypeInfo("prots", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addProtocol"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prot", "PIProtocol &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addProtocol"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prot", "PIProtocol *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addProtocol"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("config", "PIString &", Const); + fi->arguments << TypeInfo("name", "PIString &", Const); + fi->arguments << TypeInfo("recHeaderPtr", "void *"); + fi->arguments << TypeInfo("recHeaderSize", "int"); + fi->arguments << TypeInfo("recDataPtr", "void *"); + fi->arguments << TypeInfo("recDataSize", "int"); + fi->arguments << TypeInfo("sendDataPtr", "void *"); + fi->arguments << TypeInfo("sendDataSize", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "protocol"; fi->return_type = TypeInfo("", "PIProtocol *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "protocol"; fi->return_type = TypeInfo("", "PIProtocol *"); + fi->arguments << TypeInfo("index", "int", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startSend"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "startReceive"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "start"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopSend"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stopReceive"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "stop"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "worseQuality"; fi->return_type = TypeInfo("", "PIProtocol::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "bestQuality"; fi->return_type = TypeInfo("", "PIProtocol::Quality"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "count"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clear"; fi->return_type = TypeInfo("", "void"); + + ci = new ClassInfo(); + (*classesInfo)["PIRepeater"] = ci; + ci->name = "PIRepeater"; + ci->parents << "PIMultiProtocol"; + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "firstChannelName"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "secondChannelName"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "receiveCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount"; fi->return_type = TypeInfo("", "ullong"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendCount_ptr"; fi->return_type = TypeInfo("", "const ullong *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "received"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prot", "PIProtocol *"); + fi->arguments << TypeInfo("ool", "b"); + fi->arguments << TypeInfo("data", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PICodec"] = ci; + ci->name = "PICodec"; + ci->parents << "PIProcess"; + ci->variables << TypeInfo("c_from", "PIString"); + ci->variables << TypeInfo("c_to", "PIString"); + ci->variables << TypeInfo("tf", "PIFile"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setFromCoding"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("from", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setToCoding"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("to", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setCodings"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("to", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "availableCodecs"; fi->return_type = TypeInfo("", "PIStringList"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "encode"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("str", "PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "encode"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("str", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "decode"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("str", "PIString &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "decode"; fi->return_type = TypeInfo("", "PIString"); + fi->arguments << TypeInfo("str", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "exec_iconv"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("to", "PIString &", Const); + fi->arguments << TypeInfo("str", "PIByteArray &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PISignals"] = ci; + ci->name = "PISignals"; + ci->variables << TypeInfo("ret_func", "PISignals::SignalEvent", Static); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setSlot"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("slot", "SignalEvent"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "grabSignals"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("signals_", "PIFlags"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "raiseSignal"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("signal", "PISignals::Signal"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "signalCode"; fi->return_type = TypeInfo("", "int", Static); + fi->arguments << TypeInfo("signal", "PISignals::Signal"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "signalFromCode"; fi->return_type = TypeInfo("", "PISignals::Signal", Static); + fi->arguments << TypeInfo("signal", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "signal_event"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("signal", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIPeer"] = ci; + ci->name = "PIPeer"; + ci->parents << "PIObject"; + ci->variables << TypeInfo("eths", "PIVector"); + ci->variables << TypeInfo("mc_eths", "PIVector"); + ci->variables << TypeInfo("eth_send", "PIEthernet*"); + ci->variables << TypeInfo("timer", "PITimer"); + ci->variables << TypeInfo("mc_mutex", "PIMutex"); + ci->variables << TypeInfo("eth_mutex", "PIMutex"); + ci->variables << TypeInfo("rec_mc", "bool"); + ci->variables << TypeInfo("rec_bc", "bool"); + ci->variables << TypeInfo("self_info", "PIPeer::PeerInfo"); + ci->variables << TypeInfo("peers", "PIVector"); + ci->variables << TypeInfo("addresses_map", "PIMap >"); + ci->variables << TypeInfo("diag_s", "PIDiagnostics"); + ci->variables << TypeInfo("diag_d", "PIDiagnostics"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PIString &", Const); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo &", Const); + fi->arguments << TypeInfo("data", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo &", Const); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo *", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo *", Const); + fi->arguments << TypeInfo("data", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "send"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("to", "PeerInfo *", Const); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendToAll"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendToAll"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendToAll"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isMulticastReceive"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isBroadcastReceive"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "diagnosticService"; fi->return_type = TypeInfo("", "PIDiagnostics &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "diagnosticData"; fi->return_type = TypeInfo("", "PIDiagnostics &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "allPeers"; fi->return_type = TypeInfo("", "const PIVector &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isPeerExists"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getPeerByName"; fi->return_type = TypeInfo("", "const PIPeer::PeerInfo *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "unlock"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_dataReceivedEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "dataReceivedEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_peerConnectedEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerConnectedEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_peerDisconnectedEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerDisconnectedEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "dataReceived"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("from", "PIString &", Const); + fi->arguments << TypeInfo("data", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerConnected"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "peerDisconnected"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_dataRead__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "dataRead"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_multicastRead__"; fi->return_type = TypeInfo("", "bool", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "multicastRead"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_timerEvent__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "timerEvent"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("data", "void *"); + fi->arguments << TypeInfo("delim", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "hasPeer"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removePeer"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("name", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendPeerInfo"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("info", "PeerInfo &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendPeerRemove"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("peer", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSelfInfo"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendSelfRemove"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "syncPeers"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "findNearestAddresses"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "initEths"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("al", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "initMulticasts"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("al", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "destroyMulticasts"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendMulticast"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ba", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "quickestPeer"; fi->return_type = TypeInfo("", "PIPeer::PeerInfo *"); + fi->arguments << TypeInfo("to", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "sendToNeighbour"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("peer", "PeerInfo *"); + fi->arguments << TypeInfo("ba", "PIByteArray &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIPeer::PeerData"] = ci; + ci->name = "PIPeer::PeerData"; + ci->variables << TypeInfo("data", "PIByteArray"); + ci->variables << TypeInfo("msg_count", "int"); + ci->variables << TypeInfo("msg_rec", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "clear"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEmpty"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isFullReceived"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ba", "PIByteArray &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setData"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ba", "PIByteArray &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIPeer::PeerInfo"] = ci; + ci->name = "PIPeer::PeerInfo"; + ci->variables << TypeInfo("name", "PIString"); + ci->variables << TypeInfo("addresses", "PIStringList"); + ci->variables << TypeInfo("dist", "int"); + ci->variables << TypeInfo("ping", "int"); + ci->variables << TypeInfo("nearest_address", "PIString"); + ci->variables << TypeInfo("netmasks", "PIStringList"); + ci->variables << TypeInfo("neighbours", "PIStringList"); + ci->variables << TypeInfo("sync", "int"); + ci->variables << TypeInfo("_naddress", "PIString"); + ci->variables << TypeInfo("_neth", "PIEthernet*"); + ci->variables << TypeInfo("_nuses", "PIVector"); + ci->variables << TypeInfo("_first", "PeerInfo*"); + ci->variables << TypeInfo("_data", "PeerData"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isNeighbour"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addNeighbour"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "addNeighbours"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("l", "PIStringList &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "removeNeighbour"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("n", "PIString &", Const); + + ci = new ClassInfo(); + (*classesInfo)["PIPeer::PeerPacket"] = ci; + ci->name = "PIPeer::PeerPacket"; + ci->variables << TypeInfo("header", "int"); + + ci = new ClassInfo(); + (*classesInfo)["PIBinaryLog"] = ci; + ci->name = "PIBinaryLog"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("filterID", "PIVector"); + ci->variables << TypeInfo("file", "PIFile"); + ci->variables << TypeInfo("lastrecord", "PIBinaryLog::BinLogRecord"); + ci->variables << TypeInfo("startlogtime", "PISystemTime"); + ci->variables << TypeInfo("play_time", "double"); + ci->variables << TypeInfo("is_started", "bool"); + ci->variables << TypeInfo("is_thread_ok", "bool"); + ci->variables << TypeInfo("binlog_sig", "uchar[6]"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "playMode"; fi->return_type = TypeInfo("", "PIBinaryLog::PlayMode"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "logDir"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "filePrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "defaultID"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "playSpeed"; fi->return_type = TypeInfo("", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "rapidStart"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPlayMode"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("mode", "PlayMode"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setLogDir"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setFilePrefix"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("prefix", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDefaultID"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("id", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setRapidStart"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("enabled", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setPlaySpeed"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("speed", "float"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinLog"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("id", "int"); + fi->arguments << TypeInfo("data", "PIByteArray"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeBinLog"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("id", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readBinLog"; fi->return_type = TypeInfo("", "PIByteArray"); + fi->arguments << TypeInfo("id", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readBinLog"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("id", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEnd"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isEmpty"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "lastReadedID"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "restart"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_createNewFile__"; fi->return_type = TypeInfo("", "PIString", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "createNewFile"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_fileEnd__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fileEnd"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "__stat_eh_fileError__"; fi->return_type = TypeInfo("", "void", Static); + fi->arguments << TypeInfo("o", "void *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fileError"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "threadedRead"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("readed", "uchar *"); + fi->arguments << TypeInfo("size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "writeFileHeader"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "checkFileHeader"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "readRecord"; fi->return_type = TypeInfo("", "PIBinaryLog::BinLogRecord"); + + ci = new ClassInfo(); + (*classesInfo)["PIBinaryLog::BinLogRecord"] = ci; + ci->name = "PIBinaryLog::BinLogRecord"; + ci->variables << TypeInfo("id", "int"); + ci->variables << TypeInfo("size", "int"); + ci->variables << TypeInfo("timestamp", "PISystemTime"); + ci->variables << TypeInfo("data", "PIByteArray"); + + ci = new ClassInfo(); + (*classesInfo)["PIUSB"] = ci; + ci->name = "PIUSB"; + ci->parents << "PIIODevice"; + ci->variables << TypeInfo("eps", "PIVector"); + ci->variables << TypeInfo("vid_", "ushort"); + ci->variables << TypeInfo("pid_", "ushort"); + ci->variables << TypeInfo("intefrace_", "int"); + ci->variables << TypeInfo("timeout_r", "int"); + ci->variables << TypeInfo("timeout_w", "int"); + ci->variables << TypeInfo("interface_claimed", "int"); + ci->variables << TypeInfo("ep_read", "PIUSB::Endpoint"); + ci->variables << TypeInfo("ep_write", "PIUSB::Endpoint"); + ci->variables << TypeInfo("desc_", "PIUSB::Descriptor"); + ci->variables << TypeInfo("conf_", "PIUSB::Configuration"); + ci->variables << TypeInfo("iface_", "PIUSB::Interface"); + ci->variables << TypeInfo("hdev", "usb_dev_handle*"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "className"; fi->return_type = TypeInfo("", "const char *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "copy"; fi->return_type = TypeInfo("", "PIIODevice *"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentDescriptor"; fi->return_type = TypeInfo("", "const PIUSB::Descriptor &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentConfiguration"; fi->return_type = TypeInfo("", "const PIUSB::Configuration &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "currentInterface"; fi->return_type = TypeInfo("", "const PIUSB::Interface &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "vendorID"; fi->return_type = TypeInfo("", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "productID"; fi->return_type = TypeInfo("", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "deviceNumber"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "timeoutRead"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "timeoutWrite"; fi->return_type = TypeInfo("", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endpointRead"; fi->return_type = TypeInfo("", "const PIUSB::Endpoint &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endpointWrite"; fi->return_type = TypeInfo("", "const PIUSB::Endpoint &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endpoints"; fi->return_type = TypeInfo("", "const PIVector &"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endpointsRead"; fi->return_type = TypeInfo("", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "endpointsWrite"; fi->return_type = TypeInfo("", "PIVector"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "getEndpointByAddress"; fi->return_type = TypeInfo("", "PIUSB::Endpoint"); + fi->arguments << TypeInfo("address", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setVendorID"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("vid", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setProductID"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("pid", "ushort"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setConfiguration"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("value", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setInterface"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("value", "uchar"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setEndpointRead"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ep", "PIUSB::Endpoint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setEndpointWrite"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("ep", "PIUSB::Endpoint &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setDeviceNumber"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("dn", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTimeoutRead"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("t", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "setTimeoutWrite"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("t", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "read"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("read_to", "void *"); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "write"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "controlWrite"; fi->return_type = TypeInfo("", "int"); + fi->arguments << TypeInfo("data", "void *", Const); + fi->arguments << TypeInfo("max_size", "int"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "flush"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "fullPathPrefix"; fi->return_type = TypeInfo("", "PIString"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureFromFullPath"; fi->return_type = TypeInfo("", "void"); + fi->arguments << TypeInfo("full_path", "PIString &", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "configureDevice"; fi->return_type = TypeInfo("", "bool"); + fi->arguments << TypeInfo("e_main", "void *", Const); + fi->arguments << TypeInfo("e_parent", "void *", Const); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "openDevice"; fi->return_type = TypeInfo("", "bool"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "closeDevice"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIUSB::Endpoint"] = ci; + ci->name = "PIUSB::Endpoint"; + ci->variables << TypeInfo("address", "uchar"); + ci->variables << TypeInfo("attributes", "uchar"); + ci->variables << TypeInfo("max_packet_size", "ushort"); + ci->variables << TypeInfo("direction", "PIUSB::Endpoint::Direction"); + ci->variables << TypeInfo("transfer_type", "PIUSB::Endpoint::TransferType"); + ci->variables << TypeInfo("synchronisation_type", "PIUSB::Endpoint::SynchronisationType"); + ci->variables << TypeInfo("usage_type", "PIUSB::Endpoint::UsageType"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "parse"; fi->return_type = TypeInfo("", "void"); + ci->functions.push_back(FunctionInfo()); fi = &(ci->functions.back()); + fi->name = "isNull"; fi->return_type = TypeInfo("", "bool"); + + ci = new ClassInfo(); + (*classesInfo)["PIUSB::Interface"] = ci; + ci->name = "PIUSB::Interface"; + ci->variables << TypeInfo("index", "uchar"); + ci->variables << TypeInfo("value_to_select", "uchar"); + ci->variables << TypeInfo("class_code", "ushort"); + ci->variables << TypeInfo("subclass_code", "ushort"); + ci->variables << TypeInfo("protocol_code", "ushort"); + ci->variables << TypeInfo("endpoints", "PIVector"); + + ci = new ClassInfo(); + (*classesInfo)["PIUSB::Configuration"] = ci; + ci->name = "PIUSB::Configuration"; + ci->variables << TypeInfo("index", "uchar"); + ci->variables << TypeInfo("value_to_select", "uchar"); + ci->variables << TypeInfo("attributes", "uchar"); + ci->variables << TypeInfo("max_power", "ushort"); + ci->variables << TypeInfo("self_powered", "bool"); + ci->variables << TypeInfo("remote_wakeup", "bool"); + ci->variables << TypeInfo("interfaces", "PIVector"); + + ci = new ClassInfo(); + (*classesInfo)["PIUSB::Descriptor"] = ci; + ci->name = "PIUSB::Descriptor"; + ci->variables << TypeInfo("usb_spec_number", "ushort"); + ci->variables << TypeInfo("device_class", "uchar"); + ci->variables << TypeInfo("device_subclass", "uchar"); + ci->variables << TypeInfo("device_protocol", "uchar"); + ci->variables << TypeInfo("max_packet_size", "uchar"); + ci->variables << TypeInfo("id_vendor", "ushort"); + ci->variables << TypeInfo("id_product", "ushort"); + ci->variables << TypeInfo("id_device_release", "ushort"); + ci->variables << TypeInfo("index_manufacturer", "uchar"); + ci->variables << TypeInfo("index_product", "uchar"); + ci->variables << TypeInfo("index_serial", "uchar"); + ci->variables << TypeInfo("configurations", "PIVector"); + +// Enums + + ei = new EnumInfo(); + (*enumsInfo)["PICoutSpecialChar"] = ei; + ei->name = "PICoutSpecialChar"; + ei->members << PICodeInfo::EnumeratorInfo("Null", 0); + ei->members << PICodeInfo::EnumeratorInfo("NewLine", 1); + ei->members << PICodeInfo::EnumeratorInfo("Tab", 2); + ei->members << PICodeInfo::EnumeratorInfo("Esc", 3); + ei->members << PICodeInfo::EnumeratorInfo("Quote", 4); + + ei = new EnumInfo(); + (*enumsInfo)["PICoutAction"] = ei; + ei->name = "PICoutAction"; + ei->members << PICodeInfo::EnumeratorInfo("Flush", 0); + ei->members << PICodeInfo::EnumeratorInfo("Backspace", 1); + ei->members << PICodeInfo::EnumeratorInfo("ShowCursor", 2); + ei->members << PICodeInfo::EnumeratorInfo("HideCursor", 3); + ei->members << PICodeInfo::EnumeratorInfo("ClearScreen", 4); + ei->members << PICodeInfo::EnumeratorInfo("SaveContol", 5); + ei->members << PICodeInfo::EnumeratorInfo("RestoreControl", 6); + + ei = new EnumInfo(); + (*enumsInfo)["PICoutControl"] = ei; + ei->name = "PICoutControl"; + ei->members << PICodeInfo::EnumeratorInfo("AddNone", 0); + ei->members << PICodeInfo::EnumeratorInfo("AddSpaces", 1); + ei->members << PICodeInfo::EnumeratorInfo("AddNewLine", 2); + ei->members << PICodeInfo::EnumeratorInfo("AddQuotes", 4); + ei->members << PICodeInfo::EnumeratorInfo("AddAll", -1); + + ei = new EnumInfo(); + (*enumsInfo)["PICoutFormat"] = ei; + ei->name = "PICoutFormat"; + ei->members << PICodeInfo::EnumeratorInfo("Bin", 1); + ei->members << PICodeInfo::EnumeratorInfo("Oct", 2); + ei->members << PICodeInfo::EnumeratorInfo("Dec", 4); + ei->members << PICodeInfo::EnumeratorInfo("Hex", 8); + ei->members << PICodeInfo::EnumeratorInfo("Bold", 16); + ei->members << PICodeInfo::EnumeratorInfo("Faint", 32); + ei->members << PICodeInfo::EnumeratorInfo("Italic", 64); + ei->members << PICodeInfo::EnumeratorInfo("Underline", 128); + ei->members << PICodeInfo::EnumeratorInfo("Blink", 256); + ei->members << PICodeInfo::EnumeratorInfo("Black", 1024); + ei->members << PICodeInfo::EnumeratorInfo("Red", 2048); + ei->members << PICodeInfo::EnumeratorInfo("Green", 4096); + ei->members << PICodeInfo::EnumeratorInfo("Blue", 8192); + ei->members << PICodeInfo::EnumeratorInfo("Yellow", 16384); + ei->members << PICodeInfo::EnumeratorInfo("Magenta", 32768); + ei->members << PICodeInfo::EnumeratorInfo("Cyan", 65536); + ei->members << PICodeInfo::EnumeratorInfo("White", 131072); + ei->members << PICodeInfo::EnumeratorInfo("BackBlack", 262144); + ei->members << PICodeInfo::EnumeratorInfo("BackRed", 524288); + ei->members << PICodeInfo::EnumeratorInfo("BackGreen", 1048576); + ei->members << PICodeInfo::EnumeratorInfo("BackBlue", 2097152); + ei->members << PICodeInfo::EnumeratorInfo("BackYellow", 4194304); + ei->members << PICodeInfo::EnumeratorInfo("BackMagenta", 8388608); + ei->members << PICodeInfo::EnumeratorInfo("BackCyan", 16777216); + ei->members << PICodeInfo::EnumeratorInfo("BackWhite", 33554432); + ei->members << PICodeInfo::EnumeratorInfo("Default", 67108864); + + ei = new EnumInfo(); + (*enumsInfo)["Solver::Method"] = ei; + ei->name = "Solver::Method"; + ei->members << PICodeInfo::EnumeratorInfo("Global", -1); + ei->members << PICodeInfo::EnumeratorInfo("Eyler_1", 1); + ei->members << PICodeInfo::EnumeratorInfo("Eyler_2", 2); + ei->members << PICodeInfo::EnumeratorInfo("EylerKoshi", 3); + ei->members << PICodeInfo::EnumeratorInfo("RungeKutta_4", 14); + ei->members << PICodeInfo::EnumeratorInfo("AdamsBashfortMoulton_2", 22); + ei->members << PICodeInfo::EnumeratorInfo("AdamsBashfortMoulton_3", 23); + ei->members << PICodeInfo::EnumeratorInfo("AdamsBashfortMoulton_4", 24); + ei->members << PICodeInfo::EnumeratorInfo("PolynomialApproximation_2", 32); + ei->members << PICodeInfo::EnumeratorInfo("PolynomialApproximation_3", 33); + ei->members << PICodeInfo::EnumeratorInfo("PolynomialApproximation_4", 34); + ei->members << PICodeInfo::EnumeratorInfo("PolynomialApproximation_5", 35); + + ei = new EnumInfo(); + (*enumsInfo)["PIVariant::Type"] = ei; + ei->name = "PIVariant::Type"; + ei->members << PICodeInfo::EnumeratorInfo("Invalid", 0); + ei->members << PICodeInfo::EnumeratorInfo("Bool", 1); + ei->members << PICodeInfo::EnumeratorInfo("Char", 2); + ei->members << PICodeInfo::EnumeratorInfo("UChar", 3); + ei->members << PICodeInfo::EnumeratorInfo("Short", 4); + ei->members << PICodeInfo::EnumeratorInfo("UShort", 5); + ei->members << PICodeInfo::EnumeratorInfo("Int", 6); + ei->members << PICodeInfo::EnumeratorInfo("UInt", 7); + ei->members << PICodeInfo::EnumeratorInfo("Long", 8); + ei->members << PICodeInfo::EnumeratorInfo("ULong", 9); + ei->members << PICodeInfo::EnumeratorInfo("LLong", 10); + ei->members << PICodeInfo::EnumeratorInfo("ULLong", 11); + ei->members << PICodeInfo::EnumeratorInfo("Float", 12); + ei->members << PICodeInfo::EnumeratorInfo("Double", 13); + ei->members << PICodeInfo::EnumeratorInfo("LDouble", 14); + ei->members << PICodeInfo::EnumeratorInfo("Complexd", 15); + ei->members << PICodeInfo::EnumeratorInfo("Complexld", 16); + ei->members << PICodeInfo::EnumeratorInfo("BitArray", 17); + ei->members << PICodeInfo::EnumeratorInfo("ByteArray", 18); + ei->members << PICodeInfo::EnumeratorInfo("String", 19); + ei->members << PICodeInfo::EnumeratorInfo("StringList", 20); + ei->members << PICodeInfo::EnumeratorInfo("Time", 21); + ei->members << PICodeInfo::EnumeratorInfo("Date", 22); + ei->members << PICodeInfo::EnumeratorInfo("DateTime", 23); + ei->members << PICodeInfo::EnumeratorInfo("SystemTime", 24); + ei->members << PICodeInfo::EnumeratorInfo("Custom", 255); + + ei = new EnumInfo(); + (*enumsInfo)["PIThread::Priority"] = ei; + ei->name = "PIThread::Priority"; + ei->members << PICodeInfo::EnumeratorInfo("piHighest", -2); + ei->members << PICodeInfo::EnumeratorInfo("piHigh", -1); + ei->members << PICodeInfo::EnumeratorInfo("piNormal", 0); + ei->members << PICodeInfo::EnumeratorInfo("piLow", 1); + ei->members << PICodeInfo::EnumeratorInfo("piLowerst", 2); + + ei = new EnumInfo(); + (*enumsInfo)["PIKbdListener::SpecialSymbol"] = ei; + ei->name = "PIKbdListener::SpecialSymbol"; + ei->members << PICodeInfo::EnumeratorInfo("UpArrow", -1); + ei->members << PICodeInfo::EnumeratorInfo("DownArrow", -2); + ei->members << PICodeInfo::EnumeratorInfo("RightArrow", -3); + ei->members << PICodeInfo::EnumeratorInfo("LeftArrow", -4); + ei->members << PICodeInfo::EnumeratorInfo("CtrlUpArrow", -5); + ei->members << PICodeInfo::EnumeratorInfo("CtrlDownArrow", -6); + ei->members << PICodeInfo::EnumeratorInfo("CtrlRightArrow", -7); + ei->members << PICodeInfo::EnumeratorInfo("CtrlLeftArrow", -8); + + ei = new EnumInfo(); + (*enumsInfo)["PIIODevice::DeviceMode"] = ei; + ei->name = "PIIODevice::DeviceMode"; + ei->members << PICodeInfo::EnumeratorInfo("ReadOnly", 1); + ei->members << PICodeInfo::EnumeratorInfo("WriteOnly", 2); + ei->members << PICodeInfo::EnumeratorInfo("ReadWrite", 3); + + ei = new EnumInfo(); + (*enumsInfo)["PISerial::Parameters"] = ei; + ei->name = "PISerial::Parameters"; + ei->members << PICodeInfo::EnumeratorInfo("ParityControl", 1); + ei->members << PICodeInfo::EnumeratorInfo("ParityOdd", 2); + ei->members << PICodeInfo::EnumeratorInfo("TwoStopBits", 4); + + ei = new EnumInfo(); + (*enumsInfo)["PISerial::Speed"] = ei; + ei->name = "PISerial::Speed"; + ei->members << PICodeInfo::EnumeratorInfo("S50", 50); + ei->members << PICodeInfo::EnumeratorInfo("S75", 75); + ei->members << PICodeInfo::EnumeratorInfo("S110", 110); + ei->members << PICodeInfo::EnumeratorInfo("S300", 300); + ei->members << PICodeInfo::EnumeratorInfo("S600", 600); + ei->members << PICodeInfo::EnumeratorInfo("S1200", 1200); + ei->members << PICodeInfo::EnumeratorInfo("S2400", 2400); + ei->members << PICodeInfo::EnumeratorInfo("S4800", 4800); + ei->members << PICodeInfo::EnumeratorInfo("S9600", 9600); + ei->members << PICodeInfo::EnumeratorInfo("S19200", 19200); + ei->members << PICodeInfo::EnumeratorInfo("S38400", 38400); + ei->members << PICodeInfo::EnumeratorInfo("S57600", 57600); + ei->members << PICodeInfo::EnumeratorInfo("S115200", 115200); + ei->members << PICodeInfo::EnumeratorInfo("S1500000", 1500000); + ei->members << PICodeInfo::EnumeratorInfo("S2000000", 2000000); + ei->members << PICodeInfo::EnumeratorInfo("S2500000", 2500000); + ei->members << PICodeInfo::EnumeratorInfo("S3000000", 3000000); + ei->members << PICodeInfo::EnumeratorInfo("S3500000", 3500000); + ei->members << PICodeInfo::EnumeratorInfo("S4000000", 4000000); + + ei = new EnumInfo(); + (*enumsInfo)["PIEthernet::Type"] = ei; + ei->name = "PIEthernet::Type"; + ei->members << PICodeInfo::EnumeratorInfo("UDP", 0); + ei->members << PICodeInfo::EnumeratorInfo("TCP_Client", 1); + ei->members << PICodeInfo::EnumeratorInfo("TCP_Server", 2); + ei->members << PICodeInfo::EnumeratorInfo("TCP_SingleTCP", 3); + + ei = new EnumInfo(); + (*enumsInfo)["PIEthernet::Parameters"] = ei; + ei->name = "PIEthernet::Parameters"; + ei->members << PICodeInfo::EnumeratorInfo("ReuseAddress", 1); + ei->members << PICodeInfo::EnumeratorInfo("Broadcast", 2); + + ei = new EnumInfo(); + (*enumsInfo)["PIEthernet::InterfaceFlag"] = ei; + ei->name = "PIEthernet::InterfaceFlag"; + ei->members << PICodeInfo::EnumeratorInfo("ifActive", 1); + ei->members << PICodeInfo::EnumeratorInfo("ifRunning", 2); + ei->members << PICodeInfo::EnumeratorInfo("ifBroadcast", 4); + ei->members << PICodeInfo::EnumeratorInfo("ifMulticast", 8); + ei->members << PICodeInfo::EnumeratorInfo("ifLoopback", 16); + ei->members << PICodeInfo::EnumeratorInfo("ifPTP", 32); + + ei = new EnumInfo(); + (*enumsInfo)["PIProtocol::Type"] = ei; + ei->name = "PIProtocol::Type"; + ei->members << PICodeInfo::EnumeratorInfo("None", 0); + ei->members << PICodeInfo::EnumeratorInfo("Serial", 1); + ei->members << PICodeInfo::EnumeratorInfo("Ethernet", 2); + + ei = new EnumInfo(); + (*enumsInfo)["PIProtocol::Quality"] = ei; + ei->name = "PIProtocol::Quality"; + ei->members << PICodeInfo::EnumeratorInfo("Unknown", 1); + ei->members << PICodeInfo::EnumeratorInfo("Failure", 2); + ei->members << PICodeInfo::EnumeratorInfo("Bad", 3); + ei->members << PICodeInfo::EnumeratorInfo("Average", 4); + ei->members << PICodeInfo::EnumeratorInfo("Good", 5); + + ei = new EnumInfo(); + (*enumsInfo)["PIDiagnostics::Quality"] = ei; + ei->name = "PIDiagnostics::Quality"; + ei->members << PICodeInfo::EnumeratorInfo("Unknown", 1); + ei->members << PICodeInfo::EnumeratorInfo("Failure", 2); + ei->members << PICodeInfo::EnumeratorInfo("Bad", 3); + ei->members << PICodeInfo::EnumeratorInfo("Average", 4); + ei->members << PICodeInfo::EnumeratorInfo("Good", 5); + + ei = new EnumInfo(); + (*enumsInfo)["PIConsole::Format"] = ei; + ei->name = "PIConsole::Format"; + ei->members << PICodeInfo::EnumeratorInfo("Normal", 1); + ei->members << PICodeInfo::EnumeratorInfo("Bold", 2); + ei->members << PICodeInfo::EnumeratorInfo("Faint", 4); + ei->members << PICodeInfo::EnumeratorInfo("Italic", 8); + ei->members << PICodeInfo::EnumeratorInfo("Underline", 16); + ei->members << PICodeInfo::EnumeratorInfo("Blink", 32); + ei->members << PICodeInfo::EnumeratorInfo("Inverse", 64); + ei->members << PICodeInfo::EnumeratorInfo("Black", 256); + ei->members << PICodeInfo::EnumeratorInfo("Red", 512); + ei->members << PICodeInfo::EnumeratorInfo("Green", 1024); + ei->members << PICodeInfo::EnumeratorInfo("Yellow", 2048); + ei->members << PICodeInfo::EnumeratorInfo("Blue", 4096); + ei->members << PICodeInfo::EnumeratorInfo("Magenta", 8192); + ei->members << PICodeInfo::EnumeratorInfo("Cyan", 16384); + ei->members << PICodeInfo::EnumeratorInfo("White", 32768); + ei->members << PICodeInfo::EnumeratorInfo("BackBlack", 65536); + ei->members << PICodeInfo::EnumeratorInfo("BackRed", 131072); + ei->members << PICodeInfo::EnumeratorInfo("BackGreen", 262144); + ei->members << PICodeInfo::EnumeratorInfo("BackYellow", 524288); + ei->members << PICodeInfo::EnumeratorInfo("BackBlue", 1048576); + ei->members << PICodeInfo::EnumeratorInfo("BackMagenta", 2097152); + ei->members << PICodeInfo::EnumeratorInfo("BackCyan", 4194304); + ei->members << PICodeInfo::EnumeratorInfo("BackWhite", 8388608); + ei->members << PICodeInfo::EnumeratorInfo("Dec", 16777216); + ei->members << PICodeInfo::EnumeratorInfo("Hex", 33554432); + ei->members << PICodeInfo::EnumeratorInfo("Oct", 67108864); + ei->members << PICodeInfo::EnumeratorInfo("Bin", 134217728); + ei->members << PICodeInfo::EnumeratorInfo("Scientific", 268435456); + ei->members << PICodeInfo::EnumeratorInfo("SystemTimeSplit", 536870912); + ei->members << PICodeInfo::EnumeratorInfo("SystemTimeSeconds", 1073741824); + + ei = new EnumInfo(); + (*enumsInfo)["PIConsole::Alignment"] = ei; + ei->name = "PIConsole::Alignment"; + ei->members << PICodeInfo::EnumeratorInfo("Nothing", 0); + ei->members << PICodeInfo::EnumeratorInfo("Left", 1); + ei->members << PICodeInfo::EnumeratorInfo("Right", 2); + + ei = new EnumInfo(); + (*enumsInfo)["PIConsole::ConnectedState"] = ei; + ei->name = "PIConsole::ConnectedState"; + ei->members << PICodeInfo::EnumeratorInfo("Disconnected", 0); + ei->members << PICodeInfo::EnumeratorInfo("FetchingData", 1); + ei->members << PICodeInfo::EnumeratorInfo("Committing", 2); + ei->members << PICodeInfo::EnumeratorInfo("Connected", 3); + + ei = new EnumInfo(); + (*enumsInfo)["eType"] = ei; + ei->name = "eType"; + ei->members << PICodeInfo::EnumeratorInfo("etNumber", 0); + ei->members << PICodeInfo::EnumeratorInfo("etOperator", 1); + ei->members << PICodeInfo::EnumeratorInfo("etVariable", 2); + ei->members << PICodeInfo::EnumeratorInfo("etFunction", 3); + + ei = new EnumInfo(); + (*enumsInfo)["Operation"] = ei; + ei->name = "Operation"; + ei->members << PICodeInfo::EnumeratorInfo("oNone", 0); + ei->members << PICodeInfo::EnumeratorInfo("oAdd", 1); + ei->members << PICodeInfo::EnumeratorInfo("oSubtract", 2); + ei->members << PICodeInfo::EnumeratorInfo("oMultiply", 3); + ei->members << PICodeInfo::EnumeratorInfo("oDivide", 4); + ei->members << PICodeInfo::EnumeratorInfo("oResidue", 5); + ei->members << PICodeInfo::EnumeratorInfo("oPower", 6); + ei->members << PICodeInfo::EnumeratorInfo("oEqual", 7); + ei->members << PICodeInfo::EnumeratorInfo("oNotEqual", 8); + ei->members << PICodeInfo::EnumeratorInfo("oGreater", 9); + ei->members << PICodeInfo::EnumeratorInfo("oSmaller", 10); + ei->members << PICodeInfo::EnumeratorInfo("oGreaterEqual", 11); + ei->members << PICodeInfo::EnumeratorInfo("oSmallerEqual", 12); + ei->members << PICodeInfo::EnumeratorInfo("oAnd", 13); + ei->members << PICodeInfo::EnumeratorInfo("oOr", 14); + ei->members << PICodeInfo::EnumeratorInfo("oFunction", 15); + + ei = new EnumInfo(); + (*enumsInfo)["BaseFunctions"] = ei; + ei->name = "BaseFunctions"; + ei->members << PICodeInfo::EnumeratorInfo("bfUnknown", 0); + ei->members << PICodeInfo::EnumeratorInfo("bfSin", 1); + ei->members << PICodeInfo::EnumeratorInfo("bfCos", 2); + ei->members << PICodeInfo::EnumeratorInfo("bfTg", 3); + ei->members << PICodeInfo::EnumeratorInfo("bfCtg", 4); + ei->members << PICodeInfo::EnumeratorInfo("bfArcsin", 5); + ei->members << PICodeInfo::EnumeratorInfo("bfArccos", 6); + ei->members << PICodeInfo::EnumeratorInfo("bfArctg", 7); + ei->members << PICodeInfo::EnumeratorInfo("bfArcctg", 8); + ei->members << PICodeInfo::EnumeratorInfo("bfExp", 9); + ei->members << PICodeInfo::EnumeratorInfo("bfRandom", 10); + ei->members << PICodeInfo::EnumeratorInfo("bfSh", 11); + ei->members << PICodeInfo::EnumeratorInfo("bfCh", 12); + ei->members << PICodeInfo::EnumeratorInfo("bfTh", 13); + ei->members << PICodeInfo::EnumeratorInfo("bfCth", 14); + ei->members << PICodeInfo::EnumeratorInfo("bfSqrt", 15); + ei->members << PICodeInfo::EnumeratorInfo("bfSqr", 16); + ei->members << PICodeInfo::EnumeratorInfo("bfPow", 17); + ei->members << PICodeInfo::EnumeratorInfo("bfAbs", 18); + ei->members << PICodeInfo::EnumeratorInfo("bfLn", 19); + ei->members << PICodeInfo::EnumeratorInfo("bfLg", 20); + ei->members << PICodeInfo::EnumeratorInfo("bfLog", 21); + ei->members << PICodeInfo::EnumeratorInfo("bfSign", 22); + ei->members << PICodeInfo::EnumeratorInfo("bfIm", 23); + ei->members << PICodeInfo::EnumeratorInfo("bfRe", 24); + ei->members << PICodeInfo::EnumeratorInfo("bfArg", 25); + ei->members << PICodeInfo::EnumeratorInfo("bfLen", 26); + ei->members << PICodeInfo::EnumeratorInfo("bfConj", 27); + ei->members << PICodeInfo::EnumeratorInfo("bfRad", 28); + ei->members << PICodeInfo::EnumeratorInfo("bfDeg", 29); + ei->members << PICodeInfo::EnumeratorInfo("bfJ0", 30); + ei->members << PICodeInfo::EnumeratorInfo("bfJ1", 31); + ei->members << PICodeInfo::EnumeratorInfo("bfJN", 32); + ei->members << PICodeInfo::EnumeratorInfo("bfY0", 33); + ei->members << PICodeInfo::EnumeratorInfo("bfY1", 34); + ei->members << PICodeInfo::EnumeratorInfo("bfYN", 35); + ei->members << PICodeInfo::EnumeratorInfo("bfMin", 36); + ei->members << PICodeInfo::EnumeratorInfo("bfMax", 37); + ei->members << PICodeInfo::EnumeratorInfo("bfClamp", 38); + ei->members << PICodeInfo::EnumeratorInfo("bfStep", 39); + ei->members << PICodeInfo::EnumeratorInfo("bfMix", 40); + ei->members << PICodeInfo::EnumeratorInfo("bfDefined", 41); + ei->members << PICodeInfo::EnumeratorInfo("bfCustom", 65535); + + ei = new EnumInfo(); + (*enumsInfo)["PISignals::Signal"] = ei; + ei->name = "PISignals::Signal"; + ei->members << PICodeInfo::EnumeratorInfo("Interrupt", 1); + ei->members << PICodeInfo::EnumeratorInfo("Illegal", 2); + ei->members << PICodeInfo::EnumeratorInfo("Abort", 4); + ei->members << PICodeInfo::EnumeratorInfo("FPE", 8); + ei->members << PICodeInfo::EnumeratorInfo("SegFault", 16); + ei->members << PICodeInfo::EnumeratorInfo("Termination", 32); + ei->members << PICodeInfo::EnumeratorInfo("Hangup", 64); + ei->members << PICodeInfo::EnumeratorInfo("Quit", 128); + ei->members << PICodeInfo::EnumeratorInfo("Kill", 256); + ei->members << PICodeInfo::EnumeratorInfo("BrokenPipe", 512); + ei->members << PICodeInfo::EnumeratorInfo("Timer", 1024); + ei->members << PICodeInfo::EnumeratorInfo("UserDefined1", 2048); + ei->members << PICodeInfo::EnumeratorInfo("UserDefined2", 4096); + ei->members << PICodeInfo::EnumeratorInfo("ChildStopped", 8192); + ei->members << PICodeInfo::EnumeratorInfo("Continue", 16384); + ei->members << PICodeInfo::EnumeratorInfo("StopProcess", 32768); + ei->members << PICodeInfo::EnumeratorInfo("StopTTY", 65536); + ei->members << PICodeInfo::EnumeratorInfo("StopTTYInput", 131072); + ei->members << PICodeInfo::EnumeratorInfo("StopTTYOutput", 262144); + ei->members << PICodeInfo::EnumeratorInfo("All", 1048575); + + ei = new EnumInfo(); + (*enumsInfo)["PIBinaryLog::PlayMode"] = ei; + ei->name = "PIBinaryLog::PlayMode"; + ei->members << PICodeInfo::EnumeratorInfo("PlayRealTime", 0); + ei->members << PICodeInfo::EnumeratorInfo("PlayVariableSpeed", 1); + + ei = new EnumInfo(); + (*enumsInfo)["PIUSB::Endpoint::Direction"] = ei; + ei->name = "PIUSB::Endpoint::Direction"; + ei->members << PICodeInfo::EnumeratorInfo("Write", 0); + ei->members << PICodeInfo::EnumeratorInfo("Read", 1); + + ei = new EnumInfo(); + (*enumsInfo)["PIUSB::Endpoint::TransferType"] = ei; + ei->name = "PIUSB::Endpoint::TransferType"; + ei->members << PICodeInfo::EnumeratorInfo("Control", 0); + ei->members << PICodeInfo::EnumeratorInfo("Isochronous", 1); + ei->members << PICodeInfo::EnumeratorInfo("Bulk", 2); + ei->members << PICodeInfo::EnumeratorInfo("Interrupt", 3); + + ei = new EnumInfo(); + (*enumsInfo)["PIUSB::Endpoint::SynchronisationType"] = ei; + ei->name = "PIUSB::Endpoint::SynchronisationType"; + ei->members << PICodeInfo::EnumeratorInfo("NoSynchonisation", 0); + ei->members << PICodeInfo::EnumeratorInfo("Asynchronous", 2); + ei->members << PICodeInfo::EnumeratorInfo("Adaptive", 1); + ei->members << PICodeInfo::EnumeratorInfo("Synchronous", 3); + + ei = new EnumInfo(); + (*enumsInfo)["PIUSB::Endpoint::UsageType"] = ei; + ei->name = "PIUSB::Endpoint::UsageType"; + ei->members << PICodeInfo::EnumeratorInfo("DataEndpoint", 0); + ei->members << PICodeInfo::EnumeratorInfo("FeedbackEndpoint", 2); + ei->members << PICodeInfo::EnumeratorInfo("ExplicitFeedbackDataEndpoint", 1); +} + + +bool __ClassInfo_TEST_H_Initializer__::_inited_ = false; diff --git a/utils/code_model_generator/test.h b/utils/code_model_generator/test.h new file mode 100755 index 00000000..6f7e77a3 --- /dev/null +++ b/utils/code_model_generator/test.h @@ -0,0 +1,100 @@ +// Generated by "PIP Code model generator" 29.04.2014 18:03:05 + +#ifndef TEST_H +#define TEST_H + +#include "pivariant.h" +#include "picodeinfo.h" + +class PIMutex; +class PIBitArray; +class PIHuffman; +class PIByteArray; +class PIChar; +class PIString; +class PIStringList; +class PISystemTime; +struct PITime; +struct PIDate; +struct PIDateTime; +class Solver; +class PIFFT; +class PIVariant; +class PIObject; +class PIThread; +class PITimer; +class PIKbdListener; +class PIIODevice; +class PISerial; +class PIFile; +class PIProcess; +class PIEthernet; +class PIPacketExtractor; +class PIConfig; +class PIMultiProtocolBase; +class PIProtocol; +class PIDiagnostics; +class PISystemMonitor; +class PIConsole; +class PICLI; +class PIEvaluatorContent; +class PIEvaluator; +class PIMultiProtocol; +class PIRepeater; +class PICodec; +class PIPeer; +class PIBinaryLog; +class PIUSB; + + +PIVariant execFunction(PIMutex * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIBitArray * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIHuffman * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIByteArray * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIChar * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIString * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIStringList * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PISystemTime * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PITime * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIDate * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIDateTime * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(Solver * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIFFT * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIVariant * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIObject * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIThread * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PITimer * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIKbdListener * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIIODevice * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PISerial * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIFile * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIProcess * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIEthernet * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIPacketExtractor * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIConfig * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIMultiProtocolBase * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIProtocol * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIDiagnostics * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PISystemMonitor * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIConsole * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PICLI * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIEvaluatorContent * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIEvaluator * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIMultiProtocol * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIRepeater * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PICodec * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIPeer * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIBinaryLog * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); +PIVariant execFunction(PIUSB * object, const char * function, const PIVariant & arg0 = PIVariant(), const PIVariant & arg1 = PIVariant(), const PIVariant & arg2 = PIVariant(), const PIVariant & arg3 = PIVariant()); + + +class __ClassInfo_TEST_H_Initializer__ { +public: + __ClassInfo_TEST_H_Initializer__(); + static bool _inited_; +}; + +static __ClassInfo_TEST_H_Initializer__ __classinfo_test_h_initializer__; + + +#endif // TEST_H diff --git a/utils/remote_console/CMakeLists.txt b/utils/remote_console/CMakeLists.txt new file mode 100755 index 00000000..39955038 --- /dev/null +++ b/utils/remote_console/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(pip_remote_console "main.cpp") +target_link_libraries(pip_remote_console pip) +if (DEFINED LIB) + install(TARGETS pip_remote_console DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) +endif () diff --git a/utils/remote_console/Makefile b/utils/remote_console/Makefile new file mode 100644 index 00000000..4b9c885f --- /dev/null +++ b/utils/remote_console/Makefile @@ -0,0 +1,209 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/andrey/linux_build/libs + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/andrey/linux_build/libs + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -E cmake_progress_start /home/andrey/linux_build/libs/CMakeFiles /home/andrey/linux_build/libs/pip/utils/remote_console/CMakeFiles/progress.marks + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/remote_console/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/andrey/linux_build/libs/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/remote_console/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/remote_console/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/remote_console/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/rule: + cd /home/andrey/linux_build/libs && $(MAKE) -f CMakeFiles/Makefile2 pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/rule +.PHONY : pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/rule + +# Convenience name for target. +pip_remote_console: pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/rule +.PHONY : pip_remote_console + +# fast build rule for target. +pip_remote_console/fast: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/build.make pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/build +.PHONY : pip_remote_console/fast + +main.o: main.cpp.o +.PHONY : main.o + +# target to build an object file +main.cpp.o: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/build.make pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/build.make pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + cd /home/andrey/linux_build/libs && $(MAKE) -f pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/build.make pip/utils/remote_console/CMakeFiles/pip_remote_console.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... pip_remote_console" + @echo "... rebuild_cache" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/andrey/linux_build/libs && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/utils/remote_console/cmake_install.cmake b/utils/remote_console/cmake_install.cmake new file mode 100644 index 00000000..f5bff204 --- /dev/null +++ b/utils/remote_console/cmake_install.cmake @@ -0,0 +1,60 @@ +# Install script for directory: /home/andrey/linux_build/libs/pip/utils/remote_console + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}/usr/bin/pip_remote_console" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/usr/bin/pip_remote_console") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}/usr/bin/pip_remote_console" + RPATH "") + ENDIF() + list(APPEND CMAKE_ABSOLUTE_DESTINATION_FILES + "/usr/bin/pip_remote_console") + IF (CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + message(WARNING "ABSOLUTE path INSTALL DESTINATION : ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + ENDIF (CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION) + IF (CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) + message(FATAL_ERROR "ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ${CMAKE_ABSOLUTE_DESTINATION_FILES}") + ENDIF (CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION) +FILE(INSTALL DESTINATION "/usr/bin" TYPE EXECUTABLE FILES "/home/andrey/linux_build/libs/pip/utils/remote_console/pip_remote_console") + IF(EXISTS "$ENV{DESTDIR}/usr/bin/pip_remote_console" AND + NOT IS_SYMLINK "$ENV{DESTDIR}/usr/bin/pip_remote_console") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}/usr/bin/pip_remote_console") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}/usr/bin/pip_remote_console") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + diff --git a/utils/remote_console/main.cpp b/utils/remote_console/main.cpp new file mode 100755 index 00000000..db43c449 --- /dev/null +++ b/utils/remote_console/main.cpp @@ -0,0 +1,64 @@ +/* + PIP - Platform Independent Primitives + Remote console viewer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "pip.h" + +void key_event(char key, void * ); + +PIConsole console(false, key_event); +PIStringList as; +bool selected = false; + +void key_event(char key, void * ) { + if (key < '1' || key > '9') return; + int ind = key - '1'; + if (ind < 0 || ind >= as.size_s()) return; + selected = true; + console.connectToServer(as[ind]); +} + +int main(int argc, char * argv[]) { + console.enableExitCapture(); + console.listenServers(); + while (!PIKbdListener::exiting) { + msleep(200); + if (selected) break; + console.clearScreen(); + as = console.availableServers(); + if (as.isEmpty()) { + piCout << "No servers are available!"; + } else { + piCout << "Select one with numeric key:"; + for (int i = 0; i < as.size_s(); ++i) + piCout << (i + 1) << as[i]; + } + } + if (!selected) return 0; + //console.clearScreen(); + piCout << "Connecting to" << console.selectedServer() << "..."; + while (!PIKbdListener::exiting) { + msleep(20); + if (console.isConnected()) + break; + } + if (PIKbdListener::exiting) + return 0; + console.start(); + console.waitForFinish(); +}; diff --git a/utils/remote_console/pip_remote_console b/utils/remote_console/pip_remote_console new file mode 100755 index 0000000000000000000000000000000000000000..ec478061be9a4acea6750c65c856fbc1927c792f GIT binary patch literal 26824 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 TBj(&lrdPEHI+=9WwCMd8jcp`Z literal 0 HcmV?d00001 diff --git a/utils/remote_console/pip_remote_console.exe b/utils/remote_console/pip_remote_console.exe new file mode 100644 index 0000000000000000000000000000000000000000..3a9eb63efe8448918c9bfdcfb617e403471d45aa GIT binary patch literal 1363466 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

Vsvn_{~#P~MH5JnMWd4q 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 IpPH1mgs8v4HO7hrJ&lVfL|jI0{6J8H>yYm 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�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 HW1S1wdWF>#Q6z_=+=qB$85JQIt15TaIHQ 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

jjS?S#K{nk>)PNBYBV%%jf_f~K|=O| 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

YK}bWvSHQUyh~DPpGwvd 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%0D@i0l)cg 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

A`JLnoh@VkI_6oZS{gfRef&;peTZNe#cBW=!9l} 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 Q>|MUID@OxXp1xD~ehostname + "_" + PIString(rand() % 100)) { + setName("Daemon"); + timer.setName("__S__Daemon_timer"); + enabled = false; + mode = offset = cur = height = 0; + CONNECTU(&console, keyPressed, this, keyEvent) + CONNECTU(&timer, tickEvent, this, timerEvent) + timer.addDelimiter(5); + timer.start(200); +} + + +void Daemon::keyEvent(char key) { + if (!enabled) return; + int num = key - '0'; + switch (mode) { + case 0: + if (num >= 0 && num <= 9) { + connectToDaemon(dnames.value(key - '0')); + return; + } + break; + case 1: + if (num >= 0 && num <= 9) { + mode = num + 10; + updateConsole(); + return; + } + break; + } + switch (key) { + case PIKbdListener::UpArrow: + /*cur--; + if (cur < 0) cur = 0; + if (cur - offset < 2) offset--; + if (offset < 0) offset = 0;*/ + updateConsole(); + break; + case PIKbdListener::Space: + /*if (cur < 0 || cur >= files.size_s()) return; + if (selected.contains(files[cur].name)) selected.removeOne(files[cur].name); + else selected << files[cur].name;*/ + case PIKbdListener::DownArrow: + /*cur++; + if (cur >= files.size_s()) cur = files.size_s() - 1; + if (cur - offset >= height - 2) offset++; + if (offset >= files.size_s() - height) offset = files.size_s() - height;*/ + updateConsole(); + break; + case PIKbdListener::Home: + //cur = offset = 0; + updateConsole(); + break; + case PIKbdListener::End: + //cur = files.size_s() - 1; + //offset = files.size_s() - height; + updateConsole(); + break; + case PIKbdListener::Return: + //if (cur < files.size_s() && cur >= 0) { + //} + break; + case 'A': + updateConsole(); + break; + case 'R': + updateConsole(); + break; + case PIKbdListener::Esc: + //selected.clear(); + //updateConsole(); + if (mode == 0) + menuRequest(); + else { + if (mode > 1) { + mode = 1; + updateConsole(); + } else + disconnect(); + } + break; + default: break; + } +} + + +void Daemon::timerEvent(void * _d, int delim) { + if (!enabled) return; + if (delim == 1) { + if (mode == 0) + updateConsole(); + + } + if (delim == 5) { + if (conn_name.isEmpty()) return; + PIByteArray ba; ba << int(RequestHostInfo); + send(conn_name, ba); + } +} + + +PIStringList Daemon::availableDaemons() const { + available_daemons.clear(); + piForeachC (PIPeer::PeerInfo & p, allPeers()) { + if (!p.name.startsWith("_pisd_")) continue; + available_daemons << p.name.mid(6); + } + return available_daemons; +} + + +void Daemon::connectToDaemon(const PIString & dn) { + if (dn.isEmpty()) return; + conn_name = "_pisd_" + dn; + mode = 1; + updateConsole(); +} + + +void Daemon::disconnect() { + conn_name.clear(); + mode = 0; + updateConsole(); +} + + +PIString Daemon::connectedDaemon() const { + return conn_name.mid(6); +} + + +void Daemon::peerDisconnected(const PIString & name) { + if (name == conn_name) { + conn_name.clear(); + mode = 0; + } +} + + +void Daemon::dataReceived(const PIString & from, const PIByteArray & data) { + //if (conn_name != from) return; + if (data.size() < 4) return; + PIByteArray ba(data), rba; + int type; ba >> type; + //piCout << "rec from" << from << type; + switch (type) { + case RequestHostInfo: + makeMyHostInfo(); + rba << int(ReplyHostInfo) << info_my; + break; + case ReplyHostInfo: + ba >> info_other; + makeOtherHostInfo(); + break; + }; + if (!rba.isEmpty()) send(from, rba); +} + + +void Daemon::makeMyHostInfo() { + info_my.execCommand = PISystemInfo::instance()->execCommand; + info_my.hostname = PISystemInfo::instance()->hostname; + info_my.user = PISystemInfo::instance()->user; + info_my.OS_name = PISystemInfo::instance()->OS_name; + info_my.OS_version = PISystemInfo::instance()->OS_version; + info_my.architecture = PISystemInfo::instance()->architecture; + info_my.execDateTime = PISystemInfo::instance()->execDateTime; + info_my.processorsCount = PISystemInfo::instance()->processorsCount; + info_my.ID = sys_mon.statistic().ID; + info_my.threads = sys_mon.statistic().threads; + info_my.priority = sys_mon.statistic().priority; + info_my.physical_memsize = sys_mon.statistic().physical_memsize; + info_my.share_memsize = sys_mon.statistic().share_memsize; + info_my.cpu_load_system = sys_mon.statistic().cpu_load_system; + info_my.cpu_load_user = sys_mon.statistic().cpu_load_user; +} + + +void Daemon::makeOtherHostInfo() { + PISystemMonitor::ProcessStats & ps(const_cast(sys_mon_other.statistic())); + ps.ID = info_other.ID; + ps.threads = info_other.threads; + ps.priority = info_other.priority; + ps.physical_memsize = info_other.physical_memsize; + ps.share_memsize = info_other.share_memsize; + ps.cpu_load_system = info_other.cpu_load_system; + ps.cpu_load_user = info_other.cpu_load_user; + sys_mon_other.setStatistic(ps); +} + + +void Daemon::updateConsole() { + if (!enabled) return; + switch (mode) { + case 0: tabConnect(); break; + case 1: tabFeature(); break; + case RequestHostInfo: tabInfo(); break; + } +} + + +void Daemon::tabConnectedHeader(int cols) { + console.addString("Connected to: " + connectedDaemon(), 1, PIConsole::BackGreen | PIConsole::Bold); + for (int i = 2; i <= cols; ++i) + console.addString(" ", i, PIConsole::Green | PIConsole::Inverse); +} + + +void Daemon::tabConnect() { + startTab(); + console.addString("Available daemons:"); + int num = 0; + dnames.clear(); + PIStringList adl = availableDaemons(); + piForeachC (PIString & p, adl) { + dnames[num] = p; + console.addString(" " + PIString(num++) + " - " + p); + } + finishTab(); +} + + +void Daemon::tabFeature() { + startTab(); + tabConnectedHeader(); + console.addString("What do you wish to do with this daemon?"); + console.addString(" 0 - show host info"); + console.addString(" 1 - file manager"); + console.addString(" 2 - execute command"); + finishTab(); +} + + +void Daemon::tabInfo() { + startTab(2); + tabConnectedHeader(2); + console.addString("Exec command: " + info_other.execCommand); + console.addString(" Executed on " + info_other.execDateTime.toString()); + console.addString(" Hostname: " + info_other.hostname); + console.addString(" Username: " + info_other.user); + console.addString(" OS name: " + info_other.OS_name); + console.addString(" OS version: " + info_other.OS_version); + console.addString("Architecture: " + info_other.architecture); + console.addString(" CPU count: " + PIString::fromNumber(info_other.processorsCount)); + console.addVariable("of this process", &sys_mon_other, 2); + finishTab(); +} diff --git a/utils/system_daemon/daemon.h b/utils/system_daemon/daemon.h new file mode 100644 index 00000000..dd0f5745 --- /dev/null +++ b/utils/system_daemon/daemon.h @@ -0,0 +1,93 @@ +#ifndef DAEMON_H +#define DAEMON_H + +#include "piconsole.h" +#include "pipeer.h" + +extern PIConsole console; +extern PISystemMonitor sys_mon; + +class Daemon: public PIPeer { + PIOBJECT(Daemon) +public: + Daemon(); + + struct HostInfo { + PIString execCommand; + PIString hostname; + PIString user; + PIString OS_name; + PIString OS_version; + PIString architecture; + PIDateTime execDateTime; + int processorsCount; + + int ID; + int threads; + int priority; + ulong physical_memsize; + ulong share_memsize; + float cpu_load_system; + float cpu_load_user; + }; + + void enable() {enabled = true;} + void disable() {enabled = false;} + + PIStringList availableDaemons() const; + void connectToDaemon(const PIString & dn); + void disconnect(); + + PIString connectedDaemon() const; + +private: + enum PacketType { + RequestHostInfo = 10, + + ReplyHostInfo = 20 + + }; + + EVENT_HANDLER1(void, keyEvent, char, key); + EVENT_HANDLER2(void, timerEvent, void * , _d, int, delim); + EVENT(menuRequest); + void peerDisconnected(const PIString & name); + void dataReceived(const PIString & from, const PIByteArray & data); + void makeMyHostInfo(); + void makeOtherHostInfo(); + void updateConsole(); + void tabConnectedHeader(int cols = 1); + void tabConnect(); + void tabFeature(); + void tabInfo(); + + mutable PIStringList available_daemons; + PITimer timer; + PIString conn_name; + PIMap dnames; + PISystemMonitor sys_mon_other; + HostInfo info_my, info_other; + bool enabled; + int mode, offset, cur, height; + + +}; + +inline PIByteArray & operator <<(PIByteArray & b, const Daemon::HostInfo & v) { + b << v.execCommand << v.hostname << v.user << v.OS_name + << v.OS_version << v.architecture << v.execDateTime + << v.processorsCount << v.ID << v.threads << v.priority + << v.physical_memsize << v.share_memsize + << v.cpu_load_system << v.cpu_load_user; + return b; +} +inline PIByteArray & operator >>(PIByteArray & b, Daemon::HostInfo & v) { + b >> v.execCommand >> v.hostname >> v.user >> v.OS_name + >> v.OS_version >> v.architecture >> v.execDateTime + >> v.processorsCount >> v.ID >> v.threads >> v.priority + >> v.physical_memsize >> v.share_memsize + >> v.cpu_load_system >> v.cpu_load_user; + return b; +} + +#endif // DAEMON_H diff --git a/utils/system_daemon/file_manager.cpp b/utils/system_daemon/file_manager.cpp new file mode 100644 index 00000000..0ca140d5 --- /dev/null +++ b/utils/system_daemon/file_manager.cpp @@ -0,0 +1,182 @@ +#include "file_manager.h" +#include "shared.h" + + +FileManager::FileManager() { + setName("FileManager"); + offset = cur = height = 0; + enabled = del_commit = false; + CONNECTU(&console, keyPressed, this, keyEvent) + dir = PIDir::current(); + //dir.setDir("/home/peri4/Documents"); + dir.setDir("/home/peri4"); + updateDir(); +} + + +void FileManager::keyEvent(char key) { + if (!enabled) return; + if (key == 'D') { + if (cur >= files.size_s() || cur < 0) return; + if (del_commit) { + piForeachC (PIString & f, selected) { + PIFile::remove(dir.absolutePath() + PIDir::separator + f); + //piCout << "remove" << (dir.absolutePath() + PIDir::separator + f); + } + selected.clear(); + updateDir(); + console.clearCustomStatus(); + del_commit = false; + } else { + if (selected.isEmpty()) selected << files[cur].path; + console.addCustomStatus("Delete " + PIString(selected.size_s()) + " file, are you sure? D as yes"); + del_commit = true; + } + updateConsole(); + return; + } + console.clearCustomStatus(); + del_commit = false; + PIStringList nsel; + switch (key) { + case PIKbdListener::UpArrow: + cur--; + if (cur < 0) cur = 0; + if (cur - offset < 3) offset--; + if (offset < 0) offset = 0; + updateConsole(); + break; + case PIKbdListener::Space: + if (cur < 0 || cur >= files.size_s()) return; + if (selected.contains(files[cur].path)) selected.removeOne(files[cur].path); + else selected << files[cur].path; + case PIKbdListener::DownArrow: + cur++; + if (cur >= files.size_s()) cur = files.size_s() - 1; + if (cur - offset >= height - 3) offset++; + if (offset >= files.size_s() - height) offset = files.size_s() - height; + updateConsole(); + //piCout << offset << files.size_s() << height; + break; + case PIKbdListener::Home: + cur = offset = 0; + updateConsole(); + break; + case PIKbdListener::End: + cur = files.size_s() - 1; + offset = files.size_s() - height; + updateConsole(); + //piCout << offset << files.size_s() << height; + break; + case PIKbdListener::Return: + if (cur < files.size_s() && cur >= 0) { + piCout << files[cur]; + if (files[cur].isDir()) { + prev_pos[dir.path()] = cur; + prev_off[dir.path()] = offset; + dir.cd(files[cur].name()); + cur = prev_pos.value(dir.path(), 0); + offset = prev_off.value(dir.path(), 0); + selected.clear(); + updateDir(); + updateConsole(); + } + } + break; + case 'A': + selected.clear(); + piForeach (PIFile::FileInfo & e, files) + selected << e.path; + updateConsole(); + break; + case 'R': + updateDir(); + piForeach (PIFile::FileInfo & e, files) + if (selected.contains(e.path)) + nsel << e.path; + selected = nsel; + updateConsole(); + break; + case PIKbdListener::Esc: + //selected.clear(); + //updateConsole(); + menuRequest(); + break; + default: break; + } +} + + +void FileManager::updateConsole() { + if (!enabled) return; + startTab(2); + console.addString("File manager", 1, PIConsole::Yellow | PIConsole::Inverse); + console.addString("Path: " + dir.absolutePath(), 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); + console.addString("Name", 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); + console.addString(" ", 2, PIConsole::Yellow | PIConsole::Inverse); + console.addString(" ", 2, PIConsole::Green | PIConsole::Inverse); + console.addString(" ", 2, PIConsole::Green | PIConsole::Inverse); + buildNames(); + console.addString("A - select all, D - remove, R - refresh, Esc - exit", 1, PIConsole::Green | PIConsole::Inverse | PIConsole::Bold); + finishTab(); +} + + +void FileManager::buildNames() { + if (!enabled) return; + height = console.windowHeight() - 10; + int is = piClampi(offset, 0, piMaxi(0, files.size_s() - 1)), ie = piClampi(offset + height, 0, files.size_s()); + console.addString((is > 0) ? (PIString(" /\\ ").repeat(console.windowWidth() / 8)) : " ", 1, PIConsole::Green | PIConsole::Bold); + console.addString(" ", 2); + PIChar t; + PIConsole::FormatFlags f = 0; + PIString scol; + piCout << cur; + for (int i = is; i < ie; ++i) { + if (files[i].isDir()) { + t = '/'; + f = PIConsole::Bold; + scol = " dir"; + } else { + if (files[i].perm_user.exec || files[i].perm_group.exec || files[i].perm_other.exec) { + f = PIConsole::Green | PIConsole::Bold; + t = '*'; + } else { + t = ' '; + f = 0; + } + scol = PIString::readableSize(files[i].size); + } + if (files[i].isSymbolicLink() && (t != '*')) t = '~'; + scol = scol.expandRightTo(9, ' ') + "| " + files[i].time_modification.toString("dd.MM hh:mm:ss") + " | " + + files[i].perm_user.toString() + " " + files[i].perm_group.toString() + " " + files[i].perm_other.toString(); + if (i == cur) f |= PIConsole::BackBlue; + if (selected.contains(files[i].path)) f |= PIConsole::Yellow | PIConsole::Bold; + console.addString(t + files[i].name(), 1, f); + console.addString(scol, 2, f); + } + console.addString((ie < files.size_s()) ? (PIString(" \\/ ").repeat(console.windowWidth() / 8)) : " ", 1, PIConsole::Green | PIConsole::Bold); + console.addString(" ", 2); +} + + +void FileManager::updateDir() { + if (!enabled) return; + files.clear(); + PIVector el = dir.entries(), fl, dl; + for (int i = 0; i < el.size_s(); ++i) { + if (el[i].path == ".") continue; + if (el[i].path == "..") { + dl.push_front(el[i]); + continue; + } + if (el[i].isDir()) dl << el[i]; + else fl << el[i]; + } + files << dl << fl; + if (cur >= files.size_s()) cur = files.size_s() - 1; + if (offset >= files.size_s() - height) offset = files.size_s() - height; + if (cur < 0) cur = 0; + if (offset < 0) offset = 0; +} + diff --git a/utils/system_daemon/file_manager.h b/utils/system_daemon/file_manager.h new file mode 100644 index 00000000..63894d06 --- /dev/null +++ b/utils/system_daemon/file_manager.h @@ -0,0 +1,33 @@ +#ifndef FILE_MANAGER_H +#define FILE_MANAGER_H + +#include "piconsole.h" +#include "pidir.h" + +extern PIConsole console; + +class FileManager: public PIObject { + PIOBJECT(FileManager) +public: + FileManager(); + + void enable() {enabled = true; updateDir(); updateConsole();} + void disable() {enabled = false;} + +private: + EVENT_HANDLER1(void, keyEvent, char, key); + EVENT(menuRequest); + void updateConsole(); + void updateDir(); + void buildNames(); + + int offset, cur, height; + bool enabled, del_commit; + PIDir dir; + PIVector files; + PIMap prev_pos, prev_off; + PIStringList selected; +}; + + +#endif // FILE_MANAGER_H diff --git a/utils/system_daemon/main.cpp b/utils/system_daemon/main.cpp new file mode 100755 index 00000000..f7af30c4 --- /dev/null +++ b/utils/system_daemon/main.cpp @@ -0,0 +1,244 @@ +/* + PIP - Platform Independent Primitives + Remote console viewer + Copyright (C) 2014 Ivan Pelipenko peri4ko@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picli.h" +#include "pisystemmonitor.h" +#include "pisysteminfo.h" +#include "file_manager.h" +#include "daemon.h" +#include "shared.h" + +void key_event(char key, void * ); + +class _Init { +public: + _Init() {srand(PISystemTime::current().toMicroseconds());} +}; +_Init _pisd_init; + +PIConsole console(false, key_event); +PISystemMonitor sys_mon; +FileManager file_manager; +Daemon daemon_; +int mode = 0, oldmode = -1; + +class MenuOperator: public PIObject { + PIOBJECT(MenuOperator) +public: + MenuOperator() { + CONNECTU(&file_manager, menuRequest, this, menuRequest) + CONNECTU(&daemon_, menuRequest, this, menuRequest) + } + EVENT_HANDLER(void, menuRequest) {mode = 0;} +}; + +MenuOperator menu_operator; + +void key_event(char key, void * ) { + if (key == PIKbdListener::Esc) { + ;//mode = 0; + } else { + if (mode != 3) { + if (key < '0' || key > '9') return; + mode = key - '0'; + } + } +} + + +void tabMenu() { + startTab(); + console.addString("Select with numeric key:"); + console.addString(" 0 - this screen"); + console.addString(" 1 - show host info"); + console.addString(" 2 - local file manager"); + console.addString(" 3 - connect to another daemon"); + finishTab(); +} + + +void tabInfo() { + startTab(); + console.addString("Exec command: " + PISystemInfo::instance()->execCommand); + console.addString(" Executed on " + PISystemInfo::instance()->execDateTime.toString()); + console.addString(" Hostname: " + PISystemInfo::instance()->hostname); + console.addString(" Username: " + PISystemInfo::instance()->user); + console.addString(" OS name: " + PISystemInfo::instance()->OS_name); + console.addString(" OS version: " + PISystemInfo::instance()->OS_version); + console.addString("Architecture: " + PISystemInfo::instance()->architecture); + console.addString(" CPU count: " + PIString::fromNumber(PISystemInfo::instance()->processorsCount)); + console.addString(" ", 2, PIConsole::Yellow | PIConsole::Inverse); + console.addVariable("of this process", &sys_mon, 2); + finishTab(); +} + + +void tabConnect() { +} + +#include +int main(int argc, char * argv[]) { + /*PICRC<16> crc(0xFF12FF34); + PIByteArray ba(4096); + for (int i = 0; i < ba.size_s(); ++i) ba[i] = i % 256; + PITimeMeasurer tm; + uint_cl<16> ret; + for (int i = 0; i < 1000; ++i) { + ret = crc.calculate(ba); + }*/ + + /*if (argc < 2) return 0; + PIFile af; + if (!af.open(argv[1], PIIODevice::ReadOnly)) + return 0; + piCout << "open" << af.path(); + PIByteArray sign, jfif, rsign, rdata; + int phase = 0, pos = 0, asize = af.size(); + ushort jct = 0, jcl = 0; + uint ct = 0, cl = 0, cc = 0, tend = 1229278788; + sign << uchar(0x89) << uchar(0x50) << uchar(0x4E) << uchar(0x47) << uchar(0x0D) << uchar(0x0A) << uchar(0x1A) << uchar(0x0A); + jfif << uchar(0x4A) << uchar(0x46) << uchar(0x49) << uchar(0x46); + rsign.resize(sign.size()); + PIByteArray nf; + PITimeMeasurer tm; + int cnt = 0, j = 0; + while (!af.isEnd()) { + if (tm.elapsed_m() >= 500) { + tm.reset(); + piCout << "readed" << PIString::readableSize(af.pos()); + } + if (pos >= asize) break; + switch (phase) { + case 0: + af.seek(pos); + af.read(rsign.data(), rsign.size_s()); + if (rsign == sign) { + phase = 1; + nf = rsign; + } else if (rsign.resized(4) == jfif) { + phase = 2; + af.seek(pos - 6); + nf.resize(2); + af.read(nf.data(), nf.size_s()); + } else + pos++; + break; + case 1: + af.read(&cl, 4); + af.read(&ct, 4); + rdata.resize(piLetobe(cl)); + af.read(rdata.data(), rdata.size_s()); + af.read(&cc, 4); + nf.append(&cl, 4); + nf.append(&ct, 4); + nf.append(rdata); + nf.append(&cc, 4); + if (piLetobe(ct) == tend) { + piCout << "found PNG size" << PIString::readableSize(nf.size_s()); + PIFile wf("./PNG/" + PIString(cnt++) + ".png"); + if (wf.open(PIIODevice::ReadWrite)) + wf.write(nf.data(), nf.size()); + nf.clear(); + phase = 0; + pos = af.pos(); + } + break; + case 2: + //jct = 0; + //while (jct != ushort(0xD9FF)) { + // af.read(&jct, 2); + // nf.append(&jct, 2); + //} + //if (++j >= 30) return 0; + af.read(&jct, 2); + nf.append(&jct, 2); + if (jct == ushort(0xD9FF)) { + piCout << "found JPG size" << PIString::readableSize(nf.size_s()); + PIFile wf("./PNG/" + PIString(cnt++) + ".jpg"); + if (wf.open(PIIODevice::ReadWrite)) + wf.write(nf.data(), nf.size()); + nf.clear(); + phase = 0; + pos = af.pos(); + break; + } + af.read(&jcl, 2); + nf.append(&jcl, 2); + if (jct == 0xDAFF) { + jct = 0; + int pp = af.pos(); + rdata.resize(1024*1024*3); + af.read(rdata.data(), rdata.size_s()); + nf.append(rdata); + //while (jct != ushort(0xFFD9)) { + // af.read(&jct, 2); + // nf.append(&jct, 2); + // //piCout << Hex << jct; + //} + piCout << "found JPG size" << PIString::readableSize(nf.size_s()); + PIFile wf("./PNG/" + PIString(cnt++) + ".jpg"); + if (wf.open(PIIODevice::ReadWrite)) + wf.write(nf.data(), nf.size()); + nf.clear(); + phase = 0; + pos = pp + 1; + break; + } + //piCout << "length" << piLetobe(jcl); + rdata.resize(piLetobe(jcl) - 2); + af.read(rdata.data(), rdata.size_s()); + nf.append(rdata); + break; + }; + }; + return 0;*/ + + //piCout << Hex << uint(ret) << tm.elapsed_m(); + PICLI cli(argc, argv); + //cli.addArgument(""); + sys_mon.startOnSelf(); + console.enableExitCapture(); + console.setDefaultAlignment(PIConsole::Right); + console.start(); + //WAIT_FOR_EXIT + //return 0; + while (!PIKbdListener::exiting) { + if (oldmode != mode) { + file_manager.disable(); + daemon_.disable(); + oldmode = mode; + switch (mode) { + case 0: /// menu + tabMenu(); + break; + case 1: /// host info + tabInfo(); + break; + case 2: /// file manager + file_manager.enable(); + break; + case 3: /// daemon + daemon_.enable(); + break; + } + } + piMSleep(100); + } + return 0; +}; diff --git a/utils/system_daemon/pisd.exe b/utils/system_daemon/pisd.exe new file mode 100644 index 0000000000000000000000000000000000000000..58f69d2baad0105aa0aaeab2a369000daffe5b39 GIT binary patch literal 4896546 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 z zbDTH$)CfMv2EC!kjol{$eT^|a-Cm6v8sUA=_ZVg8pghB@>3?WIo9v4K5jzF#OK@tx%qOGtoaJqrB1+zaNWZ#$$${`gv)gD_>MQz&3Hytvo z;o4|D_eGA_N3BhA|A6&0?kPz4 zCDgG6|rdfg!-y45GpU3W_%>yP|@kf^rWYCRuc~{x6B3BK`#(Ov|0bWFdR_hMdiCnntLv4j$8SdRx*l&w2{n01)Kw4L3F>m% z60353zCGm|4Zyk-#O1cu(I$}Lwl9-h5AihiAA(q?dgAKH-I_WwUCy@4jWBrg-wRR8 zV>qBKVF=~pz)KVZpWEAn@ctdBA!st5L332~V>%(AJvirg{Zt+_hwB_3=WN^TYeb$P zE)#Z`V5i2@C&rb=1qDuI_8{t{#+bH&t)X&YIR)AETECVD%|^VCU7UlX7t%7Oaswp+ zWn(y83O9A0XGk<|ckuk~zldV-{iNV!G?0E&!JGs;l~5?nsAB3v_lUxy58Xow6zx9+ z^KkW#25XARbS9w^*$_p?X-VE(NF7Y4Bkaf?Z#;WnMEYnv-_qniA`m*rX^LFcK|EFd zaP1@S{<{!EW2R*|b^rbO3u!B!^LTB6fSAV=hLe8V@BfNEPo0mua(<^CzKVMIKciZ3 zixvp~F0j!JUxW(5IRKKvPe*UX3lQigPjqk1uqXh|>B;Uq>p6nohx$+i}Qz8`+8wq z-d^ipc2<$z#n;}k zQzl|p(P4QVubII(n@%h8@a=^GK?jr$)ronr%_6LSF*RK54jVfFDOPm%F z73E?D{?CRL_*n~i9{4Kl90Ju2$=H>?U64dW820(@c(VUhnr^Z`l;VS< zGr>~yS!59Xj1~QikCO#e%KWz=EwLWG8{eU#o>x4OM%0s>1|!bn`@>&TUs2- z`2+l`iO46YA@N;*Q{vKbD$4d=%h>}%P$VwH=q{%8xKtS%yoJq0-V13q7e5j8M8Xb& zgo_Ojujc-%WfVVj?=jIPzd>Y$>WX(KfWh@BqR*CHC(2Lg`>(bLwoFlM?t3UQv`Fj) z!IeZCjb}u~m4FgtpQg5adYpoBU$K{N^3~-N z%C<$5Pkp1fy{FqL6j6?B63Ou}&n))ekaRk2n==`8t{W#xN!(imdpa=u1jsh?JaR_1 zboPJ^C?^h@XDb~o2+X(W6yHNamBt8Seho9Uv_(xGLp})#&6t#S2g!kwK;+wbB4vxK zBM*R+fBMwgPHG`utDjoNQ;WerV-QV5#T`2TsolyP(73jIT1O1H>qlM-u5DiH2~KcC zh$tw+6doZpd{tVWvCTR}?59i1P)`q;&iiAfd2^zAZZiZ2*vQ6JA6>#tYy~)FZ)r14 zvQ=EC>EHUsBXNKA|mPeT3XhkBb%NRuBTpJ8oLr zDC62!R21-HH8WAF%)Fc8hc~_|(+Q?4%pfVpU>(^1G(=9Yy<*4ACdeoKUC7Td^_lbP zqRG!|DO$+SlbkwSK5X$fL(~w3xLp^5FbRUN>j^)R9&)b_QsEruKM{nc;gdeqBF;zh z`)F$1H!+?rmO0x6#QEQF-^3Rw+PL>$yl>*NgRjm01_AFpN{uPFqlUCZs5@WCPUFom z$^ydNEiiWohvc)t-T|E={j?K&aHYZqEH6{Pu>W=g)i5(v<35W1>-g*@CVhwZw*XElf63oWoacUy4p zh+zlY&YQu}ypH%)KiGXNW+Kygrt8QCA6ROezF@_`t_}fvV4{R7E{fhyE1@7D)!Q}j z*6h{PxF3Wwc=N=|8T{YBALK-LjlKUv_k&!)Ul!r^a(Mz}}~Pd#zyi zuUiPR9qVIYca45aX*4W$#a+ohw>2)0gva|(g29VH3)-*kgT%xAAyW_uEdlVY3qa6n z{0^Se8N@^C;;Uf=s9uA!ttix$4bq5fL-_2Oer?Ez*)^{X3B{Cr@Y)diNX)b96t75J z4#DpX;l(cBGT2AC6|IUfD6f1A()ZInlhG9>BssRLg%L1j^|hz%MUK;^_R! zjy#~_`+bDnh^I-HuN%!KSDsM51)1F#DD35XL(o7wCRMf8=A4(E%>_ zoFtzD`0z?XAmlR8qSoae*lz$0)Hd6XK2luiK^OU{_5;<+J+@Q-X}sKn@~B_#L2p;Q z+#?FJ`edleiRK!OC!1yhCR`(El;0fFF?0(}Fn8Qk)k99CDJBRqfXS^+-3ru-UBsq0 zXBdU&BnG zlg_VEkJsc^vKbcSSNceNVm)y=zb4USu908gLc3J?^=Nxh7YCbiekG9zQdXnu)A_ZG zqjP>;4fM-w5-plbWLQPb7Iy~;14^1zrACx7jiq1HqU9`|z@z0XeIKF)OAkgSYBB_6 zLcLO1W7lIrcGYg6*;kuMDNUV8>8;epZ=lin`?6$k7tL1KR@+*U3^vWcGY}6qnzNyu z%7kmM4puW9=hqFrgZ%n84b=-&;@3rr8(t(39wDC%#I6q!(s|`U@>r>DRkTcQ7`SpyDuLBT5=hqz^o%5>%bmHeolCM0?pnPquh2hM&gookGxD$I# zz>J?EjF7LFNSe0!fM*o*+g98v36C)0;pGB1gnX*j=qTaj@iRO)!ys=#8Ati7#nQeY zOE=fXXR7?=r!b82m&%~CHoes=e;0#+>y*EhZ3GP!=#q8t^Xc1y{Ja&IT>h>Ds*u0$ zYF=-U7ni@w$m_ham^?K3n?qL{#>mr1D#+8;^52#C)w=rJ$H7!?@~1zadyN19aXErF z+5IyAUBQ2s;a3YA&%=^G{rTL>1ptUb(4Xv{&wrQj-+B1e!XEcfy5vuPKKCL40HP4| zC%b3x-#PrZ48K~~l{_r@)1S{hTL6G41pUblm+Y8=O<`J)sT72+=mNfDl5kw)$c|ju zQ7Ah`XqY)1vrwSq3ny1#4wM~3WkjuZcEE^el7{&W$Lu9gdI%?3V8)TDW`|wFe3N4)3Y2)^#0gAHn;0$8Oyiib0wqQ` z(E^jEI&{keLpWlDzz7kJl^oS}8_7svufgj{{u8xy+_&|GKM;tA4Ikwx3}(G^dq8Vd zW^u3ze5gbxLaCWa94^nSS@`(WcnD+ z(-m{WK-zu9n8K)0+NTj^gLWT02*mpBEZD_;P?R;z=1vL%c;{||4{W`t8H24C6;e8Y zwBETiE>v2E5tv9|?DZ5VmcZ}Pt716R3_dhWG=nl2rt*8DAtA_?Qi^vjQOEl+C9902 z0l<0XGty*vvdSkINvTP!3JoUl!F9nT9u-Nv1s@XXZ}l_|9e5X4fBk)pX$iIdd>pKz zObkR+_19mgng8+n+g0Ac`g;S2f2jT@Bfu5v?|yK!O5DLxMA=*s{ZkXi;8AwKQ487^LMiMcPsECgM`*9r1ao3ElsnoLDQE4IAGK4;*hXI(C*%0fu-%@l zm2%b&_g1TC>MD8aN>9mh&!Cl_!=7O)aEz$}MgpxV&Q-4Xl)bKWNExf#+JgywYszOO zKjPpPz9J+LaErW|v6B7RUO?gHVJqCu<+P__9{GC)t*ZEkYA+p!42G>hOr7MZN4*oR zDZdm)%N93Qj*!XQP+=*DC!WGd1bR)vtEy7KxEqb;*DJB0AT`A}ObSt*;)7PT+|}*h zOj{4a$C>Nf2j9ya zUW8vQ#63I&`O}|o<}&UQv_ysEnR5Wi{6aioNkR+T7Gb>u^6N50n8X*@QOjlsP}!SlSe<@u&*4U`AZ0P$+}K{AGD87`z~Gjb_gzKjvV8A^_v z(O=FOC}(79n7ujXK!K7ioc;n62Qt&;j2;?h3^2U|?7ob2ft4zpUgRi0gj3wnHScZu zsf=FE(nXEF}X7;B!GTkzx z&5b@49>~6Coslj)z$e98>YyCT~J6bQ}i}7I;!5CVMM|o-S75m=Y{G2tf43rptv>z&1@P)kK zd?(Z_D*TSApiWPJD9WzO1JoR<=Ntbkq*G#AOih*+bP!}1f>3%9xImdVBUdh2Tda|C*Yy>1#dop9Q-yUP0euN%t!pjK(D;I<3lC!^ zw&w8&pL)zhSWVVr(Dvi@s%fwk#TWgtx}K(y18y8;8!qpI;U>~M+CA1Z?xG#9z`&EJ zeKBD2koXpjC)QJiFG5o3Y49}Nn|pC3mh-DzV8xym$aYIB*C@#L;dN{fu6(3{BHahX z`ZoyMX@jtKcI!qoH=>f5zaf1o5oPS@46)53`?Qd!DbA3IP0>AjDk--cLsWYqIMbaG zVZlxuY^&b^6$^HOY%^cwLC721)#mmf38I~f;wE?aN$RFT8e-~pMq7ZQ{_9x3&A|Gt z3)}8+K#5ok=g7gh2OkD+J&Hq7NFAH#c@{jwj$+@hdkBi+`EJ9{63JK3@0ND1L9#PK zWe7~{sr#fMfKjgw(I<$bHa>@70_|R3UR_A7Ca);V+k&jP_1tH7JCD+B^i=$;qbVDT zp1hnslZjJ-aQ)N}6u@F~J&GaN!*sUxDBqt0OVK!5Ydl{YPUVY0`N)d&4qtDu^?^R>StNu00cRph5*qC9;V+a@u+8t+i>a3Vro@y6K~ zctlV~I)EF|g_wR6uQ=R>gZ);`2*XrDdo%=S5Yri|n9kQCi;&6UH_T9DZ;WdBg4ZML zP(wc0k!R1N5&jgQYx6~vz@xam$}hna@(LSYeuwZ7TU<^9@@)0?i&B2Y@C|cYCo#~X zv0$Svnv?+llKp1)@hGq_8Cr&z=o@FUIoc;Dss9bULf?laOfru$-$q$Zb<;Ou`7($;zRSl~!=gIJVIB|*6ij!={de?sRu-?Hi6IJvW zR-m zV8trJcSHb5Zcf|rkbp1{Z`!Gw1xq5#X=0T&8JrKobgmNh?8Gz)uV?hn+r@bq2+n)Z z#fxE1K7?j&*K@RAtJZwg53UAwh93g)N}XXfPRlrhgSj~rty7TEDah!oYrp^&g#4Ts z5^R5%3rJJj-6$$ZG-<@((|fF@eXvA+mwZnMUU7ykErQOlxo)73O>wDKU!2v}H@d?> z*mSPm(c#4D)FYfJ2C43gaBq(O>wQQ~-A@LHClDe(L}|dZK2n+ZOvOI6)%>5!-(CNY z=kJ}O|1|w_>Zsq|wd=Q&Uca>ImCpZYceC*Wifw9UtM2-IqvE>;)aQRBKk`F0$aJ;* z)UA&XKqNucO0=GO^>NW%$6_B~G6vj9Xz1}EnK%08l#OtU2P9O2!4s-*D*0ME`%nQ1 z3&E98g^`^bvx(^ZxHhV`2fBs3ilan8L~$9%QL*U5#~&$Mi$keK(jq))Ft`k3Yv~6x z@C0T~h=*T$fr0IQHHJ!3UnkU16I6Xz41l}PCv^Y}7vs9-7|az4!I&}ul%xS2j~v-C zoxz~l-3Q&LzJ4n=r)%yYYH5Ewz89VJcdF69j^T1RR4`5#(;h^#&2*YX1F2Al#^d_K z6TCBBg+*!7XGjjqprL3>Ma;Q)E!A`uHRK=To%jo5>zPDb=V%APS1e!82DD^{*Q z2lWGkcBPJw{qGXm3I7T>Vho4_w?QSKZhkvFuA%$}epXwOaM0guqh_2arzXmaPy@m6M229Ny14a2Zyw9cnu?FIXjk&KOO};U?=8`-Ed)WM;%jM zW@5)R22(f>c(!ysfd0%GEjw`_KT1omITghzbbhDM`JF=NcVaUf4#ow$DF0Y=Xt1YK zXD_wIp7INAgPv z1!kte>`~L0&W#*1RiN||P7i?@Pp7{7#A&1m;h2Kp!dz5+#&ixBQaGC{j~jOnZb zrW+Mgw>2Gn@Tul>Fi5wRr-AdR_Idq+A)@1yVnl#Rl2{s<@d3WCH%}L56=_Ho1IsMP zKi>eIX+RYBA{3W*MOIt@ zlm@%DO3|;#X}^KW;}~PgSx1!VC+Iy{d6>qW=apjq8m)}spN}e|@J_Km(w^>WsrW{% zF?GGLuM3O4N_#{pkIR?u!wmts4V=HXJV>HV@U%8BA>;wXG$g%6Yc1avpq%xZlNa{L zGjcWT6~IUV$iI~2Od~&d|Ak)1B12xR)9CHMH^JNI?XYlI49KW2AjVXK$a|p*2 z6_+7oK!%V38L-lrDrY2Xm|Zw#s)$o?O9tm1GWD8~BxeL=fR$r%4ht@R#Zx$1)5@@8 zoTSD1Z9bLAF5(pQ5{qjzr2xxA8CDH*CC7{sm=VI^thMB4GhdTzJ5<*sq@OW$KYV-d?uE9O~ZT$rXSL{R1p`v z`OALUhii54z8ft@pj+~xtx5wtLZ*f+??kt{{jH7-*WQeReai4 zPUpFWFKr7XNX|Y>60m%?`mSc)S5A{DgrLqwklN)dKN1XoRE3oIP^8`>mi5NYlMtC_ z3|dP$S9a4b;)JB<&Woh*?xVyU)Lfd7E{Mee(XpUXu?gN`RbC6BVoOFQQ%%xi|By;v`b9rkJxU)@ibY+@Su- zsmlizt1}F5@z259A9~$(Ac;wzM(e-mLRN=?Rt#XTqCI#_=C*sAnUbli+pmK?1 zoGS!625cfS5sxeQeYyBPCFt=o_i&a8XPIzj2xp0K776DI;cO!ZV%g{1EIif=XRUD7 z2xk>JTb=vx?8oyho&$Ie;yHxpFrM%59AU~T@HtkW!0M`<0-tl9h-1ERcweC&m!NU; zOYj!E(Gg5peTEp82p|ka3Oiz26MSMMF*wow%KK%NaXcETLRp-4=SOn2XfhFvkNfj1 z@k8(gVJVCsU?o^>%ldht_Q)PAaEN2RMdIKtBFyi4PMzPbJ^weNf&Bd;N93ZNPXmhH zPe?X*MOn|)=_p3Y^V)(K$zOD9V*mb3SSV5t_&@T4MjK@U*)7_y6u^hX!n79D-vsUb zG_ZYM+tB=97=DHJSy7f!qkV1%@*ilQH2$56!}ORJv3jzOz=$UZP?1wU_Ymg*APhO&flQPPNVzw&dFSMTQw1 zmBF_z-JJ-NE>H_SIRHpG#Et6EBynjwc8+*(^As$7V+&|Tss~pRW~6%@*in+{!Ci(K z{XN)3nvw0nrG^;;Jr3+i8REfhh#5mY*oK-h!s8eLE!>0ss~Pzom_f`a^f(G_?`KRH z?Qu-7y_Zom+fjtqV!RgPwPd!V1h1udEye4k*^Wujw!t{=lVv@p9<`PK3WmX@7kcN! z`4!Un8c-5@BCr6pbz*N|kZG8$r9CjFpbrnxeX_!{(v?N)NsUQWATK&kqWm%p(GEJ| zF?)(a{0}1y%%Ge!xvp2|yJ-HTQrPE05N&}9DO8rc3lDz=LU7-TXM~dW(Miso0&>L*|=(ZQE>aJdeyP(d^vpwH7kEK@bc)LW{xudC&bgQQker+9yCNAG(yffqS@el z;;)b%&Jl)}Q>lF3qLCwGm2=i>m_0dW zs))0faC(p<4~mxuCCNE3GArV2$}y7!N}_P$1ttus+vS{P8s^XUQa zF|!4xU;u|;0C6dxZd&ygj+rVj1q0M$S~ZGeCJ9Wz0QHzw{RujX&tVssf&uC=t-2PN znD>jSWm^?KJu%Z)lZdwRn^E=DaO56Xj^G1^DF{zKs@Za1ee-kjG}-{`wU%u-Vzo?* zrUsau1TJg>N6zlyOXbCqQfrd4&H|*x@q(lYW>1UrrHPWIaT-7g3X{o`W62Io z;Bmq1El%|bLIx+^(gi_yJp|{~gj5yP7_^t0D=_ngQz#rEM73icQ^-@slwFM*o_%80 z&*w-LVK@hrulG4di1!KHahJiter`r1$#mJ#-{;_YqZjN$;Wy{pdx4)g*ZWP6&)aW; z(p(_{HA1QQp4@E3f_KcUT-;BuNy=Foapl-S2Ca#IdpGd{ryT}i>Qtq293yT+_okk| z0JY^bmz)M0h7&Yx^%)AE!Ao27b~brju6$o1GzKwar(MpfuD8@4Z{_f87*in4`(BQFzWF62QvYG@;H9n#|yzg+Tl#+a-K6Ww5w^6z6|yl zea^Mw`+DJQCdZckS=l5L^JKjY<6gG(3uQgnnmLHsmcFqjr;`$P7&l0h*#hTs47lJy z#sa<&k!=&s4&m$*&TewF`56q~=uNu~{s_IPlYh!EL`+ehrb&rO;-!Wj9h};aqF|&| zNAU0s)1#};!FmBVuqmb${)807WF!(b*j0Eg2i(=5`A8SX z@yzWUlhZnQ?1IU{;h8>GUfige7^gy77`Un4- zbs(I_NP#1`B(j0I5?Jye-SA_kU3N0rI@@0ofaqF7C-sf(g)C+m-Uki-Fa&hMBKlWU z3@GIrl*YJq2Wq*yD#X@%qbJQu8-|gwPl*`@TRn{vzTJ7un+Ww|DNFgaxTU9pj;o;8 zQeFdwhYn}pP)3DkJXR*P10AqAIXKFD_eIa(I2pe%oQRafArQ~tSoe{~Xp_nvc9@b> zTRi5hD9y2mF{J{Adz{R@g)c+*<31BlD)&-io0PwjgSv6R6}B-G0M)oyK)FGnCaI_~ zjdYpL_W<`Ce7EN-R3l8I#>w|Ydy7zj(iov%X=hD#f$IFM3Aewwh3a5)6cp!Q48#ob zL!vy{4&$=2D=yVL_+rWq7xqNsEX`;w{jW{s$KAt|~r$PtVKot77;hH~PtjZ-}^Z<^Z{l=RK`c%M%-oLpPw-)1WfgXV+R9(SD-893 z;@JKm@#8o!6a^*6JEi=h=aD!N*%7Py+x_T-Xx8>#?-XX91~_n=ZPrR^c-D3J<#qVv zSrlL+jVL@-35rPC5eJif-b^csyp5+@(q8OhF9b4W3>KU`7C+6PeM0jA6>p&oA$&tX zVx02lJJ1fl;%H>LEm2I4H-)diH$q%Lg_07*nb8#c#9Er+V5lS4qgD%=>CTfr`&Ne3%&q=oYe5qWdVhtYkLG#}ykmIgj z>o>sBm#O#|Vd1xi$u`+K4d$S?mZu?M)7EmzvuboPXf=RKGfz29L(}GC=Nh7B-5t?; z@K<{gE=hxOl}p*#{BlfM`Ny7LJ}buI5cP*w(GOL@CE1F zjB{`_smHStoI?ejjZ>!DL@8}Y#L+W;zW@cG(`WjODZj9Zyy*&2CN@&bAlmqU7%#?dEn z`Qg%Jz%XYJ+&_u-nBsG#r0j9s%bRHMxY|!L$HjN-aUqfB^KcLKTYq4Er#zm)#OX@X;r@9G8mLP7q8;3Q{{z9 zu;4nHTNbmdT%y=!G^Oz)c9{r^oI!IM<7Cc#v+c=k>ci| zdUCS5>^;S-?gDCht~@#WqFX_k^6{pc1?AC*c}xk8n>+{I7_aT#KHL#eX^ILOQ?j{O`au+1tv|{=GnO6f*C^}GK3fc*=nU3=&$+`)rfXf zv)?199&X{(vveT&t>%rek%u>Z(F5?c64AE2LuX#}2=ZGzqKbIu!JE3@12TzROi%f( zbc~npz*F<^D$fI1)SQ9RIcBtI}Y;2*3L{fAnA!N=Ew`wNrpz`j_1QWHy7v&Uo#HnYCqtH;4 zy|ge)`roA>cOO3v6nK3BFVX|GzhM7CH9rj7ts>;VCV?%yIUr6FvV$#rGn!&oH*dN? zz;?GNAd=*8#6xe@JCjViXPd`sN0`N)9i9bo077xS+I86ZEU%`wn&XV%wTsmKqD$aC zhUbju7q!>eaG`zIon3eN!~zno8AS{U3+NYu4Zp1x(64(P{pvl+dJ!4#SZs3+Nf`Ld z{S3cd52*8nt0@LtF^XSLrTd7@_FmZ%tfJXgR9iO$tRDUu(vUuvClac24L=h(1Co)$ zXp`LLy>l(P3=fS0R>_0b$XRRYNaPM%){cbFu*y8QB@#skAeXGcgqp5o2x-2p!e9i@hLA+(oo20#Q}ZwN|-t({hG@)kjd(dX5v z@b#9{H&~vd(9t3^hC<1dI?ud!-6W0>!o%|o2_ee%bAmnyGo8lS@ZPU5grV&2SGK~Y z7PgdpLe6Pr4IJ-Mo`wC&oBV~c3%uv}3op-p>Tx6a%UYEC>*HbXscoUSj#BOUzwZH~iet`8J z>WR3oFyQ*S%3fJ(_#Kb4KBcA&9>YFgS{VU%5$9nMW=%>ZU7;z?)S}iw6vdT}0+y`t zpjU^P{Z;NNoK~AkYp+>6S?5}B^wZu5FM7d%H{ERwYPqPJGz680t@IB7dT_rhR&S0W ziY>?!AD__r&7NH+%g>ekDp+4#!a)m|UX55e`y*NG*KI_}4x-ke9?|-h`d*YBWzAZp z-m_GKS2R9kZWTYGwbeHBOF}DI1GEGba_!EOI9NL41M=iV3LYnYnscS~U1G^{2NioQ zW&a6a>iU);KeX+*Mt=B)kXrenSJ0Poh_eZ>ORF9=tDT=^6j}ZG`4u|0nx9f&>iJO* zY8|7BG>S6qe3D^*v5;k)zCxhw`pMszB2#M|#U4P(K%-sjE04t&lAR%HB4L_SbUV?e^1pA0Ppq0iHEjpW<;mQIb3ziqwcs}=c zCG8kd4_f1Iih%QA>9p9$FG2=Ee&tj1)Z|d7Z>gzU{nHUTDDe_5AS&Johz9T38|uSm zc=$pB`mX^h$VOKhQ4VqS@pa(YdAja~mIex}_(`ZY)Gm{$bIvhz&JMM6Mn{*E{lM=AW43u&km#~qA3hK%VXb# zZC6o9Wi_7X@qCHrIkNi^jUeb)nh-j)%8o$iDw>$DOO%Jgw08fvbS3VeC^_aDa1z0~ z802w(O;sP|zQCX#M%(7{U4JfEG4E$h`4UGz_#zt4c>o<^aMq*Lvgyo%sjB>hCo$^L z(fHswwIR?RvA_tFb+JildZ9*)k5hL7qtz7SSHT$R2nmgiX1z(0h;sJS_sCgJgav!W zEzQXeIbz|r9-RmIF@Ypbu56<8kYU=&YdC=N4dn~xR4ZvdVjrb=`8m~9@K(j&W`LKS zpVqEB-AE@>ptYKiGn#<`PtyK%u+2i`gzsgyco01n7jd|MAlAr8L37iA&e8L>TB9f< zu<359#DN?O&Zm5d55fLyO1K-eV76Hc;fu0>y=!h7gdfg(K7+4fK8_zgDV=0Ecv3uu zk_K8oan86k(i7AVffo>YM~3Ps?M+m`$O9#c*m*2vqpK?+0GrB#`6UaTufoY_xG3F* zUTW!bBJ}P{oq*ph1=3d$>2s+zb<#HloU)@djL!Vz;EYQ} zoLT`{zzg>0>irEh>F;V2q&;u4ZA9*(VDEtn6#)f=5`~I8bKNB(mb$)V*=kMVHL%r$ zuUkR?=kPh0{~-Mf;9C#<{e}3Z#V6=L*GT_q{O~4G8hcbW6tyFYa+a(~|0vr`8b;Qt z0}PVMQ>%xl%j+SfC$9%s?T_HJ*NErOMYg(r?H?wbJz$X!K}P294-WxtB(|yXr|u`j zq|xzSB=NL`7?`IH&YSVcG;n~r`^|^_boleB>o8&&Q#Gv}T$MRWD9X7*d}>}@fzkIc z(P$R?oA^9oo#!dk6?=%Pnu9uJ3S#8izg4Wj6!Q0jbX32_3QX)R4PAjblR}t$Zcr^T zt(Ncso~9E+h&IAnNvnzrv?%iFXW*C9%Eq;DpoDyj0XQw5yhGl!c=9?vRP0fyEa*$t zvWA7oCDbg%Sutt{XeZ6(US{q`;?6d6JiOgiXt@!tP<-ZtU>*jVJ7fVY;n1xr_~Oml zL}T@ut7gP1xC%)vg=u53RJ^{>8#ScLe&7Vfv?tQo=7HkNcS%!QQ+gZ(?SuQBvo_Oa z=i{hI*|^!6pC@##5^K@-?FOqlFRz_Pdo;9m269Ye?Wko2y;8`qi_N_lSpb+50sA59 zK}J-Z)*bL;3QfrDLPmsYE&wk&LR|vZ{}kGZI-VyXf{Fi%m&N-UG){H@Gfk7v^Ex-u z7HEjaXFwg&A<3qWE+6ZRei%aH*fz|aJ6G`)xL9x)tikS6#?mk@Yn77sp24CWMf9l$D*H7@l}sZ7}m9@&5LgC6idaO*Pq z?M%P>l>@h~;BWN1|I-7v&gO6Y_tyCwreFFpfxpo&y-ne7^n0kq2<~^NMZW50bKfE2 zt!*m3wavt@68bIAQ4;0Ii5!*Pnv97SR+5Npl4RK`(Yr~xhH{Q~NE}hVm#nm{IhEG= zXl*iBRw62uH+33f|3SpQeh^~+8AL~U*CW*fx5ne^fzI?xq^h@Q4;&1%-)>sbH zFMX+^u$}3b-mLr^{T^zeaKA$>DphwM+(Rvnh_|-e=&kJz{3@;X^YX5w91TK_>ML(o z$~l#-A?3yXIIH_;W#FNUkW_c)+&S%dFOo2{*;Zj(qa9B7ytxX#Bb)4 zF&~sYgNzM|TQ8MY z`LzIzIPYxN_4mLQh zW$DYrFAQG~bf#b8mk9nwzr+U$VRYudx1QxN{nD2m{EdF;?I3@n-$O0dbH76^wyEw) z?z=|3wOvMUZI|O$A){T$Q55B&9C2W`{TIFN}-*4!SJdc92qBNqZHOikw3z%4}o| z`JVN4Uux z7hIz}I2e76HLmgr__l*D%tIMkJh&eAh?O5P9SWqCEr4_$^!QXmA#tDda~iWNX)OC# z8jCufMj2-0FI-c|AZavv81tK0yfng*G)4QDab7cf(Ja2U^_ryDvBqtdUa+#=W@)LF zowAV6E~`LjxzZ#pwzAJn5_tNONqWu7K2|?PTrfY``0XZaOA~<_83XsWu}jSCZ8i2k z4U=9mv$ssr-_7h3BxGhA)GzJ30yk4Cv#?xgm4%%%N$*(LT(h*;!sc6GbsQN_z!Ek~ zlAf@zTcuwuY=HEOg^iUeENqrp@>|&RX6b1Q+ir>F$Vv9QF+MU$Z%FLC3E>u)C7;Bm zSpY7zNLwUu3cy#a(k6h?Ej&z_sq_74swU}^aJHKQoi<4yg|pda>HTo_nprv>#%5Cl zFIc2gVeDH1f3Zj>!q^ImYl~H?2xHX*E|esH7~3HM^h?tAFt)Z4z*UW<=fhZKW62%H zo(PdPAdwJwpAC@?hO@tgzF_8=h`L8QX=Pi@(lINWPcfk6;nPqyGy6`ZRrpJ&9f_@0 zzeY`wFcx^X%n_tt)LF0rQN(D z{%K~|#hq#(oQv zW;SQ*x#*^44)=c-D{diWv$ruCep(QQu;WC zeH$r#7{h*vjHznLez%eTQ&G~{mh9~)Xjp8y$<%DMQkhky816*Mc<4@MbigjIQ1VPa(z z5BM#z1>A1ZD<<{Evw+U`sL-dFQ_VP`8EOMC5XTVv_4 zogHc{{b*qcvWpx()b>1-1XN+}%}~kanWPUT_CAqk zn@QRQVPTR^NbE#6BZZ{bZKjXvDn4Ij^IsG-5jlJZ_N=0*%Q0mR0(- z5!+^M&DeRXG`BHZB+(6vNGDuD8W#4Y%5@Ep+u;XI(&JY4oLYUho`@eE(nbs0qeb$u znfkoBDn|HTv$RfP$J90-zQ9CZ11fUzO)!X#YTw z7aL2no3Udd8!UKnH$!>>*3s1ZIspBpXH6!s{l_NDQIq61k!Xd^%-B>_zcAUR!s9ny zNS~VIO}68}c+w(yA|UJEHhCl1r_}o$Z!7^k5`wMazR-=>8o`#3Jbg>;CWbGyN|nvn zPOEgW8T-X59dE{-kfgcI*gqucY%}(iB$YL1Cnc#0nQUZxsu`Q#h+yz8{FgT(oYjp8 ze`6yG`&A=~=efp}Ff0Favt(Wy4eRaxOugM2i!?WyePxm6wO|1v?bD5<`7PMF#?n*K zY){&iF%GColBBF{_cMV^%) z7h?gwiRK}Z!~%TGEd8w!TVx>^4df{_8xHTYNXH~r#o?J&=_d)=7W%l)RZe}vR3fd4 zVoOYI-fhZ0HAyR)vi&CMgC^_^ODy1TEYiX#Hr-18^Q=;}jeWx5?N;eW8#`rfgiv7m zZ8r8}V`+npZ4Q;rM6v^*UnKK~#++!vmV}f4yW!IErtIr*=~NV(5kWprMM%4&*grV@ zk0un4(&RYWD;2h&Lkc5t{7EEr0DEmD2M}bPMf$`>&3K)SRa&HHk!T}nv5ie@EG{GK;-JQK-mCko(o2=5=?(9dabgDb)iO0ILPeP?1yR)xDr6b+hPhrx5 z?(9H>w7)yM7$JSromDiEKIzW(L`v(rvmYWQPj`07CT;4*jyIP+?#A{;OKZEaW6{!w z-B@)CX-zkFsipL8H>Si$Z+BzA$4GB=V^6e}{@#tvjg^*nW9MU~SG%z}ZKapHv1RR~ z7rU_+?9x*BTq8Z(jXi&jw7464w}Z5>8(S48Jq4eR(!6f$osQD4$!u#UX@4>+iwBog z#Y?XzGx<7c^Udtsb<#g?X71~yg+18PL}_skHuDB)RS)*!4blfa*wbC5(>JmAyGn;{ zW}n;$QM&CW$(zh(Cr=ZiG`cgQ>$b7`C=Wu$bW6ZmiTxZUz1E5C zZ6VaqMj=OOG9N%DoT z#f_vbA#6<}>2zaK)EQe(KgjH#PNJ)fWNVv9k2hsik?<_1V*K~-e=r5mWufZD;GMhb zPk)T-g`5fmQh~GSlR#koZM;L~)WD@r%>H_BwybR$TZzZsK8@{Ym&T639q?1?M{l?K z1S6pT{{6pBfx?3O9~d=ic=7Pui8prc+9kKJkPRPRl=nbEu`91=_~@dMWAla=j2k_k zal{8ZcfCpA++I5TE)~mBII_4nuNdKS^Xdx8So+AkvE#?Fj=5}X-nf#x@*XP5D|WFY z<`_S2T;3>GUas9W{uVp4v+Tav_MFK`daPZ9vB#4aOJIZZN4o5}C>(h|${|Wyd<#P{*zJP`^yBzp0vzwk&npUJWAY|DOY_FL zSn2qJTsA6yWD$8WSHal4BK?E?I#vLj;khg~udrY&8_p=hsLY(*XkJn2Naz?W)4?)8;w+WImsNKCb!%snSZ6kop;~Sj3OeQ%6tP^Qx;yj{bdXP%aB?MI&9~i>S@iPq-XWSl$T6m7rP+M%fWP zxPlr1Zx+R)it_TtG2Q}dw+d!wX>1qI7g{W_kXjQBvB(X zHk8YoN@sM8-CdCC0j4K#jFlywuQF-?G zf&K5u$wAuLBa2)G^zZiw549_w=`|w=ElZEn3>^!l1vb_jm3u47S8uEz* zS{O^q%_U)B?>NDpkG3*yyuDy7ByZhsaPpi!d#d#&@C5rNh%_&_w zB&uutsPToGC`NK!NC&!7nEMM{py0!K8t#bYpaoW}28jT;@LP>!V2*ZqO$mL zC543vEc>p$0|sUccMi$EV}NtOz~SkA`}7@{!;Vy@vbRr(XT1uu)8c)U>QCS8cqH{b z4tR}J+*b@ZT0DQ$EmPyjSL1ZRosZ|pNs*8E6M7z_3~=pqqSSmF{Z}5>!y5gKaAk$S zSqV2A_;x%akajYjC_Lm>siwOc@AL4i#5={EYsgO#!e5KWn5G7kKmDP83dW(q@ybfV zw8mM4QJ;aoB5gbv0o^vzF@Dr*v%bFV-EAY}_{X>2_WR`Lvzw>yy3KlF>e4@Tp5N=n zd;1KccgD)_*wYwGMZhC?mQe)otNV|}Pp$Awt^2d;Td9VROBEjX2siZ!;m(GDqQ3{L zxLY=(3({w7N3&7fow0Wzck{MyC)YlFnYlMyr8JYK9@&fYTaSgC`s0$M7vaupw|VUz zxXGP<9TVYTWk+tFyeZAWmhCGaoLuT)+Xg%^cEg(vcI%TPjt=?WkveDfq_%IhNY6g? z&pk(5_e+23o2*7(Rh9*H`?a2Z3*Y&ANw1q;TmH?p=lZ7H`r6s_OSV^TT)J@1S0Nw% zwWDMFirn}{+o*}v{imkia-6h!^_r(Mem#Gi-*QKftQ*@VozI*&{oY=m6hC(8jus_# z2WD(6D`ur^6m$pb%X4`vg!C@Xa}6I~;+jz68V;EPSzu|$T!%5(Hmu2hfwkGUI7@Jh zbbOD>OkTJ zx7gzgy7%bbdBXVOf=QioCyp!{-MJ{QG%3;EyQBd9+WnL5=t=qv?mQSh3FI@CEWw`K zrAL>Wm@)jsf^j$9_y@wLbh+_=RQP|Fe*X>s@A2P%>Gxmy{X6pOzx?y>@z1|2|Nl$> ze~UaP|o8{pm7>Hgmt;GE97e}Mu1 zxr^?9!T`^`LHD0;fX^A=Mi|Eu9VkD4hK{Sjr0;5Q1-2n*@EHTVsGIKpyaCSduKSNS z!0sNp|C0t-F~H{x@N{gz)6$)1fcF^SqXziv3>|;J0UmR^?q6hp%LnNGyA1F?1AN*5 z@4ZvU|Iq-4zHbWVGs*ya-qZc(8Q>8HoCgeWTb#nu%G<>NH~LZck2b(LKj{7=4e+}L z_(KEiy++4>)&RfNPxoJEfZyn^`@d~~=WNyepEkg=Uef*N8engx?!V9g|Mdmk|9%7f z;5)kiLk4)00shPYw|`g1?__{mPtpA!G{EBx@Nxq@b-j+i+5mrOfJbl8alXGt=Lf|A zkNd0c|Cj-e8KL{PH^48B)BRT(;L#81{$mYr#$?^U&;Y+-fL9w}`@=eZq5*!v0Kaa4 zADN}&&oRKqJi7ny2KX^q_xBp$(oc0-O*O#l4Dja$xa(&+eh&j2@v83M+yF=2uKTw% zz)!uV`!6%Vf5!nYt$n>?fDag8`?WgG0UYep@Do1L;VuTa)ByW&z+A(xG{A?y(fxlk z!2bC<-F`E`w=K~9vkdS_1ANf{|81d;|FQwjU8MUL8Q>ci>;9<*m_4KWM;hQS4e&t& zd|-)=f7}4~U#j~LGr-Bu>HbawJYt#d|BwOx&Hz^$;9+WCOnufk104R69#56Ka z|7!+#Xu9tIpaK5G0Pirsey5KAn*ko3q5Hd3xD32EN*4YEhj?|k$N;}?fH%$4aUOq4 zhtC+`gr{}?=5uxU!zXn38bdty7~ro}nNRsyq{?}McX~xV63pi6@U?%|ZNg|$P zz=wX;;S&aUyQ2FaGQgLP>HbYB1Z+h-l8Qs{uLiiIiZgVJ8FTq&Uak><^9}G&1Kh&^ zXB*&j6+VmjPu(NRMev!&1iS>WYmdke!FTNya3@kHH)c*uVhp7=Wa39WWH;^0T+hygx^cWS!5n@G-?7Pr;B zjMAhO35OQ7mH`jdr{kFi(Py46dDo6#qtmv>1A#__fIrG3{ndwiaBLtzB%r^m;ZA_9 z`i9~rHy{s`o<@&0lmXP?V9=Gyk&K7v9Y+56Bfm^Mu?9a1KNJtq^IEtRez;n{F1#ke ze+v1derKA~A|u?EKH!qO!y+TnHbsV{ZH=@#z$Tm@UWQu+{0CHgx4B=Wy?3^7uD&VSBI}NoDt8YA`R=FO97$@mBnp#M%wR3+>v&t$dTZeeBi|b?=dw`ybPt0 zu>&IQ{Vw~>ij2*SwC8Yt^9n5*PUDpbKXC7*z|LTLpoJL$`bOF_ul9>f^;Kh|x}`tU z!`c0Li*C%0Y)oZLYu5mI`L-dg&%m(O_l~EDwum;-SG2`D3@yMAErPUhNbKX{H793TAxZ|x08$mUDbGo>jDmz zlSAB6xp}5_mW8DvET#@v+@(u_cZfDOA}p7W2%913Ilz#EjBrbuQCd=iqCA~No|XkJ z1)PBCuRoqB#CH&W{V3j{m&a@FXNb6Oc#T&__^28mDUBgk#Am7wmYd{3A^enOfxuC~ zBoE9-B4Ja8u{lVy61d%)Ano!>y-XTiCx#i~PvbJ5qNq=9#vzR%gn&Ovm;P$wQro3A zP*oHN+)M~s+s)&0CD?ZB3*So%zc3IuLxPvrLoGSuh)gwaszY|51H4+iM;;3VCZewE zj2H6DQecXVhUBXuz<^#~ymow}@~-I@2;2^O2g_^eZPo-#ePJmaJrNHCYRb7n5wgB; z8jW6tz1Mg(&2p0UwPf+cI!JW8sv{uT%j!We;oZQ z)GlVt*5ne}5tlLMp`77J#GuhMG`?6ZzM=nKeAFf=e`{|I1fcFRYrY{qtxZ^rax*Rb zYI)S+oP<1*$yDpZb;S9#F;3@I<4jfaIq;c4U@*n`tRYTS9$AWwai)b2tI?7LUm==$ z>q^V_yxRf+4F8yQYaMCWYNpXpTJ%~J2#}FZ>pnxA8hzXRYjIBcraEw*;%rezKUDt5 z;?(%`EKK7(OZ5HS5U1!1UlK7Aqh{1A7pc!7nk2%04wf;DG6mYQsuMx~Ha~m0NNFf7 z*G~=va;e<5I{L-N#&SFA&1Ww)pQ~U@Kl2Lm!g7oG@{Fossd)9Z`&4|RcJ=Zg*!3cM zw!1v9!wvkI8E$D|%y}kcQbXxcd7(PcjOfw%@-)nc4T(U$TupxN#=Ru5h|ACy80#(D z?1ccW-4|qBJ>EGZ1A$j-(%Beqs%25#biP`C=i}zw)iv|0>)x5@yI%fdeV4`;Yi|k! zzPHw(gC4IlGL;JrmH@>gt>73#XMa z#uW&3x>B9Q)Lkc(CjHgN`$_6faYVN_lDQu zK!ksScx=k$SI1I#Hr~PpBmd)!*#br=!1Mr9H=ACihnK6 z_*()29A9QuXC33NZGSAzRJH86FxtJG>c7irbu3p)=kJF;;HJ8&t>HRnD(<{_o6_iW zg*19o8nrvdtB)U#7GHgij@l5ll}W5R*j9}5V`cEKJwGZ6{XvJa< zhQ`|$ahK6+Xsg!YzofA{YtCs{mKkRvM3^}UGpS{D;MP!t$vmru=^LB}vFtR?+oXl3 z0)IW88TRTxbQHpT{p;mgdxs9kk2K!2xkzkdP=1<*6jx3v?~j)p#HkG#tcPV>%a#F z9y8We>iu=p74g8;Xqk#AiO*J`|EPj%Ez`=)^{9;CoDJrI%`@vxo zFW1u0`y0zYjI?dI?rVJrV_zEAd}N4I(;XhF*{3%&pOvM7z_X+$oT($u7mQ=2`t>_1 zGo=@e_WPe6w@zpo2;|ZF(`tiGqRGSUM!vtjULK{q(UXgI`R|Osa(&f-KBR}q2Hi%> zOQJC^{p!t2l$w{S{HyE28t&RZfSdhQb%69&`m3*E{d}ww)jipDJSf41#T*90-ONpydR3mfAlqie2 zWRj(+DQpA2rty6e4!$(Yd70L$qh|*K?~$CudKl)IB74xf*aMNc(F5g&f85=A{iMQ= z^m9A>=8}FMdOqfoS(qSx;alN&7xMhp6ANT|F72j0{W>}HN7j>lZL&Ib?m4}`ks7u~& zqrDB{TZu;SIVsX_d*NZjs{@aci?X=QK+46=kPPe$afD;{28Yr~h7ivc;>iX+HBw$kK;cN8| zka&a2ZXK!5jqrUIy=kvRhFdZ}Z;*M8aKg{W6McVmU>W2`a1KKo*H#$Nuds%%(WWrB z;k3yHE~U=~L`DroUD^Q>ZSvvY7jCdzW5EtkQ)v?&r9=JJeBclb=&wFH^};v8nGM_( zgsAa=TDH6zMKc!|UVBr!AvzDmQ-$!@LaK)cSYMhNPY=wi4m@NGqtP>0-{?YRrFvfu zT(=Q7ZKfr|Z53OMXpHI%H{ZiEM=xo-&dLaXbai09Fj)3YTcE z&gD&3_qf3lh2S~%Ky_e=ieua(;h_C$=<9}~r>i}!fcwx?voJw<|kjNj`AK zs5mpt{b?UxUm)@gd}-n4+jSUmb6*kvP=sBAuzY@uw^=p*!6JU*w=&=?2hKo>KPNJx z6mp*?_UU~Iz8%N6XXzWl&w|XySWeZoV(tn<@ePAHWaU11Y2&-T7~k~)nWB&>eZUt@ zapAAFjzIp@b_(;W#aB4D;4xm6q=^cK*+D-6&u@JcPfqM!r#djHRIU`4y->E~5f_x!)M6x3N z!D=yH;&jdkj+xD6sNEp>(!+ZJ_aL7C#on91M^&BS!{<(hkdP>eidzv!L<|U$uq6;g z1`;H!k+3LIhAfjXkd4eF0knXMR&gmR?i+4(t;JpIzErJs!K$rwx7t=)TU%RgwF=+! zyyxC?@12>1nEHL+@B4q9-|x(wIp=+z^PcxC_uO;ed(YjF{}GPK`HAl(%n%5t$q#2| zwl&`84zAj{>t2q(qA#vT!#~U@6X)O0{Sy(05K{@vmL|-@?0L70@xV-zK|bU0WDxb- z1WaS=&RuWfx5>v@!|{%O;T$wf<8TbC==sJ|z~`>sxeM>&xAACy$dcFQPM^)_&->A6 zb3P}nu-J*~84ty=d4|cq%;2Z9&*MIM;Mz2B*l8>@>d0<{m+10Nup+(1vqX zxPLenodn!dz`bqf>%B%P-?K7srKgv06=X(E%WiC@#=iLPO*?nJLZPI-W4GlkRz@ftcR7ojrs~tjW;~mbR=OMghS>U* zT)K1DX8hLrp|8|9=doIz&!m5_-nT(6Y|DA;3f-~OUoRMUA-4wMAz=2j>(@JO*k!K_ zB+_a<3$e+ks&LL6Tei$|Qo^V_FRgIb^)efJv0e%<+qvsRqZ`Vt=d#zCsll`ycbZV1 zqupZdGraEJ{8J|PgE&Sm$Idtr9BD`YxnxS9D#<`AAhr$RY+!~P9WX9>{TipCGi^^> zI6AqfF_3-I_Bx~^503Y^u2z*-xa0llJlCCyv1UqOrrW!_wi)fk&!VoySN2yy>0_DH#2U!L*lxAXhq zI7hwfuG+cl2^>uu*K@*krmoSBv|pjF;1EO?Abbs6DUNEseJ>Jo!Wx+p>T3hG@%^vf zx$8yBNdLxjCeGaSRR5^Y^UO^M_d`Bv7#?*V za-Q(569?AVeZyP#_VoqNhg-Mp+;tf7sEumOJIG64^xF_WuWNf(W*nVvXwu_u0=S2+ z!M!YlM_HV*w|dH6mJ{&$Z14og{O<;C;C0=O4^skvN?)!J@c#t<6W}>E(JrS3)^dJ1 zJqII45K*kZ{c(=j|N5P~PBJ>Cw5cf>f37n87I-FCLDr=Vk+ZU;)kk^+cuaq(r@~(c$xng>bj1$ST2e|b~9~_JGUgM8< z?ixy7e0YlDCwcBlI}Su>g)IFMbsJ34VMySKG&)SnS(_$S=0HP0l|U%D5o?M#>N-Tj z;fWoWTRgBTyV5HU5b8ApcrJ7C!#MV{GQ@G7#n0~W``?s`-v@CHJ_HW7u{^|0$5EGG z_uC)XV*&Nxm^KMAY}-brQ%<3x*BOXjigafkh`L^ZaGWP@ce>7oY!)#5P?lw#fjF@r z`t~}se2GJRE8;tGG`h(74SmFZ4sB{qv-4B*I|-r>d2}JPD}7jAhDq=>Jb;2S_Q59l z5jMu8eAYaMhHQWShApnXej=bwdfbi6!=7CVlftc@xJwYXKjLyB>wFfx7EoId_mC&< z3dBvpvy|yR8xg-1;d+Fp5I#i6dODznAe13AB3y!SH^L4C?6IYWAk08WAe@14J;Fl> zuOfVcko7E{-$W=uSc7mj!Zw7v5uQc(1R)EKRs#_V5y}vjBWy+3j<5saLxkMtkd80| zVL8GYge?dkB48gYH4x!AgapDF2v;E7jqn!2*9f8KQEr6e5Lyw=K-h+GKf(@#w-EUG z2*7-15^Y=jjECn0P_ zxE|qW2(Kc1h!A)wp!y*ULKuNC17QimN`#FF{9J_N^$2$(Jch6X;XQ=U5HfclKZHRD z1qh=NCLzo~s6;ppp$4H5A%Sob!s!U-B3y#74dEt)I}sj2cn;xJgm(}=LiiiPR|r9D ztCfdvAi`jT5eVZErXtKnScFi6z)vHNTM+I>cpl+H1obP_4?+pTa)h%HE)b{oVEjwMBfc(Lmuy){4w+T{U=D`|}_tZIx#TVs5#FtTKB(P+F4 zwxyA8x5s;|iz5wfE$yxGa<=17opil*!UDXBySTQ!tqt!5FRwxRXF5GnS;3^Xsnzjl zQ4!vdTVcPvzr0Ri4@}9!D>E*hzzf2WcxZrWV=60V)zr=A#t_ZXwqm|LAMgLB0^=ne zZ>!b$&uPI6ms{G3ikhldMXM5RkcyYHTocpFjg@@nHRG+`-0YwnC06RFw6fERNHisF zTA8Gs#I(_)BPd7()QIp4?>NWXyW1j>BE-j<8winR=x? zw|e4H*KM(=w)16f{De5(Vk|oeAm1z9c;xHLLVd+FykK}5-kLmabvxd#E>)(!_QuCs zt849emEp>RthlmbdSi7%ykc$<6ekJxfrz!@ZTDyiakd@CVZV<=TT5d(bjk4GZ4;_2 zPh4ZXymA)olIM?;wz022j+cAt`*s{(kUSP|#P^x7a#ja{D?BpOM*9u0%9B<$T9^Gb z#-U`=YwWi0hBwYud{7W_=B3OZ4E z9%`UPW*^vc0-H;7yrmK2RCQh5B5avJCA>9OIjbmnz=^qyuqrZsy1e$AO-;@8bB=Fs zg*EMVJkOt2Qrj4HK+>#3=n-ceiG0fm5suf!Vq`hkpFXB3R#zTFJ%;@8W2OB< zevCgpy4ucZtUtaXVaJd2$2U6h#s2taHV)e6_nED+vS>|v1M2+`_-&tz)SfD`uo-W# zti!fNaqQNCWcW*Ty=74hY3VjIYDau~U96)nHU>M^;CE9?9e=-SZx}NTyL(`tjm9c{ zo>rf#a-LW^Ow4qDGRU{5XN?FA%yKF-4kANf%|4u#LK2mtD248J{8-0a4;E~ zfqxy*WKlINV|Gh5W*TA}XudFG4)#BZ5w@UZajY)NVM|?*AzO!3V*eC&b)3>g4ZI)! zk&OA+7zg9h9FDc;k{x+vHsiMlsv?`Hxm_a;&50VhV(RM_%)adj+#VW|oeqQ*m~1|0MX=Y(D%Bc@*xDbH5ovFh zxPigynwGYNIy{J30mg_Ug6Jqn!3;8}bD18jZ^e8uQLkp;S9_vX%?V=9CggQou)Y&r zi@6423l<$U25>cI#3(*C%MNm59I|Z*Hbt9iTi0S|SpMP$Q0kf>HrPQ=xi*ONjfh=` zUy`J54#FOqO5GadUOC**YI`s)kb8ph1UBnxQ>bJ9YHG!X-uxxo{3!J>e`8dHuL^%P zQ{eqzhf@&s?_g(bT+%I$$5rvM7=l_cOPGWG(g0{#%b}~fqPCo4QXoYp7RQU1Wq5OB zDzpsF5tt%*uyUTOitG55Zo>2&=9?&qwZtPe=oVwyP2~)OwT5(Q_Ppk>+{luuL{V`h zl33B!(g|!`L~I9Z-@IpJ$$~|5IoYXQv!=Qx)=@;kTJ8lW4Gm4BzNK8vQn0PEz zR5kUFEU9a(1iMnJ@w>TmrCQsc8B|AVu-RO5q_#RyyFzWS<1mS_V=$+-4zkUke?LG~0J;CC!>sc8 zbIWIs8Lc(NnkIDk|4L|zcht5ewC0u2ySD*#5l__B9&yCT@s1hTHNNvtVg3}unU^<3 z6+Y$u-}dAbRf+Jw&;P*|_}f%95MlNWQ&s4_ss9HT^nXQ5w!m!`<{T0kl<&NKr>Ksj zvF`GGSn>WH_mRrLk^4OH$o-!fzvB;K@loCJKv?lTTY2w>72lUt`Ak^x{Z<<hlFBR=ng zu;M#?wuQoq@8M~k6;^zA&fjhdtDDLH^DwTdaNP+#XApmFSn*vjp&4P!SfLm4dRSLR(&A9@t&}HL}KAv2mStbSXk|2>$8!1 z=SjqFbh+@5PU$XNM&%Md`9BknYVa4ZF`C1zI}FzP8roGh67abbcz#&_{ILG{xdipk zkMm#ZAOAlE{yn>0Z0QIqJ~y@l_F_BW=L?%}ZXWbMJgoRESLh>M-&z7b#rP3Wcm1}X zUB7?((G)eYNT)jWNwaXDHs?Q&+}DlAZKJ}9_sF^58;{)cZ4i$9Y_jcn4)a|A`vAZ_ z-{g4|q&w|^$Gnfjiq8k}BlU=*w>}u}*yjk_UiYHB{9HN!^#win9Ln-(=+Cfs<)6Yz zo)yv}a-TY&>bCW_%USZu6w@v#vJXN)?RSlnZo~d}_>L`bl^IEb)-iJzhNc~H1h(G8 z)_I|kO^NpA=ur*4+Y`fn$xYR`3O`YT1?yVc zu{4a^5s`-G_S#5Cb)*rusMNrH-vL)J7>U$ylR;cNIw@ZuK44|ae%KjKh(462?7LPQWHW;-KxUAG8FK7oIgpweq(;z~D#}6+ zey7^4udEfR!a*a?#UPMX7p=v%yp5687G^!@NIBDFC04Yw$FW)x$2w7~8Z?Tr!7RDq zh@~qvsE`p^Su8wnGe+WTn`&Ab)u1BA=Vs|!kF{$}{AkAKWnl|=ta$h`9K)1-Bqb@+ zu}s-tQrwKkF>+uQH=;_!I-*!bXlPc0#xpjQ)f{cW7QZI8n6X1dN$g@@8>x#m#1e5e zsD$P#$nwQaVBD~*)<|tUf(?~xqga?xgC;U|IAURiNDYd^yI*QhDWi|b!eWG1coJhr zAl5H@6r)Fy1FFKzap*glaYs_rjXRogqfm>VLhH=nWvHC&tML`EvP=`yEf$~%md~1E zwW#%j_hPN1?Mnuc`ew!zz7Ak!@Ev^j`xsw2lu>=TKG$BaLZMJA#^bC=Yobks4xyFs zrxw*88ce}pmaGw}(4kDq%8JzEzMcvVVOlQ!Vewam4&%Q(z|i=FbSNYC0kpjy4N!#+ z=l}h)B8jHfdfD|nR6x3cDr0)Z>~a+vPQ?O&KDxuO@#Q9()R54IjFC8r?2%}K9cxu+ zV+MKTKUQW{=w$gHWIEa?^gl%+vKY}+SG`u@wPZx(N(8r=-X#C?_ zIt6jMMC>mT67fTc7|4iNybfbY=nRPosXk4(AjkSJtQ@*t;`YP^x*Dg}b|}^VkSWx? z{~>2hLP`4{a*mEX_dH4a(RMj(c|{KA{ap^{AJ|FB3yS5i^*A|PxJC{aZIQ#p*T~_L z*W_^NPB~n5C{}j+A9DEuIb5+?4p*Hmhi$jX;hN{=aP6PvaD6@&L;D|c<9IpTa)KOg z+bDGtPcE?KtEel4X632ix)v$+m{W*)Q*qe%4$Z^Lgus zw~0m-_SHjZ8&>DzllXhGvIc*AJ|=m4U4ti;O~IH z;TmFas0)fBQ1GnG^FJ7B6(OIHLE7JdHwYfm6*#)u3ywL>u!!|Q4YV5jMO*6C;DYod zV~~iu!pwI6=9WZ6WJjczEw%-us6=Rfm0?e^4t0O_FP zEl!3GkRDoWar8Y<>guR;8F#vUv~&KfPL+qNq?{*NykCfwA3<^VWgiWvN9#`7=~!nT z;Y4cqzU-vsT_B~G8swRNr0%5^>7kxpO1$o+FOlFSW-VWyUOFc|i`z>(6{RzCZLHl( zk4+DAdTFQbrOa%mgVeoLENA!9g$B@!X6N;cp^1O+{sO;zPSNGCr z7Zgdov{MmsJ{iQ0x|hbf0{eSu!fA)UaWv3s=w8~Cp2Y5@%+~FttJBMRdTBxw)%>de zka3)<_8&6-Qxv=ZkmCMlVv`AUX}MFFP}Z2*49qa=V)gZyEgkwWPb&lE<{>@8oYU-K zOaF~te9+$Ok!lS(G)t+&BCH8(&_<9SRy!G_)*$Zxa9CX#e;<4(=B|gWwjKrS=Ln&t zh*df^ZoP(>_ng?A8YUf5i(YcrTI&-hIz&xSPmPH1DC7<;hb=w3KXiI`Bc#&lw8EoP zvsb4oz>Y@;HGn{${%3Kw0{T%^7pcGkvPmg(uRROI*3f2L+o=45tc4J=vYF%IlaOKlA=aBH zr5dyur=I*ZR6^Hn{)rdMZ`N)8N!Q8mvk2JGZxdy9VCI#7a+CZ%7ImI~3X5b73Zu{G zpZX<#7u=JL^F#jDPmtL#i}DvSUp1_ZoEP(VaM;l-;w6WoU|F~X!i{$zF8@0grVf3O zvcqpc`q0tTdUy^fh8929iJ$d29SxoOG*CyJN3wf37}z)NM@On6(WX}1Pi~90;$(L> zq((f5R+j%Lq-MEdb8z_(fgj4MXdT3EK0~SYe7IU5gkA3AmlPjLgQoE&rDuz&IPgT*R%eL+y!I8|;H%Lq0?o z%zw#+j2>_Dpz~J*YXcF3Ua4jSx!6JHNF9tgm}Yy&r4WCIwrIWW2gXKrDj;V%Fm)ud zXn;N{|938`*p75OBskg;`UqezI#6k>y2TDS4NYa}A@o_b>tOi5z$gWBI)WHW=R0aPEH?BZ8A7}9?`Q{VqaRs#9~-Ei zoO_V4l$`B4q_{r;<}L@PiXLU_Z1EJb1ZJwmVvq3>St+ph9Ei4%RE#P-nq`zpAlfPo z?5UD{vFth!A#^R9juzEZJy#Om%B+Gg#AZ|UCWy+Qp+N{3VFKX2jVg*d0{< zL|rA6W(1_agcRQ-CVH#FjnqP>deB1bxFTA+s(dA`CKL@;fVJ!r1hI&2DoS@l&m1@mr?cV z{{$!JBH-#`@s;h(wF$ZY;z08ba3342;xCW1fpi z&M%w%g09G+SwyuPoSazsW#caH3ddY=Is8+DWCiLrGhjZ?qgU9-LNS%Ten+dh57h4x zB&Ow;8g(a6YOiW})&<BM1Zza0*GhE9A}T1#2%z9d0DW28f(y2({QIo6wdMx*H+$6GK;WJZBZ> zXu9!jj*35J#xFzaH-=G5USu=6qSsOMYlsED=jd4Sds_Z#O*$42O|gLseEDWq#5waHIf@>h-v_h?Z(Is?yLyYK%Pf_E5U-Suw62zr=5KNQ8rUIpCk25ZJ*4a?u93*=;KEbuB2@A^=7KKuLgL01qBg9qcP2f?l1 z92p2F@+DRIBl(09W~Qy}@fElwhDjlMP%*@(8i+`jUWs-wRBi{r4)*fDslgQxjvIis z90B>uG`$z$SndkQ-{He}EhpL87Yq*CwcP8#ePpm6%Soo|{Fxfd?HR)QDT20yZaV_l z><2iOn+(~xM&2`!+|E9Cmkq+BmQg%Fx|{i1rA)CnJZ%Nz&4yLxa4vO;P=Da3<`tdY zRbB@0eFGMpwzlBDOoMaGopT6Qh!8x@fJm>+$uYFSZbf#nIKj7@>l~nK{0tt;ivokS z&;EE1SU18mfx9#nt8{rMB*B~tcoc|N{itM9&GJKgR139o?PVP_80!WI+9FaBdWLWU zuUP6d@i@%C@mzvq#bY5~Z7`w?zf_4}5u~Hf$|=#K>y| zGFab$aF0WM<b5*5uuS0E!fAnF z08dB*76#o~gkhf~hMv}x+p}*)E{~aD!Nn=BPvsmsV~Y zf`#MS#W*|D3z6YZ(`4$dI20b(7vsX^dTL+9j1-6_@2JhbUfM&oR$*jo}5j)<;M;O2~+%22A2v|1E8aq7qq@z*`pD+H3LL zVf&iM=<=23F*UY}Gr*?DI*t?i+IZ5}0qApyj5c^p1DAkoiX`yQ(|{+)!q(7V*_TJo z?R<>6EU@(nAl5LHfY$~3{)RD$ns@^=8k(ssIyT-}-C8~$a|-Ja07eiblYh1eH9>C6 zsQmBsg_@XnjFbPk`e56$=0o^60`%3#(S2Z(!)!_C@n;b{5ke=sf_GAIge_P!1`jvt zhwONt4BQPY!R-*g+l5>YWrn`zl-4*=*u{Mlf`4;_-NigzS0%*eS2%hJmP4(L-ETM+ zK@ha5%rr=8*l|9Xv=A}y93Z}LP|_V4uTew)=MCc&Hx`ST1$8iK|g##M+8JEw7N z$r?TY%r6Yiqakravw3O2s?j*AXy^BLU^0(zN@jGltsrD9cy+Dj54*rSMrZ)C)1W;@7?2Gk{KG+y79-%<(PSIk z2<&|Z@38^#Lnk{n@Z&uu_#?1i8@$opu60o&KT9{6qEr&yQjZvk*KQ!BSU})I(!(7C ztN?J00ecK^9R~9J(GIxS(+cPp<8KK+0l~wD#A5}L46SmkkcPx#iqAmM7nPP&4BHf< z&avI74;eMVs|9wEI+M42sJE8|*Z4miG_%7gKNx@_oL7snvy0(_Mra1Amc-VTq` zHkE&et;TpA!K<$G`s2j#3_!mzKn|dGebVPI|0x?~+=paR&D#VPUr5N8WN8jOAUBdGB}%rYpGoqhQu_-oVSp|CKl0s7)D7({iC{zLCh=7PyJ&7+`r&d{)5 z+v-1=4AD2@B=3I$kX_`I+11_yeo~RWcNb1AdzPTMTPSNgwNPu@sbv5yj;JhBH7*LQy9$a?$QH-R7aTgW3dR15VAHyU#}xfPw9LvGB1GY6+`E7 zk=ZR0o657qg_S2Hk3hQaYFJVO|%V-7zOS?_kk^)$%N8 zrPTUMeCj-|JG)~|cIpA^p2b)RLy+=oJ-seHJ!5oV<^sm$U|Z#9^t$@=h|zTdqCxKj z+x-rs&k1OEWIp$xB6<&l?i+_n*NrqHzjIJGv>vx1a?QceQ-u(Eo1Mn%Hq;Z2%1%+} zd=Okok`F*4Lvo5kQ8#R^s}WnsJK*`yRmkgV)D4Hv328Y-&%-9b0T4l#E5!+^8!C@` z5{a5Yk}yQc?n%4hu^pH01pa<<&^~_0rEUn4T$)(T{{czPM7vbF3&{+~=hD;-WmnEl zRp4CV=Vf+joSnKM_qjn4elr*!NM-fAL3Kk|l;j}QDffzZfw5nyV}t&kuxPS_R5zTg zUF|xhozag6lb%G7Ne{@$u2Z|A^Sa01l!nghRMicY*WHRv?*A}UQWbno!sl+)4ONOG zR_AV(?(ys1HoOjm(!{J}<3rl`ji4 zCZdXua>~N7PLE95Wleip~TXy-&1S_2%8;JpQl*&EPfv{PCAVb*@K{a+)z3`WG^G; zEhko=!W|#7PZ0etlk_=@6oshLC|GplE;jW57`I^Oz%R-o6`%{B1o+=l4daQ z3cYHb2!XTwLNbNX*}Z99jv+~Zi_LKX@K+fQ8LGT4Y29!b7c`DD)|=pX-{J8) ztM!C~V}^Bb7-xS3edhPNv2{aXJFbZm%K@$@ft;;<4sN?=5EZTk`X-}-*Y&L%0@u@R z6N`bD^r%ma7CxuA9+9je$q`ePDnih<@Vd)&!{PYHi5g8n$H^eZ@Hx`;fI^hm4*0#U z5?&X(?kH?0Id&rJAAo=9Qh1&3x}k6$n(I(PQZh}c$q2SFyl#2jka!*Tgk}RMPBS!K zhrMoCj4NNKvK|9?2MJ`hYz7IRD_>8jl+~{c53C`$OnxW7ZdknTe^RVP;8{v8xe)NW z|8>LSbqu^1;A{QLcpU?~VR2ms-vs`Bha=f#usa5yGvOiSSnWZuE86Q!*bRp`4=!M9 zkoHF38bqR5fcaT5r^ zqlnjOu^STY&gh(MI>2$V;gK`3=F$F)-Se1}%|l>##<1vc6^{@(DXd~!GqU%-MBDM2oPsyBmO@Qi5ADy>eNjy~hb@qVRt=H$k z_=aKi)T?N!JwAIzsB7cEnV9+@=tAq>B~;oMv9{P{! zt3PCFy@t&GWHOX1Pd8Vu18EO(rE96vzemo(T^$5>_{-6a!Q)%nV@jtroC3ltQc1l{ z!sB+@6MDBzyaV2U__;j|!{dG#f$LH~UvhP6 zC)OU2?q+SGQa6%LC6n`Skm(+CoPtO@(PsdUe`_~+x}L8xe9Z#W35HEdz%QTY>+acl zRsgO4!^rJflOy%lnb}UU-&JN@$Ps&uoQw94petVNr857 z;jKbR>Zqnlybjdea5%2j zLh) zVUy0lc^-OU*!p>}zHgY5ZS8e(|914+)WetJNhpM*UV^vcWTOGv?(aP( zb}W4|D99c>zKcdxnM2lw9%zsKC-rEdGoe@lLk&8K`H`_dsKS;cPO zQU=?bz886D!(RvbyHd08``Ld>cE|d=z}tVBqrS)bUJv~4xKsV=y~bY#>SjalF}~M1 z|J%`fZ2u6LUpDN??cM9P|LwETrXLi+8@dsaYS-`3|Lw>f%dZ9PnTFc6e6p*5H|(B= z05-r6*?JyyZy8FSEbV6KeF&f%KI7^yRj3{8L(Ad%hM+CL8uULO&=Wd&asZRW`vA69 zgY0xeXq2?C`n``1d<$xv$%Xty5dWnMaNx8iOE$+aUbU8}x*X zPa@cK>p^vap>vJFwrmsIPa^b~*tW#$VEwEMW^IIQx|Yi`3T%AxjKa2l?lTJFF#jzd z4zQi@yLn9Ezw+$w&GQO&hG`#J`0tg;X1~kO@90#APv(;hQzI4FUU7O;g73?Zt6;&H z);gu8;Yrq-mX^lq#?}?p%Hm&afuI8XQ6F0qt;7Bq__+exlxFb<-rgK-=zF?Fc z6`JKX`hqcbsVM{l3$HvWPMI&S7HPX{QNq$7jYY`g8Kf|(XuIxMVPUBO)I z6f_o?cR3C-?euE=cHzAnHmLbm~7@Gugok*6DwFGj%U3_<{Z(nr$~qpXX0r7coUi`{RR3Y~_eX>5Kdh=6XP*AU7RW{!!*YA*j>a%wa2{r}l3CZEHv?Tq9*KpUA z{=;kEM^EcNJbFE~9A5vR92#Dg!-_x4Ar?G~X)6zs!>Vy|Xj~$Prjz8*e5o8(KOl#; z_v8={o=se0upHXUkzWq4SU}{C8qP4kw=@hf}VX!>JF-VbibVaQcDgQS!`jayV<7T)y}DgkMo4hbtGz;i@%q*tSIu*W4qAzt>5A|9D0I zef|eId{O>G!vD2X{(bqq3;6G=ljQK9F>?5Nu^hg+42QfC%6b6DTyC1t7+o_-y8L97 zb->=i8O>NsTHFs``vzZv%pATK{(x(Pb5>!T%@~r27JtD0!A|@;1tIhvL~uY{YmXW>uww{2P#Bh#y5r##Ux>Ob#-ckeUfLm1?jvi9s5h zLphlUVp5t+YzQ;C0^--2Oh!pbrlw{hC8<}>LGm>x18uTVl1q6iL^7#Y-#|R8$*Bdg za-r21MVXNTfwOeI%0^*}AU`PyL#ML?=A~fZ^QJLT$hRh8PR#^nQ3|H1!p2+*`RkK0 z8Nhr$731Xd0_0y$!aR`$OkE15Zjqgjh4z|@pj)EYV047HP}Bie6XkCM<0J`HIu(#f z2t4XWkS(n^dk!MzIsHO!$~IZ$9dJ`{^=j;oARXh@V1F3WI$U~2NuPQk)Ocy#KM7jr z;olV`Jp?j2p0u9^t)C$NVUzXyq^{iblU0CN*hWV2hi(qp z(x|gL5Mers?9k`*mi-Ty+~?|q(_6xQX40m*x9sS%6)?NOPwQhnihs|Mxf(J#p0x5l z)|-g`vq}3N<|{e;vcZ*otgn&Sx6J`dZ_(Ybs*kll;tw@xa+c9ezee68=bjg$rnfXu z%}QVvIXJtwM3e2~Vw#BA1o_RxtieCKx2#Cb#%}qN&3zDm*v&>-@v1c0*ci#?&yfGS z$wv2<)v4J?Z;2}Fz&P9i5VUE@M2{8Irq zHwh%YWqk?=y~PII55SX2An7fqrGU^|Y|vi-_;)ghz2)pwkjZIq0?)rAc{2-^dyg-<@w?y6Eaw#Cz1^D6*-5j!|QD=|Cw5I>aNt?FvaMZQDZWuZF zOisl|PPsrL!`tLA^-(!Yds_}=U&^6;uL~(TeXJagnJtGI4LlqygpYi>F9E5nn9hZxNtG4Tz&@wCIo8_V$ajFn zCr;FH(^{GnZ7q$HhY!aFSfkIf-UfSBaP&FWEBG-jf(=d^+i_W@7DN`bs)k$fOXrjH z!hGcL?Q$Ap9n&E>jkAuzkF+_>w|D+gW1=iQcMal3K&lpi>^XblUI~hfO-8Z6kva1$ zYPqN;(b9=EoEtNE7068z^*)u0>hT6NCaeiC;T9(F3p-l!3QQ-*u@z*14j0@`QF}3P zK|>2Js&8!7Zv2Mk;UoQpV?v!5p zOQIC;b4lm6m6EQO#2urKop>K~;7*o08{4LF$EL4~O}WLT>!o#^TGZZbTXmx_bMMO> zHX?1>#T{;?6-cFVS4_83a^69nic)sXWr+~?%uE(q(&4H)imGx)O;=Ti$>{r)=*#^! zU40!Pr_7;Ik{x&B)Izp8jy9GgbC*s}@}kaKR83Qj3f(F-!`(ae8xEz#OY?vX3WSB^ zV=`E0+}YDrRY_`7s|r;}3*d&Iu8umjrLj?k>Lr;QfhH$oPm$0}q2~Ue$<*;ywB1>v z9QO@P0@rhMV--42(r++uX;G~79LAwB-ikvuhkdFm-C?#sxcR71N!`Qu(0!_G~BGzRmdyDGF1u>cQQ@KBW6dBxJ~p}PAPfksr>Tx2o{4{iy;<>H1|Vw z^HqzHnrNw0q1+5kw68U({Ds1^*0ckqHEYvJ@d1C0bUg&?0RFib+SM z7IrEs^LrVmfsAj5rG)5)x9V8u$`^t(!7{i^e_kna@ZZ&JCNT*qWF?xpZa`#zX2=a=VTWi`- z3-cwJyVAO4lw@qB4s?|ypKp>48dC-pS}3X9#MTFC9gA+#5Xid9eEGn$S(jK2yE)H28PjfrP=Y0KnsXguTAbLNb&_N^=M9M7 z>?D1Q=G^IN&Yh|s7_8^;^%|)*B7>Zv_|>!K?4^QV!hz)4_Y^pRB51DB!qtQ3+*zK~ zoJFx(5XDJGqvY(|_-&eVXSu&QccMAp1+FIzAF~kBo;7Ev=-D)f%2*j_0NDsq*d8_K z&T?;amhFSB3NRc`7Ad7@#ir4t=8P&Z%^8m`ZUxQNJ}TXu<+PCfE_CjT_d~WfMcZ&w zEFt@qi^D)ev~3cuMbN5Ciu-NCoBpmuPb!&sKGYaK6+=f!sr)w4cC(Y8U6ac& z-F1`3{r-?;pRzCHMo zzCHMgzCHL`eP8fHeP8hR`i9^i^bNs}^j*S_d0%j!x>$!g;@7@Y*BHc=uUVtWo4_0_ z=RBBFzSNRPB)SHs!_}&6rHToP+N+TM9amDYaC`=4sqB(z1hMT`b3i{3zV-j z@=H^Rxi@5Mb)t5K+G{Qm9%<)t02dwyWN@8RmWt)7OJ7vv20hEujx??e?$2OZ<^rK7 zrgFg|3UgkZXldv5;sY61q6G0YLIEq&ZklX9%AT#(MQhp{)TrVsf%yKYl7HhinOYV+ z2xHc=U?aW*R)D@KxE$iYOgrV4Y^L*u(y}0Ta?iBCbqu%V&ZvjSQv}XD4OE&t<#LJy z3l6Hh0}iH#w*v!$(0O^~y7X7DHgYnBDs zhL_3uOJvI{MwK&5x({dAkOx3YsiKw-$xLW@YHKezO zURO)k&qgW)8=n??oil4$y5nCP~)7LeR63G~u%66zbV z$(IV=BMJ1|a1yYdRI7sbN<1AoJn?j-3*Ij&3!Ic3{(=SRBqA%75c!#GwoShey+AlQgkX;5bQOBdh{wW z$Fm|+Yh?Hf=7`~tt!+tjd*ZbMWs7>m8)FU$Vwy6F+MSFT4X`Q73V?EYUda~$1mn2;}R-Utp>d2If4E>d~E>d%gJ50f6 zOFHKRx;J__;>`|8l?ZXRpoOG6Q4(uH9ZqN2TZA~5NY%!+ORk7;p5a%g2S(|v($Vz2%39stl2D~%SR*Q{4IU_^WBEI%GPGRjII{GO zG&-9Bpn%-k>bfYR= zDq{(~$?WKwc(fYpYpQg)#Su}RhZL@(=r4DCWC9A5i9K($yAiN+-4)870N4xYxpk>(aOsgRX6Yv6nn?BZg7`1kYU#dUkh?miYlVXTaLFRk)p1OkRcW z8rT0eSahVz;WR=m#%RFh=+e`q9_U)9HSLR2DFz#+!tOVS-RW`XrrPHN5y2XA>5Ud= z6m-W+mVp~{Jb~6ZX)Y~FPd$;aXPK~uD%~!Ip!c5c95OT2hQOSGH$6&kmqKvPu0`ZZ zxg%1})-~w}PU3Bi8XK!gxkj2NXZ3m}zDQc8Doq5~hB?jmOw-vKak47iEFez)Z56cz zkaD7=@OmJ*c-l&w2$!A|;6#{L3&}#-&}i^yTU^iQm4qwe7#j6(vBjA=9S=Rpk$RTs zsC(E|=x?a~dIDJ)whvZF-w;5DUB#&$-4mCIFV?akGg}ti2~akFW(KcLFoJ@CJcHL> zDM+Pf*D_m%xh)G$*a|3rX4iYFA+l zn>>a+Wx4!SliPUHAER5nzDYFs&&-i``E%$7AYUrdv`X$EP5zW|zhNT3K+l^+5uNrK z)BeFUej$zju`7M8PHyGth>imKW>dtD{tKgrF`8dMjlv;YpbbqL`8Vc8rvfb!k&6eN z^j9X)(ZEhZo3V@0!6r6($<>9$%%A~;GA>MaJ#oVd|;knbwBM}um`q8qBaDHfSZjVRn)X|U1 zXs9xb45Ai7ATt=kcgBo4^U4;^MrJ=Js&8a^#q9D06?4i}*3mEALY}(L*)5%AI2$bB zUBIJX{012^b_Sktaid>iG)_bYe)Nu&K-W^;=kTNRMHKa5Rr>|NZ#e&t*8l(H{NIHq zPpYQPt1OSqE?-nWTLr^=Uw$#18LIFe@91po$kJHBM{nw};U^y4aARl3npdfSC!(so zrWtpXGCWb?x+XY#1U)fTF*x1#@kGpPYk)_`y6Qx%h0n6M{Kqu5)S$Ze^hCk`15bS9 zsWp+gWffJClETpuyu^HQd1V9@v0!193Qj#Jtv*sH&^2XQ|F5=Z?0`y z+saIf(j@~`7K>|`jkh$mOEu>GD~w9W3?75;eoOI{ z!~T_%hbEWvHe2%AKLoHYJZ+G5nNsVpqyW#NX6*caUe0$xsb-XZ*`+1ooB6!CRX5KFkV{i}Sla?Q&I?H`9_K z1J}-+bmYylW=SGe997Wz6drl$y69bcP#Y|W~4w&~& zKc7 zl2yrrxyb5tZoXJ-D_$|Ts3g^ZMPq!HD=#m`^(0-yxEbN-NR66@tgNCdlnNt=!a2-6 zhvyrmvpM6x%%;f6<`QIalgVabQZ}3ayKG{1S-wFAd!PmCvYcQtnaGC#^3Lu>Ch+Ri z4^LaigSXCbOD$>Ib9+sTmkU|jLHVGerCpS!-O^jyn6mm@h2kQ(c2FgiG{O13AdRlJ zO~7VhEeGu?LoH^|)LVN^4KoP!gP?udP>U%v^+mm-j%nJxu2$+G1Z@o6g+9oJF)rx^ zZFAIXj3&^oG1S@^LVa1UsU2fH3))uG7-GS7@GrQ+|mn;8+_el zD`>Aa)Y=$AeOs@o9b ziXk-Z{k^7zAuQ_#_{SsYsuLq<+Mo4~7N^q%poz4e(cvy4B6)dDT352=dO?U|$f@YRW4$b_0FPUSSw+5U|hF9C-fGpVJ#oq9?w7Ir; z2&~T-W^D^$-qBlT#}@nE4F5L-uPuc6SG{DmZP5(QwT4&Q;@rNl#jCyHjkdV9cowX$ z7-nq?Vg7Y*nH^gUz6H;JA$V;e%&+&7*|xGsx@wWx-agrDO)zQhYtW$|@`7$r6n^a=TLN59o(&ajlC3R==NMY_5jiGVWIg z-IEEi}6OCpi-8PlP|cr5_a(B{Vg zIEUa*1zg?M0QbaZtTCsvSGcWuKE~}|6~G-r#)>qS}gibCo<>3=TUH#eKsm&{l^?wt?L5T>8ye%Ua>>_ zULR<@7c%_Mdce*+fkl6?)WDN1%Fl-Ae1y>NSE9A)ys>;;t)hr*brPJsiCE`E<_uf~ zh#FjpfpM&LU*OQ&kxRT0w{We;?25N<2w0EH|KJ{2tH%18^@P-M)*f^qjkGB1$-scm zEma`@mGzVekJtmoj$^AzE+|_+mnEpeF!QqR5A384-vdV9B^2k88_-U2$fM(=bE<5b zBD+7nPO)H($~LsIw!~Ux{ldaY&D3yFktY$SZX{I6`sVyu6DlhfRb%mzTC7D0&qN4G zHj?4%s2R;Ym%b9#&wRXGjbgl)64n95FMTxXR4d*N&89V0$K#slE)uzIuxPAb08NKC zS1sK1VrR7W`6+G!BZT7khmP24mvoxA>fxdII|75*X99Ua$_L6IJCE|FDC#szZqbzM zI?87Ibq!SLrj=J#;g$HtM9R7tJlgU!i5dz|z7>%=HX`e$z}V9R%FQL_B-@T5tlD>sd)S8}XnTj`o%~iQi1WtwO)9c$>n(UY-1Lq=U4;CY$a`Q9F zhFB`^U~=RRwN63bKLa6jDGOZ6C!ceNX?y8*BU?v}$J!*l1h0mWbq~ZJb09eu^VhiH zNw`WppCO1pLi#g8V7)J{A+sUA*g%@tc(ht0 zQy@h}l@(LhCZgfCw(7MSy&1?04f=P(OrefUL03gIZEB_8KUQzB;KC4QPZsmqF0(E zF^NXavDP8_G?OId)k&4sg^0evBz-Xon457K^a(y5C#{W$A2r2XEc6Pn{G z%Tnuer1iPWDW;@*%n-E(FwLZw{L2)m-YP_NsY#mLAGM^lYOrP@dXY)uYO5q-8vN@N)OyfK6U{k^kE$$nSX%+CPG}0vm=Z z|Jh*ln8bDA+zWjey-sbHXrFu0E)cvW63ivZ7+;BI0kX)zbcqCZMKa8kXg$QwG!R`P zfn1#oaZ7Y3{L(oRhB@)Pk$q=_hiy&WZFuFusSq8FV0I*9d?mU7kgE(#mq=i*Cc{jLo`(3#2BJ$Okl!Rj+!B2S`944M zmB=$1%QF_aZ}{M~9W@w)WmqW&@F)lD9mUPVIx6?gBrr#Cy75~H0N14h+YSV|ZzUlU zKu)_1$lHOs+aODMQJ?#ElCZg2e-nc58(~k`+Ub~(`%V&WB{G?R88X@XL7W5-q^iAT z6L&VjzMF*QoAl_iX3Ya`VLGh#f5?3=3D^W+gqfZJ(7EY=+EXI;{UqQT01qedae$sl z2ef@Ga(|bETnl6qk^ce8dMHgfwZ~xY2T8zs0O==ajRk08I-u>wk^5m1vJS{ca4xl) zfl3%;>3$rxKZdZm0BXeJ*|VJK?G=!`k}$kF{rAb(API2}mlDX#+auEFWc1HpZk zgk%2^MCQYI=?{X=N%tQ?e362%FAqu}J_WfDR2=8) zSbxdg&j%@P#S7)|vRqFmxCW@(3{pCQZ2g;ipbzQUjo7|8d;_50`+*ahVs$DvM4&rc z9)rm8SWMR7tp1N->W83DbC@XDv*ro%-sarH{LrzC#ax@qch*e67W$xSf_|ZM?r=YB zoJ2dgQ-C=q30I3ZUs2UUe;IW&m6Z6JaRqcuS@@Dnii9T$Jli+|S09cj;#xhrv%01c#9Lq?If0AP}00{@ACNQZ9?vJ@; zgt%2wY$pIFro91>TM6SOhTi@yccw2Fv$bX{=8m6l0rGdk{Pxi!Y00HLc~<%}F0r>x zV}lSL$$rQa*vtzdsZrQG+!HT%QF?92fo1v18eRM*keosyGoTAc4qcd)R%mHg3b|CG z)BT`%!RW+p;ibBSbIod>PDO=w+2GYD-HW#iq*5}T#HBAnl2)ojSZe$VrKQpB9~4VS zW3B_WfhMp^V--8M-lxxa9qlxyGl0CnD8aUj-XlP^kClEUSWTdeqMCFAc^b%>T za6QW1&dbzw>EY(g{TPrt{Af9SPl&E*#q%xFmlw3C+>Jh-qA|YY@??YT`*SS4A|xBc zX64{Q($oEu(h~2C9k&3x-NCbQNGck~7Q)=Y z1C2wcIHSi00DVlLj2;sb)vKa1xL)MX&W<;yf&-t1>lcE@2D({NP!F${`xr``1gBLl z1-ikH8&Wby5ya!?J z1Sa?kN5u*8)C3 zS`ch-NYKVw@Cb~9|0or2QXTvQz&`55&&5L}9nrFAEnY_3Sc!LR;_hqiCw`{U&?JqV z!?_2RdiO@KYwUW|V(w>t2EDCiZA@43WC+i70J6re7g=Sq$lNc|L9tVd#;yZyv%#_f zda+-n!(!C8!S@09i~+Oxc)>fl0k$Aj6k ztK*4sC+pFGPBri^U?VR)vn#kMcN?&$7`&(4l6}9f@NU`f0{BTo;3>Nh?AaB8TYg|O zo=+|R1Qt~fb9<#BkpYskFx!k1K{3lm;3s8BnLfSdWcR1$pz_%u-Q&q zBEA?K+^F0G{7glKZldm)vMlu?XnyOXQWJ1FWpfPlbCftK9)kWa;MOmKJBd>z2WOyJ z9PG!A*W(>Jjtq6v0h#TkUqscl5Z_=R=>JpsR+HSJe$;p! z?|^Ox;BGHS?uq6OO93$+Ahu5H0{}kuf~w>(o!pUrRB@t363SzkuFE>zz!#MofuN1S zg4#3ng|tYKA6|kn&c(}W-BMs1)8J9q3a-G7^D~T-XvtoTdO4uCriU*S`~*K9wqm>x z$U@#*0DqF6U^bs($~`KDfbl{gt9b{#gr#qUWCNf83pGR7&j1@rf>6l1-g3ZO(^JgW z6y+%tk{}ea!gn3uccq~y8JUG@sPMyC4K7~R`91*lA8GI?#dPk~rE=%^IZz5oKm(HX zz9Bm>6GX623(I*TKh_UHwq-5tcq8{<96}B(6xF1Hc6? z=zTV`69_U3R}<(2A`_$XINPaQz&!=XZwZsjN;X{?k?qDRERn8Q5{9MU%UJqA&@61g zDJ->JvBV5ZB^aWHMf!}V{R>Q)^oTAIBu2>ok%UfXhyJ2CAPGM>3 zilxc04E`1F`XXq%uu-S5#JggdKWmNQSqY8}hKFl&DLkEB^Q<*IcY@;?!@~u;6rK~i z;;|R-J_lUA;uMK(T$M=GZ0HI&f0n(FR|r_Cf$D`kfu7nmG^(5FD!@7nbbSTtgUxw9 zUf;twVKFm?Q)kEUo`l0dn=(0Lzto-kY-Ce)c$1dO@o_z4Q>hU4uqGSd&didszS zC^r7QuJO`W1V5Gdq%LCPFYFpGy+rV*5TDdJY`pjzn*I(CKUaV0AA)~^_@r)O{0&{>?cN{^o5+yV32cU&yJL`kAPi5FA*uP> z3_t0bpe8{*ATXS$??cv10+q}2Hn#gD5^oV1W9AxY>7*lOmpO!4O7b{ zPC|K&23VrIIqr4P zm|4C)w~oO!gP255M;GOU6W5zL8Q!yX(YPc5yf6TlQ3+6OLeTbhFJMOVb$f6rUC>gM zz#>g9xjbtOzGTcZc;)seXnsyASz|cMTJJcUD(lxy4x#&4qv~vVjm)y(#b@Gmz?Btc z(betIN#^aCwa_2?RAnFf#vifs`wC3pv+uC_T?E|Ww_sS!zSE+wWAO0#OwoU`4!;RA zq3pXPCHEZbEC`=t?Ldn=#|lI29P3z2MJi(y%D2dC9egpl4zoIbi$~ZILjOdp(y_y= zvk`N#6Pxpun>5P05z+UVq^+13>GuU`=s4>cr2WRE^UWeTeLf;}CUc)?{Sj%OIqBLU zrS$H~o(3D^aTKve#fozM{BmJL@fYRe>luP{@jc;=bF^5^~|0doFji76&^!K#YWqt&<(33)l{0zv>b>$_8%aaP> zW>Li~PK5Z$gh(lL7UC-9DTI@U0B(cuoi1Pib-F4kkFjw~BVbuJ0qboDf8YYeK*^WPw?Y0+7emj#?CXK?lm@PRE7g8%yT66thZJTP)1BoE3l}@t zH~0~ws}l|+_id&2L-0VvTQFO^#FBGi|FVvT_)J1rhu&OnOe%}cMlf;6ulHk0AKn;InRBjNvw@T9Cm)4z z;pW^3!0iO$6+`B~$tyzvxRie*^INKvsOl0dOBuShW;KJ}LpU$TC9L%(>^~6V5*Toc zSAs@x5xXMya6-rlOji*zw|a<1_6C3jg@qn1$UR#j;su57`(^lcoK-b>A5p;;19GPa zI~r?i=60{N%GkRK-6EMPi+l&TPc@e69aWJ(*UTLrc5oxKu8k5&Zw%4%EhvEy48hB2B%X2MP?^Cw z&P?ECbN>V2M-CXS;%K`4%f$_j^`fTOvUl*}M=-+}*P7w)=7ht7LKb}xz*AiUexc77 zwL4Tsk?WtS&9*a{d{QA_4+p9?;Yh=x<0No2g z_R+z3rA3wNbpw1uulOO2EzK}MYQ+AWo7@4=2^uIj>OG49Z$uK-!vibeg- zrA<+dhZ>0Q+Dxb!Hx-ZKwCG_VUeYLf0m)~XSCIbCbOnBthaU|5{`JRTiKOhm1H9G; zYPcEJ??qZ65Ab04Kt(g0ol?ouqCr5^XcQMKp`Xym)q2pO5=w>cKW=K&2HbDN{@KIjj=&E}9{tl)=E%G-gOw{ix z%HHf{A3AwzGnchXLi?p69-8v|z>7Wc5 zlI#Kdq}&(uVsAk9SFkLX$OqXp?VxR#J}OT`MFg1{pQK>%K{icWXd4nAWEpS=GB4Et zS%k7I(N)uB%%C#fMfQ&fvNQFAJS?Yq;~Xf25gU90B`AVK@M$?syJb7SIm^zZLiR@X zF$Cdp;`t%_&NawC&c*P-IZek3r{}mFT6e{4Ot3xHTiDC$c&HTVpj ze$p?{IYd7V$g8?A-jMJiI!$I>c47Jy%}aOD=kPU*5RV+4qSH@#2;6##kI@VngzS4L zh;@ukzv$uYb2KAcftnLSzLW#WM^c8~4A}h|%I|qO7IctKlWmyYMqDp8Cuzoi0_;yA zJe{P|?|FFZD9z~YzJUE3f;}d57EZ77fX-Q(p_2h?cc9i;I{kTWJe_HnVKLB4T?YAz zrL%N8wz$zxGMY{bo|Fudzjo0)IrxN~E~f36-E#x2BlhNB!u2wELAIPH8XvRM%Em=^w|CBF^h6-*Jv5!O(<~Zr%61RhjJ^QKg&z8F zLih07Y@f6l`W#>@Jt&>D)5^|9S35pxGpg&?5Pc%pjb#+e6zu9s`!qE#cLQdm#_^Qo zvv#_dU(v*2o69{8*aaFdJDCpK>2e?MoVFRe47kTVESAZ~{y7%<(9b@OfJqeJh21W<&^tL`MbmG1opsO{IPu%Ig zKF}PwpF-B>b#^{-r+4(T$7k+oeCGZIxzpdOVdpi0&)n%jKFm3E4*+DOhVfC9&s0pn zhwk)HpTIqJcLF_6GsuGJ)Sc$TzCGWZWB09qJg8yT8JLdU>9Ky9-nsh|AivdUbM8)0 z@PW?3dyDTd>Im}LunJv5Th@bpY~bWg4*A<%2A=AC@=hO;U`QUl7Xy8#W-v$Z^r1f3 zI(x4K;B5uMQJwmit&8mbRmbS48`kzx1ldd;5_5pw3d?S7syC7|@+bW*<_H{+Pov+} zNaQp2LHLp7&zI33!0zS0Ph!()4$!!qJuJepd4IV3P{(G<5%vDV$L3)uSI7hKHsV$M z=M98%DnK8bKSj(hDpuB!8>)`Y-G6}o3xQGDgA8<#=#A(hI*CwO>EI+jHt&tJ{Z)GI zV{?;HFi!@(I3AEw6-<^GIyN`e=p*gbsJ~bW$O8(dj9YS z2%~DAi~J`VOz7AQjC*Xp1NoO4%muUtdB^6an#8er6%hY5sL-*wsm4DxZ}KxbfP(C{ zz_GchhL5xK#EX&0Ii7OUNZQ9)_t@N2BTuu8ITrcnyO`jyIWC7DIB_TPKR_6&m0gZ^ zY*qy^XcYioxS-In8Dko&oVj{Ee}Op=LOeM`$7X}za>gL{ctXf73mlvAlqnfLmvI7e zpKQtq9h)r(7qSG|?=yvjj?GOq?y-3lvVWl<@iG%SHaFF{$L7s`#r+oq+1b1xR)vnu zH09)HJxF~VyFoq#z(x(Gs)vuwnB!XW9Gg~L2-qSI8aOti_v2$Ty*tFyK)gyQGX;ak zW&@))lqmWQ_Wuahj0zo_F$_xi%uDxBKz1jXT)G0sW|R{jo0}qrG$Z>l3L@VhtbO*5 z&FB!VevXmX19evj=^mR6636Bk`VL@UYN&a0RRxaCz?)-pjNjsS?0*nUuf{bG9GkI- z7!5Qxxemx_4q9rUy<;;9HY(`2;L8BJ*@4Cd^Re4KHamDaHgn-`0R5@UAm?!4*vw5= z$7V)v5{YPg1gqh^TL>PTG1k_x89oQ2BQ%uQavYnRY7)ohCas#j1`O6tidED8v6;%% z$7X`o$fmyr?7O-K%dkR+kIfh{qnzeuuP5No6G1jR_p!OD#yK{}gSIb_hiEiE^uc4Z zMoVk-7=0#?mw4#Vu^DLl*c_vu2J%%89Xd8+sO7axUaPp##YG}o4?#9sRy%ZTZmQt} za9rT7KVOS+|{=1$t7i-;-^xRb)iW*QhvP0g@LfJ`;8(6JdXTTgv2W~;aqkc9>oIyO`P zFiyQv8TcYVD>N{8Y{m@Gnre{}Q5r$EDtK(h(l1rj^4L58xrZr)+=2v;&3HDYt{T@y znx;k5069U!=#6C^L4wC-R8uRfDgUiN->VsTF=A!4e{9CMYi%_Oeh-kZHH-_E*wC>V zLt(3{o1!hcil{Gwd^BolC1G{7e{4pfT3?Mq4+3PWhFOJ%j?FZXw!#|j2%4hHfWFyf z;He%wHiN-GHaA6Y0R5q6p#7HASo_Cj?k}aXUJt8v8G@V-!DBPc2Uc)Ti*`rOKdIbu zF5uWq^AKm^29#Kvszq`}{-nRfGU8;6XKkt#X|vB?3(~h98+U~zPdDizw#N~4z>d1{ zc_HdiPnI6tdr`g~J;f4W9-<-%5T8OhX;bkmqF3moK|nH%GF^$2HWyve zB3c_k5>i=lQZKPNqWkD1GWdv-%EeGbSL-CYWFIGOAtoTYK__LYn#{UDOls;Fk26rz zV=IWwMpyKQ6WFE>_5nL2PQs-D$}27b{wm^F4{#hmC&6@GLbvvzl`2hPUj}Za#_~p| z$2LIO<*AL%{-dWwo1zGj=_aBL5M(c~=comOcYLT~)T6hDuT)8RiNp+}fu86y;5rQB zxAX9WWr9JU3giVYy6P$#@jf21@|ZS!RS~3w-GB5XS^XygUE#p9AFaTcNRI9Eb4-;S z-7|RgBbYA8?nu2~MepDqeLW866&%-MEYJsQ23Y|H@0br97k@f{7iq98nf7`;cJjb# zujsTNz!e%y!xy)o8LILz#Ko_*mWVb%NVJ}AkM-EqWANV0s{OzptT|-+8NOS7cwB`u z0lh@SWe?EHxyLXMZoiv(_C5jBvkDni(G9X5yL%w#)y$}0f#{Nrn;ccqW~s+04`udB zF!^EB03e1bRJM|52%XM)jP{`NbcQ=_^n5h|(W+2*pkb%W#@jvi@la$#9Gh>`3MQ@r z=td2!BHQa8V?2y8zK$Iwz6QX5G>A(hlj$B~J)p9gj#r(vyJHbR;5i^G$wtaO_VsYu z&^dNrxHmv!G_Yz%C^34B^DxFVId(vJEC7GjAika7V}F30g^}bXw8ZfJ@!OGm86jv@ z%<>||5|bX|eHbJ&8udO9pS!3-$<26=30@7^(>R7%^uPvT3k3Nr$RQ>{LyrUea-^Uk zzTQ3tkb?-u)srxiGxV6~!=#)chMfe+*)Hr*GS2C7pjSV(&Y24NCo(@u0DcAXb0Pr; zg#d82{{b?8sR8V;PXZ1O0j5Qw4EKn)L@UIqID9Y|YH}X>5X4J#|MYb>1V}m~3FqyJD5`61!>_jih?nM9Fu3IztyUX^Y z|MZPAM-wL%&<=ymzatLMGF<_ObOJHkqG$0bhPXlyUC9J=sdd3HqT)p_V7EsoAGS3f zIKEB10r8HI_sOGdg~L@*VI|_8`Al-MMvZC#M|Q}ms6G9O&JmOAnvq|NYQ)Nx&$lwl7V4+}gR+IFw6bNydLkNyP`(cO zNGn?oMog26&EocTEUi__mf1)&NxZat%Vtmn4l=#;gqnF&q>l6%FPYnfrNn7?TvSa)t^1 z0`RGtAgG*466iW?Ky~;B;Li|6U+Sl@vL?w9SArS3mEsV9AQ?i+n~n$#aAXB34-Z{B%n-6a19>N*X=d3#!c=J*)+Z(NR` zvMEWz^`Hev?ASv@l?dDwc0D}hQ<6hggh|>!aGXmLQbr{?lyZuja~~KUCKmayg_Kjd z8Mq!l0Ued;aSbS|k_1|L#dX*f=;6d5>kv|2<)Pq8oB;UArV=4#R+2*QIkAlMp7=4q zpH&p`G9FTHC3)l~RPn5}k%%@#kb^5<2O(uwlE+ql>5s4-45|iAM~w}uzmjxD9j0~< z;(8F><&gyxVo5HgAfxxa_!JD^6N`C_f(o+SH1rx512)F_55am0LJG4ai&miV>vs+) z<`IpYJplz;l0hldsAHJq5fD73NaQXdq*6;V85Nu6%5EZ}9tg5~$%6B^@l@t9p z6;Ty}oFv4aL$#NrNvQfTwBrZHcBp5AQ|^-K8IyLXzOpY#X(|6CS&e)wUIp7brk2ZPZNj^(ZrdFrJK{VAP3#k>8Wb&S^;#mxiJ3~C4qA?eb zda6DH#}Ar^AE=<>G0EeJJ9T&M-V6E<1iQOJs>mdxrJB@iXM*Vxk1eE}OtRSmQJ%Le zK=Y=e3M(sU--^%fW}s4(z#qr0Y$T+2`Mv^G@f#kiS7W&QcV<8 zZYGJ0vU4?{-)MMH*_nhp%Fq5=VEsdo1J0{xQ2CjpiIt%k>~Zv(oEFUm%{iKib|{vZ zAgB;ck{Sgm;hzQD3e6}h7rIxRRMYJt~Y$aDsvV~NpNj67?O0#l8`&4s#N(m9uXE`JqB<UCYtM99_#Ix7rj9LUF1Nsk1Y<+rMsh@bW$)+Kj}9kvLaOf}63y z11FFNwcj^Z&uoQ)3Bf_5xz-MQqtBaSf_)BSQJp$P~v86ZawJZz@)* zS0!Li@e-on(@89JjMcAlR|(lF3I0b{*x%r!{UJmc^hE{s48GAeBH9X}`~{TC?$cO= z8v7?B-)VyfMp+in+cXt}v=1|x2Qra2z#yiAtA+Tu6(o&is=eZmq!Jm6)*Z4TiCl{A zUQj(`(aDdm63gL%wjO2Ed;POl?E6aD9Zo)JpIp5^(8)(PbFCt%!C-Pz*|h zy#GG%4KfK7PTy8kSm`xWWrxfL{3N2F4#~2vet~Fcv~ot-$qA+bP7cNOckn##b1A0A z2Ch{@lFP{fF7BN5dP9zkkfUBPTVsN4kf|BxQGE5_YWDe5$x0`XJu=DXOJ$UuooGbGKsOJ%fHk7`fa-pt zi|4PCYrxL%Y?`DRp#1KG+6O3ms>qXAv=P3SU zL3W49Li ze1T|cuWmXL7l5j1g;Fp`w>cIM5tmg1)M$mo3#F-jBtA}FJZow)ln%Z@eLf-@A{SJBrZr``TeSY-}3p=!_J&sqv&j9+`0rF=xqUv@F zhQ@KM0&Te?bpZ9MGQ4Gp5!@)hD>s<5&gy4uD@=5P#RD`p+JSVijnIopApZ zL3M=m;$MA|1&Lkw$6rM_44Ef6fCK4b%eaoVsQP3Jg@azJNu>jFRBB}t` z(*kw2G);z@wPNrH{Ee#5u%HzKoJ26tA}Njo`Y#p(ZvN0mWTNWxEi7HNp;&UL&A4 zk3HhjYvGT0#Jzw$;&#g%Exykj=9BS~H z^40JY2%?I(keFl+b>W(_(7QqG0fxPZhj9l&3`!1K~oSCM$cFtTnKtvlO zl=J*l&YAllW}u4APNAtQllqBjL{HF3yl69ctsimAVpM!Mj<^{t8VG=nnbs{y$|!ve0G706tKsH5Wk4a{4F z<5A>`5UvAfg;SRw7`4tINP-Yz6kWl{TpnzkDUMb&F%qD$1mxDq;;sk+Re20M0g#go zj4oSvE}eBX?Hd+<1>`{kqZ<~UV`l~Pu2p;v(6+J|1M-b3G2|3l6{asbaB16ALJ5Wtmqr&IGOlar z1dfY49GJ<3lMe+QygUcd3MUtTENXn7xDc2{3KuVGy!NxJyTrRhuJj80B7pz#z;utn za~7>ib}lc#a*`|1V<_(bBFHhNwgjCg#_1~w1Vkd2xu%L zYk(T3kn-IYa4W6g*3|<=a0!;?U-&R`{Biv!%2&3DDBk6?8N[eYE>0=TL9G%wZJxMJW+;SR4Z)q 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

XK&#Y? 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 Q@YQ)vV-BR;tAT$I~R2EB7k1ZN>*_c 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

E6Bgq@o%1CXV3#8 zJ5uDwkv^BRGA%)TK{Av4qqzy!(YgDw3d{tsa(%ct__RM)7xC9^F-SZF4*E_s^MkAq zM>O+&Y+i&&dI`A(sK|9SDRKgc??7bS&^i7@>V%oG4@Lvy95P;8MfjG0*0etP_o z=S7|t_!$sy0US5H(?%n8!tenV89S1(V2;fk4x;AoD1 zz`X{@O40NrJB~&Xa

5pxx?FE2vT{T^$MgY7cxsA zJ0tsE2EwypfvlMeIZ`04$Ufgdc$O@X;#^3&3R{Zo%M65P&jRU{3z;fX-az)12Ewyy zfvlGcX%I;9{W$uFAl2vDc16V|=>5GtNJR_Wqroez^Ac18HQpfkBT_;4$QJ+JLps;) zrnB{906NVF4xg26NQ(Or(9V{(Lu7R}%Ns`O762Y0keM*cEO#G2|P(xZJ~6r16l<_{)L4-ovxx3G70=xYENCCnsp|y8wO`fU&(ZD=FUD0}iD~ zjDIY#-(dA;J11hJ2#B255{n|2f+;|NAiMeaE(-pi9>?vTu8?f7{d zAm?jo{2b+vbfO*`qZ5ty1rJB}n~7sw)FGIM#Xkv-ceVH&o)7zjXTNx9hy#1b` z@GCp1IVnEQ<0;$DORf$Z2dAQQoI@}>c$gGDdYl5#nFQp~V|aVrVU0YvUf_#M zOoHx}$zync2)4!oP6yb_J@g2o)gvswP&)&%mZ?nIYlGC z1L_wa$p>MJZ}WiCR5&54aa%o(k01g!m6UYs>{(ObGpP7(4=L4@G!32(V3QA?K(_Kp z@k1U~nwU~B0Hy-~wBV!&=LTN}j>j|)j{x>hf*C;5wD#${;_`uPQv3`N+dfxT=A@!n z^etBZ0acGDbib>h3k!>1^>O-kLV9J@VB{?~`G@23hE!it{JM`CVUi$pXK6Bs>U}0dzgzK3u}lujUyZD;eB=H zcsP}W%CPt=pJ`i^B$7{a-UYq~3}*#h?O6P+&mi|W)@S8We}T;Z)BxUk=K(`*M=bs^ z2E}DAg5CTnjQu`R_e2JU8qrGAuR|4kpB zZdySqopAV6m>!R*YiqC8qTd7bYXc{Bg9|Ur2RHTZ^E8e=BIMMY#jlwUZ|hzQaI+zB z>dpi`^AXtk1ADW<+xl}=Wwnb!8U{c)p9Qv5rgsceW%lsA*Nr{;lXfk%}L$FeHr*vRKFDGtFs z06*>%R4kzhb6+1jOvXLDI6UNi3&_tJmQ<|084#QJh>C1m^{ke5+J)hwZuTtRe+2XX z??z5LiZ}OB!!T$eUV|nBaHtDnRcZ0S91z6=^aYK_X9IA)3!2EbCB<9&sEYPxPN>de z+RpoRPXhFY2687)XY8+2iR{C9xOGK;E{C{?ZlP)4CNfn;<-`x z0CfL2d|$?o@bPFXif01e&^s023*!W1$n>Uo#~cERX9C{UdkWw;;{^K(!>&F9+K>~N zg7^2+W

7c0P?n9=7l8bg<$&l7>(T5M~-N3 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�qUgju(x2ISisKdJ=i+Oqv6h30s*`PAz%TgXQs^p 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%0DtQ8ilnC^CVl8h5%7Rk5)GqH6Z< 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%0D&m(tRRhw9K+U`i& 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

=B8~s5@ zl&tZ0h%aAThzfm_0`KDuv{(m(3qDcn0m3E}RjprJWUAH$RdO~o`aD!rjAX9(rl3mb zSs`|_iswS?2w*};aV220EWnB@I={}}X@dG(C|$R<5cNfXHbOr>#KfqWeb}_x`v4kI z67^&#aor_q8G)yc3kOjef}md1^8vFgVrMIG0W3nDwHojBxZ2| zV~=9A8Pnj$yP<9^OSeI3yhGg&pneF@6``M$6`~#sC7c)aa{w`+-#c~FT7fu-*vD&*fjG_!CqQ%qC=&|vN#PfD z4q(beyxt0HCKe*z2+&06V&{u^hZV3W;=Q3}W$|T*uK~0Wx*H&V1jf_L=O&+ZxOXQ@ z9+}@l6MJ_UKAl3fXJ}cSYuT72PhRMD$&{3v%rMQjm@kx+FZYCep`?6?8A2(`5K6P? zM+_>Z)Dc;5zrVwbDre5jWR_9L%u>qCQp(Iy%FI&A%u;f*HkJ*o%6y!!$X9(BVBxzL z2ty_+PCX6cB*`DOk|bR%ZBJF30lg%&g=x2W9!j0%l3FXPbD$j5@w&gRG8HktodH<^|j!|tR` zoQMzAZwxRzU&2-Z!*fyXlvbKFE|gF3^Qr$wfD@OHEq{E`NH}Kdbwl|v>DnP%>U@zJ zDwS#hOE)s5c4IPK?L&7r*ACdq9fYRnxF=TOOgA2=k)$Ct; zn^9T}-&wxQ2GD73#7rjJj+KYr2j}cb;jF2Rr1Cs9yo3qmUfn z-KBYkaRGY1T=`Qt0MkI!-{B4ogyf@yG7k~TJfxI)NXaKfHGh44c+qO&DZGd^IriVn zuHVaU!OL#L%WlQXo_%hoJi@u5lHrz0hMOuGZmVRtv6A7|q+C}SS^%W?QBH264RdzW zy%-&)l*;0JBIgT+PJ>qh%$LiDbgA$GzzWjx1i(qzS5 z2JI}vvUXO^+F7~2U2ueJ0&iF{yk*H~+>|&}o5H9zh2c#Pp@)Y9+)Y_qh)|a~(MZFS zHs;;l7H;0E7eVEZ@F%R%Ts8VHYc$szl7 zn^Amyu+c!V*S6NPIj)V|$Lg-2oULA`%ki*(w0{BQx(DM*K>I5y7cZ1Fv{5&uOgE+M z;);^54?)Xt-MWTNeyfyptCV!Blys{k-MS_ZS01kW&2jbNe6O|VpF$Q1eH!3K^?f_( zhK1H2D~MPMATOj_7{<@_h5IhDxoLgfBo0bR7z{b6zNrt@pe#XVqaz_Dtqdues{zec zVY!k`_v;v(PXHkuM12ZiI}nO@x5%0lW#yhSLY)kalo9G=C}nq?+RQz<@XvsLQm#){ zhz?Gai<0iaeFX?6MBM?<4WUi#rRQ0jH~zBFaQ&Z!hEf(9N?B+qrKzJkR&Mkgu|wrX z;Oa|;TPPWBq-40AlHsOGhFkjq*51$I!uEVw`Wj#bS=o{ywt_5d4_ILjh zkllXQHjsf1)qfX9p!|*5SzYY63{B zTozwgX)C_;e>l>@>V;&4wcSZZR=*Kx;c(ze57H-L+wJEzo7rim+xsJZZv~i(LSdK& z9^Fa0pT)?)Ptk|(eSq(-Lgw1!U5J_c7fSA7D7l_caxX*46^D}RerI%#hxk%e0NL~W zmr#2u083`S0ze8q2=MoY$5{BUAf)i!g7MveRBSHi<g49(5^#Hw04XUxDyrVNsr3dArZhR%V5t2ADw?4oQm|s6u!h!0-x5 zhsn5-YiJ|~s23V%qTNEBF6zUY?F73}cK}cw+r{w+V&ai}r!oP#0u(I-ndBUJQ^xZY!TE z?xHr?N29Pi4QrN}vrSYyX|d8n(G**S4iC z)=gzjkj<`@enEwHObk@e*w(T*sVp@CzJqIWB=+@u?Vxl^2sJn%>144UIJBA7& zxyS0hdWN)2SbKD5E_b2QL~|CvQf4P>Il4~G0lMpP}_GQXG>Q0IiwqeF$L=s)cm zXrukS)W^ma>G_#Srg0qL4z!Y4KV&lBKrT!>QAY${$$U}kLh0V2LR9peb`3no;u~98 zM62GfNy}IRJ;bH`cW@fCC+3+AjX?aDZD?>cO3{zTGWfAkBZ<} zxwd@Yl*a3;i)e#K#%}Sqaoj4`FV4&_Gc{fG&ScQ;Z%^WyzdIQ!x)IUcP2N7`l~EnB zbrPz&2&}t)lgx(ssLT^4se)R}l4)7OhzrLstb!Dg!y0NUN#eZG2 zlwE!>vwo+-Rfdvl#_IV1I%F)n0&o`NGOx^vk3_j) z%vaLbm?AC;g;|9NsjY~wYoz0j#7sX+{%#}Y{f(Fk%?AMzPDtUe*nFl@qvs$c@5a^+ zFFWWwS|>kVTnet9QH%eaR}nlk3JzmxOoxrGt5T~j0Oy4o=9kO941wTty8rCFiq*yHQS4tTo$E>^di4yepHqmCa7XPjwjD_y5}M8_M7#_jutFgO zlJXE>U{0YRoD!sjLOdkp@i3{}cJysd>03qOPk7f_Vg&yc!ivVNk8P!K5)y3&@5Q4N z{U+gMi4;<&i1M`|%3+|(F*&GxwQ~?{kUeRj%j}V)ta2OhquX*@(M7!MgCe;$yMJL+ zX#sY9m1s-iZorr#V!vZ{9TcKKNmQ0zCzTbVvW!xsLUy{pnyEVjWws;0)#bRo1Cbu55l zp;OBWQLhdaLNP?7mWOEb1YUE!sS|PLXHGO-8r;k6=zFt>Ymvzg7ZM#|(jS7f4ZDae ztJ0#C+f=+wS{W>nO2)J>HB5fDID*YJ9@2h4j~tz7)Agk;e8;!1b}^zGo2fDESuRLx z$oOudZ3%ifgNV|2gvVVRIW;C4#ZWCu+RADlM=4Z0U1az$<`*2<#+JE}aan>~*G*AZ zb(#4};$|AEOSx8znelTaFOiL|hynLlwA@5?~;h}>P` zedfC^=-}_oQLO-YIX4r+q*t&q*C|z9hmpBXsp>im*C{P>vEG*RL(l7_;buC{p#4(7 z-eeYW4#4yf`lRt!U%OU>`cA(+EL`bayVg}p$$5ZcDEvi}El-JJU1Y4TD?v8}Qb^kD zJ&FdARjYRZ!Cy60U#s3<1*c7Q5*@Ccs$3Lef&b`y=tlWxBYK=4x3?*ViOMe%I5zvE*5S_8n3QzisUCicXZD3BH(pXnQ z@+z3ITTNVA6(w}v%cGj#1M_;+Hqr2=Qp4&QNkh6h=Jm}r{9{WmC86YOlBRBUSYoQ( zzW~HXNGh06p5~e@-c+2inBiSKh`qV!vpi z7uw@XBIgS2Wn`Do$wqbyt^KkIxN|S1&65C^1XuBK45+67dM_l|P~qY;;70MAlDIu0 z$r@1Q4KBmI=VKN%{DCl0I|Jw!iu$R@#UG$or^bDsz-zs0( zQvC?crBII*x5rin9sJR+k0J*3L>ILLNP*g;as9Z%BjfndFe|1iE zSI_polTD(@^Hi$pRGm6?>eN}f-|n81EncVV=^PQ$Qn|OIqfp&Gpj7l1TTiMgcWO_Oz7kUO-@6%qD|bk-mHP*2;Fj z((6mxP#d{zhyk`|3~J@Psx;`jn0x7b$tec7N^h(cB!U#d0_ zO{lheS&d$2TlK=>L-B*bsy$E@R({dR0nRq>`JV=>7Dl{^Q7Ej^V9@b&xNiq+Uq`^`gXSJAq;cGewB(f<*2@u&kZIE$1yG ztA{NksIO#4g69Lb;Ot1)f`fW%9i61V4SPcRQ?a1O-bQRWGC}=Kpgx1XGTj9pB5E#` zgaaVT-KQoRe45b{3otd&@p?4#KLRa!%jPaTd2-{g0%NFoyg)m}!P6!;-YT&2Pl{OR zjGK9lOkj#Lsrwqwr!LnZk14!s{wHU=f(gBQF7y^qI_d3vmG7~4e@HibykpKsJ#56* zs|Kc@-Pd1HC-AfT_&Yi-cv7{W64+OKAYP_sbr3vU2oJ(f45+5Yb}hjFY2t2tJJLc| z{;=jQj0{iZ9%)-z*W8we%4U13PvS)|(u^zv5KgI$KLg7kHQvg0sxP8}Xo z(8h5BW4x8?G_+)w_8CodoJTEjo>hs9HOMPn8Ix642}FW^nG)>mzK~VbsNAGFsa_ZL zZnJt_AnLWJv1)^UNMQG`uyedXi3%c7UC+I#td7i^mFU8VqHwMHwvxJzsU{(p#_a-@ z1u%hCntJT+(}+AQNaG8&^_x)W0M(O%J|?vd-!ZxI;xa{`NElTjTNtpU##phQB#u=j zt!!jjZ2y!KsoVqlfRSCGo!)Gvq~o;$DbVZ`fk@C{0%iH5bK9qEQG9HwJJEv^^Ua^0 zYu`D!af?7T&dttr-BEIM?~#&wT-2Gi z<1j7@MSZE{V(-_4QQA~V8}j#`eq8A9nlLU~u0%hXG@7}qWR~M6NyB34QyJPPGBm3Y z(-_((F|<1b?Xwoz=Pb0(SZJTG&^}wCeXc_LOojG&3hlEL+UMxD@_kqQZ=B&pjootG zZM*mNRWB%yDSU-BiFef)UuBJ{ud|cVI?D){)VpkqueHW_M~(6I))-%Ljqx?t7+-ab z@h;GVHFZQL%lCZ+X+?%QSfFhZRIN=j^A4BPJk=8C$(A@zx5Rn$6Xz+HI8VC7`Di4L z#A8Sj=Yu1+JPVV+^DuFqiHY-EOq^$9;(X-j{jh73_gj715{$g+e zeXU?L7ZdH2cr$1sSx*a;31Ge~@T#teFL`==qpw_h)n9R8LWm0!LR^>v;=&XV7m{9F z$aHZb)5V2M7Z);JT*!2B(O)v%7OtUJSx<6PtEYMYg|)Vpj&Q~NUXC6)?28GsM-JNK z2JKOU_LxC?#GpN1&>k&lj}^2>3fkiY?NP$7M+AD6AN21EnDTxsu6$0QVnf^4;%NAp6aE-l_t48~JKN9m1wf3Em(>&>$%W>&8Ui%c;sTQ_jxXu+v022fgm!)j#SI3#z_U+b^__Bzr3r8OXSIKUa0A_pHXW z#;!Zms_rS(V+C1M)vlub8i`Y$XmPn#Ov)26?$;LC7wah2vig*A#Ly@^8Z;^!J7x{t ztaq~%?IY00f=FN;uD0+**1h&e=C+U9;`rPkGOzkF>Czt20iPw1ck}u-Rmipx$R>yg zTDe#3m13VjCmK+$_w-zdznsE_&Kc+S6;KmYRowjQ*Fx$d(bY{*2+s=~BL%GLDFQt& z;P!Q+_-Xaygu>gCpm}>TwOIF9{Tl-3y46ebcJn@Pn1`c*oeR znymQfPvYSr@{^g7$B7Y-kaX@gapUlmq<(a8bMHt+c-2CEiEyoymMtkPi6 z@%wINv(mh;Dy(b{Iv9T#Omm_#_EiGSEw;X&+s&6Q&@zD*)U8;_rwgP3N;~%%Tlv<8 ziVv(C(|Y>oT+Cs^7>wle@1t|Qs!6==inl((2AjJyf}W!~Pr&*LrmtF|y{8m=N8PGs zOj*n)iVdlpBS1o6v3&+ATu6LFj1jM05BM(A5G>o1HMdK%l6B_%W8^s+BW#qLn3f z_u&xG%hH_O$s1J7s=YIIitVlZsJOfRd+)8f+`{kSF~&8XEBE<@xK_BC3Jwq`&q2r) zh26bQw}N$p1*{%_55Z6|r`{kjkHK{lLqySA9+*yE(Ih?qwN4$W*54&iih?c{*aIUp ze}#>w{h-190jX3b!rdfH(DCJIewyl?DPUm$)4rA?ZznECsN$mCO>$p@Pa=IN?vUDp zW~n@&Q*@7@T@UicyGfMaZ{^c;L%q7oEPSZWO`lB$-o{u`Ss-fQrxH*?=h~t)9ehw!5 zhH!DNp(S}rS-}|BH^%ei@=Coos`r-WYim0LUiE;-X;?|pFG%cY+@MYzPo6M?634SM zEHjDYc^+;HCXVNMI1eO_Cr_BOiDQ%HDmQU#H9spkwoQgO$rwJi@WinL4}3<*y|)Os z^TxRE#<=UoxaY>WsMIR5z1$k;D55v}J&L1j>%5 z%iB?Oh(hh`p7#6XB6c1`^8~6huWyI9>MpoIwm`2HSh-h3`9&u00U_5-pKwpd6;%2} zqi`K9=ha=1Q)GjR;TTTQsRDLReu##~r?B6ik&AE{(VZsl0{uo{7Z4Cnq;hu{)k{pS zr;8yzX7Vx;F4soK)5l{A*U^K#W6Lw^2eXyowZ0;)>&$!y=r$wEYlQ0u7U3%)8YWnc zw=`ARTq;`%bfy7igSw*@qF>z~+Nx5~U5lVny_kT?X#%;W+b&SI2sDPf7ZB7Dvq@Q5 zdV0R!BOV%1?a)9+sj_Xhk{TFNWv0}U3e*n;<^x0%ANI&9!!&R}r7~0;I$Be?Txx1a zR-l#%jEhCzDa1&L#_N~#^=P>luA&sN4qE8)eEkq%HWxqCDjp7kZ(xz*uR zMlvMtZ*KCFmC8_kCBjX@G15W!a&wa*>xUZ3pfc3NXd!QZTKO`RmB%WTp?ql}^VZWG z&T$;d%D+qH4K~$v&h^Pn0moBq3TwvZcw}}som%~bmpDJ-CC<-yiSt8V;{24CI6vkk z&d+&?^MhXE{G^vSKk6mU&w7dT!(QS%+`)TYfducx1@FZL@5Kf0#Rc!h1@FZL@5Kf0 z#Rc!h1@FZL@5Kf0#ku##Rk2s;n&$n~HQM|4RNiY{53v^)GDlp<9C0CY#D&Ze7cxg& z$Q*GYbHs(r5f?H?T*w@8A#=oe=FDHCy}x9Q_WtwozD-NK?#h7X*=qmJ(=3N}up6{J zoreJh+_rDcv2ZdPR$Xhh9{Jjdp@b$lgY|GmsIYFB+@hG zyYhCKKo=7ryww|r9VGmh1u6#NH^n%9jsP0ZKO%s}^{-_b&yNyN?v6vd-_Y(jwEGS1 zjzhcO&^Z1(LAd1kmb_&r)tz3Sog%BqcKN(isk<2z0Fx2qtd3dB=6cc^<5_Err>!xb zx5jwJ7~`31jAxB8o;SvL<{0C-V~i(<`=~n!czCBxutPw}S>3b6+4BWb0dc!hS3_fL zmtmbS##ag{`8pxeeHK}Htg7y@$}4|W?*6L0@>b>U?URb=dA1(xYKzwlTLdPS+aEuc z5Kg>-26ID|I}Gj%v^#?i3l}$5DR;l1-7$3BFUs99%H6N$$|v`0s5XacC)$qo-f1gI z4`{k|dFohjS`N<`OEYPGJ7X*nf4e}7sP|H&cSfYQ5ms4T#+E{jDOP!rgO6Qh>5$4& zdB5f4(o$z-sk}$BiKKg5I~|}-f&Eg1qqmvQw)9?O+ef+Dnug4mXOvih)2rzJ2C!RhN-N^v z<2Yxjx@!S`kwB|JHAK}afGVA^Rls{AuiZhBo)ME}1-RapI1 z(obn+xl)ks4M1HhkTpsQHJt!R9+UkS+^7hku*5BJZwT;V58g#s)o%ixVlBqwJo-;ZxUC>K>igt1dY;* z1S#@R3j~ThD65Cacbqf1afUz&pg(_*ntWczTlttuFExb@(4psAB8`*Y*@Dp7=SnhP zMf$r4$IhSJD9#mqLEtYEy)f|qE1Kq9-y5WbW2}`9(B@K6D>R06kr+NNk#19^OI3oo z;1RCB$Sie%ww6>;(KE|X^gthJdT?$5^>TqOy+E{*1m1(hd0UBd?-S>~)8ZLwO3mnp zIH+0HekbUPB=~q=0rj~g0R1=#bYl+cXGs8}?;7%>%*E{26LZVRs%?FK9lt)7e7;C8 zcZwut1o}wUp#{W!0%?JWos~oUR*)=1{azp~P|6LOjNQ#qRd=BVby6;e z;E4;t6X(`0SMXMzwd+=@wL4aOD*be|xA^k)0scA+zFxK!YzA zXq^J(jB+WfaGyYHvfht@dbdEjAo42-JOi}!ot+ld1tx>@(ND5yc;zhbq3yh&=eD(= z)Aq_Pbc z{*UNgCP?E2b*1&I6GVp92NLy|T8e?fR53LT(DMs|PZL(-FOSQt;1WVDKORGi1ra*XJ)f!{>*_JKc4G|job zN1YaKuvR)ipHNF`g~qTh62s3+q}x>KNh-ly@Ceu6WtO@?m*cY?EupLjHr!B)t(7hi zt)x8g9wg4&N}PLN&lp;~M@^-pCDc!>{Z3H3j7y-SCDi)XVkc;?B+$_k>OYbIMBnXb ziHq4UC0y`JD-nKeo_yBCfZ9@^@dRyO3UIhrU`I%ZqXg0d5j!h~c$+}Il4Yn<1kwVf z+=xd@x|^e_qb1a!PRivFJaHj-Vg9r!Mk~+SrYqIjL|I$CskF~(Z}H&O-XcrJ@Cynv zfRhpv;18Jwvm9`=^ko4ZpBB)bZ_u7?(7wo2i`8R0{I`}vudC(Jc(3og+i*VGp$B#b zvn552)edA{*uSQihxN*fYV{YYw^s@5XbJHPffnQ63lWKMv_zE^jE;i;X5#W_NzrXq zbjXiNX?e7CsWpzA(AGTp*}zH^4bXd^;*nPEE@bTj?Y1CR2ipfd+$ty1FGwn&?Olb4 zAD7BOZ!)qI#5z>lO=<9Afz~Nd&L|%uR^guu(g_mkmjda6@G}YAB`tkAOybpx1c~#} zPh2#-a+dedc3#kP+gi|Rdu6ZN>_2IQdc0|!CuxZdARH}6yivKiw1KqbyN8p#FQ-i` zVjt9CfsopE=yG2PG`IeKV>r|hy>WsxUQpXvzdAu=SbZQ-Z(#@ZRx$7@LH|}MJ4m3U z1|4E#Cx|$x$#Aqp_qC~1J0R5l0`(J=)x*|E$>5WL0jo`h5yhO^BiQdR%!5!rA$qCe zvHSPJC^XJf+y&|tXrT@Z^@<0ow9^ziKyBxv+kL0dZqf}4<2NPUQ$;!|j{Sg+mV1kS zP2gWIx;OCe5lwTh?;}SG8(1qHpj(aXrm;N)YS0afbQ{49{Jq8e?E>AQ>RLN=s}c&g z(-=cNBv2lJa6Adzdg9#a#CdaxbBAehJ2T9!N~j5DxD(W!1UgSb9gzf}Ymz|cNvJO- z0f-LU1o9ZGHDwtA$X;ss!OK@ApCyAL)Y8;qgwF>E?63%NkU--LVgRh1uFMytDp2PN zqy@U96hM76acULnlLD!MQnJLeCZWg?S16#e%W^UVR$K_IxDZ%z9@s-ys<|mp%RF5m}mMhv%y{sxb0eU47&w2*Vzh-D0(Ol%;FYe^pYd4_m*<+F0^+R+ItJ_DPAp_k3IkUT9&=8mTBX?zVmLw`Dlk8*jdmQ zj@rS{3;Wmf^00(@QLX;}%K8#(VX8hPBcfeh*SU5RAtDiuxTvzI(oyivCN7V-6g?`? z!#2xGX?etTsWpzA(AGRzR|UyrS&5=6jYlfJd%0Vor zR?Y}?rE*Y@k)5EtmhM{)tm*rR(E6_gS}Q?0yfsoZ_aQ zV6o|D>1`d^s#9Ts^yUWlerl^0IV9v{c5j9{H@N(|TtzefxADl=LPooZ5k-gjaEhRR zdz8%;XvTrgGO`oIYL<2jZxG$-sZ<96s2Kvy3s6=MCj?3^5TrQ(b&){oATllq+&bzl z9C}=RgemL$LH+#frHab7cZP%apB~no*QGdHK0ni;zdCqQ`U8ZZ9~?4?n1OB==&71( zXSJ_C>A71JuywP*n69ajknxP+4N-lII z{4prH@}xk{gI<}OUp%LPnv|Ren=+~tH>bFS%dbAXTu*q-?+qg6ypa}vsuy9TR zH8F9w%qgJu5GYYVlS={A>l3$hP62hGKx&|_QUG;$;`GPCp#D=JHP93dk{Xo&sw0gY z=q*Vwe@+2)O5$#rRX|M>s6ObyQUJ9y2@ENxQ*TCzS}$=+XBAM-5vV@sy`=!^+{DeF zT|iwRkQ!(~DS-N9;ug*>pgt{-8t9Lu0P5+)-7>p?YIK?!XtY4SNdWb{#4Vj&Ky4(D zHPG2<`H=u>zCZ#{&T5TKm^nA6tUk8OY^xH~+Y`5Nb^$e2AQPauNpQ>T0_yC<(UPe7 z0$LLKP${@g)P2THyJhnN>VAPe#|H68DQZ{NJvU{ZnuXdlaSA@vzX@a=G$9G*&n}=Q zCQg;0_7F%7v~MYZ%F|ZXpbkwkB?eTlK$SpDE=H$TlcXehHx18fPz}h9iw(@8A62LCJ%8sur6GNU^ z*Y5vo_y5MJV~e%>KfCfjWdG-E{g1vn%tr}b0fx(ra6P#8{J-}6Z^zcP=l_*{{=Y!; zpPO>}*tNOBd^Rh4cBAog%?pseP+ zKy&%BQ~LBI-6EMLF7!lPY~ic}ELtjsdL(l@7EnhVXtE_c7El)_ZrP3n)SZc2Frk2Y z`IKa3LIL&p#4VXnK#hKb$rkNYK)o?>ckNU_{Wx(?>{LL#;2_hyXy*dzki;$8xq$lL z6!E)uE}-%izh3bQSN!@RKZIPG#2|-U93dYpBD}lj5m{HgzBa``SM^Zar+(hDV*&N9 z#4X*ifLfHe`4bALrxLetLIL&86oXqP6i~lO+|mgJ)V8VDH}6zHeKK(m?o>c6OWfHz z7f`#W7+k({0W~#oH}70P5aHs%$GQK9qzhs~Ta-imQfWnmA9;(8hxU+PHi`8!8EHs77c*Txdg_x4}Y?`>}Y( za^cDSShhj`eyD^tzMNJ%)u0VhON+3$(1y6!MqVaV3YA;bGErZ)$33xO{}xpeT2zhD zqPWnaxY*)9^YT{pIxcAc>`PeawWhX@^)tKIt8$t0c+?gq(mwCPOLnwfI8U~_228e# zHtIjwR1zkeYJ|xq&KuNZ7v}@;&v$yL`WdI!Ki`=k^fOGTXIej3`xN2;oR6-{cC@2w zovn*8H?w%R8K*Mj*f zPS=7^d173&bN_?fT>~bDO2WiYjW999RY9I6&L_s2dG%TKB~FDk^SUwgB_#hpqA#mG z-MQJ3Z&NIuV7Do9x-S}#?oSLzca?;6SB;SF;;OJt6X)r^rrchsypIXKrrZh%-iMT4 zJ>IYOB<3DnzPqM-bWnahFd&I9+IYbAz{W9&@2VxSxGIp-#CZ}wbMFdP{>HR@=H9al z{)R+dRsOE_)Z|Xklj%0+vIzy0pR)&~=Ar?qsgkh1K2b|eaaHK1iSyK49rvDS>EK~V@s;P{YENp0-dETGmx~t-I3}nhr14#~%SCZjc;X$Gf9!87l}|CL z{;|Jq1fN10t%y&nJ#o0>;OpOj#91^Taa0l#NB0uK`BGdJka(YAb^i=kc@a}(b^r7g zya>rLGA~wpI;@VX>s9|dYzTe$<#pBn+8NpnL*A_2)jr5vUFJEzXuz50i2-w7C1K91 zMws*Bs!qpi%2o06deu^#*Q?@Z>(Ejd$bl`b_MuxHS5hnIS%?tAFb7x8Qw70x7#?h| z_5oQP*AMIJ9h))so=pd6ra;eOES^BdF644q^&p5H_f=eTls^+K9$RS@Pa|K>^TnUS6o>)UJ zs%zh>d?vhAxpw|EE>OOA>-|{mnxMS*EvX$F?y4OdBqMJ5MNn~2m-428Q*N z(4twsr|J>NYiDsS!BN2^SjCPpzM&f9lXI~Qt=xC(^HE6eOVE0LYjwzXDQJJ>Z@T9; z^y+trn>gY|i+b_Ftx3`F+OH3+=+_6 zWwpKRiP~N!S?HU%kVWD=i`IUef(32Jk5hyYE=-rg%YB^Z`yN->5O#yUU}PsKkLH5f zRry7=t8&SLE8@aviu2L@SN(=ah|P))6W>>PhustE0p+n-TpOE3X>8aA^U08pXlP@Q zntx710v{Dj{)0c+vO+r_-;&uupwk>Ehh#}DBzILIQ5+--2`bJ*u_`}HvqF8`OdVr9 z`JAJ>9=~B($@d8IJ<5(DCopzWh2Z>OUI<`$=rb&J^A8mZt5=co`-vx&x9alyi6@1_ z*fi<8w|Z|toClhL+Ebu01MMSNw=wPN&2j4~fyzNUnqw;8U&K)Ym4lMQDv$P7wvWr} z3-xfY-s3;0^l1U32Hwbe)9D>JKoOW`0qO9fH;Tp9x{cAdlwmX`Y79QA9`)KqoEu!f z@yXH2#9Jo0Vl0d1aX_EV`|hvw**w>EKI-LJrwcgGuJjo-ucKKPUX90-Tw`ACMMizG zIMk5L+n74y8fWJ44K-zukIaYnsK)sM1-1HPwo?=!R^rq_sQ(dYc?FFuD*SAcYg|x^ zivH45h>Bz$6>5z9^+&g*epD|t4)?aLS5P0ruShhU-PP|uP$Y|nU2mg?8sWF0R^QL` z+BFBgITiMQ0XyhVDq}PB>z_fr>i@CweYwUlf2t~EH>Tb!(9a#9^973B;yDG>hfUB4 z%E6N$1Wz9V#J_A+G9PQKqNo1%yO-noCUJE>oi^f@W91gUyXNW~I#13=j5!6=sRG>! z1`X^9>Vtmk%k6R1lt0v_BTFnD^h<88K$U#UC+z7he&@}N@OtYF0lF_W^;jdr5W8*5Y^P+z6kNyD1r2Jgb2EjzIkd&lA=dm+&2WE@(x+1^pscX4nrxIjUy$Z4)TRPC1=_3>cq^!{pGx(~I;iIf zqz=mJ61X}gd?1y$)l0WZrAy}&P~!zM0?O(VxDiVB5y*(v9;nFzse|}>Xc9#Am!(pD zd=Kj70;z+tx&*F%!6lO$9~VdgboTx`uG25I&R_ST&=Bfx+ap> zY-^k<&MU9S=W)lW;1{a@kXb`{5EFWBJ(v(zH=%-HBD~{%d*#LQns{KvO|+|PxW59i z7^CX<2(%J;Ps5@_11~UXmj`cbF5>)y=r|J}20C4!&7!Y>cwZ{_YN*bzqAt+81v;4@ zTaJm#RXDZ?8dFP+ZL@`;HTGz#aX{A4GYg@O%8QOB@}rx`>DKvzG$7u0O71R8p~$ik zrR--_VNo)%c=G~ku|Ts3lx<58Y>TVsvI=~J<(@cqFWA;r;*)TZ_ws2>XCIVgKBL9i{ZZd(Ozjmi86K?*R`i*0%6afQFC=y@ti zU4+`m6golZ*83jR<+H0>-$RAa9ZZZ*X5<#s_5yVW#8Q>|>F(VA5e>FL3ZQYC^IGpf z+X~Vm2X$r=c(t~RlWyv!tC!2#j?#Xq)sM?ssH8QiUP%R^Qdr2wRxPz&Y3t>w^t!6j zlK$?gAh;*a12ILF##?N9Tp=t^nCupWN02&l5z7;zOHF(j=qmzSo*=%P%Do*_ud|{q z(0>bR%ahA(@d+B$@^oUhFto<>rWzl}8tPAIqgtLWXd?e)6FJ@bA3;hh?>i-A%ZQTg z*Q)eHGNq*iYMDT34$9UfsAr)Hd=%A~ICmjf(_C|FHVuP4iR$)L5bT9n+NSQTpSq-3 z3iUjJyaQ$LB&b^p%M6oiFF^_k)SCq{^ThTf1$6`JNK@zppr|4}<)y1z|3Zb( z0Zg2n%*ZXMQw8b(h{ZzogTI&PuvOT(s{?d}V4cQ=CxEXK=&zTwm9f4@1rG~!843EG zK)NS^9~Ve>bgA3up48Y-poT&3GqMYGjvy^xPDQ=Sp1_5y+I`UqQv-&)zkVm+zv zAmGpIxB_O7%Z!VI#YI^fYj{~u`&MbB+wE?qqIV0ZiG7Si(>`uTi|FnwPL`RERa^yVii3Y{qupzj*l1-ea;asz5+ zuelhjb*nh$25J+e##p>w_$`_CIxbgFT^vIBM5ygGyez1Vl2IDb{_9#tsOEp0FB1zy z7{>?N$L*LK=$HvLO zU;|IB-OPSR)l`QYsO1JG=vmXY=1S@P0&)XPV>SP)+&~q7EH~USC4@T=a)SVm6UY*1 zcO$z%dm33Lk+{acSy3nGv{BUQ2Av^DNraC7LrDkcM;nE!YatZpHQMdUuiBM2kp7C- z+22~F9a87B0^8*wu1(C;;vNwb%;(c@Zxm4Yq`z*pYd`0zfWBB&P#V4qyH#5E_wQ(R zGd7t`Mx-IHRwCpqF9y z!wQ|3r4WP48J7=?k}BE1q2uTpZxVs=p>52}8bf(8uZjG;CUQERhi90;f1@R>J1VUk z`w!xza`g>b%AtBrca&OWTK21n)(G?QS1lR-OQkhTS4Jrpvy;PUjcrM5o2)hLWNK-~ z?bV8be&Naf(1LfM}_vEZ*9B2D^CUc>UpVfm{SF+y=56 zbd?}Q5$fAXK#%zMfOJ2nB3(1@S3sbnANThyT-hW^IjN7t^kXv5zVmOg`VxWuW+Z4w z!8(oU`$n^;s!WrAbZA(NYYbKk< z7PbeEjeCX0X#&Nlw}5z;KqCOkHG5-J4=p{IQEBvxyW8$-s&QUZjccT_SYTra@eP6e z1Ca=|u|@gXRM=ZUED}f=l$Co+|L6VJ8E8zVbF|B*_)N7VV0fU5%V zWdb{ALR>8fhfCxXkv!mUo45((6J02M5DI|8r5jrR@oRroaS$&RXb?bz+cMER4xS;99JE9`mG%;C2-(CW$+9K;VY-w~WzR0>A({xL=i*z>OYco=FTY1Xyb7~$T*iiTPNv1eRI^GE*oW@ zpcRT_!u}nr|5Iqo%bZJ9lzXASD;9he7km{L+!JT^^q<$)Jo3sSy{1U2ohc9r${h^9 z4L-ht9(eub_nZ7vyLup+@Elj z<5H#VX*OmXt07|`HWTP!wVUU(zjBLmoT@6%{(Cvh>o&ynZ&G&jckI-DHafeg8{NG! zx}CIk71Zohg|g$ucg&h0b!lP)^E)_E6^6n8%mS9t@)Owe;T%0p%r*_LF?rO74d zjZ=S#V8Alsl_l_+B4afgvZFw52HI7jUH2sE4dvn>I!d0<4gH}}*O^(_8B%9Kr86KL zZs+nAbiUGpj`uZ%*R4~!TMDzhgxXV}ga_sLhxtLtz5-k2AodeT8^qkHEx4n$o!od> zpy~V@p|8^ev1;nRQIVc%Xxf=-c)g6TEn`-=^sm3GH_>;iK7~(Gi`3E9V zYGaS`?*-Nwh{pv|24&^yWVoY3Fh!s|U#h=QD(Y~7Rx8j0r2vY15i$dML^CMWfcih< zPJ3`}0X0vFon%t9e|ziymDk1})W!?SHg*>^c#FT5o)$F_PFjfETRU)KXhT((66pCx zc7iZ(`dB~M%DX_FUJmh}sT_m@wIO&?rZu~W!+br%2_;bQK+mcKDLxIp zJCHgkt4olz8^?-hsdv~_?}qC|m-*Foq|k63qRBT41eRV9*QIjMw*>0M;=Tgv z=ETW!s9OZ84&tU->MImC&%`a8Yd35;lSmEpR4F)19eGG#ZPFdqTVo*h7N`p7KrerT z2>ND9^zImEAUK~SKcP+(s6OZ&r2y*G#Hj;N(*;rk<%|ns!YGw#Bfsq*g`)-L1jHDD zOn|a-H51oWl@AN#mu3>w=LMRHpgiFu@D$c5Ko5h32`8Bp?H_kVkm&D#pT*w^C)3FV z=ZPS}ah~|lCFiplyUFrSF>*<13^hw2mq6by1yHw}pc9mRRgK{5*?pxK$(s9+IQJlN zGGhP8uHVRSwnU+9cwx=(<;ifmJm?0|Q`wOkZIBU(gCZ?tE!(#|enzIRJNPXTDO19TRM;EUdu=8VBa^r~ zUgKz6WBo~^OZ~*T{lpEd!So8lkSALn260{^tlawzR#>fn7e?p3`W01SRsHJ03co&B zA-%|3LRFo@ru&CGz%sp^Af+1A1cBCY5SEf4s&A1>wVy$4C6GEOt4rYO>_vIY2{CJN zhjJqrm?4lS^ZN>@IRdo_Vp&gus6K*?jcsYXVyhd#W5C-OePJ7TaxQ6>Y3&M_-yFt57(1njV*1p>*gjr=5{b;%^Zkbj8RSc#xF~Dtp4(Qb+I z5TvoWT7!B`5n`(=@F!^4Kj zm2&Id=2IsqXHV$}n)?gP9K;(0N@-ASG^lJhG2Kf4q4_~8A@=^GOyn%9JcLTl>U!_K zrW${!H1;d=%o5yN`BPJkcKML~7{UhQNsw$BxnT-lmI`|dh?ff#HBeTr*4xv*H@WeC zLD;6MqD~|i2()%+WrBJj>4MsCa{<(|jXO;TF{r~znR|uRTtgQIp~j+G4as7Sud9|C zS1HsBZ_U@UMyLr(jCDoOrhb+fYmGlQHLglf8=6RS7~=WHXm&%q&?OL?x&&eymq6@b zjQ;*J#Et^Lecma$OOPCdqT98#=)>~*St`_h4t&`lk$6HgD)n07MhJCU2s8FxAxLB6 zb`s|y#8jI#)D0r)mMR{8y8?DYT29c) z5YaJ#*TeqOP{pJz&R=h?l9-+I11yk)pY-N$?1Tmbgw|b-&m!>1&E~5NdUyUFb`?L;t z7U$kz>Zz7}@99NNO@??4X(i|k*e<-KR)TbWJqs6 zyxvKT4Gy1#0_gnXAiF?ky>XJ-)cbn{)RhA1fc81jbU;T4k`B~KCg=psGO`PFu^{O{ z?e=D?40@v=37}3$0?_}J0;ngF0JOnLUIS`lfqVr`C3ZUMc z1fW@^0IDwuKp!pzP@hNw&=*Pp)OAS!`e7-6x;+U%_ml#tdy@e4vr+(ce-eNmDg{sv zCjsb@QULY4Bmg~L3ZR}$0#MgmJcv-e0tFE?wG=?TI|)D^D+N%OB?0J*r2y*7NdWp< zDS-M$5`gY51yDap0??mJ0o16snpdEW1Sv}z`QPXxCN<6!wCQ)O54UZ6Vu&!Mcr(54S<|39{;SBJWA;)v5`3&atKRN@e<21zCB$gnrqM-@J4^)|UU=Iu;5onBB=!C7Li6eMLRrfpL830x}s98StUjgzv^z#k?-XKFO2V=Xoi9y>yx5N$j(|6#Ilv zVxRM+*r$CG`^+!JAC_TeeG>cpFU7tDB(bjorPvpOB=)tS6#H_J#J(bwVqX-J*w=+p z>`Oxu`|41NeSt_~Un5GfFB3`ZD@7^x#UhD)y(q=LWF)b#8l~75jwJTAqZIq{k;J}& zlww~*lGxXgQtV4f68maWihV&zVqa5AaU=h`N%QJXfwKR;MsbOzN}f34T<6x2&OOYm zoqN^HT|4(!rq|9rJ`15h_`F)GdBwh^-yPOzE0}j_--8>d!;i+54xH(3S!T^mPxYZ4$R|P64%pKx&|gr2uNr#Lb^mKp? zdV@e}pu+E_X(kn7f20sN-2Pvp17s63aA+Zse#^83ZTwO+%2;TsPhF<1AVL% zKwX-+r85ht&j_Rj`eG@7`fB19&MKh3E|41NyQKi?2Z@_MtAM&gAT`iWO99j`GdH_{ zdRQPe(Bq{5>d%Q=I=g`St3Ya?XX_xyV9hR|Hb|TvJ%id~%&RPuioC0dJKmyR% zB$z+9fZAAKxdQP*fwVwVz5LH2{+h}`8!2fqJGbZ+b(BCAKqn-De(Z#LYvSh5ETG;Y zkQ!)aDIonh!6qmFPZTHC#EsVRbc{fiK#cry`&WQG1%&G9zGz6)IX?$1gZl{SB=vp;86Ki zf!tZDFo=4GKx&|wr2uMP;*?-eXA7hTx}X$5U7R>27}Q4vQUhI43ZSme-0TACT7lF+ z-zWu8HziJa1oa(()IfKZ0;na4QyxLxCy*K_T?Uh2oR6OpFbuN_sJ{uM2I8!o1e}vM zP2AF11=PO@qz2;5Or&NNoR{}VoK^#UBu~;+RW|ntq~=N&*m< zWtN=~oNsAmP672^7eRbLphiF(daX)z`lZTcD!wvlfzn0v^!am(>J*F`2i0fUb#Nyr zZHP?KM*hd{#BAr~=qrWU>Y$mX?Me)2W*D0uv~PLP(Z&~LN1f3&3iW+~?(&23Qj&Mu zypxLa22v$&B5~eG;=CF5&unebeHnLELo%%8F%ZX9MYBD7?cTh0Z(h4MFVEh*cGJ}| zyLQtpoG%7AMDifhm$yTV*cHOlvFQ+&Oan)lP#9ezXdW`W) z8)N*+#+c>xnxh~$E6s>^;ph3R!)rFxv252eQ7HFQ4zwo;w5JGke|w7jUA5#B7fxd0 z+-lNvyNPqliF4bBYK-~uL>*W(;{;uO5=Nc=2p|`XR{nkcxbahgF+Oa@xEbz;lxBvm z8`Wtj-H;_ld+NxVIQl@^ByR1m2;45@+J_6C@|HDBn!bpiSw9*)6&#S#Wiz{TPtX0q} zb0e{ZH9e{iy8gNX+dzGar8_|cl8McnPJv`qTs!^jPD7b^+;(7`QiT3R=9j0=&y+fU z6KJOhcg87Qno70PK>c2ztpb$QC2%8mAVWwl7`O`z2}O zyxqik%Zc;06X&hxdb$0?xd(}J9}?$YaOKNE56^fWjcZ+L?eob7tOm|p$#l-mlCeFvO-i58?>mfGu9iU!;zAN%<^I?6Zx(=$Kmk3losvKUGyFrmY zaj-`3m)9Hor#WupfQg>2JH4fNcL&wBf6c~0JjRK8a1 zje^mQGa4@&|4w~q77itq^raH7{?WWB>eb^bc{TaUH>SI0&a+6d3^?!i&Ybt#XU_Xl zRPvvHISs%VWFi{ilry=;9QG#d>f<)JIbkKsgE$geZt}zcj+)+^fX7Plx>9Sb`)BytJ3+Q*rHwmB~OTK}!ZxRIG#0B5P1>eL4-^B4uM>>|%ZtzW9 z^li7~4QO8SW{IAJ5p{O*2ITot^G0gH8*#xKalspL!5eYG8*%Q

iSTi+uvYd#>>{ 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 z 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

8h#A+tKmJ_Najvr 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

&7vcQ%M{4- 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 $nBK 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

oj!uV7g2&4Y!!_6bi3%2@P?*A)*zB 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

R6&r*ckb%~=15c8KG!o>fFPDH4^ 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

pPQtK`$hpVmRq-WsepNRq3Uu~7S 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%0D}x|f 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%0D@DJRD;<@4i}hPcpx=w+0+xEJ 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