From 0647fa4b7d894372159340030889b4439eb06cfa Mon Sep 17 00:00:00 2001 From: Pritpal Bedi Date: Tue, 25 Jan 2011 08:51:49 +0000 Subject: [PATCH] 2011-01-25 12:41 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbxbp/xbp3state.prg * contrib/hbxbp/xbpbrowse.prg * contrib/hbxbp/xbpcheckbox.prg * contrib/hbxbp/xbpdataref.prg * contrib/hbxbp/xbplistbox.prg * contrib/hbxbp/xbpmenubar.prg * contrib/hbxbp/xbpmle.prg * contrib/hbxbp/xbpradiobutton.prg * contrib/hbxbp/xbpscrollbar.prg * contrib/hbxbp/xbpsle.prg * contrib/hbxbp/xbpspinbutton.prg * contrib/hbxbp/xbptoolbar.prg * contrib/hbxbp/xbptreeview.prg * contrib/hbxbp/xbpwindow.prg ! Renamed: XbpDataRef() => DataRef() to be exact Xbase++ compatible. + XbpMenu():popup() * contrib/hbnetio/netiosrv.c + Added: NETIO_SRVOPENFILES( pConnectionSocket ) -> nFilesOpen + contrib/hbnetio/utils/harbour.ico + contrib/hbnetio/utils/about.png + contrib/hbnetio/utils/exit.png + contrib/hbnetio/utils/fullscreen.png + contrib/hbnetio/utils/harbour.png + contrib/hbnetio/utils/help.png + contrib/hbnetio/utils/terminate.png + contrib/hbnetio/utils/netiosrvq.qrc + contrib/hbnetio/utils/netiosrvq.prg + contrib/hbnetio/utils/netiosrvqt.hbp + Added: GUI NetIO Server based on hbXBP and hbQT. implements : DateTime In, DateTime Out, IP connected from, Port number connected from, number of files open. implements : Termination of a particular connection via context menu or toolbar icon. --- harbour/ChangeLog | 37 + harbour/contrib/hbnetio/netiosrv.c | 11 + harbour/contrib/hbnetio/utils/about.png | Bin 0 -> 1873 bytes harbour/contrib/hbnetio/utils/exit.png | Bin 0 -> 1861 bytes harbour/contrib/hbnetio/utils/fullscreen.png | Bin 0 -> 4265 bytes harbour/contrib/hbnetio/utils/harbour.ico | Bin 0 -> 9158 bytes harbour/contrib/hbnetio/utils/harbour.png | Bin 0 -> 3025 bytes harbour/contrib/hbnetio/utils/help.png | Bin 0 -> 1973 bytes harbour/contrib/hbnetio/utils/netiosrvq.prg | 894 +++++++++++++++++++ harbour/contrib/hbnetio/utils/netiosrvq.qrc | 10 + harbour/contrib/hbnetio/utils/netiosrvqt.hbp | 24 + harbour/contrib/hbnetio/utils/terminate.png | Bin 0 -> 1763 bytes harbour/contrib/hbxbp/xbp3state.prg | 2 +- harbour/contrib/hbxbp/xbpbrowse.prg | 2 +- harbour/contrib/hbxbp/xbpcheckbox.prg | 2 +- harbour/contrib/hbxbp/xbpdataref.prg | 14 +- harbour/contrib/hbxbp/xbplistbox.prg | 2 +- harbour/contrib/hbxbp/xbpmenubar.prg | 21 +- harbour/contrib/hbxbp/xbpmle.prg | 2 +- harbour/contrib/hbxbp/xbpradiobutton.prg | 2 +- harbour/contrib/hbxbp/xbpscrollbar.prg | 2 +- harbour/contrib/hbxbp/xbpsle.prg | 2 +- harbour/contrib/hbxbp/xbpspinbutton.prg | 2 +- harbour/contrib/hbxbp/xbptoolbar.prg | 2 +- harbour/contrib/hbxbp/xbptreeview.prg | 4 +- harbour/contrib/hbxbp/xbpwindow.prg | 18 +- 26 files changed, 1021 insertions(+), 32 deletions(-) create mode 100644 harbour/contrib/hbnetio/utils/about.png create mode 100644 harbour/contrib/hbnetio/utils/exit.png create mode 100644 harbour/contrib/hbnetio/utils/fullscreen.png create mode 100644 harbour/contrib/hbnetio/utils/harbour.ico create mode 100644 harbour/contrib/hbnetio/utils/harbour.png create mode 100644 harbour/contrib/hbnetio/utils/help.png create mode 100644 harbour/contrib/hbnetio/utils/netiosrvq.prg create mode 100644 harbour/contrib/hbnetio/utils/netiosrvq.qrc create mode 100644 harbour/contrib/hbnetio/utils/netiosrvqt.hbp create mode 100644 harbour/contrib/hbnetio/utils/terminate.png diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 25c10458ce..890fd6b8ae 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,43 @@ The license applies to all entries newer than 2009-04-28. */ +2011-01-25 12:41 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) + * contrib/hbxbp/xbp3state.prg + * contrib/hbxbp/xbpbrowse.prg + * contrib/hbxbp/xbpcheckbox.prg + * contrib/hbxbp/xbpdataref.prg + * contrib/hbxbp/xbplistbox.prg + * contrib/hbxbp/xbpmenubar.prg + * contrib/hbxbp/xbpmle.prg + * contrib/hbxbp/xbpradiobutton.prg + * contrib/hbxbp/xbpscrollbar.prg + * contrib/hbxbp/xbpsle.prg + * contrib/hbxbp/xbpspinbutton.prg + * contrib/hbxbp/xbptoolbar.prg + * contrib/hbxbp/xbptreeview.prg + * contrib/hbxbp/xbpwindow.prg + ! Renamed: XbpDataRef() => DataRef() to be exact Xbase++ compatible. + + XbpMenu():popup() + + * contrib/hbnetio/netiosrv.c + + Added: NETIO_SRVOPENFILES( pConnectionSocket ) -> nFilesOpen + + + contrib/hbnetio/utils/harbour.ico + + contrib/hbnetio/utils/about.png + + contrib/hbnetio/utils/exit.png + + contrib/hbnetio/utils/fullscreen.png + + contrib/hbnetio/utils/harbour.png + + contrib/hbnetio/utils/help.png + + contrib/hbnetio/utils/terminate.png + + contrib/hbnetio/utils/netiosrvq.qrc + + contrib/hbnetio/utils/netiosrvq.prg + + contrib/hbnetio/utils/netiosrvqt.hbp + + Added: GUI NetIO Server based on hbXBP and hbQT. + implements : DateTime In, DateTime Out, IP connected from, + Port number connected from, number of files open. + implements : Termination of a particular connection + via context menu or toolbar icon. + 2011-01-24 23:12 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbcomp.h * harbour/src/compiler/cmdcheck.c diff --git a/harbour/contrib/hbnetio/netiosrv.c b/harbour/contrib/hbnetio/netiosrv.c index 7123e05b6e..24898b976a 100644 --- a/harbour/contrib/hbnetio/netiosrv.c +++ b/harbour/contrib/hbnetio/netiosrv.c @@ -1387,3 +1387,14 @@ HB_FUNC( NETIO_SRVSOCKET ) if( conn ) hb_socketItemPut( hb_stackReturnItem(), conn->sd ); } + +HB_FUNC( NETIO_SRVOPENFILES ) +{ + PHB_CONSRV conn = s_consrvParam( 1 ); + + if( conn ) + hb_retni( conn->filesCount ); + else + hb_retni( 0 ) +} + diff --git a/harbour/contrib/hbnetio/utils/about.png b/harbour/contrib/hbnetio/utils/about.png new file mode 100644 index 0000000000000000000000000000000000000000..873294b3a99062994fc4050bb5d38bfb19431846 GIT binary patch literal 1873 zcmV-X2d?;uP)Z@@;naz4zPq-tK!Vp#NYc3&L1bgn4VpWYrs2UHUVgyh& z2ynS!h$4ibA82nO2*1Jj>j&t6?o$yBZ6m&AL=FEJKqb*Dg8PhV(u7%pIQkL@P8STD z4Wiu&(Po8Uv62JAwJ&0nzfdW&Dgn zY5a5uIS$y|F689W*JgppxOAP!fMFQCZ%|*SZ%ok;jYOe@B0wYp^~cRbpZTDxw-DE- z{Q+=09PU@`lkb$o0oBMUEkbT-0l8aDQP^8K{g~f)UsE;6-C;!i0qAW<5c9mQ8M2>Q z;+F}`D_Y72!(CMgtHVx;^#7#X?CX4u7L6f%vI}ZQE22A=>qf*km-MXf z3&0py?0a(R7CLfr$SWJ>62%^buXgZGrO^!kjN2ssH0h)kxRY#<~ z6H4n5L_90VFVRWFcCaS^iKx*w;l^>!bEm*Px|$}8q;kHHf=^(97iX9=suXiZmh%3( z!yQ<6sKW%qb{z~u_4+udq&4UpY3qP|$b;Cy4-U}M8X_$rZ=P6EwK{j|{V1wAo9`^C zoQ|1jxAACCw7SXytiG};HE_Nm?e}`U1R~B zyO6mlbZ`&ky>I+Z)1#Q|S|R_;okg>kB5&ld)5>Yb%+Gzb^U9of@47K`98G9C3BKXO zpRn&_xX<;>5^9&LXvd)7v4b99Y& zWsxi;X1>*Rx}2iNP9$9s`E@Ts-@Wc(TrTZE2_LTIMH0?Klqqr%T$HqqPB#eJonsZu7X%4VE~1=~{uqiUSL3A;ovC z(fV;KJn%)7jC_i}n*!3u_2}Ucx;8FU1iJH$if1-Mu$um7{>kQo$^r+zyQ?;3?822E zH2Wf%-9Wcuw6&efH8}6YKCNTh8D1apH0_H380A&K;#ICz9O&Pmj`3?dQ&dA5C z%i@4rn(hP>fG8=0p8CQfSZsVk3(MIpQ0T<&`|480CcU^F&0SdlkcDH%+RR{A6?iw^ zr!yzE4R~~8x#TM13$#!;D}cd;x!C={6{!H8--f2HP*w{lbRBa`hyCz<^zcarU}x#P zrM329W6d;5d7KAgCICgb*t2+Q%GkvEt!VOQ2EbxK?KFc>Iq?SqUoZcb0jSTfoAY4) zWjC2c1;v0aM>7K`&c)tGu1Og?|Cuk*)R_eUB`GZ!;ueVfyanEQ7UYkrtCATfBwpWZa;~)?+ zk7GIjB`!2RJ}YIc=J8L^bSgangXFQ@bMv443&Dov$z;UZJloJQt4roQojf8+S9jWA z99)uz@1MFhWo*Kun+QN4jdo`K5SPm~7~HXvZo)t3(ahQe01HuL!OVNdI!0e=UPvrp z{Cx|oAQv2{zdmJb+~SRBN#g>8V#+kVf#}hF2sdu{fq4x*3KG`F3O2{C;+vmySc?al z0ZEKncko~Ll1KyJK6x#wD@yqPKUz-Vq9vQ4_o^H?8!1jG*L-d0Zg`2xrRYSO`I$}k zPGPgf{E~NyZ+JqK@=AELa^De%-bb^PY&LiDDBgd!;Sf61KDN$FF|)qV0v!nKT&Yn} zI-6$RPb}#xhu$H&3Re`&TqIe`h9w2CT+XN`5av@Zq-Wv63K@Y{l*tNO?L3O$t~XUf z?!JRotm&yNT@s%~IpQtX#On$iW3MKGA_v0LHC4R)gs7ScE~!_D*Nr_&b~3&E+jhu@ zzw$!YZie}0M1KIVHiT%ER8T(EIexleA5JkNTFguquXNGZJAr4qC}K_fN%1yA51#rA z=F_at$7+8br!4C%670E`+bYkItOG_sDy)F$EF{yLDcn$G@^L3LZwp2AfKk1`^M6Pu$eU`y=!pv*Hd%_WZY!00000 LNkvXXu0mjfY1xMW literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbnetio/utils/exit.png b/harbour/contrib/hbnetio/utils/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7ceb0ce0b10ed047df2dc7b48649eadd32c565 GIT binary patch literal 1861 zcmV-L2fFx)P)Aa+OOULN#h4kt#&w3{X?52!Wsthe9+ahA3b_lvW88 zsMUZFiJ+haj}%A)DG^JBauv$e(o)#cLU+5@^P8Qw-Q9MniEc}aIk zmq~w-j+2T2cLQ*Q-SwnD|1W@Eq|M!djJe$R3I~a#7*ZTXw?qR`8Uavrhlk_@>{Nw= z>-D6Aq(VTyCA*7B*B%GJt0rLQEFftn2l3pMlEeW;juuMiqKBe;$lPmuePe=XegHHP zK?A=JIR8Dj?;<8*dxPEmkpOs;l76)U&<1nR*9!E00x(Afn1*HUmD=#Hxd^7d4!Cz8 zILC9=aoQ#|@pXFuW_P0IRs-rl>U#75dRYg9(PJ3~&v)Sf z47C6!R?*DksDkkWi9$0DHxAT!h(<9qdYHz8RX67ZBbvlX4K)#TLmc~RC}1~zq^cGu zclbaEOykI}G#CI`p@c>nK7-7kA0$`&l6#x!aP%hg9Zu`*hm4p1)iY$O=raygp5Yci z1PF?MnA~>)r@3`B$>Rr*oeFIIh!RX0PBdyja)nHzEBW={v6?vfI_-HoE^wBMbc24e zmYTarU*ooI0sz^eJO@Z!md4l)vboAsVvZ=CJi6VaHY($Te1c{yx(93oE^zrN0U({R zUQ|GDPwy9Cu2hqGP~25b%Sy}KD7D|8_88DNfVzC7FP!dOSGGMd$#`TPpl7xUMiYeqqH;xJb zHNW*m*Rd%^sByt`Hdr(TF*VgtlT$(@79gD2+0g6j5lw9bGxtS9<9#$)Q=l|8x6GYn z7QLs+oNkaMHaLT z--OIpvVNSmNInl332)osQm7gI#z=;mYN)@QARdMSaPvp~!yF{P|5+Olt(#z8`(8Fo zn|4BTg|68s?Fqvf#nM~kqnH%}V13n$#G{sR($)507lqVUErs=i4L)ZK%baGZT9yS< zZXrzWw(HI0@rR*l7eOqvlNUAMx-tT$Xc!t03DO&0Iv2}u%&tOonmQ-!y6uN=VV^M< zrbi?#f$2!B^nqsbSlsMOoTx4x0&5qe#H#1QYe2M^xpR@QeLGQ`!fSvkY|P2Q!%dsQ zuG`72$nXIhX@v{50zlE8en=l@s7Afg)(1q3n?E0kTed*awDx^~)v00SN;Ixt-)8MD zEmvZenm$i0eeS_=0buRBDOjrUp+*V;!*h2(xP{(=!V8W9Y96e~HVNvFziGhj+g z!qD8UEZw1I@$jF@Zrxe7g05!-r9Ji}+t$U9a05#d(h|gX_C3!j^Y_p(ebBWU^adhxy~_X7RKZ=_L-D~Gyc6~ z5u)<8w0Qq1GPmo}{+o5*EjpXi`F;QbddV6q(k68XO35{HvCeFQK6554-MYiJ|3`Gc za1pKJz$p}$+7Gc~#=?H46kSTo5NoKuT$NXMaqdaocS#jD_@@zcArUPtPDSy~9*F5} zlB&`f4dyz-rUpf!{pK}n>hD)@P-if&A~8Tkbr{R3GM|ZC{XfU5p&-u+wX5N+LceC4 zy#GB;W0FIqW;h+GmXyaXtFXvoEwwycVqci7;mb9hp{1GvUu*EIdl3!BqlLywb)(IZmF`qy!vI z?053}JLxd1Ft=wyz8Mh-0MYu8@_J~PI4u^+GiG^pZv6%bHx_xm#Or$;>a_m>$OlQ- z+hrt=(-%m~J1BT@q#4>EqUc2x^M(bJ|Dwt79e%G-%nR(7>5Nw2jm!5qJ=)&kkpS>F zW(j0KKF^2n$DYIz4`~9Lx8-?$)KGO*B!~VB`MfDJgTe2000000NkvXXu0mjf{5*Hc literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbnetio/utils/fullscreen.png b/harbour/contrib/hbnetio/utils/fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a33524ec3262c6f01a8d8afe51571d710a584a GIT binary patch literal 4265 zcmV;a5LWMrP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000HlNkl7-k6~}+)-kEvx{QRB7achHL{<4D!|(}5F#l)o-o3Y7U`3#zf&JAo34Xy& zp>-sSqc?XvG*SG*iOd8rPo~0sEj3>F-fP&fiuZEcv-j-Ta}&VbXv%p@;_QuQq8{qe zR~zp?yT7u2@`+NsY8ssbm>D*8PtugHQ%Yoc4E(q7Kzpb>a=nwIm)aooAeM&O)#mjD z_sflst>5z2dl!CINJ~E{c#j8+7(UzKaR@hQxkms1PKD1j)%h1iob$NU5Ubz6ZQH|J zx_i2qDpy_{J#qF=tDQgOfP5_UHa3%ZS-uAD6sZ?_TdQ;hGn5jKOU*Nl&7CjIl`_SS?R~|GndVB}GL< zG_cZ|3rzmeUcY^kOk7E#azE*3$6#uzf^$=vL| z`TcWC5Wrf&nneIEO-FpHO~{9Wu^IK$;JrbF4N(-ml#9YxL{tP??j+i|3wZBMt)2`z z=k^0xXu%kvn!xZ_#+7l$iwgm~F<@y44G(sE{LBWv_~3OK@>QIdox6AM{%)alEoqv~ zUgK^l^GZuop1ybA$xfX*^>RZTO$`^7p>fZ-t5B_EXx%T;fWmZ5d1t83wR4>m%VnN= ztc(%s#D@It52u-&Dq+pt0n`%5*LH5AHO`dtma(DH+)wxixJyT*$#96ofOQcd;!OD+y9n^ie=R~u$^yS{zhz^|)GRuPeJ z0_wd-y(dl6wmuI*fNbk|ot_hc9aZlR6R zEL+jfx%qbp&N+8~*V=gJ&Tade8*_)8*KJD}a4y^T>7K5i?)vg}(lkZA-r(DNk8^Ip zq01=W&M|+4&T1^{-Mo(WRjrR7J#zeS$;8x?z+Z0w2(5W_yg0dG;OzNt_pIwe7Klw% z$+C;m^SWzn~uewH8z@GGbT zVHlESnLTp!SPV>;M+ZTKu&tYX`$lFG2mI(JfDaEJz^Bz)Y6)N}l}fHyEZz{}a-&kI zP%4#N7=~-pG_CrqUIu)9^aAzK3kycO8?ACli4~x+t*xzR>(;HiMWjJ>-dFzibC%3E zTrkGinVFf(eSLjzd+*1A$+-#dmNeZ70DuK@a~l_r@X4Zq&n#HG_>3x$-A*TW1F$6W zYkKK;M2|-Bf=}R9C|9i;V@SryikrE~s6R&=NYH@I74E*1I9sg$ldXf*;`j|G>00000 LNkvXXu0mjfgK!>d literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbnetio/utils/harbour.ico b/harbour/contrib/hbnetio/utils/harbour.ico new file mode 100644 index 0000000000000000000000000000000000000000..f92a768e6569659a6303c5dc58a126e8ac5a8cd8 GIT binary patch literal 9158 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 T(qpe(00000NkvXXu0mjfXI!`> literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbnetio/utils/help.png b/harbour/contrib/hbnetio/utils/help.png new file mode 100644 index 0000000000000000000000000000000000000000..9f15e06b0f33e1d291a33f912c07bc7f30beb430 GIT binary patch literal 1973 zcmV;m2TJ&fP)t&B0y%Ezq6i@r1bp43LI?CqC!k$8rXU_}qjTE{+y7q$$_bwo+*4ObbJqxB z%_0a{InZr3h;}PPn-zk^N*n~}vJ5SefEG(YpeMp1sAs)UKYU%+gT8+ep9cv)`#cJ) zf@t}xrEXQeRJRg>!wH)^2aard+AI*+DNQ5Pq3b$d>$KMBnUGb)qjAXLC=iW8`KXof z%>XpzdvxlJOcYoTr~4`U;vY+5NfjK$1;{SWBX^4<1dbL?KgKh;RuvVo!3g5PA!xl9 zk?=mP>aifR#GfZpV6Bjq|AKvKvuN>r5$?)zSeo##-YvYCM6+^#Le-J%}G{ z(e!BGK9cj|SPIm_Vn5{xcNJyM^D(6i#U-+HE}A z8CdAKpwxx=CAsiq+aRktE(c?Hw<~}SfApp%EFk;*P$>pd*3eZIk*;1uyt|%t$8bPYETV%^uEMPq!eC1eb>zlg-;_N`2T_i|S}w4h+wiV@L18b01| z8{AC6q`99t(uub^d?<4}@aP@YD9pB-v={orSi0vwBhG77oZ?rmnXZVQJ&N!LPkWgH zzT%(ko{}|VrXifA6m!EU*s{11YwOE7&7TgQ$K%JkDMm!@=m+MO;-SS=ChbsM!B=*8 z(|E+YeN?VvJR_98s|ddF>t5z)wd9f4M2p*PqzhHBRO*cYMMiy57WeJBV1frH2f9Mb z${MVh?J-Gvf>F$W>Vq^Ea&V9WGQj0%kuV1KZjuG6`Fh#!TOn8t|1rUz&#n z6@^$tIG5IfaI-?Zda@hMt)HZw(WolMdwiU~E+^oBX(Q<`F$MNh?n~Uf%vVMNjSn>* zH(J-F!hzAh;hplpu4Kbd zpaescGP9Dks;DRQgc1m-lag~#{6Vs=!Ywd(U@JAMtBqzeD*EB}DtlSA5eGwIBOS+q z;#>z_Z~i7`PIV)aQ1GMY-^bghCmw=z;>T{!&42w8LhUVPGh)zWtEhdp=-$W76p;r8 z#|_4f%WLuQnmY6SWakYm+p=#0>CF6L&X-*d*?gj%cqz!Os^x}c?^-`FP)&jSstsy^JR`;a~>|d ze~Z&vSZV|$9aINHX?01YIC+FDuxep7&Uf9wrrih86HN~UevAaCgsXvG47NW`<5IkV zc22YH(FwawbQS%r@b2G=Qf?8CR_;4eVsvVXw_tW&0&3|KE`I9ZM0gN(o@N^^o%`a2Oi{1-)!4Q?Qc z=SGl^!)6Wji05+}zLV#i^DSa1az%K%rknE&QB*@YQ?8J#fWt<1GJUM$9mLMP?T4n` z596B=nJB>EON6_mJkRp1x|M=`2E~kMF*;dt(#2Tc3B1$Ak@)OG65OV1p&M_)_%s_c zPc!*AT|&57uxBr|mES5^OJ+gJFN2tsPosp + * www - http://harbour-project.org + * + */ + +/* + * The following parts are Copyright of the individual authors. + * www - http://harbour-project.org + * + * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) + * Copyright 2011 Pritpal Bedi + * + * See COPYING for licensing terms. + * + */ + +/* netio_mtserver() needs MT HVM version */ +REQUEST HB_MT +REQUEST __HB_EXTERN__ + +#define _RPC_FILTER "HBNETIOSRV_RPCMAIN" + +#define _NETIOSRV_nPort 1 +#define _NETIOSRV_cIFAddr 2 +#define _NETIOSRV_cRootDir 3 +#define _NETIOSRV_lRPC 4 +#define _NETIOSRV_cRPCFFileName 5 +#define _NETIOSRV_hRPCFHRB 6 +#define _NETIOSRV_lEncryption 7 +#define _NETIOSRV_pListenSocket 8 +#define _NETIOSRV_nCompressionLevel 9 +#define _NETIOSRV_nStrategy 10 +#define _NETIOSRV_cPassword 11 +#define _NETIOSRV_MAX_ 11 + +#define DAT_HBSOCKET 1 +#define DAT_SERIAL 2 +#define DAT_ACTIVATED 3 +#define DAT_IP 4 +#define DAT_PORT 5 +#define DAT_TIMEIN 6 +#define DAT_TIMEOUT 7 +#define DAT_BYTESIN 8 +#define DAT_BYTESOUT 9 +#define DAT_CONNSOCKET 10 +#define DAT_OPENFILES 11 + +#include "hbhrb.ch" +#include "fileio.ch" +#include "hbclass.ch" +#include "common.ch" +#include "hbqtgui.ch" + +#include "Xbp.ch" +#include "Gra.ch" +#include "Appevent.ch" + +#define RGB( r, g, b ) GraMakeRGBColor( { r, g, b } ) + +THREAD STATIC hSocket + +/*----------------------------------------------------------------------*/ + +Function Main( ... ) + LOCAL netiosrv[ _NETIOSRV_MAX_ ] + LOCAL cParam, cExt, cFile + + netiosrv[ _NETIOSRV_nPort ] := 2941 + netiosrv[ _NETIOSRV_cIFAddr ] := "0.0.0.0" + netiosrv[ _NETIOSRV_cRootDir ] := hb_dirBase() + netiosrv[ _NETIOSRV_lRPC ] := .F. + netiosrv[ _NETIOSRV_lEncryption ] := .F. + + FOR EACH cParam IN { ... } + DO CASE + CASE Lower( Left( cParam, 6 ) ) == "-port=" + netiosrv[ _NETIOSRV_nPort ] := Val( SubStr( cParam, 7 ) ) + CASE Lower( Left( cParam, 7 ) ) == "-iface=" + netiosrv[ _NETIOSRV_cIFAddr ] := SubStr( cParam, 8 ) + CASE Lower( Left( cParam, 9 ) ) == "-rootdir=" + netiosrv[ _NETIOSRV_cRootDir ] := SubStr( cParam, 10 ) + CASE Lower( Left( cParam, 6 ) ) == "-pass=" + netiosrv[ _NETIOSRV_cPassword ]:= SubStr( cParam, 7 ) + hb_StrClear( @cParam ) + CASE Lower( Left( cParam, 5 ) ) == "-rpc=" + netiosrv[ _NETIOSRV_cRPCFFileName ] := SubStr( cParam, 6 ) + hb_FNameSplit( netiosrv[ _NETIOSRV_cRPCFFileName ], NIL, NIL, @cExt ) + cExt := Lower( cExt ) + SWITCH cExt + CASE ".prg" + CASE ".hbs" + CASE ".hrb" + EXIT + OTHERWISE + cExt := FileSig( cFile ) + ENDSWITCH + SWITCH cExt + CASE ".prg" + CASE ".hbs" + cFile := HB_COMPILEBUF( HB_ARGV( 0 ), "-n2", "-w", "-es2", "-q0",; + "-D" + "__HBSCRIPT__HBNETIOSRV", netiosrv[ _NETIOSRV_cRPCFFileName ] ) + IF cFile != NIL + netiosrv[ _NETIOSRV_hRPCFHRB ] := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) + ENDIF + EXIT + OTHERWISE + netiosrv[ _NETIOSRV_hRPCFHRB ] := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, netiosrv[ _NETIOSRV_cRPCFFileName ] ) + EXIT + ENDSWITCH + netiosrv[ _NETIOSRV_lRPC ] := ! Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ) .AND. ! Empty( hb_hrbGetFunSym( netiosrv[ _NETIOSRV_hRPCFHRB ], _RPC_FILTER ) ) + IF ! netiosrv[ _NETIOSRV_lRPC ] + netiosrv[ _NETIOSRV_cRPCFFileName ] := NIL + netiosrv[ _NETIOSRV_hRPCFHRB ] := NIL + ENDIF + CASE Lower( cParam ) == "-rpc" + netiosrv[ _NETIOSRV_lRPC ] := .T. + CASE Lower( cParam ) == "--version" + RETURN NIL + CASE Lower( cParam ) == "-help" .OR. ; + Lower( cParam ) == "--help" + HB_Usage() + RETURN NIL + OTHERWISE + OutStd( "Warning: Unkown parameter ignored: " + cParam + hb_eol() ) + ENDCASE + NEXT + + NetIOServer():new():create( netiosrv ) + + RETURN ( NIL ) + +/*----------------------------------------------------------------------*/ + +CLASS NetIOServer + DATA nNumConxn INIT 0 + DATA oDlg + DATA oBrw + DATA oBrowser + DATA cTitle + DATA pMtx + DATA oSys + DATA lSystemTrayAvailable + DATA oSysMenu + DATA qTimer + DATA qLayout + DATA qAct1 + DATA qAct2 + DATA nPrevWindowState + DATA lChanging INIT .f. + DATA lQuit INIT .f. + DATA nCurRec INIT 1 + DATA aData INIT { { NIL, ; // hSock + 0 , ; // nSerial + .F., ; // lActive + " ", ; // cIP + 0 , ; // nPort + " ", ; // time-in + " ", ; // time-out + 0 , ; // bytes-in + 0 , ; // bytes-out + NIL, ; // conn socket + 0 } } // files opened + + METHOD new() + METHOD create( netiosrv ) + METHOD execEvent( cEvent, p ) + + METHOD custom_netio_server( pConnectionSocket ) + METHOD register_connection( pConnectionSocket ) + METHOD unregister_connection( pConnectionSocket ) + + METHOD buildToolBar() + METHOD buildSystemTray() + METHOD buildBrowser() + + METHOD refresh() + METHOD confirmExit() + METHOD showDlgBySystemTrayIconCommand() + + METHOD terminate() + METHOD buildColumns() + + METHOD skipBlock( nHowMany ) + METHOD goTop() + METHOD goBottom() + METHOD lastRec() + METHOD recNo() + METHOD goto( nRec ) + + ENDCLASS + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:new() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:create( netiosrv ) + LOCAL nEvent, mp1, mp2, oXbp + + netiosrv[ _NETIOSRV_pListenSocket ] := ; + netio_mtserver( netiosrv[ _NETIOSRV_nPort ],; + netiosrv[ _NETIOSRV_cIFAddr ],; + netiosrv[ _NETIOSRV_cRootDir ],; + iif( Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ), netiosrv[ _NETIOSRV_lRPC ], ; + hb_hrbGetFunSym( netiosrv[ _NETIOSRV_hRPCFHRB ], _RPC_FILTER ) ),; + netiosrv[ _NETIOSRV_cPassword ], ; + netiosrv[ _NETIOSRV_nCompressionLevel ], ; + netiosrv[ _NETIOSRV_nStrategy ], ; + {|p| ::custom_netio_server( p ) } ) + + netiosrv[ _NETIOSRV_lEncryption ] := ! Empty( netiosrv[ _NETIOSRV_cPassword ] ) + + IF Empty( netiosrv[ _NETIOSRV_pListenSocket ] ) + MsgBox( "Cannot start server." ) + + ELSE + QResource():registerResource_1( hbqtres_netiosrvq(), ":/resource" ) + + ::pMtx := hb_mutexCreate() + ::cTitle := "NetIO Server [ " + netiosrv[ _NETIOSRV_cIFAddr ] + " : " + ; + ltrim( str( int( netiosrv[ _NETIOSRV_nPort ] ) ) ) + " : " + ; + netiosrv[ _NETIOSRV_cRootDir ] + " ]" + + ::oDlg := XbpDialog():new( , , { 20,20 }, { 800,300 } ) + ::oDlg:title := ::cTitle + ::oDlg:taskList := .T. + ::oDlg:close := {|| ::confirmExit() } + ::oDlg:create() + ::oDlg:drawingArea:setFontCompoundName( "10.Ariel" ) + ::oDlg:setWindowIcon( ":/harbour.png" ) + + ::buildToolBar() + + ::qLayout := QGridLayout() + ::qLayout:setContentsMargins( 0,0,0,0 ) + ::qLayout:setHorizontalSpacing( 0 ) + ::qLayout:setVerticalSpacing( 0 ) + // + ::oDlg:drawingArea:setLayout( ::qLayout ) + + ::buildBrowser() + + ::oDlg:oWidget:connect( QEvent_WindowStateChange, {|e| ::execEvent( "QEvent_WindowStateChange", e ) } ) + ::oDlg:oWidget:connect( QEvent_Hide , {|e| ::execEvent( "QEvent_Hide" , e ) } ) + // + ::buildSystemTray() + + SetAppWindow( ::oDlg ) + SetAppFocus( ::oDlg ) + + DO WHILE nEvent <> xbeP_Quit + nEvent := AppEvent( @mp1, @mp2, @oXbp ) + oXbp:handleEvent( nEvent, mp1, mp2 ) + ENDDO + + netio_serverStop( netiosrv[ _NETIOSRV_pListenSocket ] ) + netiosrv[ _NETIOSRV_pListenSocket ] := NIL + + ::oDlg:destroy() + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:custom_netio_server( pConnectionSocket ) + ::register_connection( pConnectionSocket ) + BEGIN SEQUENCE + netio_server( pConnectionSocket ) + END SEQUENCE + ::unregister_connection( pConnectionSocket ) + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:register_connection( pConnectionSocket ) + LOCAL aPeer, cIP := "", nPort := 0 + + hSocket := netio_srvSocket( pConnectionSocket ) + + aPeer := hb_socketGetPeerName( hSocket ) + IF hb_isArray( aPeer ) + IF len( aPeer ) >= 2 + cIP := xtos( aPeer[ 2 ] ) + ENDIF + IF len( aPeer ) >= 3 + nPort := val( xtos( aPeer[ 3 ] ) ) + ENDIF + ENDIF + + IF hb_mutexLock( ::pMtx ) + IF ::aData[ 1,2 ] == 0 + ::aData[ 1 ] := { hSocket, 1, .t., pad( cIP, 15 ), nPort, dtoc( date() ) + " " + time(), space( 18 ), 0, 0, pConnectionSocket, 0 } + ELSE + aadd( ::aData, { hSocket, len( ::aData ) + 1, .t., pad( cIP, 15 ), nPort, dtoc( date() ) + " " + time(), space( 18 ), 0, 0, pConnectionSocket, 0 } ) + ENDIF + hb_mutexUnlock( ::pMtx ) + ENDIF + ::nNumConxn++ + ::oDlg:title := ::cTitle + " - " + ltrim( str( ::nNumConxn, 6, 0 ) ) + ::refresh() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:unregister_connection( pConnectionSocket ) + LOCAL n + + HB_SYMBOL_UNUSED( pConnectionSocket ) + ::nNumConxn-- + ::oDlg:title := ::cTitle + " - " + ltrim( str( ::nNumConxn, 6, 0 ) ) + if ( n := ascan( ::aData, {|e_| e_[ DAT_HBSOCKET ] == hSocket } ) ) > 0 + IF hb_mutexLock( ::pMtx ) + ::aData[ n, DAT_ACTIVATED ] := .f. + ::aData[ n, DAT_TIMEOUT ] := dtoc( date() ) + " " + time() + ::aData[ n, DAT_HBSOCKET ] := NIL + ::aData[ n, DAT_CONNSOCKET ] := NIL + hb_mutexUnlock( ::pMtx ) + ENDIF + ENDIF + hSocket := NIL + ::refresh() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:execEvent( cEvent, p ) + LOCAL qEvent, oMenu, txt_, s + + SWITCH cEvent + CASE "browser_contextMenu" + oMenu := XbpMenu():new():create() + oMenu:addItem( { "Terminate", {|| ::terminate() } } ) + oMenu:popup( ::oBrw, p ) + EXIT + CASE "tool_button_clicked" + SWITCH p + CASE "Help" + Hb_Usage() + EXIT + CASE "About" + txt_:= {} + AAdd( txt_, "Harbour NetIO Server" ) + AAdd( txt_, "Developed by:" ) + AAdd( txt_, "Przemyslaw Czerpak" ) + AAdd( txt_, "Viktor Szakats" ) + AAdd( txt_, "Pritpal Bedi" ) + AAdd( txt_, "" ) + AAdd( txt_, "built with:" ) + AAdd( txt_, HB_VERSION() ) + AAdd( txt_, HB_COMPILER() ) + AAdd( txt_, "Qt " + QT_VERSION_STR() ) + AAdd( txt_, "" ) + AAdd( txt_, "Visit the project website at:" ) + AAdd( txt_, "http://harbour-project.org/" ) + s := "" + aeval( txt_, {|e| s += e + chr( 10 ) } ) + MsgBox( s, " About NetIO Server" ) + EXIT + CASE "Terminate" + ::terminate() + EXIT + CASE "Exit" + PostAppEvent( xbeP_Quit, , , ::oDlg ) + EXIT + ENDSWITCH + EXIT + CASE "QEvent_WindowStateChange" + qEvent := QWindowStateChangeEventFromPointer( p ) + ::nPrevWindowState := qEvent:oldState() + EXIT + CASE "QEvent_Hide" + IF ::lSystemTrayAvailable + qEvent := QHideEventFromPointer( p ) + IF ! ::lChanging + ::lChanging := .t. + IF qEvent:spontaneous() + IF empty( ::qTimer ) + ::qTimer := QTimer() + ::qTimer:setSingleShot( .t. ) + ::qTimer:setInterval( 250 ) + ::qTimer:connect( "timeout()", {|| ::execEvent( "qTimer_timeOut" ) } ) + ENDIF + ::qTimer:start() + qEvent:ignore() + ENDIF + ::lChanging := .f. + ENDIF + ENDIF + EXIT + CASE "qTimer_timeOut" + ::oDlg:hide() + ::oSys:setToolTip( "Harbour NetIO Server: " + ::oDlg:title ) + ::oSys:show() + EXIT + CASE "qSystemTrayIcon_activated" + IF p == QSystemTrayIcon_Trigger + ::showDlgBySystemTrayIconCommand() + ELSEIF p == QSystemTrayIcon_DoubleClick + ELSEIF p == QSystemTrayIcon_Context + ELSEIF p == QSystemTrayIcon_MiddleClick + ENDIF + EXIT + CASE "qSystemTrayIcon_show" + ::showDlgBySystemTrayIconCommand() + EXIT + CASE "qSystemTrayIcon_close" + PostAppEvent( xbeP_Quit, NIL, NIL, ::oDlg ) + EXIT + ENDSWITCH + + RETURN 0 + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:showDlgBySystemTrayIconCommand() + + ::oSys:hide() + + IF hb_bitAnd( ::nPrevWindowState, Qt_WindowMaximized ) == Qt_WindowMaximized + ::oDlg:oWidget:showMaximized() + ELSEIF hb_bitAnd( ::nPrevWindowState, Qt_WindowFullScreen ) == Qt_WindowFullScreen + ::oDlg:oWidget:showFullScreen() + ELSE + ::oDlg:oWidget:showNormal() + ENDIF + + ::oDlg:oWidget:raise() + ::oDlg:oWidget:activateWindow() + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildBrowser() + LOCAL s + + ::oBrw := XbpBrowse():new():create( ::oDlg:drawingArea, , { 0,0 }, ::oDlg:currentSize() ) + ::oBrw:setFontCompoundName( "10.Courier" ) + + ::qLayout:addWidget( ::oBrw:oWidget, 0, 0, 1, 1 ) + + ::oBrw:skipBlock := {|n| ::skipBlock( n ) } + ::oBrw:goTopBlock := {| | ::goTop() } + ::oBrw:goBottomBlock := {| | ::goBottom() } + // + ::oBrw:firstPosBlock := {| | 1 } + ::oBrw:lastPosBlock := {| | ::lastRec() } + + ::oBrw:posBlock := {| | ::recNo() } + ::oBrw:goPosBlock := {|n| ::goto( n ) } + ::oBrw:phyPosBlock := {| | ::recNo() } + + ::oBrw:hbContextMenu := {|mp1| ::execEvent( "browser_contextMenu", mp1 ) } + + s := "selection-background-color: qlineargradient(x1: 0, y1: 0, x2: 0.5, y2: 0.5, stop: 0 #FF92BB, stop: 1 gray); " + ::oBrw:setStyleSheet( s ) + + ::oBrw:cursorMode := XBPBRW_CURSOR_ROW + + ::buildColumns() + + ::oBrw:oWidget:show() + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:terminate() + + IF ::aData[ ::recNo(), DAT_ACTIVATED ] .AND. ::aData[ ::recNo(), DAT_CONNSOCKET ] != NIL + IF ConfirmBox( , ; + "Terminating: " + ::aData[ ::recNo(), DAT_IP ] + " : " + hb_ntos( ::aData[ ::recNo(), DAT_PORT ] ), ; + "Critical, be careful", ; + , ; + XBPMB_CRITICAL ) == XBPMB_RET_OK + + netio_serverStop( ::aData[ ::recNo(), DAT_CONNSOCKET ], .t. ) + ENDIF + ENDIF + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:refresh() + ::oBrw:refreshAll() + ::oBrw:forceStable() + ::oDlg:oWidget:setGeometry( ::oDlg:oWidget:geometry() ) + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:skipBlock( nHowMany ) + LOCAL nRecs, nCurPos, nSkipped + + nRecs := len( ::aData ) + nCurPos := ::nCurRec + + IF nHowMany >= 0 + IF ( nCurpos + nHowMany ) > nRecs + nSkipped := nRecs - nCurpos + ::nCurRec := nRecs + ELSE + nSkipped := nHowMany + ::nCurRec += nHowMany + ENDIF + ELSE + IF ( nCurpos + nHowMany ) < 1 + nSkipped := 1 - nCurpos + ::nCurRec := 1 + ELSE + nSkipped := nHowMany + ::nCurRec += nHowMany + ENDIF + ENDIF + + RETURN nSkipped + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goTop() + ::nCurRec := 1 + ::refresh() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goBottom() + ::nCurRec := len( ::aData ) + ::refresh() + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:goto( nRec ) + IF nRec > 0 .AND. nRec <= len( ::aData ) + ::nCurRec := nRec + ::refresh() + ENDIF + RETURN .t. + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:lastRec() + RETURN len( ::aData ) + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:recNo() + RETURN ::nCurRec + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildColumns() + LOCAL aPP, oXbpColumn + LOCAL nClrBG := GRA_CLR_WHITE + LOCAL nClrHFg := GRA_CLR_YELLOW + LOCAL nClrHBg := GRA_CLR_BLUE + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Sr" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 40 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| strzero( ::aData[ ::recNo(), DAT_SERIAL ], 4 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Actv" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 45 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| iif( ::aData[ ::recNo(), DAT_ACTIVATED ], " ", "X" ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "IP" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 150 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_IP ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Port" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 55 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_PORT ], 5, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "DateTime IN" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 152 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_TIMEIN ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "DateTime OUT" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 152 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| ::aData[ ::recNo(), DAT_TIMEOUT ] } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "KbIN" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_BYTESIN ], 6, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "KbOUT" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( ::aData[ ::recNo(), DAT_BYTESOUT ], 6, 0 ) } + oXbpColumn:colorBlock := {|| iif( ::aData[ ::recNo,3 ], { GRA_CLR_BLACK, nClrBG }, { GRA_CLR_RED, nClrBG } ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + aPP := {} + aadd( aPP, { XBP_PP_COL_HA_CAPTION , "Files" } ) + aadd( aPP, { XBP_PP_COL_HA_FGCLR , nClrHFg } ) + aadd( aPP, { XBP_PP_COL_HA_BGCLR , nClrHBg } ) + aadd( aPP, { XBP_PP_COL_HA_HEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_FGCLR , GRA_CLR_BLACK } ) + aadd( aPP, { XBP_PP_COL_DA_BGCLR , nClrBG } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_FGCLR , GRA_CLR_WHITE } ) + aadd( aPP, { XBP_PP_COL_DA_HILITE_BGCLR , GRA_CLR_DARKGRAY } ) + aadd( aPP, { XBP_PP_COL_DA_ROWHEIGHT , 20 } ) + aadd( aPP, { XBP_PP_COL_DA_ROWWIDTH , 60 } ) + // + oXbpColumn := XbpColumn():new() + oXbpColumn:dataLink := {|| str( iif( empty( ::aData[ ::recNo(), DAT_CONNSOCKET ] ), 0, ; + netio_srvOpenFiles( ::aData[ ::recNo(), DAT_CONNSOCKET ] ) ), 6, 0 ) } + oXbpColumn:create( , , , , aPP ) + ::oBrw:addColumn( oXbpColumn ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildToolBar() + LOCAL oTBar + + oTBar := XbpToolBar():new( ::oDlg ) + oTBar:imageWidth := 40 + oTBar:imageHeight := 40 + oTBar:create( , , { 0, ::oDlg:currentSize()[ 2 ]-60 }, { ::oDlg:currentSize()[ 1 ], 60 } ) + oTBar:oWidget:setAllowedAreas( Qt_LeftToolBarArea + Qt_RightToolBarArea + Qt_TopToolBarArea + Qt_BottomToolBarArea ) + oTBar:oWidget:setFocusPolicy( Qt_NoFocus ) + + oTBar:buttonClick := {|oButton| ::execEvent( "tool_button_clicked", oButton:key ) } + + oTBar:addItem( "Exit" , ":/exit.png" , , , , , "Exit" ) + oTBar:addItem( , , , , , XBPTOOLBAR_BUTTON_SEPARATOR ) + oTBar:addItem( "Terminate", ":/terminate.png", , , , , "Terminate" ) + oTBar:addItem( "About" , ":/about.png" , , , , , "About" ) + oTBar:addItem( "Help" , ":/help.png" , , , , , "Help" ) + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:confirmExit() + + IF ConfirmBox( , "Do you want to shut-down the server ?", " Please confirm", XBPMB_YESNO, XBPMB_CRITICAL ) == XBPMB_RET_YES + PostAppEvent( xbeP_Quit, , , ::oDlg ) + ENDIF + + RETURN NIL + +/*----------------------------------------------------------------------*/ + +METHOD NetIOServer:buildSystemTray() + + IF empty( ::oSys ) + ::oSys := QSystemTrayIcon( ::oDlg:oWidget ) + IF ( ::lSystemTrayAvailable := ::oSys:isSystemTrayAvailable() ) + ::oSys:setIcon( ":/harbour.png" ) + ::oSys:connect( "activated(QSystemTrayIcon::ActivationReason)", {|p| ::execEvent( "qSystemTrayIcon_activated", p ) } ) + + ::oSysMenu := QMenu() + ::qAct1 := ::oSysMenu:addAction( ":/fullscreen.png", "&Show" ) + ::oSysMenu:addSeparator() + ::qAct2 := ::oSysMenu:addAction( ":/exit.png", "&Exit" ) + + ::qAct1:connect( "triggered(bool)", {|| ::execEvent( "qSystemTrayIcon_show" ) } ) + ::qAct2:connect( "triggered(bool)", {|| ::execEvent( "qSystemTrayIcon_close" ) } ) + + ::oSys:setContextMenu( ::oSysMenu ) + ::oSys:hide() + ::oSys:setToolTip( "Harbour NetIO Server: " + ::oDlg:title ) + ENDIF + ENDIF + + RETURN nil + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION AppSys() + RETURN ( NIL ) + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION FileSig( cFile ) + LOCAL hFile + LOCAL cBuff, cSig, cExt + + cExt := ".prg" + hFile := FOpen( cFile, FO_READ ) + IF hFile != F_ERROR + cSig := hb_hrbSignature() + cBuff := Space( Len( cSig ) ) + FRead( hFile, @cBuff, Len( cSig ) ) + FClose( hFile ) + IF cBuff == cSig + cExt := ".hrb" + ENDIF + ENDIF + + RETURN cExt + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE ShowConfig( netiosrv ) + LOCAL cMsg := "" + + cMsg += "Listening on: " + netiosrv[ _NETIOSRV_cIFAddr ] + ":" + hb_ntos( netiosrv[ _NETIOSRV_nPort ] ) + hb_eol() + cMsg += "Root filesystem: " + netiosrv[ _NETIOSRV_cRootDir ] + hb_eol() + cMsg += "RPC support: " + iif( netiosrv[ _NETIOSRV_lRPC ], "enabled", "disabled" ) + hb_eol() + cMsg += "Encryption: " + iif( netiosrv[ _NETIOSRV_lEncryption ], "enabled", "disabled" ) + hb_eol() + cMsg += "RPC filter module: " + iif( Empty( netiosrv[ _NETIOSRV_hRPCFHRB ] ), iif( netiosrv[ _NETIOSRV_lRPC ], "not set (WARNING: unsafe open server)", "not set" ), netiosrv[ _NETIOSRV_cRPCFFileName ] ) + + MsgBox( cMsg ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE HB_Logo() + + MsgBox( "Harbour NETIO Server " + HBRawVersion() + hb_eol() +; + "Copyright (c) 2009-2011, Przemyslaw Czerpak" + hb_eol() + ; + "http://harbour-project.org/" ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC PROCEDURE HB_Usage() + LOCAL aMsg := {} + LOCAL cMsg + + AAdd( aMsg, "Syntax:" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " netiosrv [options]" ) + AAdd( aMsg, " " ) + AAdd( aMsg, "Options:" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " -port= accept incoming connections on IP port " ) + AAdd( aMsg, " -iface= accept incoming connections on IPv4 interface " ) + AAdd( aMsg, " -rootdir= use as root directory for served file system" ) + AAdd( aMsg, " -rpc accept RPC requests" ) + AAdd( aMsg, " -rpc= set RPC processor .hrb module to " ) + AAdd( aMsg, hb_StrFormat( " file.hrb needs to have an entry function named %1$s()", _RPC_FILTER ) ) + AAdd( aMsg, " -pass= set server password" ) + AAdd( aMsg, " " ) + AAdd( aMsg, " --version display version header only" ) + AAdd( aMsg, " -help|--help this help" ) + + cMsg := "" + aeval( aMsg, {|e| cMsg += e + chr( 10 ) } ) + MsgBox( cMsg ) + + RETURN + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION HBRawVersion() + RETURN StrTran( Version(), "Harbour " ) + +/*----------------------------------------------------------------------*/ + +STATIC FUNCTION xtos( xVrb ) + + SWITCH valtype( xVrb ) + CASE "C" + RETURN xVrb + CASE "N" + RETURN ltrim( str( xVrb ) ) + CASE "L" + RETURN iif( xVrb, "T", "F" ) + CASE "M" + RETURN xVrb + CASE "A" + RETURN "A" + OTHERWISE + RETURN "" + ENDSWITCH + + RETURN NIL + +/*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbnetio/utils/netiosrvq.qrc b/harbour/contrib/hbnetio/utils/netiosrvq.qrc new file mode 100644 index 0000000000..6f1699b15e --- /dev/null +++ b/harbour/contrib/hbnetio/utils/netiosrvq.qrc @@ -0,0 +1,10 @@ + + +harbour.png +exit.png +fullscreen.png +help.png +about.png +terminate.png + + diff --git a/harbour/contrib/hbnetio/utils/netiosrvqt.hbp b/harbour/contrib/hbnetio/utils/netiosrvqt.hbp new file mode 100644 index 0000000000..9adb81e3a7 --- /dev/null +++ b/harbour/contrib/hbnetio/utils/netiosrvqt.hbp @@ -0,0 +1,24 @@ +# +# $Id$ +# + +-3rd=hbide_version=1.0 +-3rd=hbide_title=NetIOServerQt +-3rd=hbide_output=netiosrvqt + +-gui +-mt +-w3 +-prgflag=-l- +-icon={allwin}harbour.ico + +../../hbqt/hbqtuitools.hbc +../../hbxbp/hbxbp.hbc +../../hbnetio/hbnetio.hbc + +netiosrvq.prg +netiosrvq.qrc + + + + diff --git a/harbour/contrib/hbnetio/utils/terminate.png b/harbour/contrib/hbnetio/utils/terminate.png new file mode 100644 index 0000000000000000000000000000000000000000..de8bcd298779eb3e62d70563f36ad5de3149b80b GIT binary patch literal 1763 zcmV<91|0c`P)ki%|4+Nn?h1qPPu|Y#{Qtc7{qKGMdv63- zA6Jk}CaEGR2ZX_pZ0USPQ@a7blgkS*hH4%j4FistSeqz6hXlN(Bw}hnbzXBLc^1k57tCmJj7sRq#A*7_i za5x}3?GPPy2sS%u5MU?@^jHkK9D_htgo4l-z0exIGK_$4E9rTLK&tJUY9azB0Oa!G-1Sz^Myn{ff4T#M~3e@7>3&6 z=b+-=plhVH4f0VhVuwEag_e#X(R%gG6?2BIOP%xrvc_D)cNRBJ$4qoOINL94FhaI< zKqC(Hdc)8(g#T_u*t-&X#~+W;s`X4Ou?xpsRnL@U-!%>Pw3PG4nVXrrFVFOOZ;&ug zDCauK13C{O3sdOOUda2_{zlUynC>beebDZ#S&K1X_|WslX~!(i|HojSP&)&r7kWI? zz5N~NLEkM5z+!vp#D)2fybRH0?;(!q`u>A)?xvy)OE+gttnS11MB@V1P8o>_#n~6#?aou}c>LQ&Qq@<7 zPRS|Sd?p@>NaH?)eqQ5c0DJ?V-H@A7e6?wu9Vr%ueq(H520p*P(vr*X-FyK1n*9mS zqfI_a*D^m5YFi5eU%%GM0<9Ii{-tR1c+BHM87$F?ljI*hHy&n7%q z0$oH%KewZYL+Gqopa_)njiR@=L9m0)_KWFvJZLr* z!~tE7CcHeVC=*-fPp|}F^3t7XXzEM^Kt)OmhPVeJzix+oWZM!3;1+xS5O40&D|-rt z3N;W+)Jpl`Jvs$5ZyUkObh5z|Z`ySf3+NO;O3b8cM}WMmau0OvSVV=Yr7B*Gavoh$ z;w&0&@}N6p9>@MWpj0|C!-YJLD=7e9Kt`iqhUiY5H%K4bJ$L`vQwY{Aix(p{<~oLy zugjVJR{V%4on1-E_@4%=#?1Akmu)b(YXxP(6LV>1LoWauNqxq&`4#T6+suT-2t&2} zf3Z)TGF@*V`saRx>o*;s$JgV6hJ=j@!QtMMJ?CAwJ-g5(B)zD01(W3^s~e}lt8wF+ zzZG3|OQ~Io-as?Ivg!V8nkA;^e4PEj8=^EIhm(rOjzA zEdLiZ)2T*$n0CXA40pxdq)_BQc)6yIm!A+-Gr`5}3O#+}1uZ+dUOxUk$$C0nB>PU_l`e|dUkzkJoomvy2Xmpe*it*-#DtATxb9Q002ovPDHLk FV1ku+NR