From 8fe7e726a4cf3de796319cfa9e674cae7e745cc7 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Wed, 25 Mar 2026 01:27:39 +0100 Subject: [PATCH] - --- .../lib/linux/x86_64/QtWebEngineProcess.exe | 1 - private/lib/linux/x86_64/librktwebview.so | Bin 0 -> 113488 bytes private/lib/linux/x86_64/librktwebview_qt.so | Bin 239416 -> 0 bytes private/lib/linux/x86_64/rktwebview_prg | Bin 0 -> 232440 bytes private/racket-webview-qt.rkt | 140 +++-- private/racket-webview.rkt | 1 + rktwebview_qt/CMakeLists.txt | 43 +- rktwebview_qt/command.h | 1 + rktwebview_qt/install-linux.sh | 5 +- rktwebview_qt/json.cpp | 505 ++++++++++++++++++ rktwebview_qt/json.h | 217 ++++++++ rktwebview_qt/main.cpp | 393 +++++++++++--- rktwebview_qt/rkt_protocol.h | 33 ++ rktwebview_qt/rktwebview.cpp | 339 +++++++++--- rktwebview_qt/rktwebview.h | 140 ++--- rktwebview_qt/rktwebview_global.h | 18 + rktwebview_qt/rktwebview_internal.h | 6 - rktwebview_qt/rktwebview_qt.cpp | 198 ++++--- rktwebview_qt/rktwebview_qt.h | 15 +- rktwebview_qt/rktwebview_qt_global.h | 12 - rktwebview_qt/rktwebview_test.cpp | 32 ++ rktwebview_qt/rktwebview_types.h | 84 +++ rktwebview_qt/shm.cpp | 189 ++++--- rktwebview_qt/shm.h | 5 +- rktwebview_qt/shmqueue.cpp | 26 +- rktwebview_qt/shmqueue.h | 10 +- 26 files changed, 1896 insertions(+), 517 deletions(-) delete mode 120000 private/lib/linux/x86_64/QtWebEngineProcess.exe create mode 100755 private/lib/linux/x86_64/librktwebview.so delete mode 100755 private/lib/linux/x86_64/librktwebview_qt.so create mode 100755 private/lib/linux/x86_64/rktwebview_prg create mode 100644 rktwebview_qt/json.cpp create mode 100644 rktwebview_qt/json.h create mode 100644 rktwebview_qt/rkt_protocol.h create mode 100644 rktwebview_qt/rktwebview_global.h delete mode 100644 rktwebview_qt/rktwebview_internal.h delete mode 100644 rktwebview_qt/rktwebview_qt_global.h create mode 100644 rktwebview_qt/rktwebview_test.cpp create mode 100644 rktwebview_qt/rktwebview_types.h diff --git a/private/lib/linux/x86_64/QtWebEngineProcess.exe b/private/lib/linux/x86_64/QtWebEngineProcess.exe deleted file mode 120000 index 81792f9..0000000 --- a/private/lib/linux/x86_64/QtWebEngineProcess.exe +++ /dev/null @@ -1 +0,0 @@ -QtWebEngineProcess \ No newline at end of file diff --git a/private/lib/linux/x86_64/librktwebview.so b/private/lib/linux/x86_64/librktwebview.so new file mode 100755 index 0000000000000000000000000000000000000000..3ca127e51dc43330443d4414076ee0a2d5165eca GIT binary patch literal 113488 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

WLXp4p*PJ+jL%8g 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

QWs8gQLJV46j}Dp3K)h#Y=nWMen)Oz0SCr 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 literal 0 HcmV?d00001 diff --git a/private/lib/linux/x86_64/librktwebview_qt.so b/private/lib/linux/x86_64/librktwebview_qt.so deleted file mode 100755 index 6aaa0b002dcd20a889243bdb8a2a86fb0b66e882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239416 zcmeEv33wF6)^-yDgf%0AB5or_4X8MiJt#T}1Ue94vValPtOE&T8IuVFa0wb;0t#0|MFVG$6wh+ah0Ys7^KZV?3|F8R+nRXua2(;X1M&*yud-`1w*ef#vO zs#B*&vpcJx#(Rs2X%9P&oxeLXc1;Nq0N@b8(*86+F*yVLbU!`p(> zu8KuqOrsZmY{h@zXr+IB*QA9a7uuCSN9kn;i3fDo;Hw0!UHNmp;g)-=cus$9877|V zkXP+Fl*Z?>UlY&iukA7$+BHO|Q815q#>xBoYnYVNt|*I#^K(x=es-3K2ldxq`jD8S zUA5;@;W^Cbu^zG-lr)*1-X0om=r1&CSIsvt-63$IS4^BbUD=!V?wC{lJvO-gnZ+}P z-O=yw4`yH3fls~yXBa$Wg)6EWtSnQM#G%cKHAD#xQEGZ9mYzW&inGC@g!i;MtV&qW zGoUm0foqhOQE|}@$Fh(hC8)2`!=dzSY|2gv-dvS9Kq-LgxkG7KTLrpo@OeN=NUs~6 z2YSVaTf?lwl&H+pBWe=Qd3?r@unPwC&JP)2d9|u%P4oC{rK%=Kv08dJFN+ASs=Cn` zG^EDiRQ~4Z(IY%~7~BaOR^zze+B@~N8Nta)FH1<(gVrG@1i2HHVU0mOg28496GEVd zEsh?EN^b|aN|jqt8pBS7(uMS}S-%fXs2w!QHhBCg)2$m;hNRrzZ^l(tsK-%ILdR(h zLmlJE7UzOJ&Vv(=aCybgBjNKXIM0W3G@Ld#wIc#PN5UBeXAI+G;d7kC@o>Eu&P(CE z3{D4}32=^w6OSZ$od{PI&Pi~lz&Qm@Jf_NP8eB8ryd2J%a9#=L)o^M@E_|K?XQAZg z%4-o^i{UJhxD>8#`S}{SdgSN%a9tojSHg7>oY%s69h^77iAR;ZE`cjJiLw;Vo8Y_| z&gF340%tv(e}l6DPCRad>)++)m2kZs&O0Pt1=l;}=eyu~51jW&jL$v@pZ^8t!*H&H z^AR{7h4TqG*TeY~oX^1d9Gn~A#N&B+{Wn}+ke`u%5k7B%bF<{O!1Wb4x5K#u&R5~w z2`3(}$t!+-9X`Ja=UZ^L!1*?u@4$)2Zn*A|pAqkc&mY41iRAXd^;7xzGkN_2u5I%3 z0l0n%=Qk3g4((_M?jW4s!})`}e+aHW!ugZLN8tK1oWH`^DLL(Vy!HS$4}!BNoWXGR zfwM21c=VUofp86l^8`3gl-y9bMx59GhI!|oociN;&sEMke{MwbRa+j}{{5t0AAf&u zh`aCV_tqc$$FhgNDYNA6|LL>a_r7<>jnjJUKDBM**x08Z*m>atS-%B;I&p5#`od-R zJ)SjofYu}qh5I7!f$T9>w(L!iJ#r;q3T(moL=#X+Bti` zXXi$=e;*claQ2a;pZa~45qp39Yd5ubjO-YB?^hGXzWVlISKhT3#KjeFeC7PF@7@tz z{!~kea<8&}>)7Rkq6VM)@B^OnS8V-kPO@w9R!hyTOMB+tKk@vtH~#j>4~f_ApMTDR zH~(F?{_;t`qSAFy}Vyt-F<-#l=` zKOby(bLM+(Pu$)dlGQZCI`E@Wo6;Ycy5;t{E&urP{RbZ(bm-uq$g}R7zP9w16F1yk z`p}A>uQ^;%aPp6D7ZpaV__i?hx53{&ZgqY6!_)yI1dv6``{mNHf>Cw>e(aZk{eeu&D-}%@0^YRZ@ zesjv|D;AIZeCS!}Bj&pH4|itnJ!jmv=U-ympO<%P`oXlg?C;h*vFy>&?ep$b&baHr ztIt#W?>|(0{cSJyUAc7X*`vpf8h-Eh(GM0UD9aqzoc6`R=e~dc_SN>Ln)6ou_o1@& zjTaA0|KQ=zpQ?W)+p=Nb&xcQ)5w`BZNBXRvux87Wm0_1}4ln-k&RIjJ1zp@Sy0fL? z)K^yS-W&VYllG44)Db-k7vCCrbJSDuqkn$*ncM3>?zy`3oloyu_d)#3%B;9WA7205 z#@I<~*VRvX=*G4?5(+op^7f;PuPWKsFQ%sO*QUs45*~OW{p)R4jIR6nk=Kd`Jdhu~ zDrjxX(yw}*TyIa=|L?1}%~|yF+25ahXOPYMXvqyjFS+Wazn@llB;&!>Z@*YEZ1}vs zDYsAB`pjvy5BBPn{zypL-@fW~+sSu-ad+LSXRa^!tmBvE>#A~B&CQ9QcV$L#e1o&% z;`gt1efMD7+%^4HUAF&)3F}6u^xOcAovE{#<^Wk-?K2er_G36g?+@s#B{>S%Yp1EYercuK$eq_Yd z!n0pkn)Bszr+yYc^iU7?J&!of$oi!GhAW&S7CG|oNpG#c_0>_sKkhTMK-5V7Zip8~ zyd64cBYxXxW4`WGW4`~T#{7;Gjrl1j81uKoFu^E4cc&WjQ{#>K{U-J~>s({`d=opL zl5Q-&c#1Ki_WByE&cC-^FhDLF(mr4A24kmj>@--&y zC>$nTM)G%?*lmbO{11mXV^rQZOxoS&lZ@qY+;5bh`%L2VdzTo?UvQE!e;TxFqkO*X zG?tGXU@ZUQRAc#qi;VecCiS=nGGkQUMG$9<@_BlMF+as_tmhY#auu2Qe@|HSFv`!l zKpOEcn)Fl8o7C4=Lyh(P$E05yZDQvsry1*+2<^)#pZf+H+s$s$u2-AHlb1~751Yi{ z?Iz`Y5f*!l@;TVV{vjsz`~(*LjP$HBX{RGh{NXVZKl~@OYa{(PjWy<{K>Rn7zuKgK z++#A{XaN5-^8Xno_W#ACyx&-j^K+j`yuHDsyiSw;y56K*cbde#DJJDT!9>s5Fm5!m z!v)aCLeaV$!%h6Ez@)$a*rXi|HSybCCVukkAY(h9Wg_o9&scsG6w1hdUIo&KUw)x6 zztp6>Z6^KQUXys3Z{k-En)Ii)g&XIm(4=2mIL5es=a{t9@(g4BH74_vaFcQJIVN%A z)HGxLz3j$(iwVDMsC_WZkv{jWB$L%T`;^@~Y9x0?9dMJ9e;dy#Q{-8IsfuQc(u z*mPt0RFiQxCx#5o#|3lvdoN0S7c&I=+s; zargkG8DG@HaU!hW;jt6e2avaP3Vgk|t?cikC}%0dmGK`zM+S!!R}R5=8|9ni#(}S- zd@bl7415)C>VQMi${LDe0~80o$cJMY{R{h0ApfYxsR%w#CNO~F2I$EW8YW6bi_aGN zZD$1LXCdgrbh8f$#o(57Y=Cxz`WZap;X}4yl;9<899si`b zH%K`xUl7pD={Pr5=&}4=$gh@slC*;rH@d*lF8RMnyS3n^3pjAU2_BKqZ=MA^rBu0p z48j^6y}SE(|;A$bkAnJ6mwm6C99jI<5o(te1u(0&6j$H_XeBZ~w25PZbyC z(j>t<<%XRzBwtVCC`cDK+Q1=cWhIOcQBTW5f=K{B!=r)5rNCzhc`g4_AwHmdtF9hx z6mOy3%@BH4LVe?L3fL3nZC40AT6rIX@f)T4n2^`(|H(zd4z{ZWKS^AagES9?{EQKL z+|q#-%J$d*+X3;A)v1g>Tj+5{3jUw6T=z>mSfm|F=_y6I|1>Et^?MR_f_Aqx&I4!i;V0@|T!rQm1MT}7FEj^G<{ za~2$fWxCsC`*ofq2#=KiTGpdY=F=+qjk3H|vb?pDUlb7US?>3As$^$b_Cb#crxQl#5>sYqAb@AVcq7}-Gv z09n1teV0idH`&2)mTaecq#asxb~qL48QYN?_gBJkt*rM%X`hA%gr4!@q6BL^Zv2Cz zQ&wb&EN}L3p=UYWRg_<3{#!Ez55s;svcXUkCuN+8ll*(*X`%V#Cj z7v{(M4;<+&lB#(jn4q#f_72X#S8iPTKQx!E14#faZPRw~Gb8K>AM@6d&s= z`$tlvj29QBzl>uoGC$IM%Iz}#IBFJOguEQ?C{KX^+TYnKcrE{tnxD%6ute&ql>KRgE)LJ1EYfwz@sf0BrB3!QEz%D) z{!tmvm0yM8n?>@vdNESE#t4Z1lx9&m{Kw`>*)G=IpEand6DJ5Wo9 z1L_6+uvz+{Hf|Ylw$R^ty0G&^DL++?PZ}Q;`om;CFO%)vViWRxCI8qcp(i_05L3l% zr4jlU^7C5-ueIx+S<3;|jlX~8e?bjje zQH!g0fm*b`S2u214gmqvwcw^)I5a=}QR-=y@lDf{DdSJeDMEgUOm~)y+wS!u|C&GC zChgNSM943b^2tyxOgH;-!A};CDOZdXyc;(j!-0FI@i<-TZ;>0UHG9qjhe16~bW}Jl zk@6pm5pmV2i>r27zqVu{XahUqu|c+Xi?o{z8_E|@FX;b@^tWqz_D;9x$RzZS$9l8=YDhx)5Lf{@+6GHE#0*B~V}UzE!t_0NL-0`)Y=5#6Vf z4}*a#>aj_`3X^<)&HlLA8jdBBZJ|p$C z$a$Zp=L*OG$~VYdEdYr-fkcZ^xm=6C^d8Pk|yNXhDv9Mdq zor00oqa?}rpri@?a`>p+1MQCd^L8Px^)IuafgrC02_Cv#I@ZZ~bc0+^_yo#{$3JCx zn`L>&3tGvO@|F^z2j5TQ@hsE>`Njs@+B3(BQ0N}98{5;=R@J+u71tH?1WXOKdwk@z;b_2w8n=TOiEa{*9 zKtK7LY)7D$4(nvW>-){6GCsGrJ_!)5*cO&DON%;!ewKdlc6zFqQrp+d2~9QdUZIKGm0n*#YkzFF$Yrn`!A_XNoY z3;Wz8F3MNIB0m@UYTYh}8-RHr^QHW4vRyRl+Qko2k428t zK#Y!Fu|kh~g;20s@-foRj@^RS#_hQvkNMP(&+nCXv#u2Kn%%yae5>R&`#+i?%PakG zv`jY{+6&sP{T89eD*2TVuaLJsEcgN9qO{96smk^!mlc%rWO-X;L)YvUBHNKe+TlK_ z|0-!u8xFMKm@cYExm?D923;Ij4}OL7jOPV1o@@EU zc|64j8Mn3ZFykx!Y7^1Q6~CSAQ(Ma%k<%Ov%c3mAU2=mU~=f8B@j;m6o_Na&n7Y z;-2xHth~yctl5PnIYotwKyc<%dt}-?&jMHO{6g1)tZO{>$Z}7qJ88bF#8Xs?A5dnp zUdUGL^5jg*o$Jc;XcG2Rfyd`~a_q7B3rli}3-hMv#PoV%pfsKUF{3QmukmDIf_XXR zo+RhwJf+-ImRIaX(O8+Py^D-N(fl$+MM+cb_EdlNqQ>O_SLk$7c@4B4<%#&qUAZ&B zf~g+6Ntt+RaXERO!udHKSCUgp$~iebOG}<9v$=ETxKc`U@?H5!&h)HYsttZ$UlHt{ zzqrzDXp*Q@$Z1l^oWc?p=GV|}hB}U7fNm5Y?a4^U5qjU{g(dl=3+%B4IVJf;u5qq1 zPvPvsJhW2U?#{C z(xe#Xv!m1u5j~(DWqD-2^)~}DufHiv5TELCmQlR2$NEF&gwnE%g>F}}E~d{wJ!pRm6Qjw{XXl{^2Sc3#wc z*-0fcr74ARNlEr7*|T}TkXeQKhkxrMm(BmS|qJq#VL_QYG{TKAqUj zbP>#PyIm#uNqI`H?8xJNo?(yDMlPzW$n7da*I{+VY!l!@egzTHnu4jNWyLhm$w!yV zcg=?I2SxH_EggnYGr4j@_YP=H{|m0xUEg+G$#tjDWO&luBU)=bicA`eV9=c1iSf7v zu1bL*Ke@XnOxuVUPaU6zE-l3#drg`gNMnE_t=;CT5Qm{qSnf?=CtxW|2ednTR7rpz z(h&COey1Nw9G5F}8IYLNzrTS+M5QKOQvt2Uvv3-;z8p_!nJ?1ovy_r+PfCh`(N9iM zc{dT>IeC71Ecu3EWb2a0l)`9x#P5ra$F4(H_Yi<#U{nq%P_K)CFdqlCy0(DIyl{6;twgO5u84OfMJi}$Sebf90A=dlr}@(eUnoMiuoF? zj+UbX&0f(ioHQmmV^V229big3-J4KY1f4$4V+@6C9vs@x!%0qPK{V3os>_yFP*?1-v$K{F5cg-hnl@nmW+HK`7&y2$ILReKu5|dB;L@y2}SZX2EyjUvG6xySU z3rh-%D~i)i?nf243g;AfAhJ+5#G<=6|A&eaShg$`Nus@x?UxB`we+`)ti+ zaA+&m0)$vZsrfbMhwxBRy^C-}(Y6xY0 zEy!L1>n@t(1 zFeh_YfKy^;rkOA{HCaanD&)_kR=CO*CQXgNl}+}PpaYB=N6}#_Gyw=s^F_BzeMT4W zjL3s&rpG0gf52>PaO8ybPFjW#H?;wjT)psFC7`>~-?Vq>8T1mrug3IGcT;a&L``b1 zi=06nW~2vn_%Kvsc9OGd9KQw3Pq9XD0OMN~igtC0u0AX3`fi=7?xLzr^ytAgFqcP* zt-JvC;|Q$B7XExq{8+-CPx#ovohIIGmI z=1Oq8VW>n)-S$W+PqC;xDJFG7QO=z5WSmJ8l>%>_AaaVOc_D-nNn#om>t7(HKnPQ< zxYQXrWraB~612z4)hmcC2_^Xx%b?Q;T*8V%&QstlEia`0w9=Vwr-|ugpO$D(Da_`Q zoMN==qvJfK=@7w7=7^D|kB3P=N%{zFwiKPJ=9CvC7dmyOhIa%W2&l#GB3S&)Duiot z+T_AXNl8gl(<8F%F&Vy_xHMnnNt%|CHQqff!$$ek+$u^q0NR*M-Mg8PI_GztFv5Jy zHNG&XsC14!8m0g+-7i6kRtVw6lo*1gL9`GhPmjui|DBLaU!|pI#mJ>VQ9XfP6 z=-^}HX`EFGEzsEg&HP@gqd+*IT2QF*1sZWy0s6==)Z(XeKbQ&x$Kg*2{; z9tShebXN%mrTGwPg`3+`Cqd{HFV(drSO}6x&d4dMaE*)57813j{0xM0|HFlqdILoI zwWPUb=cL1Zu9=L)Qqo!ymkDU6!VgI4c$hgB!;FgV2V?_<;2mRtRE(z-^9i9Z%WlI@ zuo_UD;|VZe-0ZT_;_05*aj+EZU%L0bRp6CLVJsbHlz%Xcv9g0r1HDIcvMAA8W2rPM zx-6#&vP&UacdD%PDum zSk*HdD`yctGTA&o_DDHJkZslsnL;)ColCI4W+Jr}1GLrTX(~EC?ag2_x@a3$T2v>i7H0dsi1>>UaY-Tgi&_EAf<~XUgW>MSI?Wpwi!kLce)j>WuJlO%$f}}YwL|^ zM+I7%fr$lnkM?M0c3L7g>@p%jD&0Sc@V!6}R2DC!a6YF=_^0MDT18h1WCZ&5ZGTu4k4$w_DD}D4mGv0y0)hQM!vpHBfdd?v8y=Gy$~PQ zr4t9~q|wyZBqOmPKx^uSg+{i*e9D&-#sYRUCa!GDF{P0b=<>C@g>f*Agr$TmS~u2Z zmUN}VSW=TVD3Bdn7A)$PgFAI6M&**T=%dQXacy^UDygZj1DhfIdt!GV-7Q+Yr7&S(d)ehhgbt`4jCbi@g`i1kI8d#s_@s3(@7U#^!+@4%TF}H8otck4r~B(NzGONntAo zF1F!PQ)HIiY})BJ2u-B1qXi0H=dpo_W)C@26SGu%WPT|$K^XkQvLQ@kVepaWZ@sv1 zggK5)6>Cng2^!6-EyZZG$<7Gvy*Rwk7q9Dal><_Md5LpAR%T?DlXuq8X%v-uM7|PX zdM(~yM8TjH-}S?ogWfDSCqoOxbx+vzBV=VI_zAns|BTjmX?cZqg(DcP2(rWS*~Toi zMu4-9D=3AxiLl_Hc_Sqp7z|-yXdd|ruFPq2P}c55arS!@QEa8Mt++fHv_PW8DStPn zpZ4n75=D(E@Om9y*Cdu!vJ_$P0t-yV;udXg5K#w>tcmj$<1@H+^C+t~nssC37QzS! z%{k?Tc^J0EtOoo4=*xiVlzyS`l)Gy%gEs; zw9YU0M@Qkl*<^HzsnBb{W**^@{>&$_!E3;}hMj#KfD(fBKy8#AxO^H5FHmOV;tGu| zC&SRsH|Z9Gb=b7ypYe!kcVJwR>+)KoH?_1Dzf1+XPO-7$j4On`0{0CjO@n&zPq}rb zjt7^@%A+;!W3u`&R8_32(v=4!=Ym&L=wXr@%gYR2wo+b+>XV! z_x_s!sX>HGgRk@CQFDn+%_xA?n|zpQSCo}Oy$UER(04c5g~Rpnh2`!XPhJ7;o7nb@k!{`$qWPx79=&7)-ohA|_e3xW_b@K|qOi)`8xM0^J zSX+cm1G9BqB-EV5a7nRCaQ3;Wk+{E~=uWBDtN2v0H7bKIFyK~N|Iq9Bc9C-pX5$L> z#SH(KRsz!g{oi>xmdAA)y2YGGL=<>6Tmq}lA_l=sNw9Iyf%+yW*gUj%D$#PoA9ALB zo;^ygE6X(k|MGHoec$gLCB)^!j08FX{MM(Ka{7D&yB7IXi{Ft+m^Q!)`2S=U?Gf-b z;{0i4$@HC{Wa#)&e>BW11p{*|Sj4~`4Dvm6^fkC60;<$MOs6+I%zY#1y9DBXIaDkY zg`ot6vfpb-c!dr-i3^g%%cQ`k)7?2G-H+C^HB)@LBnSVEza}v!pS}qtVnm?EqmTb+ zpeyS%p2m*pE?2(YHm9gGH>U_c3wJe&4~4!a4+~Ph_ZRkf|F)OuxL0RR3Hc4Yv8$}a zH3O3`ZW%;3pOYoQ;6i@+khal)$Jw)V-v`rgrlIO#`HIstBsrneuk1E2-C42AdpvOD zuI&T%UZQ(x1M$GBHB!N=7I$v)rvt0e=;^==7&+I`b!e{e$DTfFtAOkqbj-(NLqj#c z%Z`Q`j>DFQdVZHZyVY7CL*$M3PG!Q-_a5vEe*gAr;Nok<3_&Cks%Tny` z$&!IxyW|N>Eb^p(#l`w~qkf?4AQYBfX~1x-+a6)z)CODmU@Z~eVxXm{vJ83zgQSkL zXXr8%K3XBWJdkw!rGyckp&<>@IL_i3*pBt4$6Y;`@xUMw*so}l0e@P7aR}W0sO`{5 zM?fsag-Z5T0A5SrD`i(ca@xy(gYs*7k8h?a*10tuv`I~D^3ml6mTpCE{4XlxfIlGD z@#0GqIE$u%8|)T^)%Pe^Ybg)}VQq!q$XT?k9Pii&CLm(rCm#Q@P718{XsGNy=?q_Th;CGbavVDSUL zCl$bpEhvE$zDo{ZV2wVj0{(UhPaU}e*l8O;!oK6Ix#a;A?i|%~Fbgb!KcOU6wgaSL zhKPR|CW}_&%CP}ybr(}nUgUDQVLHKcK@pS_@U9fM>v9T~XbSTK7~I1hK;V|X0KzTa zxdw2>@&#)kDc`0Bkf<(8eD^$nUqBnm@GnVubm@aJJ@`T>Ks=9LRb@f@37~NeItxwM zl`V&tPysB~QfWn&2lo#L+?ZYFa?x&N1wX-GrGV*rnKE1KUJ8(u-_j1?o(v`txdd?qZgC%y{h&VRj{A92`{7R%NX)?rj8VjDj&j^$KpPHe}Z-z^Cajs zj9i9|#jjq&S~9-Rf?c+95|s`!$($m}ij*^1`af8hH=MpQToGTlBBBi;?m zNZqYyBt!%$M_cm!U(|qp6ZVm0EGU)VFoB}Q10i-4;&yNO)deVXL^SMlal_wFE5Yw0 z!#hBBTULcwl!$@9paNFGt;h)_3;hcjX!&ll3Cj@ducdYOwg^I z*iOMD{PS1v{V4yR%7TsMnukvAGIX;?6qcvEie_WIYRe1;QnteKa`@68z78dSu%}nh zUwR{g3d%-JU2+pEs*dxbztw+70=i!ORwXLrx5O6!@tY$#^K--tE%qiB)*(D`v*jNZ zN}e#E?Jv+?_liY6v?9K|Nr4zA7XSlVA@;DIaZul7IYpwu_*?|a&)lOrP=J?+ z*Hgz5t9cDl&w@MjWRy25ygeHH58kTN*JRKuv=?LAFb`fnmV3%d7mB4kRH4OS+S3Z* ztH=f0wmiZW<-KU=(_zQHd`TbhRSWtW1%25faKklzGaPCBnw5)O1k=)gQ6oAB|1Oz~ zv+{c&v;Y|;zEe*{6knSl8oqNvU9zT!zOe$|HG$|X+NV(Eo3+qf5KNCb5dwOR+Q{7Z z2%i!7NPC3%MhQ;@{^$&?jm}SurE<&ve*h;ZJtp zpUevU8y)a!fc9o;) zkQu4=V&zT>3Iy7AQXF|v)djpDrZJD)Op15qMpU42uLKPWfQCO%6Yx}5J=)*qlh12! z$t0w`bz*;<4AJnV)-D?1`(^YZ9pCnphz^Vr4|R|ZmP?(ptLMNdqA;Zh@N-;`99snzE5-V^0LS*c1$PF$HN>* zn<`#|1yd%D8e8#V8X~k`u>eMU1vb`94OBjuxLYGeItDv^}0fWn5-vLSk~3 zeRL#g7;U#H7ZsEiyDkDtmtU0XxhMvx(GeG6eqy37g1o?A+znEC!Wk^Dhy?CM*C62W zzn)5Oy7r;_J(WJh^@Qh8TKf;5MT}<%T~S`(Ab3W|_9b1tfERcA`n2=`8B9mhju>;+ zPinz*#XY==R78rR1gH;lglUWPP+Hs*pOD2TgQcDz_^ks>0cAu^wX{($N@``*o)=|6 zw!cqDUy$knITu#yO?)57g{A|a#gd2=dH@o+7FO@0^ra^-7s4WVSIFX3Na52W?Or}z zLL*vi0GyhAMF|E%admEO74(MZw<-vBK#*cVT}8+U8E+@IW8PW%tir4u4o2{A3rqe>?mbg!a6+--q1~ zQXZAh!%uc7D{s34{sMV_2K)$f!AMl642P)r4&NFfa z{OR+)%C8c?^Ta&JP%owLn(&z>e6|T+V8U0L@Kriq{ZN#*LB}`d3VxN2 z&zJUZ)bZIJ!p==PUbAnbtY@uWUdk8x75RHo8sAVXc#DqTsPWP-G zM)|vCP95JQ`9>YTwMgWrS;x0Xd5f%nEkAEc`D`8EF6FCq{QFYAQO7sR-)U&q@%yEG zhmLQS@`|iaEk7;V?>*@FR>@m*e7ocwI$r4%^_#8ZgJiuF==cWtdx~xy-zfP?9p5bZ zDjnY{`6eB2lfPfGN5@ym{DkX%&!S5H{)+Z{sraiCCySq+pn~mrOVl%TA_07>j58=I zLkY=y86V8_xTXIil}D1|AMJM!k)O)=9Zdccrl*DRqZz-4@!D^sp}JPa%b)n8RJ@E| z%Jj4|Uj8&9$#*dRzr@IYwh8;7igv~?GvU|D-v`mlhcNkbn4Sg`zKQAK@)jn4Gt;xm zgx|pQaQR_Oej~GwmGNav|5_7%2h-2x!;aq6eD>z z<3D8isbu^Vrl*SWRwm!bcpQ0ZM>ESm=Ql94--b;(ZKS<`AR1Lwoe*UN>7C_ zdCs>p`6Eofg~@ZigUSDg%d>bcfAW#;4r9Fbo0NFN%J>jw2M0@+^WjYXL?*8?dCuFI z{JSilPA1R!I3|BTlh0)GoOdw!a3-J4xeh=f9G5%Y|H!xoQbR^|z72{uL@{Noi@5{ZSco{E$T9)p*S-bEs zJ(Y}4Vtf_jw=#Yi+=g zcsJu0u>4mtUi+mhY-plxDjBjUrAC_(h z86U#<8H~3u{tCtqWBfmv9juHmVe;XOuVB25@dH@?;}~DXOo$&>Xe~9sJ#;;?1CF37ud==yGVEJ6e_y-u@!1#?!&nm{pG5JQu|HSyU zjQ@h^X<~dVli$GjADDbI$%J^2spT_ubxvqWH&5~|B&&+7%zX~o>H+go|!=jXZ#aPkB#y2r^ZQ79OI*yyo2$V zGhSsp{B*JJa55gttR0z*579`tW-}gMSo)3v#t-nZisEMcK*m=x{!W(9D#j0D^2-<> z%J>GxU&HjQV!SqXz{eUHe*)99mhswed*kgU#-GUKH!yw(cA#$U+zwT!=+rQ5{#(M)~=<1b=- zGvjTH-@*80On(dG?M!|T<2Nz+R>oh(crW9xV|+W~BbojV#z!$;+2!~D7{-S%zKZF$ zFg};@!x$gS^jH}m$M|r@$1~o>_%V!+WBkR8cQF1k#;c5XFy6`d7g_!@8Q;P9Y{sjM zFJOEq>)70kKcC50GG6`!J>{y3@d+%S%NU=?_y)#5#q_UYd=isyWc&oiuVs8A)6>Lw zmC0{ld^D49X8aDu?_m6D#w5R8Aek#)+$M|0v?_fM^9r7J2<1>9MydPw| zjp@l`{9}yIX8cU1r-1P{GI=-SuVnI-jDL&CS24bt@yi%LjqwePzl!N!#rQ17H!?n( z@oO2M!}un~=Q4f+8)n4Ue1U&HuT#@905%Xy~1 zo$-8sO9$hZGkN7de*gcN=?`K2Ell3R_FXJC!d^_VGV|)kWA7{L>+wcF+vHXNE{z)cpVf;l*ei-A=WxSQ~Uok$M@$WI- z#`yIt-8jZiVDb*eKgHx##y`z?C*ymHqSM_>#&R~ z__a)roAK{3`AWv`W_%Un-(&nT#_wT#1LNOk{3^zO!1zYS*RXu9W&DRszKQW4Gkyc( zgP47q8UG2B-@*7RSh_8Yf12@o7{8C{X=VJUjQ2ABbH=wb-plw7#vfq3vPTpK*TTPK zd4+#`s3Y&tUr3 zGQN|^H!*%Pli$GjAjUT{zK-!b7~hNWEsXEY_&uCwA_U�Z#(&3nH{<`o_)5kPW_%Un*D-z><3}>Sf$=LCzl!lg7~jbF zp^RV4_>&ml#Q0&1-@y1M8Q;wK;f&wG_){6*!uZn}zlZVL7~jhHGa2t?yp{3oj6aL< z9gMd#UXky$G5(KWdl%L0E{;4cgO zWr4pe@IPjO??cZxqE>$uqSp0V@@)@AUE1sk>TFS~w}yzf3Z2nAf$lu#b@(^*Ob2{I zT!87fwRXaB&Su0ogKcXeyb&?3^t3e-UXQpZ;wHlD5CUI0SJv;TsY6MeHQJ2ys8e4#H)K`y;jyo{M+@Vk_ZX!~+pq2+u@32(dyq z4KZ#JZfpMyh;t?(wjgdLoQU`Y#4Uu!ARdgknQ#Q+6A?EN9)%dU__j3?9)TFQ@U}G& z9*+1V#8rd`BR(0in{YqG!w_c^4nlkiVkhAvur0J;IARCkgNRQ>Y$JRC@o9*yg!dsn z9kGS*Uc_f0RtWDxd?w=dU$Oi<5nB~GoK5&f#3KV{T+>+YX{tMMVVjJRC!ik9Oh+7DcK^%d&nQ#Q+NW@KqM7 zqHT?YM<9+y+(39Z;uyqLga;#zMeHWr4{;pgY{Ef^;}JUvAA#k?f-#64gbyOV7_p7; z0mPRewi4clcr0QI;k}42MXV6sh4?bW?LSlfBX%HeCA=AN0^%0J8xbcWZYI1Q@i@dy zgx4V+kGPTW8pKJ68wjsPJOObP;T4D{B6bsAj#x#UP54H{$%vhV7a^X6*g?1q@npm{ z!gCR)Ahr_DMLY$uh44(oQxPkK(-2QX+bZ$zAnxS8;J z#CeFD2(Lq&kGPTW8pJNd4TM)Co{hMQ@Cw9p5W5L4M~od%TQ=bv5f>tM5?+LOE@B7a zGQ{%`+X&A^T!h$4I2Um-VhiD!h)WPFgwqh0B5v=X`bX?W+)6kR@imBB2#-NrhPat< z1mbeUO@v1w_8@K~JOXhA;s(OQ5zj|lMR+jc1&G~*`ysAGoJ}|g@j}E-!biRYya=&_ z@Il0j5!(nKKzuD?E8%^JuS0AhychBHh!w)S5Z{2f{YR>Q#8rq}32#Qc1aS-DjfihV z+)Q{q;%dZAgx4XiLEK1q4dSJU8wjsPd=ug-!YdHpjMzK}0f;#R_mh;KvOLU;_~ z6^NS&MRvH)1Q{eTeTtY$3cC@x6!@!n+XPhq(O^)j#4!#I1xkBfcMT z3*n83*C1{tydLobh?@wnL;N7(M#5_lKZLk}@M^^WL|jF91>%1pb`xHXcrD^=!Z#v* z7_pP^BE;(uI|!E{egv_N@La@?BDNCFMf@0I3*niFA4jYZPDA_z;`Se?{t-7JZY7+E z_({YqgvTIWkGPp|1mdR=;^z>%3HL+10dY3r zAjHojb`m}U+j|N&B6biyi1^=#ZG;aXegUzS@IJ&ZBDN6Ti})qP3gKOdUq;;iJ=H(r zX2h+8HzVGJxP|aW#G4T}6JC#a3*sii>kw~6+(>v0;#Uwi5MGUV8{#U$D-dr->?XV% z@eahqzZY7+E_-({3gvTJ>g}9k;1mbrPHxV9%_+7+}ghwF$58?*G!x8UBTt#>=;`b1{ z3HL+12XQvxAjIz@b`n0~1-uurgYZGbA0W07K7jZ`#8$%l5PyW&LU=FY{~}fh??U`B z;`Z;T{t>q#ZY8`K@h6B|2yaBZ4{Rc4+>W@Fa3bRG5VsH>gZLogX2KDOzen6ecogCv5H}JYf%p*O2ExM;A4Xh7 zcrfB05xWWZL)?Kln{W`~pAb6fJGh!Rz1Bib?Y$d!8@vn$2g!dx; z4Y5La7vfID?cY-UBUX9f<<8wsyLj9XaR z8VIjOj9XXQstB(@+y}9n@N&c7;nTS?kl2#-OGTQJ(12}dA45pfgYQHXI1 zMO!1`5r}c?L|X&l;fQg|L|YZ%!H7>r>?Yg~F>ak`%O)Iz_!PuW!biRUj9Vqz9E1-d z#w`+UHo^xGpN7~k;D?hqfld>kx+_ZX~=0F>Xa`YaqND@wter2(LhV9%47)<%q)(XA`~= z@kqo@!ix}(LhK-1hWLEMHo|ieUx3(3I2ZASh%JO?A|8!cA)JQzBE;=qQT-#fA#Np{ zh#0qgw6zc(gE#_lGvNrtxK+QciSQ`IQHUD}k3bxaxPkC+#4(7g2oFXai`Y%LAL2N~ z*@S}-$0K$UKJq!>F^C<64cZ`9?I;7&T}Hf670 zhJb?UQb9;(>+H}o$NQhh_0OuY(eSKNasG6*dhAS)RMgtfJpwcEUx!2$%7dWc&4aSD*IC_5|R>bCb` zS<3!_TDwOQTV~ImJzCQ@9TXB&%JZv#?c+IV>DLt_mNr+M2Fhx; zc;AJ-y>`!+gMjImTsKJF4y9I<&K;1zRiH3HAFL1C)Y{i-|C3OAxVEKlyXWkL>fd^K z=EA>yLYLkT&n^AhbG=&EQ^jE#IKtoHAGK~AEGkd7sC7!{vwhXt@nIp$Qo{PE+sB7l zP)Mx@2I*n=sSkd#s&&ydd$96T!YuY(UX0h6QpFuYS%`Y^z}Ml+3>9{@x-vwm7zIg+ z6u&$ZQ?HvGQXQ{&`pRs4*-xz>I0R}?t%WMsYNMh-S;Ey?4`e3e=$ZKu64NsC00cwO z5{}kp_EG)yo6tt}yBQubt=~5adHrU=0z=pO{RyU>-PSMGhp&!*_M(o^WjN!;dd`G; zUI?{Xo?JIIB)M(|R6yU*X9ugbDP7784AM{mSTXPkE1;)VX7CgHF7T9f5Cy?g&IX-l zf~SDWkm@mHWpWv`^3cckp_NbQ+~Kpc=8x%+Su6O7XXMhu6_M3P`Yae-+X7G2%z-EJ zf^SrNv~;$rb=P1GS!cDqf*!xi1DWn2YmxXZi0hK6dItvHs2_O3r&<+TXKfK`{swBq zr%S**;?r{E>Jq>ysnl?F!iS77i@NkxPtW#FNWfu{4hjC@jUah+QZR2#1vK&Y&XCZh zMesqbyB6ur(3-0Oc{{LSWA-7NT0t)G}Fg?!j9!stcH`+x_=|_QV{&J5u=p%DsX@T2d)cUM; zNVc~x*=g-sx%#Me6DzSy!>~*zCf8kG$qIA}s7Jz-lW@C>VU zy*smqY5jj)uT-79{=S{xZ$ta~&Dj9oD+5Xs2Tj z0`Gl>a=az<^5)Qy!D0SRtaiJ1=6=X^XS4k<*jx<-yVUOAh>_8IKbEczq@gbQQ;+2d zu2O@0sF1`!^j9lBS-bhmAp0)0&I5s{c0V*K?-idSz5S(8sN_mWxbF0sAN5e+sbq-H zv*05R7%o@0Z-(I0N!^jZKvmbm)IqIJ>rrt?jfdb?5vxKxO`rhd{T3#)5XQs4w8OCJ z$cIp_`p=>HLMfwzh1!aT)#_`ZgZ6}~_0fAk0`lbb!a7(&?HRHxp*0^to2OX#E__hy zE(v=H%PShp1(4si7l8i~9tFjs_`(%+qCKP+`~+t3jfbHA?OX%ThbpYDnl*3&UL~2?-Ry{ zo&SAkX|F*5W{2JYBNlse7yAcW!Tt`ke|5*H73a?mEd@DvDkW^x>`>3ZpY!oqPp_V& z(P=Chu*9ajn*Ih1OgN&PQI54j;(Bm>Zk}O}1?e-e7&*DHxDoG!D9$=n-lKAA1ji zD`Gr_@q&s04pSTi9Z=ormp~4{`!9xKjm6ABv65x68oHE+{C%7#PbZAo$loKuJ_lf6 z@4aWA^!FcVLU6d^Iabmg$Wgk7!MIvUJ;vD{2id0j!EXPkg&ZmiIS>o!^ET?=dtLJe z^Jk1OC-hdgPoP2amIk#hNUiOy)=h%3%2XVR;7|od1&I(XCRnyKgj#|?o}LQwvHld` z`QG@@321ugn=i#t%hHM9B{)Qdc@Q{eZ#etS4xPVacBp&Ple0t7C!NjJ9X&%=Zc^(e zSk#LXEukx$tvhhu)7JkpUIG?BbD`+t*hU_cy=bVU0*y~1X{c=w#xdg5jra#W$`Q%If!S&APjaJ zndU&AwdN~L2f$1JN`@m%|aD(yi61B&U&Q^P;Hy8&VIE8}B>r2iw%8AQ*I|*zhq+;39u93ev?dCas(Cxq$VtQ0+Bab`Y*p=Vs?Y!Z*DGdk_|3ap z4SnJ}jEbAS1^!1sKVfqtso%iQU{sW5RqGdas%OC*6mRrV>!S{f5Z6D zX9vV4RQ&{_-<^XY`_|sMXuR4A+Lay~)&% z2UG=-wZp&IR* z{#R?#>an06pfx>MnNDxfe>*#I$eRz>ZQ~p;>8qg%fT{|uIddTV*bYwePJ$0=ov0c% zc%JqNwz?XsV|-v~=Kxsk=rsg{LAgb(&j@qFLXG!isLZ;a)y;>hJ9>rQoMT00u%w~Z zWx!;+E*bi_-2v^Y{t|ojz8loKTkKU>tY?Re*|aYhy08|4qn<3=`EKg7d!u?vD;??*4bv6WskLK`OA80I}uO(3(})I`dvpBNHID zY*sfNfEcn_-N0f?izpoM7-?WMd{9Uogt<3Z01994hS;)O+<@3JWS5Gi?Xk1^3ydwn zCnZ#MKx`QeDG9Ii_EBHfVoO6x-Ey=M#FOTPO|1}5F6a?jQ-l$(bDO&4H@rvjBsc=q zKs@>41h}_kvxq0V)sYYoe+!13{iw!ogLv|`{V*mfq}Q}<0BNx7O&KinIpSqu8O z=QTg{%~w+D?vwtwD*@aX`nMB9YsR7Pb~Yz3=@9-n0o3(Db>NT7L7%#0JNhGLab!#K zrjFn#kj3Qq9pH~glI+cX@%!6mfjAiK5RAIIcgRo4q~wsR_8e1Ff0CZy4w(h1_#E=F zL1^PYqp6RBl)5^k7@r!p_r=&&OxpWl4Bf}v-gkgBnD-7Cx24qQ84M%#%V9(fj_|~Q zEB-wk9d5@lSJ&3A$!AD;Sg*3eAgvcXQ~Qd!_&I)Y2Z-<9%|-+HeZf3=Z~Y15xg#N3 zMI7sRZesi;FrJ%-F~C0_2pG@(6LcQykYG(4EbC)^^oD7g&R9G?{0P-0E924s_~QeG zh8Rpw3l0CPqu`s(yv2n#sYvfpRZv-pw2M>2VqIXOvy}$e-|u z7n3|UY}-d&8atEk@0a(_ubzcRe6yv`Fg=(piFE&j+0uMb9|18^TVFGrFIfWH`~S>* zY496=#(e3Lx1nvpd?^a9+I(p(8XTKye~3ObUkbvY1@k4m!{$q8LfB~gqBk|tNSJ@< zyn=`HFqn@?H+ugqa3j8;k%!9#e@aOI3BsO1Bt7Q!j7pHk{tu=U z-H%6pAahbgd-%;`7>{g~@-m=Tz%$*AM{f6v<9K8Oi2K?b?p^#d#v`7Ru2li^zdNcR zeQiBSj6aux| zkEuV~N>A{xTL!ZPUw_sLHvKdDGtVM}zASLP(4apH!QR&2pJDxK^Lt!xI=0U2Ay&V; zxBnUSt3cIY{dT+ttHRr%f|WK{fyVZIE=&iyui+u!1G0u+-FZwkybtPAt>ZP^K(h$B za)Ud1|CAc8G^$~?9&Av*H)HqlKUu$rU->iY*9sMb^*ao%qHn~ZH7wZs-x#@BZ+HSU zb9Kp9d@8&pZ#Q&5TkyTG*6 z`!9Uz_cs|b4W==XrnlQ`i^449YxBc~U=Aqpsc-`Y&V}pv_>Rz}w}baX{GKgG#e)Rz z`Ks+&ty!eh7vW2Q-%@H1ctejjU-=;+@CGZT_8ae4P#Y=m&hmB43E15RyztP$oBj+B zy#yjDBjklVtTifzId%cISZC&z{K{ZYOqw2kF zSUw(H+pdH!miqi*ne0RML7X|RazK2;*hz0+@C}^SeUGyj!audjEtTiv87u4RA;C?uB~B$?f;>ZV&b1O1<|L>M){ThJEgo zaqrX6`e1X+gOYH1tHFYrIJ&3Py9t`E3KLly?lO(T$Ebl=XuNqOcqUT`5#o{{9keEEGw|QrydRS`18c}OkhT+$N1D)?_98tj2w!jS7 zm^GF_sKXLCy(eSM;U}!nX3*u0re1gGdzWg33`VvSo;Z5uUd4iSo4J#Zp1IGcePQMn zp|F;@R?NmK%I?t1e3^sg7sZ=e4 zP0>Uihh7w$$S@QK2ei^-GRE8wTH8JbSA!iv-mOp?4E`w_#dYfj*it#%d-@A-Ing`+ zdAJPl-UmWo_VTWUOaunli@z1wqU`h)=4!u0tIH5HSEN=3;jj-Pgi?3ou&K?cbm)^l zJ>;-o0(*3ycm~yX>k~c6G~GIE%gdMn^oiLhTtBo8rqoE_HmE$x9r-Xez;_XLU!EnT zZs_+HYjz=6<>MoK;Zx%e_E7qmM?SUn>5)Xd$1 zt)P1!&x5z^!q`8du-?aOC_otb_)c(2Qy+g3w34f8{R#T`GAQf+WA9twqpGg;6Ouqs zbOr^D7BOm+L{Sq3O%yeO0O!CAMny$M#fw@LT2UrQm1<~$=5#uiYwg=wYpvR9eY6(e zkN^_!iJK3 zvzE0^`vsn;KcfIQ^VQ$1lhX5kdgpn-&iKAR@ymTY_ILf$*U(6Brb`5p4tlf`*oD zY!h#o;a?hFQH1y)o*vzmf9beA_8+El&>5y#D3MU2Mz#%)*t2O)L;Mqg)RJ2AD8)AeI3;s3t94sTrlH{zeL|2`j2+U`G`V&W+U&0QDin^p;;W!!km z7Kwk7cuHORp41g2`LLDH<^@F**EZ_BtA>CJM4b;bPyJG!sYrYhJrEjhGZ*a)2&**y zsS={{ZHmpWGTlRqS6#?}goA&n-YoVu_fbGZHKAeKS%9+?ma~cW_$r|A+)BRsle~Jq zDn7L!y|Bue3gxjS;;d0SFiRM%u)HJAC+c`mPQ>|0wcshxTw54`PbBe>{$b$5wvQ0D z_odx-5eK%uww>9qvzcuT7Z&vu+JZlY&VpNo)vZ_8V7?7awfnLVmcVZ^rysW$B?_BLI>Lz>!#7aQc zHDN9R`BO`HLMX}<+Y2gSiaFmCF@Pt4)JK2SfDwG@LVQ6JLM0SoFTZa@*aCd9Aj0@2 z&}TN9YP+R8^RFnI{5zNdU6%AU0bYPu!#O+jjNZjEYj32a_e&k0x(KH)k|SuL;j`R) zo? z=94Z2j)Urc5+`Z1l9H(<+dS@VhQpiDSd2H%@bgoaJi-)eiP0GJ1Yb9lha$2;|p2hmP9 zJ@h1#ix3JM%_ozs@b`P>lgVdNr}D{*`iT|`#IXf>ie4QAc&TszDpSD z8+GQ{C>2FqdfdV$T1{ajVW*>qy%up6QJIP)a+_>~j@#Kws<4eVJT$vcc2(Wy;4ya+ zlnM09<19~mp}raVr5*oO9g0E!T2a;fLGIv+0pE!YwbRY^jBR`#+lTGtv%T8aQ={w| zO~j+9(`=W#W;btRpzjNI#o|b)dfw2o#eUfbQiofKu|>H&3`BKhrTP?9OT7SWoIeMU z)#~%P8TlT9$BQ0CSGMz}94fs;jfR-HLK?FzKMUnV9ebV!sbNaxO+6CEQ^thW;{|6|vZ|q~Wz^TIF=Y53SG5&d` zy6Ih6cq-3#CVDT!I{~R$izc;PFEOSiAX7=>=x%gtKs=cnuyy#&e;JSglm~-JYHd{= z2;N}BqysFA)hQ2g82Ba(RsB|EZtstfkw$u!nX4=O?s4K)cTN3~^(<$d`Z>8;yxn13 zpPj^jZn`v-72$n@g%P4Y}(bf12|EfBs|z^fxZj2G7G0oK;5!v zPHXMQIBUIGz()1HbT{2q?ykEtWGyf$favc8AhhZX5EZIEV0v7SU4rPh0vK#d)6nQk z?1Q*HK*TLhgD+G!QtPgtUnrvnCx|%P)q2w?{KFCKEbM8BfY=&U@k3n@TBNxlq_i*? zMC>SRRTbsi&FevPe!K>>$T652SP|&0Md%F&zI}2#)m!2+LO@WqpTNRQdI)VMo)Xqgm8aw*rj8_JLo44&D*&vj_f~$E0AVivDc^Y{MAK?uS+P79ujpH@%1q z9_CFh!IR`4@rSYy>#-1%Os?lc>LN*I*GuIkmze?@BSQ@f@f(v3&3uk8crMx1b3wO^w=cFTMdE$sI!t^}5?yB=3P-5YkLdkcvQRH4d{jY8x5R zS!Sgtt0(q!N&2#1^j4Fp9RzK!&;QJ!nI*aFPxyiHufx*l^B;lpv-KOM+0LuXLiCx1 zq#u}0sl+s>0&pi9TIJk(hXMRiHF(7`8Dp%-0*2A1{uE7eDCHcA;Z+DTMk*6IPc=0Yu18{|K;U%F8+sQ&w$vcmVzerjcqT zoN8p+>RO-zafAo$&jsK)jwlzv9fwWIttNl4JpND#vdwG59|}+j^jir2uv*LG@;QYV ztd_?I0~h6>{4|foE}ozI4zP?JK8r!5dU7U*p97-Gb(Los)m$Pg*I5lTI^@gfDnlQj z{)2>9Tc9{;0KG_*Bh|v6vr|0>Mv890H_MhHk3!X@$%*%900PS@(LBd64UM|-+k$UQ zLNGy6Xo2{Jh}Gj*Ai^%6K^VZPG*DwQQ5USN0F96>&oaOZ9@-9|SQVK%YpeBGCq3Fj zFj_9BvyLDL3EN+#7jxbpD8I0Nm3sX?0aH!2vVlT%9~$5?Nl$~hOsA2j7EtybYKfD! zd0n35%fURSu{1;o*2t_+eqeoWAkU~@FhRhBcr?8(MXUqP_bf#X+8E8H(AZ+Be&*%x z&C8Ryh%T@Ev3Ynn9$q<1)9+}Wey3Ie^;E-^aF}xdG5SJaw8lyhU7;qr1IWKHp>YD) zHR>exj`<27X-~ZCsh$X65?Ed0>On>UaOFR&2qcE{YJYjKf}W*JH728w;}_igaGPIE%N z^$F^B;EM;N(}@!m#0jX=n~_=sI01EfT^`qR0!wD#Lrnl5 zu4aof7I3vlusTRlBSi=mQ<#J>4NKikF^~4jF<0}jQ0>h!Mc&UZ?#4SVwz|%g-V3FT zfh@w$=zmy$=zo}L zhwD$NK_t**?g&}OipCf+|1-e{WVAY#Bp13$p~}MCgUEEZNJGD&ah*5R(`)DnV2MVi zjTnnTrb;5yd&Ex{nP&Yiod*8Y0WunY=Ay&YMiLhZNtFWfSi8;?=?!`V zV*U02e{A6y{<2>cgl&6fb}$Dm6K=wK2JvT{;fgLI7IxmyYeY9`=z27y@rV2?h(Et$ z85e(Qe%l6rZbpXz{AophyTPAhiSk&{JoLE7`197Co#D?r=vCv-F0khZs2;$cz4VmS zJs3g&d#13|9$?Qz0#&f5nc^MTa{(Ii{8IsabjF5X0hfb3sAdihqGYK?@D<_^@`PzC zG@vha#E-b&^ohC$9fyi@i|C6fBpx2cVD3-MbWK|R`;-;$MsUu8`wN7E+@iG~unmCg|8S+I$@5akSh zex5v7PoP|t{|ZP3tu!CpsJ2@qe%i?m*wYFi_+u6d@Vx#DF}wjvyNy%7ITH8|^33 zS*z2T_Vyyw%H*eG0{rv^u9euWM8AMeP5y~Bl#!pqzDCii3y%D!q=E9(iH7Y~q92@} z(c-*Dy+)(}zF+klJa)CYK`i5v4H0vfb3TFN!g|%HM$=Fs8tR1KBA6BV?SM#o%5Uq? z!yfS4w`F~Ne!I;q!Y<_XUx-@5CToaS{AQHDR!A;ViOX*v?YyDOyoS1=Ax$TzL1qQ{ z?XiN#hE7)hybZq%fjbBIZ5`mZ8-Dv7iV)F${!0$k=p?(7*Aq}U6TgD;`f4<(`7H=> z7c93cS_rV*Us7cR<{XcC2Uu&~Vw}h80gDxHl^_v{~Dd-ub2!^i)yumfnGGh0Z4EDX1&}%C+|ax7WM^!%cxz z=s18+)L)5ai}2W$F9CT>o4qZ5;NW1E+6unW20#8Gr0nCz8$p<~*U4@Hm*UbMhavj- zF*&1=HELGpjZ~RNl2|lPp!d&cW4nrU-iFA34CGH}L*vH^G!Vp(7pWn*_;J&J?;1bu zp*k)8AiFMFqZ{HQc1nAdHet#yZG@mHx{14p{1;3Hh|&#BkDIyHffI8X}+^uy+&S&?{ENI zP9GV)e+eO1tu;}H_$!(wY{Hp*#Lb>@iBTSFR4xXq7l`y>V^0qZDxU;=G`SVI(oWj{ zKh+E5`P)IimZsk>5Mz3Mib;f1fO^jJ{Pt(e!yAK7zl9$C7PO(?X{eC7KH&iU-hhV7 znkpMMhK9Z+e!9t?*`GRHXczh-yCj&@L%nS3?XJl+?N zGyRiKlWXYpxeTzF^)yl?nBQl~Z(@ypUnRfy^?sMh@38m#F#b0BM$mu9#aEwU703gE z{<}wo)_nin5(8NAsUe7|T zB6f^EMgdK6Z(`(JQR&#-FF^uUu4o}Sa#*iuwdThUpm^qb<_FgEFMzSEqwCR2onkm} z4Z8vJP}J10hIN>RSwl;mV_v>!UXI60y@IGQ+dLeFhneda;J-6AJOD`3MIS5bZ^h3n zW->LzCLnFxsj#i9otJIrb$af{FSkxS3%mJ9?Z_OIZ(2{g0j0>xw%vBN+09Ap=5NDp z{tHp(MY}nL-TW7=_*qche}LWmv$321PQ-bQ`}C1SkHt2QzuMW`s*pnuJL&`Ws;b+G z?d}%%gRI0z?B;*i&3?w+&5y?aT!&F%|9*27jx-Lbhz-n&jkMGA>>1nnA{J&7J=sL< zvSdBluxB*Wf{8jW*d^QT=Iz|WUuIV<#UB2vL(7)>#qUjyM)3%?d|6(smC*o%^NQ*Q z&LUO^w(F2%suF^H4^H$-+~nM1w52wK?SRR1XZ%oOR2qMVu_tqb{!JQ-Yt-4mX4jsq z(fk75O}GQoa0hC`l=)}%{%D4Ol=Zi({Q~u|(P-?^O4-VWGUwmpFq$y|5oit0YT;{} z)OsPLPBgx*#5^=vnrTjy227|A3{8lq)i=a~TSrYOf*!%9H-nP#E&jNKaj7>2-a1Ty z>5bj(U^Cyk>0LCqK9TKU;P+7&PY1BV4*#79Wx`VGO@K5ybc;P zw{#|ZhspN&iJs`>%!vlWW4410ux2SHpx(nkK=1vvexUXxAQJ-*#vlZ=+au04m1G4B z`VVm;1@%k|6IaBO)4`5V{$HVB`KL_zYctBXvi!cf{7V_-9aFvv?7Mn+w;Pyp8mBw$og7{?%Dm zXQ|(_r}_njEO$3rQY&?r{aCksm#qMf*X0qVnO(YV?5eL51AWnOR@b2~g8V{*Xo8EA zsSZ!%(pGZCqV$`WTg|I;B8dT&L(9^s0%3o?zKuPvf@sCg*byV*xu>$qCbp0q5g&AF z0GSU+fSJBdbG&p8xAFAOSQehLt4>h-J>X9n-KGzqR>0N|s71eVu(QmZEM(Ox+PzVZV4vTJ$wLTzj^P{m^r(5H@W`DY=}L8@ve7x99w+9Yxra~}OXTTOo<1-J zH`s`;&IY|Cdavz4^n}ehhYE%|5~HGPq0;ld!L3F9l<2+4D=CV^=jh0k1Wm}GP*AYm zNq!27DF2&$T@vw`++HDIhn`*;sr4zQS^d);{gB^WS(t2N&L zu?TX=40v4@#|~jB? zoR4kit*WQUdo)0At=}Vn&H`>gGujNrC5ie#t$BC&Cd4%xrbakM;|HpEen6oN`Fj}1nA+4Ko;HQ`>`0#in}NT6yK0gFix+-^`ancobR;M2BReTx~F<*XsgEbV+;?^CJ5xExS}meF%Dv7m3@5h<}s#~1w941kUHiSZZR z4gneP2jrl0ZJkt*x?FJh_U5krMfs?ZX`clB0ehig@duEd(qA-VK^?w%wB|XC{y;PpK$h8_nF0#{_QwhfhDoGs1rB|^V>_#C7&CU+swm8qX#9f0 zXyQ7UDLbQJRxndWCi*P45HB3bUQvZS*Dybd`c~C_0W+nTT_w&eM$B?I+skw9@!LrJ zK|%)=)>bvIrM+^b*eeTdH`z6^1s9#jwqUQUfSqN{m_G|OY-eS(WTlN{*BI@VXvK0n zRJ~$o*=E1^y~&4A9OBS+-msmQA`oMhz#l45eIl@0&Jy*6{Nu}6Ey%~9t(Ho`cO8ne zS?$N>oUtM^`=Bp)SP*u$C)Lg|ous24vxsVI|iyvwf?S%FI z3^)K0W#v(|T(1Mij`y0?VYo`zD*T{>OABPSNC-_a#BlXn>d@~IpRd2z}91I6`%HWZBm6?%}L z%pd60iXN89`28Rf=^CIic`gX6-A-n$Wn$Heh&RAc_03utGZxUBLZDj2D_>W zcEvYdSGSt3q&U0!zUd0hXN4N%Fwv>_?x_0JxX2?nH1jRIsNaDvqomQ^`N0t^0;hE+ zTSs8HXhu4f$ug#%Z{}oW;lOUb>7GxxaQ@K_DZ@c%17a@VjOqSK%-QvN^ZBAcXN4S$ z+gYiM%s`fJ=44fB$o>jju!O7>$8=}%woeJCNuDc}dLM6kkhR-}Uft=e##p=_TKU6W zJHGJ%dXnjZ4>6-qLp9pv+TjBLmD{U%WwWehlBEPalLmEO#rY``t*GiZc->dyM1r0j ztsZtv-Zc(DtjtpL0Vcj3mnmPz1@OM^W&z*XrgfQIAFp+Ntl66!OmKg4SS5dQ7f4U0 zI49Sf^vyl zti=@Lo77NKY@A!{&u+21O)BBru5yWwBFz6T=*o_Keay#aD9KEP2Mm#s?_OpsXqj(rM9=`2I^-4|7!gP z3l3D?%m{2b!;W7XRx7VZi}5p{!;S`4vF*gb4<}Q!Anuqd=V??S69b>#i3y2e3eWRm zbw9e$d!-O^syn10%KQOk&@TjX#7U|KGJGhLgE020`1Se5A@xJxA<8;COj&VAjWK1z zC<}*C&;KH|0^)EH1{_8wV1%Cc=G^@;pbUpm?;BW+<8JT4fzb@J`C4{U53?DC3f14) z8H=l5lZ@&Y;GQ&p(-DnB?^v&X$ahj|iXpZ*>ZN2O=CPwV28m@XR-?`9Nq8OfA9&}` zR&$j*KZh3ZXyaBT-;eE|L#u*HxG3T@Ne+X=AbhsJaw7HvIe+F~H9?P)=g+X>x7J}K z&)R)?dm{VUX7_|}BZjL9sE}!&1ouy_M#FymL%kOm?QNrUXMe!0KTx9t zc~^i44IWvlhk4mxUiQID&tSR6JnV*t#vakv3H$3Cpm!Z#=DdL|6IdukyxL2V;U#*% zyq%c4evTZP;&@%%IN+x@qy)dR`jwF{;=S`t&C&ovtHsh)hGyeT8(6z~Vlrlw=zX2( z2Esc_<#^o~k2e-tbY)RuXg0v4cJ&xFP`U&U*mK*#nz*=}-i>k0@im$EHiioEMzCH*p`H=^>RFBF45eeXFux^Eu2fwOyrQtI zV^f`JSC?^J1s*4(N_Eb*sHTpWs}#-ZJ?nB`j^WPNet}Z?szE-$;}IEo;WFMNwxF zOGV2TxmS!u5*7q4PJ;7Aw==y1-;3HD_&$kU)wf`a7&&$_4t#s^wxjdj*e>?Ydvm+k zJ@1`dhvf<$`Nqz)d*mAlSgi6by z9?7@Vn0oM(_+7Nwg-XCD_WWQd5Jcx;4y!&wgX{v_%*Tar01Is{Z2f|oi+EOuy>(Ld z5J7@fsyCXI`$pxw7S_Db`4mUC$WXwbfG^9{e!yl>mpmcJiMHNg3j7jfEKDF6;8X9prNP8->ewi|ic0a{^phSe{`8qO`mPxUSomzFGQ z0~lxz*P?J*s?x6mIf{)}nU~!*pbSjg@1VN?|ABrVh7RW8gWM+{zZocU>U>*12oLCPTdu+R?9gnw-I)wQKG z9N-~o5WI1~I)h9o!G=xbP*$m%@UksG217!LUesBTkIPwjQL+)GUHFBb7?yup5*lG` zfq)7{lQKVD^kNjHO6$S1t$u6h4ZEwKBLr&S@1mD@-WI~4z6nT!efAs68DfGM~VzIQYjQv>NWiQ9qut~X)kjTbl z#b`$#;F~w%XvO$q_2T!rOzYJ$VLxg0IbjFTd?3HKsEaV8z}a7WlK|0sy?aVR{W;0Y+9Br_2GkCZDYsSZ3R_Rm9v<#%1Sp6 zsT-7?j=g227lQ)b^aaIbi?QG;4M0SwCW2DS;V!xDE&u?z0PW^~cG21zcA_sYs!Z+Y z;XjnMT)Sdp?0VM0P=jZo-6+N<$+V$|m0H>G1wb|1tcFs8qedkadTWpQffg(vrAAFk zsXE+HQP>VZ5dqM!Ab?za`)cqBYxw;13a;f?ZpvfDG5kUT>DK@f&V>+0D+nIMdrkt3 z_7(YrbCJ1L#d{h)BG_CN7LYJ1?5~75js{=M#x~GLR9(*{)_gti!Ekx;N00%bVHt`q z2*cuB)L!7Hz-GPG^otY+iu{5_Ks;*41o={~KI518kWym66m61BqO$niNPK)L_dPDL zVVhv7R>X!!5)-$g>{gaN0l_f2R-%8C3$Gc^L$s$6Vili$Oe+VyQI%hbwp*%?X(c_T z-eY2mBk_n-_A+0gVdMjpd&#HiuCHa+lcMpHcogJvJAR3DJPHKrbzH%YBkZ_$kiXb& z|0DeVpTx3{2=CrElt~#H~>8!dac@vt;2)nAT261`U`&f{`wnZn4vzzl_w)pasBUHCj*_^xDT;a7!h z&?McYgGDeH2f$E6@4`WYG)GNDljY%*Z8DUtoG!mHhs`m>K!|Sqpz~n*f8i%*m8owB z72UUmcGBuKOwjc+9I5HX4aMpM=fjGaEaBc%;IWkB*=b;%=clF`b)8*>8g9oxL3N>- z4!+Pr40d@X2MKarNw}affsa=9WyU&2nYD@o8hNQqjll29&QY(g)HgXMKIT;MuzT>~ zyXN6%QbT;USD8-V$0IkMd&UN)jUz%IMT9;ao92Sh2k{FKdd332*8xz;2?A4%(eGjv zG)BJx>&%2pItzvWX~p8|%ZQ|$Z4K)sdOzV6q~v>1IOemG&7Np>s%UZR)e%zo*`g-_ zK9>8G77jCM>1%hG>1j1y@t;+%Q_g3_2GPuC4X(BkEc;st-HMSeH(ZKQAfU5}#qeqg zKGjUFDo_Z>trP33`PA$1q=rwVOqD$8{hjv-lJz<*eH6sqk#o@V*FnmwMpmT52J{Wt zQwbX1U3jwVtgE4mZ5(s)-;H5%^0WA@s}~sv69@TFo#sNH?%-1O z@KpllhLsx3;z)iPjqC}SKVjW}3#=@-gd^<~%)P;6G*+fA)`dF(vl7HLDUps5S#QM7 zCa#fV{LWQl*^>4!cIbD$+fa+J?4z{AIFy>RZg% zk3YoL%pu;(f~rOhH>sKekn?-U29tvum z%QdN?hz@p`U=5xJlH40!;f_Z)F0=VEL+!)I2e*)IObh-P>RLDSZ8`ct0uzRhkLM^T66d<*cWwS?QL18o&@@9-Ql9wfIZ}66pQU1$)!Jp8d2w?hmFdHa|=a0cp5lFy2pEZXAB>A{O zHqj&7(K?72VeSoN%{kyp0HyOm0%h;p`8%;mP5cTmTIEGSG@bEuh{Q&^cKRfSd zn=JDx^)ZIz1#gDcJWd)TeFu+ye+gHyC(=GZ;bp2TXG`)1l&evfQ}DoOngr=Gv&o{y zAIqL!mYy>J*p}RkE?`1clcvS)JCM||AHpbn5GJohq4~%r24unEv`^^UK_Bhn|JueU z+RPNSMSY-W!6hFfYtac~?#8n93kraB8myg^U14x~8Kw#T$N$c?1qnMm85k;!|Yj%ZERwT8<$F_rFf{ zvo#7GCHtWOU9LX7zf}7QqwTc)7NCS_-yJgVHC8`84{(hS5gMrEj82WjZ=?@VT6=T^ev+(r-*A79oiA0ii)SAhb4hV5U88W0|8B z>tjVD##nq2Q#@G?=?L2e6eSSoOi^~7Di{l zPUyV`Nh!%t3g_hEff|h&(Dz;#3d4ZrrctH5r3q6Y{0n?WA11)vSy=7OvE0_GbXVa& zWIaH#Rccd^tN2_ZXeyqHp-IcC=eZ`82in=Uc0Yf5gn2J1)_brwN>RBV#?!W=jOP`e zj(bc>(+eGJY%$a)ALtap?#%ATd;0Fj8$aJ2?`5Mq8SmvR#!W5?hWR*+bTQ9xgOLex zbqtD9uj#I)>0<;GM`nVeJBtChGXO98rMICl8^@#Xn@8*LNU!%fhCtgG{D+dEBW>a; z^&QF=`hu=I2RJ+5Ls3oF{d-capd+m(Oo zsFCsM{aUquZ_L^0^vIU#eiXs*?*$N55y1{(TZU?2LaOfcJX+uwC?i zMRpdp63u?(3a~7Hdb5oFfz8sxQLHN77X-VP9Ou{CLj1IQ@LU}!G&WxxPEa1)?L%rn zFN^~Eq??fE8hTLZ%vSh<^yPCsF$mXQ+}o<3mY)^Nt+R5o$rJV=E1AWb&OABP0MP;E z6LCOqtHmSuxMj}Klq)X*6XS>6jtetU%SLM3pW!R@r1MQmc@cm9gzBarKp*Yd%$HsP zg|_x&hC5WzF3DGyLP)_?T$Cz1J#HtRs+OAw->q`3!!#F|ZG+ z99&@_YE!7;y`3g*=XHFMC>tpD#tVBV#+!T=&$VXR-dy&JUW=jx!&PU>V(IlU{FLzl zI6Z1HY5`rGK}J{>?^eGx`}&hb6?jcq6~psG^$f29Q^)o<&Mbfhx;xOx6Gx(TtW!P; z;0obXUkk@y^4UZ>ws&i~8^UzoDw%*4MQ#D z7|Wc3sH*b1pS)hB&Jct#?%lu1k5%eueERE8eAdYpEgYnBHe2zN*#$i6pQv%7u5lX@ z(<Wa zz;262)~nSRz&zY3%nPz2@q5E{=%hL{dr(=Z;V1aY7~n!Ebd2wK z6b!|l*dkGzg>(d$60{mF#sv)f1pWxr%i@=EE=U!^HggN`cWkc2Z34RrY!ayO$^Gld9Tfj@vBF<`kE6E_lx*;0efe+r!ezmH8?af0% zvvUUx!WqHeqY8rZ85hp?;Xph>X!asohlCUBtctPu;aX(-<(=|Fwp~2YRY`@>2bnP>#DqBa1M;z>Tauc9rk=494*YaZGkeFqjbt()6gt2Xd znd4TiOLfIBBu22~Q}gZDHbyEog?{uJTE}&JT&RuJKoQJdW{OEijwr&V;2AS+J6WC< zu^gO?$3Otc3y@6Ws<73(v76{Sne&ZQOu~F|bY9|Iu@nCx1y+GA*PcZ?n(N%uNx`|I zn+~U1q1sIJRv-d*0sDhf+Ua3Hs$qp?OYM>t8`tSsPu2Blxt9OoEa6S)u0^*0-MVSXFWJGn8)DvJb50O{axs{)R8vP9#3g zkUr#*KDr7)vsGIF1DY(JOsH?kSHFiOj5xTu+RC@`{u@mpawRmiDY*X*vJUesPu7+A zlFrKdG<0)A_9U#i2m%HLng-}~k76Y{r3{=O-H*P9C%?TY2KkLhVT7Oc-PVS}il z`p-BEL?Y+otk}X_Jqb9@#sFC>X}p9Qo<#|y=l}_=%Z=o~R7@3WeG5!h%oKaZLTsU> zBd5}gY)GKEU4K(+R&2f9(!v+1kSU*TvFp>VvGa-Hr(36CN?EZFqwyEKweL`9Cs2aO zUVtRX;NV6ABtIqPG;ipJ*jJ%Q&^?6aFj8cQ89IBr+143dJ9z-fu z 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 z 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 diff --git a/private/lib/linux/x86_64/rktwebview_prg b/private/lib/linux/x86_64/rktwebview_prg new file mode 100755 index 0000000000000000000000000000000000000000..d65bb72c75c91c38bb4b883f4e53659357ac43aa GIT binary patch literal 232440 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ⅈfXMfJW61Jy+-dm@si*m?ISMT^{bfy$6? zaGMAHyhA2$_3-V&Ib%1e41!7RRhWo^TR<_g2Uenc1Q6&p!bs%JP&5>B<*v*anMcRf zwF}4MB|h-Bsy8i#McTvdFVOL2Tqb$8zUU3DvU2uh*r02F2N(}k?60tA5{ctvYsCdu zJ*LROHv-vrFL74fa3lc6%V)$=1ezXXtTa7of2RP}j;%PriY4-$iZmdifNg|3q(5h} za%Rv@cY#gHyiMTFD6oiMxoxCaqtDS#^W?sK%4=nslEwUDZjxJ3$iLgCvH~4fvsuwl03?s8w83xy}I!&L&1JS--305fTVy~ z=IKEj?kaNgeoM`plcP}u(~yp~`+Rn;1U*}i`*FQ6Asc+qMT^((W7 zm^$iA-oW4FzHi=Hc7eG_@TFHgdzPY&1NqO0wHv#(w|+ARY2t`93O-Kd6L#LGt7UC( zk#Ewy%f)t2T>H+cbJ|1j>1?7;p-9fBQPiZym(x_$_Rw=YLLE0N^^1=0cwZ9ywn}Fs zYM?(YXPep{g}!Qg__%kO;{#R6t?luaqP-QAISSV7rPJhsUXqebC%B1x!`;V-zBwZ07g_GNXw9ErZ&zi|Ek6hFG{-_q^nSpQkKb*=XE`l}qj z7PLS8Gj)L+rN43)`7XzA2JL@Ox0mC`zM>aE-$0%#_xo1Re%VqhA;+NmyjIedj(@M) z%lg&c)}Qq8YrzA9ueE;;+JF62wU^_kWT5mg{Dt%XZ#YLIl;?lvef3F>pK4Jn`xo4< z_8<7kZU5h2QtjpVonN$V=~MXp|HQeE;h$#P+Vx+n_Sb)*j^XpL=k`uX+XI%z)) z&f{|abC0U0{)KP-tvY-CRGohdhd;tUdA`U`lF8C{d^CSw`G`9ECx2*8@dtUXoc#rS RC~M#Nf;xK?Gzh-d{vV9%-^>62 literal 0 HcmV?d00001 diff --git a/private/racket-webview-qt.rkt b/private/racket-webview-qt.rkt index 876d1cf..ad997fb 100644 --- a/private/racket-webview-qt.rkt +++ b/private/racket-webview-qt.rkt @@ -60,6 +60,7 @@ (define-runtime-path lib-dir "lib") +#| (define libraries-to-preload (cond ([eq? os 'windows] @@ -105,11 +106,12 @@ )) ) ) +|# (define ffi-library (cond - ([eq? os 'windows] 'rktwebview_qt.dll) - ([eq? os 'linux] 'librktwebview_qt.so) + ([eq? os 'windows] 'rktwebview.dll) + ([eq? os 'linux] 'librktwebview.so) ) ) @@ -121,16 +123,26 @@ ; c:\qt\6.10.2\msvc2022_64\bin\windeployqt.exe rktwebview_qt_test.exe (define quiet-call #t) +(define rktwebview-prg (if (eq? os 'windows) + "rktwebview_prg.exe" + "rktwebview_prg")) + +(define webengine-process (if (eq? os 'windows) + "QtWebEngineProcess.exe" + "QtWebEngineProcess")) + (set! quiet-call (when (or (eq? os 'windows) (eq? os 'linux)) (putenv "QT_PLUGIN_PATH" (path->string (build-path os-lib-dir))) (putenv "QTWEBENGINEPROCESS_PATH" - (path->string (build-path os-lib-dir "QtWebEngineProcess.exe"))) + (path->string (build-path os-lib-dir webengine-process))) (putenv "QTWEBENGINE_RESOURCES_PATH" (path->string (build-path os-lib-dir "resources"))) (putenv "QTWEBENGINE_LOCALES_PATH" (path->string (build-path os-lib-dir "translations" "qtwebengine_locales"))) + (putenv "RKT_WEBVIEW_PRG" + (path->string (build-path os-lib-dir rktwebview-prg))) (when (eq? os 'linux) (putenv "QT_QPA_PLATFORM" "xcb") (putenv "LD_LIBRARY_PATH" @@ -145,6 +157,7 @@ ;;; Preload libraries +#| (for-each (λ (lib-symbol) (let* ((libn (if (list? lib-symbol) (car lib-symbol) lib-symbol)) (versions (if (list? lib-symbol) (cons (cadr lib-symbol) '(#f)) (list #f))) @@ -160,6 +173,7 @@ ) ) libraries-to-preload) +|# ;;; Actual FFI integration @@ -192,9 +206,9 @@ ;;; Callbacks from the OS library -(define callback-box (box '())) -(define (applier thunk) - (thunk)) +;(define callback-box (box '())) +;(define (applier thunk) +; (thunk)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Types / Functions @@ -279,14 +293,23 @@ (define-rktwebview rkt_webview_cleanup (_fun -> _void)) + +;RKTWEBVIEW_EXPORT int rkt_webview_events_waiting(); +(define-rktwebview rkt_webview_events_waiting + (_fun -> _int)) + +;RKTWEBVIEW_EXPORT rkt_data_t *rkt_webview_get_event(); +(define-rktwebview rkt_webview_get_event + (_fun -> _rkt_data_t-pointer/null)) + ;RKTWEBVIEW_QT_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, ; const char *optional_server_cert_pem); (define-rktwebview rkt_webview_new_context (_fun _string/utf-8 _bytes -> _int)) ;RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms); -(define-rktwebview rkt_webview_process_events - (_fun _int -> _void)) +;(define-rktwebview rkt_webview_process_events +; (_fun _int -> _void)) ;RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d); (define-rktwebview rkt_webview_free_data @@ -297,13 +320,9 @@ (_fun -> _rkt_data_t-pointer)) ; RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rkt_wv_context_t context, -; rktwebview_t parent, -; event_cb_t js_event_cb); +; rktwebview_t parent) (define-rktwebview rkt_webview_create - (_fun _int _int - (_fun #:keep callback-box #:async-apply applier - _rkt_data_t-pointer -> _void) - -> _int)) + (_fun _int _int -> _int)) ;RKTWEBVIEW_QT_EXPORT void rkt_webview_close(int wv); (define-rktwebview rkt_webview_close @@ -403,28 +422,72 @@ ;; Initialize and start library ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define process-events 'process) +;(define process-events 'process) -(define (stop-event-processing) - (set! process-events 'stop) - (while (eq? process-events 'stop) - (sleep 0.001))) +;(define (stop-event-processing) +; (set! process-events 'stop) +; (while (eq? process-events 'stop) +; (sleep 0.001))) + +;(define (start-event-processing) +; (thread (λ () +; (letrec ((f (λ () +; (rkt_webview_process_events 1) +; (sleep 0.001) +; (if (eq? process-events 'process) +; (f) +; (begin +; (displayln "Stopping event processing") +; (set! process-events 'stopped) +; 'done))))) +; (f))))) + +(rkt_webview_init) + + +;(set! quiet-call (start-event-processing)) +(define evt-cb-hash (make-hash)) (define (start-event-processing) (thread (λ () (letrec ((f (λ () - (rkt_webview_process_events 1) + (let ((waiting (rkt_webview_events_waiting))) + ;(displayln (format "Events waiting: ~a" waiting)) + (while (> waiting 0) + (let* ((rkt-evt (rkt_webview_get_event))) + ;(displayln rkt-evt) + (if (eq? rkt-evt #f) + (displayln (format "Unexpected: event = nullptr")) + (let ((data (rkt_data_t-data rkt-evt))) + ;(displayln data) + (let ((e (union-ref data 1))) +; (displayln e) + (let ((wv (rkt_evt_t-w e))) + ;(displayln wv) + (let ((evt (cast (rkt_evt_t-evt e) _pointer _string*/utf-8))) +; (displayln evt) + (rkt_webview_free_data rkt-evt) + (let ((cb (hash-ref evt-cb-hash wv #f))) + (unless (eq? cb #f) + (cb evt))))) + ) + ) + ) + ) + (set! waiting (- waiting 1)) + ) + ) (sleep 0.001) - (if (eq? process-events 'process) - (f) - (begin - (displayln "Stopping event processing") - (set! process-events 'stopped) - 'done))))) - (f))))) + (f)) + )) + (f))) + ) + ) -(rkt_webview_init) -(set! quiet-call (start-event-processing)) +(define evt-processing-thread (start-event-processing)) + +(define (stop-event-processing) + (kill-thread evt-processing-thread)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Provided features @@ -459,18 +522,18 @@ (define (rkt-webview-new-context boilerplate-js server-cert) (rkt_webview_new_context boilerplate-js server-cert)) - (define (rkt-webview-create context parent evt-callback close-callback) (let* ((evt-queue (make-queue)) (parent-win (if (eq? parent #f) 0 (rkt-wv-win parent))) ) - (let ((wv (rkt_webview_create context parent-win - (λ (rkt-evt) - (let* ((e (union-ref (rkt_data_t-data rkt-evt) 1)) - (evt (cast (rkt_evt_t-evt e) _pointer _string*/utf-8))) - (rkt_webview_free_data rkt-evt) ; Free event data ASAP - (enqueue! evt-queue evt) - ))))) + (let ((wv (rkt_webview_create context parent-win))) + (hash-set! evt-cb-hash wv (λ (evt) (enqueue! evt-queue evt))) +; (λ (rkt-evt) +; (let* ((e (union-ref (rkt_data_t-data rkt-evt) 1)) +; (evt (cast (rkt_evt_t-evt e) _pointer _string*/utf-8))) +; (rkt_webview_free_data rkt-evt) ; Free event data ASAP +; (enqueue! evt-queue evt) +; ))))) (let ((handle (make-rkt-wv wv evt-queue evt-callback #t close-callback))) (thread (λ () (sleep 1) @@ -492,6 +555,7 @@ (define (rkt-webview-close handle) (rkt_webview_close (rkt-wv-win handle)) (enqueue! (rkt-wv-evt-queue handle) 'quit) + (hash-remove! evt-cb-hash (rkt-wv-win handle)) ((rkt-wv-close-callback handle)) #t) @@ -608,8 +672,8 @@ (handle (cdr kv))) (rkt-webview-close handle))) open-windows)) - (stop-event-processing) (rkt_webview_cleanup) + (stop-event-processing) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/private/racket-webview.rkt b/private/racket-webview.rkt index 292d8a1..c6111b9 100644 --- a/private/racket-webview.rkt +++ b/private/racket-webview.rkt @@ -655,6 +655,7 @@ (define (webview-call-js wv js) (-> wv-win? string? (or/c string? list? boolean? hash?)) (let ((result (rkt-webview-call-js (wv-win-handle wv) js))) + (displayln result) (if (webview-call-js-result? result) (if (eq? (car result) 'oke) (hash-ref (fromJson (cadr result)) 'result #f) diff --git a/rktwebview_qt/CMakeLists.txt b/rktwebview_qt/CMakeLists.txt index a934dad..26adecf 100644 --- a/rktwebview_qt/CMakeLists.txt +++ b/rktwebview_qt/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) -project(rktwebview_qt LANGUAGES CXX) +project(rktwebview LANGUAGES CXX) set(QT_DEBUG_FIND_PACKAGE ON) set(CMAKE_AUTOUIC ON) @@ -12,14 +12,24 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 REQUIRED COMPONENTS Widgets WebEngineWidgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets WebEngineWidgets) -add_library(rktwebview_qt SHARED - rktwebview_qt_global.h - rktwebview_qt.cpp - rktwebview_qt.h +add_library(rktwebview SHARED + rktwebview_global.h rktwebview.h rktwebview.cpp + shm.h shm.cpp + shmqueue.h shmqueue.cpp + rkt_protocol.h + rktwebview_types.h + json.cpp json.h +) + +add_executable(rktwebview_prg + main.cpp + + rktwebview_qt.cpp + rktwebview_qt.h + webviewqt.h webviewqt.cpp - rktwebview_internal.h webviewwindow.h webviewwindow.cpp rktutils.h rktutils.cpp @@ -27,19 +37,18 @@ add_library(rktwebview_qt SHARED shm.h shm.cpp shmqueue.h shmqueue.cpp + rkt_protocol.h + rktwebview_types.h ) -target_link_libraries(rktwebview_qt PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) -target_link_libraries(rktwebview_qt PRIVATE Qt${QT_VERSION_MAJOR}::WebEngineWidgets) - -target_compile_definitions(rktwebview_qt PRIVATE RKTWEBVIEW_QT_LIBRARY) - -add_executable(rktwebview_qt_test - main.cpp +add_executable(rktwebview_test + rktwebview_test.cpp ) -target_compile_definitions(rktwebview_qt_test PRIVATE RKTWEBVIEW_QT_LIBRARY) +target_link_libraries(rktwebview_prg PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) +target_link_libraries(rktwebview_prg PRIVATE Qt${QT_VERSION_MAJOR}::WebEngineWidgets) + +target_compile_definitions(rktwebview PRIVATE RKTWEBVIEW_LIBRARY) + +target_link_Libraries(rktwebview_test PRIVATE rktwebview) -target_link_libraries(rktwebview_qt_test PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) -target_link_libraries(rktwebview_qt_test PRIVATE Qt${QT_VERSION_MAJOR}::WebEngineWidgets) -target_link_libraries(rktwebview_qt_test PRIVATE rktwebview_qt) diff --git a/rktwebview_qt/command.h b/rktwebview_qt/command.h index fea5d76..26d3ada 100644 --- a/rktwebview_qt/command.h +++ b/rktwebview_qt/command.h @@ -26,6 +26,7 @@ #define COMMAND_FILE_OPEN 20 #define COMMAND_FILE_SAVE 21 #define COMMAND_SET_OU_TOKEN 22 +#define COMMAND_NEW_CONTEXT 23 class Command { diff --git a/rktwebview_qt/install-linux.sh b/rktwebview_qt/install-linux.sh index 23a77fd..b29deeb 100755 --- a/rktwebview_qt/install-linux.sh +++ b/rktwebview_qt/install-linux.sh @@ -7,14 +7,15 @@ LIB="../private/lib/linux/$ARCH" mkdir -p $LIB rm -f $LIB/*.so* cp build/Release/*.so $LIB +cp build/Release/rktwebview_prg $LIB -QT_PATH=`ldd build/Release/*.so | grep Qt | awk '{print $3}' | head -1 | sed -e 's%[/]lib[/].*%%'` +QT_PATH=`ldd build/Release/rktwebview_prg | grep Qt | awk '{print $3}' | head -1 | sed -e 's%[/]lib[/].*%%'` echo "QT_PATH=$QT_PATH" QT_PLUGINS="$QT_PATH/plugins" PLUGINS="platforms position generic iconengines imageformats qmltooling tls xcbglintegrations" -EXTRA_LIBS_SO=`ldd build/Release/*.so | grep Qt | awk '{ print $3 }'` +EXTRA_LIBS_SO=`ldd build/Release/rktwebview_prg | grep Qt | awk '{ print $3 }'` EXTRA_LIBS_PLATFORM_PLUGIN_XCB=`ldd $QT_PATH/plugins/platforms/libqxcb.so | grep Qt | awk '{print $3}'` for pl in $PLUGINS diff --git a/rktwebview_qt/json.cpp b/rktwebview_qt/json.cpp new file mode 100644 index 0000000..571eaa9 --- /dev/null +++ b/rktwebview_qt/json.cpp @@ -0,0 +1,505 @@ +#include "json.h" + +using std::map; +using std::deque; +using std::string; +using std::enable_if; +using std::initializer_list; +using std::is_same; +using std::is_convertible; +using std::is_integral; +using std::is_floating_point; + +std::string json_escape(const string &str) { + string output; + for( unsigned i = 0; i < str.length(); ++i ) + switch( str[i] ) { + case '\"': output += "\\\""; break; + case '\\': output += "\\\\"; break; + case '\b': output += "\\b"; break; + case '\f': output += "\\f"; break; + case '\n': output += "\\n"; break; + case '\r': output += "\\r"; break; + case '\t': output += "\\t"; break; + default : output += str[i]; break; + } + return std::move( output ); +} + +JSON::JSON() : Internal(), Type( Class::Null ){} + +JSON::JSON(std::initializer_list list) + : JSON() +{ + SetType( Class::Object ); + for( auto i = list.begin(), e = list.end(); i != e; ++i, ++i ) + operator[]( i->toString() ) = *std::next( i ); +} + +JSON::JSON(JSON &&other) + : Internal( other.Internal ) + , Type( other.Type ) +{ other.Type = Class::Null; other.Internal.Map = nullptr; } + +JSON::JSON(const JSON &other) { + switch( other.Type ) { + case Class::Object: + Internal.Map = + new map( other.Internal.Map->begin(), + other.Internal.Map->end() ); + break; + case Class::Array: + Internal.List = + new deque( other.Internal.List->begin(), + other.Internal.List->end() ); + break; + case Class::String: + Internal.String = + new string( *other.Internal.String ); + break; + default: + Internal = other.Internal; + } + Type = other.Type; +} + +JSON JSON::Make(Class type) { + JSON ret; ret.SetType( type ); + return ret; +} + +JSON &JSON::operator[](unsigned int index) { + SetType( Class::Array ); + if( index >= Internal.List->size() ) Internal.List->resize( index + 1 ); + return Internal.List->operator[]( index ); +} + +JSON &JSON::at(const std::string &key) { + return operator[]( key ); +} + +const JSON &JSON::at(const std::string &key) const { + return Internal.Map->at( key ); +} + +JSON &JSON::at(unsigned int index) { + return operator[]( index ); +} + +const JSON &JSON::at(unsigned int index) const { + return Internal.List->at( index ); +} + +int JSON::length() const { + if( Type == Class::Array ) + return Internal.List->size(); + else + return -1; +} + +bool JSON::hasKey(const std::string &key) const { + if( Type == Class::Object ) + return Internal.Map->find( key ) != Internal.Map->end(); + return false; +} + +int JSON::size() const { + if( Type == Class::Object ) + return Internal.Map->size(); + else if( Type == Class::Array ) + return Internal.List->size(); + else + return -1; +} + +JSON::Class JSON::JSONType() const { return Type; } + +bool JSON::IsNull() const { return Type == Class::Null; } + +string JSON::toString() const { bool b; return std::move( toString( b ) ); } + +string JSON::toString(bool &ok) const { + ok = (Type == Class::String); + return ok ? std::move( json_escape( *Internal.String ) ): string(""); +} + +double JSON::toFloat() const { bool b; return toFloat( b ); } + +double JSON::toFloat(bool &ok) const { + ok = (Type == Class::Floating); + return ok ? Internal.Float : 0.0; +} + +long JSON::toInt() const { bool b; return toInt( b ); } + +long JSON::toInt(bool &ok) const { + ok = (Type == Class::Integral); + return ok ? Internal.Int : 0; +} + +bool JSON::toBool() const { bool b; return toBool( b ); } + +bool JSON::toBool(bool &ok) const { + ok = (Type == Class::Boolean); + return ok ? Internal.Bool : false; +} + +JSON::JSONWrapper > JSON::ObjectRange() { + if( Type == Class::Object ) + return JSONWrapper>( Internal.Map ); + return JSONWrapper>( nullptr ); +} + +JSON::JSONWrapper > JSON::ArrayRange() { + if( Type == Class::Array ) + return JSONWrapper>( Internal.List ); + return JSONWrapper>( nullptr ); +} + +JSON::JSONConstWrapper > JSON::ObjectRange() const { + if( Type == Class::Object ) + return JSONConstWrapper>( Internal.Map ); + return JSONConstWrapper>( nullptr ); +} + +JSON::JSONConstWrapper > JSON::ArrayRange() const { + if( Type == Class::Array ) + return JSONConstWrapper>( Internal.List ); + return JSONConstWrapper>( nullptr ); +} + +string JSON::dump(int depth, const std::string &tab) const { + std::string pad = ""; + for( int i = 0; i < depth; ++i, pad += tab ); + + switch( Type ) { + case Class::Null: + return "null"; + case Class::Object: { + std::string s = "{ "; + bool skip = true; + for( auto &p : *Internal.Map ) { + if( !skip ) s += ", "; + s += ( pad + "\"" + p.first + "\" : " + p.second.dump( depth + 1, tab ) ); + skip = false; + } + s += ( " " + pad.erase( 0, 2 ) + "}" ) ; + return s; + } + case Class::Array: { + std::string s = "["; + bool skip = true; + for( auto &p : *Internal.List ) { + if( !skip ) s += ", "; + s += p.dump( depth + 1, tab ); + skip = false; + } + s += "]"; + return s; + } + case Class::String: + return "\"" + json_escape( *Internal.String ) + "\""; + case Class::Floating: + return std::to_string( Internal.Float ); + case Class::Integral: + return std::to_string( Internal.Int ); + case Class::Boolean: + return Internal.Bool ? "true" : "false"; + default: + return ""; + } + return ""; +} + +void JSON::SetType(Class type) { + if( type == Type ) + return; + + ClearInternal(); + + switch( type ) { + case Class::Null: Internal.Map = nullptr; break; + case Class::Object: Internal.Map = new std::map(); break; + case Class::Array: Internal.List = new std::deque(); break; + case Class::String: Internal.String = new std::string(); break; + case Class::Floating: Internal.Float = 0.0; break; + case Class::Integral: Internal.Int = 0; break; + case Class::Boolean: Internal.Bool = false; break; + } + + Type = type; +} + +void JSON::ClearInternal() { + switch( Type ) { + case Class::Object: delete Internal.Map; break; + case Class::Array: delete Internal.List; break; + case Class::String: delete Internal.String; break; + default:; + } +} + +JSON &JSON::operator[](const std::string &key) { + SetType( Class::Object ); return Internal.Map->operator[]( key ); +} + +JSON &JSON::operator=(const JSON &other) { + + if (&other == this) { return *this; } + + ClearInternal(); + switch( other.Type ) { + case Class::Object: + Internal.Map = + new map( other.Internal.Map->begin(), + other.Internal.Map->end() ); + break; + case Class::Array: + Internal.List = + new deque( other.Internal.List->begin(), + other.Internal.List->end() ); + break; + case Class::String: + Internal.String = + new string( *other.Internal.String ); + break; + default: + Internal = other.Internal; + } + Type = other.Type; + return *this; +} + +JSON &JSON::operator=(JSON &&other) { + ClearInternal(); + Internal = other.Internal; + Type = other.Type; + other.Internal.Map = nullptr; + other.Type = Class::Null; + return *this; +} + +JSON Array() { + return std::move( JSON::Make( JSON::Class::Array ) ); +} + +//JSON Object() { return std::move(JSON::Make(JSON::Class::Object)); } + +JSON Object() { + return std::move( JSON::Make( JSON::Class::Object ) ); +} + +std::ostream &operator<<(std::ostream &os, const JSON &json) { + os << json.dump(); + return os; +} + +// Private functions. + +static JSON parse_next( const std::string &, size_t &, std::function ); + + +static void consume_ws( const std::string &str, size_t &offset ) { + while( isspace( str[offset] ) ) ++offset; +} + +static JSON parse_object( const string &str, size_t &offset, std::function on_error ) { + JSON Object = JSON::Make( JSON::Class::Object ); + + ++offset; + consume_ws( str, offset ); + if( str[offset] == '}' ) { + ++offset; return std::move( Object ); + } + + while( true ) { + JSON Key = parse_next( str, offset, on_error ); + consume_ws( str, offset ); + if( str[offset] != ':' ) { + on_error(std::string("Error: Object: Expected colon, found '") + str[offset] + "'"); + break; + } + consume_ws( str, ++offset ); + JSON Value = parse_next( str, offset, on_error ); + Object[Key.toString()] = Value; + + consume_ws( str, offset ); + if( str[offset] == ',' ) { + ++offset; continue; + } + else if( str[offset] == '}' ) { + ++offset; break; + } + else { + on_error(std::string("ERROR: Object: Expected comma, found '") + str[offset] + "'"); + break; + } + } + + return std::move( Object ); +} + +static JSON parse_array( const string &str, size_t &offset, std::function on_error ) { + JSON Array = JSON::Make( JSON::Class::Array ); + unsigned index = 0; + + ++offset; + consume_ws( str, offset ); + if( str[offset] == ']' ) { + ++offset; return std::move( Array ); + } + + while( true ) { + Array[index++] = parse_next( str, offset, on_error ); + consume_ws( str, offset ); + + if( str[offset] == ',' ) { + ++offset; continue; + } + else if( str[offset] == ']' ) { + ++offset; break; + } + else { + on_error(std::string("ERROR: Array: Expected ',' or ']', found '") + str[offset] + "'"); + return std::move( JSON::Make( JSON::Class::Array ) ); + } + } + + return std::move( Array ); +} + +static JSON parse_string( const string &str, size_t &offset, std::function on_error ) { + JSON String; + string val; + for( char c = str[++offset]; c != '\"' ; c = str[++offset] ) { + if( c == '\\' ) { + switch( str[ ++offset ] ) { + case '\"': val += '\"'; break; + case '\\': val += '\\'; break; + case '/' : val += '/' ; break; + case 'b' : val += '\b'; break; + case 'f' : val += '\f'; break; + case 'n' : val += '\n'; break; + case 'r' : val += '\r'; break; + case 't' : val += '\t'; break; + case 'u' : { + val += "\\u" ; + for( unsigned i = 1; i <= 4; ++i ) { + c = str[offset+i]; + if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') ) + val += c; + else { + on_error(std::string("ERROR: String: Expected hex character in unicode escape, found '") + c + "'"); + return std::move( JSON::Make( JSON::Class::String ) ); + } + } + offset += 4; + } break; + default : val += '\\'; break; + } + } + else + val += c; + } + ++offset; + String = val; + return std::move( String ); +} + +static JSON parse_number( const string &str, size_t &offset, std::function on_error ) { + JSON Number; + string val, exp_str; + char c; + bool isDouble = false; + long exp = 0; + while( true ) { + c = str[offset++]; + if( (c == '-') || (c >= '0' && c <= '9') ) + val += c; + else if( c == '.' ) { + val += c; + isDouble = true; + } + else + break; + } + if( c == 'E' || c == 'e' ) { + c = str[ offset++ ]; + if( c == '-' ){ ++offset; exp_str += '-';} + while( true ) { + c = str[ offset++ ]; + if( c >= '0' && c <= '9' ) + exp_str += c; + else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) { + on_error(std::string("ERROR: Number: Expected a number for exponent, found '") + c + "'"); + return std::move( JSON::Make( JSON::Class::Null ) ); + } + else + break; + } + exp = std::stol( exp_str ); + } + else if( !isspace( c ) && c != ',' && c != ']' && c != '}' ) { + on_error(std::string("ERROR: Number: unexpected character '") + c + "'"); + return std::move( JSON::Make( JSON::Class::Null ) ); + } + --offset; + + if( isDouble ) + Number = std::stod( val ) * std::pow( 10, exp ); + else { + if( !exp_str.empty() ) + Number = std::stol( val ) * std::pow( 10, exp ); + else + Number = std::stol( val ); + } + return std::move( Number ); +} + +static JSON parse_bool( const string &str, size_t &offset, std::function on_error ) { + JSON Bool; + if( str.substr( offset, 4 ) == "true" ) + Bool = true; + else if( str.substr( offset, 5 ) == "false" ) + Bool = false; + else { + on_error(std::string("ERROR: Bool: Expected 'true' or 'false', found '") + str.substr( offset, 5 ) + "'"); + return std::move( JSON::Make( JSON::Class::Null ) ); + } + offset += (Bool.toBool() ? 4 : 5); + return std::move( Bool ); +} + +static JSON parse_null( const string &str, size_t &offset, std::function on_error ) { + JSON Null; + if( str.substr( offset, 4 ) != "null" ) { + on_error(std::string("ERROR: Null: Expected 'null', found '") + str.substr( offset, 4 ) + "'" ); + return std::move( JSON::Make( JSON::Class::Null ) ); + } + offset += 4; + return std::move( Null ); +} + +static JSON parse_next( const string &str, size_t &offset, std::function on_error ) { + char value; + consume_ws( str, offset ); + value = str[offset]; + switch( value ) { + case '[' : return std::move( parse_array( str, offset, on_error ) ); + case '{' : return std::move( parse_object( str, offset, on_error ) ); + case '\"': return std::move( parse_string( str, offset, on_error ) ); + case 't' : + case 'f' : return std::move( parse_bool( str, offset, on_error ) ); + case 'n' : return std::move( parse_null( str, offset, on_error ) ); + default : if( ( value <= '9' && value >= '0' ) || value == '-' ) + return std::move( parse_number( str, offset, on_error ) ); + } + on_error(std::string("ERROR: Parse: Unknown starting character '") + value + "'"); + return JSON(); +} + +JSON JSON::Load( const string &str, std::function on_error) { + size_t offset = 0; + return std::move( parse_next( str, offset, on_error ) ); +} + diff --git a/rktwebview_qt/json.h b/rktwebview_qt/json.h new file mode 100644 index 0000000..87f1b57 --- /dev/null +++ b/rktwebview_qt/json.h @@ -0,0 +1,217 @@ +#ifndef JSON_H +#define JSON_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +std::string json_escape( const std::string &str ); + +class JSON +{ + union BackingData { + BackingData( double d ) : Float( d ){} + BackingData( long l ) : Int( l ){} + BackingData( bool b ) : Bool( b ){} + BackingData( std::string s ) : String( new std::string( s ) ){} + BackingData() : Int( 0 ){} + + std::deque *List; + std::map *Map; + std::string *String; + double Float; + long Int; + bool Bool; + } Internal; + +public: + enum class Class { + Null, + Object, + Array, + String, + Floating, + Integral, + Boolean + }; + + template + class JSONWrapper { + Container *object; + + public: + JSONWrapper( Container *val ) : object( val ) {} + JSONWrapper( std::nullptr_t ) : object( nullptr ) {} + + typename Container::iterator begin() { return object ? object->begin() : typename Container::iterator(); } + typename Container::iterator end() { return object ? object->end() : typename Container::iterator(); } + typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::iterator(); } + typename Container::const_iterator end() const { return object ? object->end() : typename Container::iterator(); } + }; + + template + class JSONConstWrapper { + const Container *object; + + public: + JSONConstWrapper( const Container *val ) : object( val ) {} + JSONConstWrapper( std::nullptr_t ) : object( nullptr ) {} + + typename Container::const_iterator begin() const { return object ? object->begin() : typename Container::const_iterator(); } + typename Container::const_iterator end() const { return object ? object->end() : typename Container::const_iterator(); } + }; + + JSON(); + JSON( std::nullptr_t ) : Internal(), Type( Class::Null ){} + JSON( std::initializer_list list ); + JSON( JSON&& other ); + JSON( const JSON &other ); + + JSON& operator=( const JSON &other ); + JSON& operator=( JSON&& other ); + + // Template T constructors + template + JSON( T b, typename std::enable_if::value>::type* = 0 ); + + template + JSON( T i, typename std::enable_if::value && !std::is_same::value>::type* = 0 ); + + template + JSON( T f, typename std::enable_if::value>::type* = 0 ); + + template + JSON( T s, typename std::enable_if::value>::type* = 0 ); + + ~JSON() { + switch( Type ) { + case Class::Array: + delete Internal.List; + break; + case Class::Object: + delete Internal.Map; + break; + case Class::String: + delete Internal.String; + break; + default:; + } + } + + static JSON Make( Class type ); + static JSON Load( const std::string &, std::function ); + + // Appending things. + + template + void append( T arg ) { + SetType( Class::Array ); Internal.List->emplace_back( arg ); + } + + template + void append( T arg, U... args ) { + append( arg ); append( args... ); + } + + // Assignments (template T). + + template + typename std::enable_if::value, JSON&>::type operator=( T b ) { + SetType( Class::Boolean ); Internal.Bool = b; return *this; + } + + template + typename std::enable_if::value && !std::is_same::value, JSON&>::type operator=( T i ) { + SetType( Class::Integral ); Internal.Int = i; return *this; + } + + template + typename std::enable_if::value, JSON&>::type operator=( T f ) { + SetType( Class::Floating ); Internal.Float = f; return *this; + } + + template + typename std::enable_if::value, JSON&>::type operator=( T s ) { + SetType( Class::String ); *Internal.String = std::string( s ); return *this; + } + + + + // Indexing. + JSON& operator[]( const std::string &key ); + JSON& operator[]( unsigned index ); + + JSON &at( const std::string &key ); + const JSON &at( const std::string &key ) const; + JSON &at( unsigned index ); + const JSON &at( unsigned index ) const; + + int length() const; + int size() const; + + bool hasKey( const std::string &key ) const; + + Class JSONType() const; + + /// Functions for getting primitives from the JSON object. + bool IsNull() const; + + std::string toString() const; + std::string toString( bool &ok ) const; + + double toFloat() const; + double toFloat( bool &ok ) const; + + long toInt() const; + long toInt( bool &ok ) const; + + bool toBool() const; + bool toBool( bool &ok ) const; + + JSONWrapper> ObjectRange(); + JSONWrapper> ArrayRange(); + JSONConstWrapper> ObjectRange() const; + JSONConstWrapper> ArrayRange() const; + + std::string dump( int depth = 1, const std::string &tab = std::string(" ")) const; + + friend std::ostream& operator<<( std::ostream&, const JSON & ); + +private: + void SetType( Class type ); + +private: + /* beware: only call if YOU know that Internal is allocated. No checks performed here. + This function should be called in a constructed JSON just before you are going to + overwrite Internal... + */ + void ClearInternal(); + +private: + + Class Type = Class::Null; +}; + +JSON Array(); + +template +JSON Array( T... args ) { + JSON arr = JSON::Make( JSON::Class::Array ); + arr.append( args... ); + return std::move( arr ); +} + +JSON Object(); + +std::ostream& operator<<( std::ostream &os, const JSON &json ); + + +#endif // JSON_H diff --git a/rktwebview_qt/main.cpp b/rktwebview_qt/main.cpp index 1be04a9..1b96cc4 100644 --- a/rktwebview_qt/main.cpp +++ b/rktwebview_qt/main.cpp @@ -1,94 +1,325 @@ -#include "rktwebview.h" - #include #include #include -static int _argc; -static char **_argv; +#include "rkt_protocol.h" +#include "shm.h" +#include "shmqueue.h" +#include "command.h" -void eventCb(rkt_data_t *e) +#include +#include + +#include "rktwebview_qt.h" + +static void free_data(rkt_data_t *d) { - printf("event: %s\n", e->data.event.event); - rkt_webview_free_data(e); + if (d->kind == version) { + free(d); + } else if (d->kind == event) { + free(d->data.event.event); + free(d); + } else if (d->kind == js_result) { + free(d->data.js_result.value); + free(d); + } else { + fprintf(stderr, "UNEXPECTED: data kind %d cannot be freed\n", d->kind); + } +} + +class Handler : public QThread +{ +public: + Shm *shm; + ShmQueue *command_queue; + ShmQueue *result_queue; + ShmQueue *event_queue; + Rktwebview_qt *webview_handler; + + // QThread interface +protected: + void run(); +}; + +static Handler *_handler; + +static void event_cb(rkt_data_t *data) +{ + if (data->kind != rkt_data_kind_t::event) { + return; + } + + int wv = data->data.event.wv; + char *evt = data->data.event.event; + + std::string evt_d(evt); + _handler->event_queue->enqueue(wv, evt_d); + + free_data(data); } int main(int argc, char *argv[]) { - int wv1; - int wv2; + const char *me = argv[0]; - _argc = argc; - _argv = argv; - - int k = 0; - while(k < 2) { - rkt_webview_init(); - - int context = rkt_webview_new_context("console.log('boilerplate!');", nullptr); - - wv1 = rkt_webview_create(context, 0, eventCb); - - rkt_webview_move(wv1, 200, 300); - rkt_webview_resize(wv1, 800, 600); - rkt_webview_set_url(wv1, "https://wikipedia.org"); //"http://127.0.0.1:8083"); - - k += 1; - int i = 0; - while(i < 10) { - printf("Waiting...%d\n", i); - rkt_webview_process_events(1000); - - if (i == 6) { - rkt_webview_open_devtools(wv1); - } - - if (i == 3) { - rkt_data_t *r = rkt_webview_call_js(wv1, "{ let a = 7 * 6; console.log('a = ' + a); return a; }"); - printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - rkt_webview_free_data(r); - } - - if (i == 4) { - rkt_data_t *r = rkt_webview_call_js(wv1, "let el = document.getElementById('hi');el.value = '10';"); - printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - rkt_webview_free_data(r); - } - - if (i == 6) { - //rkt_data_t *r = rkt_webview_call_js(wv1, "document.body.innerHTML = '

Hi!

'; return document.body.innerHTML;"); - //printf("rkt_js_result: %d: %s\n", r->data.js_result.result, r->data.js_result.value); - //rkt_webview_free_data(r); - } - - if (i == 7) { - result_t r = rkt_webview_message_box(wv1, "This is a title", "This is my message", "This is my submessage", rkt_messagetype_t::yes_no); - } - - - if (i == 10) { - wv2 = rkt_webview_create(context, wv1, eventCb); - rkt_webview_move(wv2, 400, 200); - rkt_webview_resize(wv2, 800, 600); - rkt_webview_set_url(wv2, "https://127.0.0.1"); - } - - if (i > 10) { - char buf[1000]; - sprintf(buf, "{ let obj = { e: 'test', i: %d }; window.rkt_send_event(obj); }", i); - rkt_webview_run_js(wv1, buf); - } - - if (i == 15) { - rkt_webview_close(wv2); - } - i += 1; - } - - rkt_webview_close(wv1); - rkt_webview_cleanup(); + if (argc < 6) { + fprintf(stderr, "%s: wrong number of arguments\n", me); + exit(1); + } + + const char *shm_name = argv[1]; + const char *shm_size_str = argv[2]; + const char *cmd_slot_str = argv[3]; + const char *res_slot_str = argv[4]; + const char *evt_slot_str = argv[5]; + + size_t shm_size = atoi(shm_size_str); + int cmd_slot = atoi(cmd_slot_str); + int res_slot = atoi(res_slot_str); + int evt_slot = atoi(evt_slot_str); + + fprintf(stderr, "%s %s %s %s %s %s\n", me, shm_name, shm_size_str, cmd_slot_str, res_slot_str, evt_slot_str); + fprintf(stderr, "%s %s %ld %d %d %d\n", me, shm_name, shm_size, cmd_slot, res_slot, evt_slot); + + if (!(shm_size > 0 && cmd_slot > 0 && res_slot > 0 && evt_slot > 0)) { + fprintf(stderr, "%s: Invalid shm size or slots\n", me); + exit(2); + } + + Handler *handler = new Handler(); + _handler = handler; + handler->shm = new Shm(shm_name, shm_size, false); + handler->command_queue = new ShmQueue(handler->shm, cmd_slot, false); + handler->result_queue = new ShmQueue(handler->shm, res_slot, false); + handler->event_queue = new ShmQueue(handler->shm, evt_slot, false); + handler->webview_handler = new Rktwebview_qt(argc, argv); + handler->start(); + + handler->webview_handler->initApp(); + handler->webview_handler->execApp(); + + fprintf(stderr, "waiting for thread to end\n"); + handler->wait(); + + fprintf(stderr, "cleaning up shm\n"); + + delete handler->webview_handler; + delete handler->command_queue; + delete handler->result_queue; + delete handler->event_queue; + delete handler->shm; + delete handler; + + return 0; +} + +void Handler::run() +{ + bool quit = false; + while (!quit) { + int cmd; + std::string data; + command_queue->dequeue(cmd, data, true); + QJsonObject data_obj = QJsonDocument::fromJson(data.c_str()).object(); + + switch(cmd) { + case CMD_QUIT: { + fprintf(stderr, "Got quit message\n"); + webview_handler->rktQuit(); + fprintf(stderr, "Enqueing RESULT_QUIT to result queue\n"); + result_queue->enqueue(RESULT_QUIT); + quit = true; + } + break; + case CMD_HANDLE_IS_VALID: { + int wv = data_obj["wv"].toInt(); + bool oke = webview_handler->rktValid(wv); + result_queue->enqueue(oke); + } + break; + case CMD_CONTEXT_NEW: { + QString boilerplate_js = data_obj["boilerplate_js"].toString(); + bool has_pem_cert = data_obj["has_pem_cert"].toBool(); + QString pem_cert = data_obj["pem_cert"].toString(); + int context = webview_handler->newContext(boilerplate_js, has_pem_cert, pem_cert); + result_queue->enqueue(context); + } + break; + case CMD_CREATE_WV: { + int context = data_obj["context"].toInt(); + int parent = data_obj["parent"].toInt(); + + int wv = webview_handler->rktWebViewCreate(context, parent, event_cb); + result_queue->enqueue(wv); + } + break; + case CMD_CLOSE_WV: { + int wv = data_obj["wv"].toInt(); + webview_handler->rktWebViewClose(wv); + } + break; + case CMD_SET_URL: { + int wv = data_obj["wv"].toInt(); + QString url = data_obj["url"].toString(); + result_t r = webview_handler->rktSetUrl(wv, url.toUtf8().constData()); + result_queue->enqueue(r); + } + break; + case CMD_SET_HTML: { + int wv = data_obj["wv"].toInt(); + QString html = data_obj["html"].toString(); + result_t r = webview_handler->rktSetHtml(wv, html.toUtf8().constData()); + result_queue->enqueue(r); + } + break; + case CMD_RUN_JS: { + int wv = data_obj["wv"].toInt(); + QString js = data_obj["js"].toString(); + result_t r = webview_handler->rktRunJs(wv, js); + result_queue->enqueue(r); + } + break; + case CMD_CALL_JS: { + fprintf(stderr, "Calljs\n"); + int wv = data_obj["wv"].toInt(); + QString js = data_obj["js"].toString(); + rkt_data_t *res = webview_handler->rktCallJs(wv, js.toUtf8().constData()); + result_queue->enqueue(res->data.js_result.result, res->data.js_result.value); + free_data(res); + } + break; + case CMD_OPEN_DEVTOOLS: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktOpenDevtools(wv); + result_queue->enqueue(r); + } + break; + case CMD_MOVE: { + int wv = data_obj["wv"].toInt(); + int x = data_obj["x"].toInt(); + int y = data_obj["y"].toInt(); + result_t r = webview_handler->rktMove(wv, x, y); + result_queue->enqueue(r); + } + break; + case CMD_RESIZE: { + int wv = data_obj["wv"].toInt(); + int w = data_obj["w"].toInt(); + int h = data_obj["h"].toInt(); + result_t r = webview_handler->rktResize(wv, w, h); + result_queue->enqueue(r); + } + break; + case CMD_HIDE: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktHideWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_SHOW: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktShowWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_PRESENT: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktPresentWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_MAXIMIZE: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktMaximizeWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_MINIMIZE: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktMinimizeWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_SHOW_NORMAL: { + int wv = data_obj["wv"].toInt(); + result_t r = webview_handler->rktShowNormalWindow(wv); + result_queue->enqueue(r); + } + break; + case CMD_WINDOW_STATE: { + int wv = data_obj["wv"].toInt(); + window_state_t r = webview_handler->rktWindowState(wv); + result_queue->enqueue(r); + } + break; + case CMD_SET_TITLE: { + int wv = data_obj["wv"].toInt(); + QString title = data_obj["title"].toString(); + result_t r = webview_handler->rktWindowSetTitle(wv, title.toUtf8().constData()); + result_queue->enqueue(r); + } + break; + case CMD_CHOOSE_DIR: { + int wv = data_obj["wv"].toInt(); + QString title = data_obj["title"].toString(); + QString base_dir = data_obj["base_dir"].toString(); + result_t r = webview_handler->rktChooseDir(wv, + title.toUtf8().constData(), + base_dir.toUtf8().constData() + ); + result_queue->enqueue(r); + } + break; + case CMD_FILE_OPEN: { + int wv = data_obj["wv"].toInt(); + QString title = data_obj["title"].toString(); + QString base_dir = data_obj["base_dir"].toString(); + QString permitted_exts = data_obj["permitted_exts"].toString(); + result_t r = webview_handler->rktFileOpen(wv, + title.toUtf8().constData(), + base_dir.toUtf8().constData(), + permitted_exts.toUtf8().constData() + ); + result_queue->enqueue(r); + } + break; + case CMD_FILE_SAVE: { + int wv = data_obj["wv"].toInt(); + QString title = data_obj["title"].toString(); + QString base_dir = data_obj["base_dir"].toString(); + QString permitted_exts = data_obj["permitted_exts"].toString(); + result_t r = webview_handler->rktFileSave(wv, + title.toUtf8().constData(), + base_dir.toUtf8().constData(), + permitted_exts.toUtf8().constData() + ); + result_queue->enqueue(r); + } + break; + case CMD_SET_OU_TOKEN: { + int wv = data_obj["wv"].toInt(); + QString token = data_obj["token"].toString(); + webview_handler->rktSetOUToken(wv, token.toUtf8().constData()); + } + break; + case CMD_MSG_BOX: { + int wv = data_obj["wv"].toInt(); + QString title = data_obj["title"].toString(); + QString message = data_obj["message"].toString(); + QString submsg = data_obj["submessage"].toString(); + int type = data_obj["type"].toInt(); + result_t r = webview_handler->rktMessageBox(wv, + title.toUtf8().constData(), + message.toUtf8().constData(), + submsg.toUtf8().constData(), + static_cast(type) + ); + result_queue->enqueue(r); + } + break; + default: { + fprintf(stderr, "Unknown command: %d\n", cmd); + } + } } - QCoreApplication *app = QApplication::instance(); - delete app; - printf("%p\n", QApplication::instance()); } diff --git a/rktwebview_qt/rkt_protocol.h b/rktwebview_qt/rkt_protocol.h new file mode 100644 index 0000000..aacfe2b --- /dev/null +++ b/rktwebview_qt/rkt_protocol.h @@ -0,0 +1,33 @@ +#ifndef RKT_PROTOCOL_H +#define RKT_PROTOCOL_H + +#define CMD_HANDLE_IS_VALID 1 +#define CMD_QUIT 2 +#define CMD_CONTEXT_NEW 3 // arguments: boilerplate_js: string, has_cert: bool, cert_pem: string -> context: int +#define CMD_CREATE_WV 4 // arguments: context: int, parent: int -> wv: int +#define CMD_CLOSE_WV 5 // arguments: wv: int -> void +#define CMD_SET_URL 6 // arguments: wv: int, url: string -> result_t: int +#define CMD_SET_HTML 7 // arguments: wv: int, html: string -> result_t: int +#define CMD_RUN_JS 8 // arguments: wv: int, js: string -> result_t: int +#define CMD_CALL_JS 9 // arguments: wv: int, js: string -> result_t: int +#define CMD_OPEN_DEVTOOLS 10 // arguments: wv: int -> result_t: int +#define CMD_MOVE 11 // arguments: wv: int, x: int, y: int -> result_t: int +#define CMD_RESIZE 12 // arguments: wv: int, w: int, h: int -> result_t: int +#define CMD_HIDE 13 // arguments: wv: int -> result_t: int +#define CMD_SHOW 14 // arguments: wv: int -> result_t: int +#define CMD_PRESENT 15 // arguments: wv: int -> result_t: int +#define CMD_MAXIMIZE 16 // arguments: wv: int -> result_t: int +#define CMD_MINIMIZE 17 // arguments: wv: int -> result_t: int +#define CMD_SHOW_NORMAL 18 // arguments: wv: int -> result_t: int +#define CMD_WINDOW_STATE 19 // arguments: wv: int -> window_state_t: int +#define CMD_SET_TITLE 20 // arguments: wv: int, title: string -> result_t: int +#define CMD_CHOOSE_DIR 21 // arguments: wv: int, title: string, base_dir: string -> result_t: int +#define CMD_FILE_OPEN 22 // arguments: wv: int, title: string, base_dir: string, permitted_exts: string -> result_t: int +#define CMD_FILE_SAVE 23 // arguments: wv: int, title: string, base_dir: string, permitted_exts: string -> result_t: int +#define CMD_SET_OU_TOKEN 24 // arguments: wv: int, token: string -> result_t: int +#define CMD_MSG_BOX 25 // arguments: wv: int, title:string, message: string, submessage: string, type:int -> result_t: int + +#define RESULT_QUIT 36379 + + +#endif // RKT_PROTOCOL_H diff --git a/rktwebview_qt/rktwebview.cpp b/rktwebview_qt/rktwebview.cpp index 3877dcf..3e6d10a 100644 --- a/rktwebview_qt/rktwebview.cpp +++ b/rktwebview_qt/rktwebview.cpp @@ -1,31 +1,85 @@ -#include "rktwebview_internal.h" - #include -#include #include #include -//#include +#include +#include #include -#include "rktwebview_qt.h" +#include "rktwebview.h" +#include "rkt_protocol.h" +#include #include "shmqueue.h" +#include "json.h" + +#define SHM_SIZE (10 * 1024 * 1024) // 10MB +#define COMMAND_SLOT 1 +#define COMMAND_RESULT_SLOT 2 +#define EVENT_SLOT 3 + +//#define DEBUG + +///////////////////////////////////////////////////////////////////// +// Utility functions +///////////////////////////////////////////////////////////////////// + +typedef struct { + std::string name; + size_t shm_size; + Shm *shm; + ShmQueue *command_queue; + ShmQueue *command_result_queue; + ShmQueue *event_queue; + pid_t rkt_webview_prg_pid; + bool rkt_webview_prg_started; +} Handle_t; + +Handle_t *handler = nullptr; + +static bool fileExists(const char *filename) { + return access(filename, X_OK) != -1; +} uint64_t current_ms() { using namespace std::chrono; return duration_cast(system_clock::now().time_since_epoch()).count(); } +bool runRktWebview(Handle_t *handler) +{ + // run rktwebview_prg using the environment variable RKT_WEBVIEW_PRG +#ifdef _WIN32 +#else + char *rkt_webview_prg_path = getenv("RKT_WEBVIEW_PRG"); + if (rkt_webview_prg_path == nullptr) { + fprintf(stderr, "RKT_WEBVIEW_PRG environment variable not set, cannot start webview program\n"); + return false; + } + if (!fileExists(rkt_webview_prg_path)) { + fprintf(stderr, "%s does not exist or is not executable\n", rkt_webview_prg_path); + return false; + } + + char shm_size_str[30]; + char command_slot[10]; + char command_result_slot[10]; + char event_slot[10]; + + sprintf(shm_size_str, "%ld", handler->shm_size); + sprintf(command_slot, "%d", COMMAND_SLOT); + sprintf(command_result_slot, "%d", COMMAND_RESULT_SLOT); + sprintf(event_slot, "%d", EVENT_SLOT); + + char *argv[] = { rkt_webview_prg_path, const_cast(handler->name.c_str()), shm_size_str, command_slot, command_result_slot, event_slot, nullptr }; + + int r = posix_spawn(&handler->rkt_webview_prg_pid, rkt_webview_prg_path, nullptr, nullptr, argv, environ); + + return (r == 0); +#endif +} + ///////////////////////////////////////////////////////////////////// // Main C Interface ///////////////////////////////////////////////////////////////////// -typedef struct { - Shm *shm; - ShmQueue *command_queue; - ShmQueue *event_queue; - Rktwebview_qt *rkt; -} Handle_t; - -Handle_t *handler = nullptr; void rkt_webview_cleanup() { @@ -54,76 +108,190 @@ void rkt_webview_cleanup() handler = nullptr; } */ + fprintf(stderr, "Sending quit message\n"); + handler->command_queue->enqueue(CMD_QUIT); + fprintf(stderr, "Message sent\n"); + bool stopped = false; + while(!stopped) { + int cmd; + std::string s; + fprintf(stderr, "Getting result of quit message\n"); + handler->command_result_queue->dequeue(cmd, s, true); + fprintf(stderr, "got %d\n", cmd); + if (cmd == RESULT_QUIT) { + stopped = true; + } + } + + delete handler->event_queue; + delete handler->command_result_queue; + delete handler->command_queue; + delete handler->shm; + delete handler; + handler = nullptr; } } void rkt_webview_init() { if (handler == nullptr) { - handler = new Rktwebview_qt(); - } + // Create shared memory and communication queues - if (handler->app() == nullptr) { - handler->initApp(); + char buf[1024]; +#ifdef DEBUG + sprintf(buf, "rktwebview-dbg"); +#else + pid_t p = getpid(); + sprintf(buf, "rktwebview-%x", p); +#endif + + handler = new Handle_t; + handler->name = buf; + + handler->shm_size = SHM_SIZE; + handler->shm = new Shm(handler->name.data(), handler->shm_size, true); + handler->command_queue = new ShmQueue(handler->shm, COMMAND_SLOT, true); + handler->command_result_queue = new ShmQueue(handler->shm, COMMAND_RESULT_SLOT, true); + handler->event_queue = new ShmQueue(handler->shm, EVENT_SLOT, true); + + // Start rktwebview_prg application with the right information +#ifndef DEBUG + handler->rkt_webview_prg_started = runRktWebview(handler); +#endif + } +} + +bool rkt_webview_valid(rktwebview_t wv) +{ + rkt_webview_init(); + if (handler != nullptr && handler->rkt_webview_prg_started) { + handler->command_queue->enqueue(CMD_HANDLE_IS_VALID); + int result; + std::string json_result; + handler->command_result_queue->dequeue(result, json_result, true); + return result == 0; + } else { + return false; } } rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, const char *optional_server_cert_pem) { rkt_webview_init(); - return handler->newContext(boilerplate_js, optional_server_cert_pem); + + JSON j; + + std::string bpj(boilerplate_js); + bool has_pem_cert = optional_server_cert_pem != nullptr; + std::string osc(has_pem_cert ? optional_server_cert_pem : ""); + + j["boilerplate_js"] = bpj; + j["has_pem_cert"] = has_pem_cert; + j["pem_cert"] = osc; + + handler->command_queue->enqueue(CMD_CONTEXT_NEW, j.dump()); + + int result; + std::string json_result; + handler->command_result_queue->dequeue(result, json_result, true); + return result; } -int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_event_cb) +int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent) { rkt_webview_init(); - return handler->rktWebViewCreate(context, parent, js_event_cb); + JSON j; + j["context"] = context; + j["parent"] = parent; + + handler->command_queue->enqueue(CMD_CREATE_WV, j.dump()); + + int result; + std::string json_result; + handler->command_result_queue->dequeue(result, json_result, true); + + return result; } void rkt_webview_close(rktwebview_t wv) { rkt_webview_init(); - handler->rktWebViewClose(wv); + + JSON j; + j["wv"] = wv; + handler->command_queue->enqueue(CMD_CLOSE_WV, j.dump()); } +#define CMDRES4(cmd, wv, key, val, key2, val2, key3, val3, key4, val4) \ + rkt_webview_init(); \ + JSON j; \ + j["wv"] = wv; \ + j[key] = val; \ + j[key2] = val2; \ + j[key3] = val3; \ + j[key4] = val4; \ + handler->command_queue->enqueue(cmd, j.dump()); \ + int result; \ + std::string json_result; \ + handler->command_result_queue->dequeue(result, json_result, true); \ + result_t r = static_cast(result); \ + return r; + +#define CMDRES3(cmd, wv, key, val, key2, val2, key3, val3) \ + CMDRES4(cmd, wv, key, val, key2, val2, key3, val3, "nil3", "none") + +#define CMDRES2(cmd, wv, key, val, key2, val2) \ + CMDRES3(cmd, wv, key, val, key2, val2, "nil2", "none") + +#define CMDRES(cmd, wv, key, val) \ + CMDRES2(cmd, wv, key, val, "nil1", "none") + +#define CMDRES0(cmd, wv) \ + CMDRES(cmd, wv, "nil0", "none") + result_t rkt_webview_set_url(rktwebview_t wv, const char *url) { - rkt_webview_init(); - result_t r = handler->rktSetUrl(wv, url); - return r; + CMDRES(CMD_SET_URL, wv, "url", url) } -result_t rkt_webview_set_html(rktwebview_t wv, const char *url) +result_t rkt_webview_set_html(rktwebview_t wv, const char *html) { - rkt_webview_init(); - result_t r = handler->rktSetHtml(wv, url); - return r; + CMDRES(CMD_SET_HTML, wv, "html", html) } result_t rkt_webview_run_js(rktwebview_t wv, const char *js) { - rkt_webview_init(); - result_t r = handler->rktRunJs(wv, js); - return r; + CMDRES(CMD_RUN_JS, wv, "js", js) } rkt_data_t *rkt_webview_call_js(rktwebview_t wv, const char *js) { rkt_webview_init(); - rkt_data_t *r = handler->rktCallJs(wv, js); + + JSON j; + j["wv"] = wv; + j["js"] = std::string(js); + handler->command_queue->enqueue(CMD_CALL_JS, j.dump()); + + int result; + std::string json_result; + handler->command_result_queue->dequeue(result, json_result, true); + + rkt_data_t *r = new rkt_data_t(); + r->kind = rkt_data_kind_t::js_result; + r->data.js_result.result = static_cast(result); + r->data.js_result.value = strdup(json_result.c_str()); + return r; } - - result_t rkt_webview_open_devtools(rktwebview_t wv) { - rkt_webview_init(); - result_t r = handler->rktOpenDevtools(wv); - return r; + CMDRES(CMD_OPEN_DEVTOOLS, wv, "nil", "none") } +/* void rkt_webview_process_events(int for_ms) { rkt_webview_init(); @@ -136,106 +304,94 @@ void rkt_webview_process_events(int for_ms) handler->doEvents(); } } +*/ result_t rkt_webview_move(rktwebview_t wv, int x, int y) { - rkt_webview_init(); - - result_t r = handler->rktMove(wv, x, y); - return r; + CMDRES2(CMD_MOVE, wv, "x", x, "y", y) } result_t rkt_webview_resize(rktwebview_t wv, int width, int height) { - rkt_webview_init(); - - result_t r = handler->rktResize(wv, width, height); - return r; + CMDRES2(CMD_RESIZE, wv, "w", width, "h", height) } -bool rkt_webview_valid(rktwebview_t wv) -{ - rkt_webview_init(); - return handler->rktValid(wv); -} - result_t rkt_webview_hide(rktwebview_t w) { - rkt_webview_init(); - return handler->rktHideWindow(w); - + CMDRES0(CMD_HIDE, w) } result_t rkt_webview_show(rktwebview_t w) { - rkt_webview_init(); - return handler->rktShowWindow(w); + CMDRES0(CMD_SHOW, w) } result_t rkt_webview_present(rktwebview_t w) { - rkt_webview_init(); - return handler->rktPresentWindow(w); + CMDRES0(CMD_PRESENT, w) } result_t rkt_webview_maximize(rktwebview_t w) { - rkt_webview_init(); - return handler->rktMaximizeWindow(w); + CMDRES0(CMD_MAXIMIZE, w) } result_t rkt_webview_minimize(rktwebview_t w) { - rkt_webview_init(); - return handler->rktMinimizeWindow(w); + CMDRES0(CMD_MINIMIZE, w) } result_t rkt_webview_show_normal(rktwebview_t w) { - rkt_webview_init(); - return handler->rktShowNormalWindow(w); + CMDRES0(CMD_SHOW_NORMAL, w) } window_state_t rkt_webview_window_state(rktwebview_t w) { - rkt_webview_init(); - return handler->rktWindowState(w); + auto f = [w]() { + CMDRES0(CMD_WINDOW_STATE, w) + }; + int r = f(); + return static_cast(r); } result_t rkt_webview_set_title(rktwebview_t wv, const char *title) { - rkt_webview_init(); - return handler->rktWindowSetTitle(wv, title); + CMDRES(CMD_SET_TITLE, wv, "title", title) } result_t rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir) { - rkt_webview_init(); - return handler->rktChooseDir(w, title, base_dir); + CMDRES2(CMD_CHOOSE_DIR, w, "title", title, "base_dir", base_dir) } result_t rkt_webview_file_open(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts) { - rkt_webview_init(); - return handler->rktFileOpen(w, title, base_dir, permitted_exts); + CMDRES3(CMD_FILE_OPEN, w, "title", title, "base_dir", base_dir, "permitted_exts", permitted_exts) } result_t rkt_webview_file_save(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts) { - rkt_webview_init(); - return handler->rktFileSave(w, title, base_dir, permitted_exts); + CMDRES3(CMD_FILE_SAVE, w, "title", title, "base_dir", base_dir, "permitted_exts", permitted_exts) } void rkt_webview_set_ou_token(rktwebview_t wv, const char *token) { rkt_webview_init(); - handler->rktSetOUToken(wv, token); + + JSON j; + j["wv"] = wv; + j["token"] = std::string(token); + + handler->command_queue->enqueue(CMD_SET_OU_TOKEN, j.dump()); } void rkt_webview_free_data(rkt_data_t *d) { + if (d == nullptr) { return; } + if (d->kind == version) { free(d); } else if (d->kind == event) { @@ -256,14 +412,37 @@ rkt_data_t *rkt_webview_version() d->data.version.api_major = RKT_WEBVIEW_API_MAJOR; d->data.version.api_minor = RKT_WEBVIEW_API_MINOR; d->data.version.api_patch = RKT_WEBVIEW_API_PATCH; - d->data.version.qt_major = QT_VERSION_MAJOR; - d->data.version.qt_minor = QT_VERSION_MINOR; - d->data.version.qt_patch = QT_VERSION_PATCH; return d; } result_t rkt_webview_message_box(rktwebview_t w, const char *title, const char *message, const char *submessage, rkt_messagetype_t type) { - rkt_webview_init(); - return handler->rktMessageBox(w, title, message, submessage, type); + CMDRES4(CMD_MSG_BOX, w, "title", title, "message", message, "submessage", submessage, "type", static_cast(type)) +} + +int rkt_webview_events_waiting() +{ + return handler->event_queue->depth(); +} + +rkt_data_t *rkt_webview_get_event() +{ + //fprintf(stderr, "rkt_webview_get_event\n"); + int wv; + std::string data; + if (handler->event_queue->dequeue(wv, data, false)) { + //fprintf(stderr, "got event %d %s\n", wv, data.c_str()); + rkt_data_t *d = reinterpret_cast(malloc(sizeof(rkt_data_t))); + d->kind = rkt_data_kind_t::event; + + size_t ds = data.size(); + d->data.event.event = reinterpret_cast(malloc(ds + 1)); + memcpy(d->data.event.event, data.c_str(), ds); + d->data.event.event[ds] = '\0'; + d->data.event.wv = wv; + fprintf(stderr, "event: %d - '%s'\n", d->data.event.wv, d->data.event.event); + return d; + } else { + return nullptr; + } } diff --git a/rktwebview_qt/rktwebview.h b/rktwebview_qt/rktwebview.h index c661221..902a7d2 100644 --- a/rktwebview_qt/rktwebview.h +++ b/rktwebview_qt/rktwebview.h @@ -1,7 +1,8 @@ #ifndef RKTWEBVIEW_H #define RKTWEBVIEW_H -#include "rktwebview_qt_global.h" +#include "rktwebview_global.h" +#include "rktwebview_types.h" #define RKT_WEBVIEW_API_MAJOR 0 #define RKT_WEBVIEW_API_MINOR 1 @@ -9,122 +10,47 @@ extern "C" { -typedef int rktwebview_t; -typedef int rkt_wv_context_t; +RKTWEBVIEW_EXPORT void rkt_webview_init(); +RKTWEBVIEW_EXPORT void rkt_webview_cleanup(); +//RKTWEBVIEW_EXPORT void rkt_webview_process_events(int for_ms); -typedef struct { - rktwebview_t wv; - char *event; -} rkt_event_t; +RKTWEBVIEW_EXPORT void rkt_webview_free_data(rkt_data_t *d); +RKTWEBVIEW_EXPORT rkt_data_t *rkt_webview_version(); -typedef enum { - no_result_yet = -1, - oke = 0, - set_html_failed = 1, - set_navigate_failed = 2, - eval_js_failed = 3, - no_devtools_on_platform = 4, - no_delegate_for_context = 5, - webview_missing_dependency = 6, - webview_canceled = 7, - webview_invalid_state = 8, - webview_invalid_argument = 9, - webview_unspecified = 10, - webview_dispatch_failed = 11, - move_failed = 12, - resize_failed = 13, - choose_dir_failed = 14, - open_file_failed = 15, - save_file_failed = 16, - failed = 17 -} result_t; +RKTWEBVIEW_EXPORT int rkt_webview_events_waiting(); +RKTWEBVIEW_EXPORT rkt_data_t *rkt_webview_get_event(); -typedef struct { - result_t result; - char *value; -} rkt_js_result_t; +RKTWEBVIEW_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, const char *optional_server_cert_pem); +RKTWEBVIEW_EXPORT int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent); -typedef enum { - invalid = -1, - normal = 0, - minimized = 1, - maximized = 2, - hidden = 3, - normal_active = 16, - maximized_active = 18 -} window_state_t; +RKTWEBVIEW_EXPORT void rkt_webview_close(rktwebview_t wv); +RKTWEBVIEW_EXPORT bool rkt_webview_valid(rktwebview_t wv); +RKTWEBVIEW_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title); +RKTWEBVIEW_EXPORT void rkt_webview_set_ou_token(rktwebview_t wv, const char *token); -typedef enum { - info = 1, - error = 2, - warning = 3, - yes_no = 4, - oke_cancel = 5 -} rkt_messagetype_t; +RKTWEBVIEW_EXPORT result_t rkt_webview_set_url(rktwebview_t wv, const char *url); +RKTWEBVIEW_EXPORT result_t rkt_webview_set_html(rktwebview_t wv, const char *html); -typedef struct { - int qt_major; - int qt_minor; - int qt_patch; - int api_major; - int api_minor; - int api_patch; -} rkt_version_t; +RKTWEBVIEW_EXPORT result_t rkt_webview_run_js(rktwebview_t wv, const char *js); +RKTWEBVIEW_EXPORT rkt_data_t *rkt_webview_call_js(rktwebview_t wv, const char *js); -typedef enum { - version = 1, - event = 2, - js_result = 3 -} rkt_data_kind_t; +RKTWEBVIEW_EXPORT result_t rkt_webview_open_devtools(rktwebview_t wv); -typedef struct { - rkt_data_kind_t kind; - union { - rkt_version_t version; - rkt_event_t event; - rkt_js_result_t js_result; - } data; -} rkt_data_t; +RKTWEBVIEW_EXPORT result_t rkt_webview_move(rktwebview_t w, int x, int y); +RKTWEBVIEW_EXPORT result_t rkt_webview_resize(rktwebview_t w, int width, int height); +RKTWEBVIEW_EXPORT result_t rkt_webview_hide(rktwebview_t w); +RKTWEBVIEW_EXPORT result_t rkt_webview_show(rktwebview_t w); +RKTWEBVIEW_EXPORT result_t rkt_webview_show_normal(rktwebview_t w); +RKTWEBVIEW_EXPORT result_t rkt_webview_present(rktwebview_t w); +RKTWEBVIEW_EXPORT result_t rkt_webview_maximize(rktwebview_t w); +RKTWEBVIEW_EXPORT result_t rkt_webview_minimize(rktwebview_t w); +RKTWEBVIEW_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w); -typedef void (*event_cb_t)(rkt_data_t *); +RKTWEBVIEW_EXPORT result_t rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir); +RKTWEBVIEW_EXPORT result_t rkt_webview_file_open(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); +RKTWEBVIEW_EXPORT result_t rkt_webview_file_save(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); -RKTWEBVIEW_QT_EXPORT void rkt_webview_init(); -RKTWEBVIEW_QT_EXPORT void rkt_webview_cleanup(); -RKTWEBVIEW_QT_EXPORT void rkt_webview_process_events(int for_ms); -RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d); -RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_version(); - -RKTWEBVIEW_QT_EXPORT rkt_wv_context_t rkt_webview_new_context(const char *boilerplate_js, const char *optional_server_cert_pem); - -RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_event_cb); -RKTWEBVIEW_QT_EXPORT void rkt_webview_close(rktwebview_t wv); -RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title); -RKTWEBVIEW_QT_EXPORT void rkt_webview_set_ou_token(rktwebview_t wv, const char *token); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_url(rktwebview_t wv, const char *url); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_html(rktwebview_t wv, const char *html); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_run_js(rktwebview_t wv, const char *js); -RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_call_js(rktwebview_t wv, const char *js); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_open_devtools(rktwebview_t wv); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_move(rktwebview_t w, int x, int y); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_resize(rktwebview_t w, int width, int height); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_hide(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show_normal(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_present(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w); -RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_file_open(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_file_save(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); - -RKTWEBVIEW_QT_EXPORT result_t rkt_webview_message_box(rktwebview_t w, const char *title, const char *message, const char *submessage, rkt_messagetype_t type); +RKTWEBVIEW_EXPORT result_t rkt_webview_message_box(rktwebview_t w, const char *title, const char *message, const char *submessage, rkt_messagetype_t type); } diff --git a/rktwebview_qt/rktwebview_global.h b/rktwebview_qt/rktwebview_global.h new file mode 100644 index 0000000..962d205 --- /dev/null +++ b/rktwebview_qt/rktwebview_global.h @@ -0,0 +1,18 @@ +#ifndef RKTWEBVIEW_GLOBAL_H +#define RKTWEBVIEW_GLOBAL_H + +#if defined(RKTWEBVIEW_LIBRARY) + #ifdef _WIN32 + #define RKTWEBVIEW_EXPORT __declspec(dllexport) + #else + #define RKTWEBVIEW_EXPORT + #endif +#else + #ifdef _WIN32 + #define RKTWEBVIEW_EXPORT __declspec(dllimport) + #else + #define RKTWEBVIEW_EXPORT + #endif +#endif + +#endif // RKTWEBVIEW_GLOBAL_H diff --git a/rktwebview_qt/rktwebview_internal.h b/rktwebview_qt/rktwebview_internal.h deleted file mode 100644 index 71ff3c2..0000000 --- a/rktwebview_qt/rktwebview_internal.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef RKTWEBVIEW_INTERNAL_H -#define RKTWEBVIEW_INTERNAL_H - -#include "rktwebview.h" - -#endif // RKTWEBVIEW_INTERNAL_H diff --git a/rktwebview_qt/rktwebview_qt.cpp b/rktwebview_qt/rktwebview_qt.cpp index a9d07dd..31d9afc 100644 --- a/rktwebview_qt/rktwebview_qt.cpp +++ b/rktwebview_qt/rktwebview_qt.cpp @@ -1,6 +1,6 @@ #include "rktwebview_qt.h" #include "webviewqt.h" -#include "rktwebview.h" +#include "rktwebview_types.h" #include "webviewwindow.h" #include "rktutils.h" #include @@ -29,6 +29,92 @@ static inline char *copyString(const char *s) void Rktwebview_qt::processCommand(Command *cmd) { switch(cmd->cmd) { + case COMMAND_QUIT: { // Quit application + _app->quit(); + } + break; + case COMMAND_NEW_CONTEXT: { + QString boilerplate_js = cmd->args[0].toString(); + bool has_pem = cmd->args[1].toBool(); + QString optional_server_cert_pem = cmd->args[2].toString(); + + fprintf(stderr, "bjs: %s\n", boilerplate_js.toUtf8().constData()); + fprintf(stderr, "oscp: %s\n", optional_server_cert_pem.toUtf8().constData()); + + QWebEngineProfileBuilder b; + if (has_pem) { + QByteArray scp = optional_server_cert_pem.toUtf8(); + fprintf(stderr, "Installing cert: %s\n", scp.constData()); + QList certs; + QSslCertificate cert(scp); + certs.append(cert); + b.setAdditionalTrustedCertificates(certs); + } + _context_counter += 1; + QString name = QString::asprintf("profile-%d", _context_counter); + + QString code = "if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; }\n" + "window.rkt_evt_frame_el = null;\n" + "window.rkt_evt_frame_win = null;\n" + "window.rkt_send_event = function(obj) {\n" + " //console.log('Sending event: ' + obj);\n" + " window.rkt_event_queue.push(obj);\n" + " if (window.rkt_evt_frame_el) {\n" + " window.rkt_evt_frame_win.print();\n" + " }\n" + "};\n" + "window.rkt_get_events = function() {\n" + " let q = window.rkt_event_queue;\n" + " window.rkt_event_queue = [];\n" + " let json_q = JSON.stringify(q);\n" + " return json_q;\n" + "};\n" + "// add hidden hover element to body if necessary\n" + "setInterval(function () {\n" + " if (window.rkt_evt_frame_el === null || window.rkt_evt_frame_el === undefined) {\n" + " window.rkt_evt_frame_el = document.createElement('iframe');\n" + " window.rkt_evt_frame_el.style.display = 'none';\n" + " window.rkt_evt_frame_el.setAttribute('id', 'rkt-evt-frame');\n" + " window.rkt_evt_frame_el.setAttribute('name', 'rkt-evt-frame');\n" + " document.body.append(window.rkt_evt_frame_el);\n" + " window.rkt_evt_frame_win = window.rkt_evt_frame_el.contentWindow;\n" + " } else {" + " if (window.rkt_event_queue.length > 0) {\n" + " window.rkt_evt_frame_win.print();\n" + " }\n" + " }\n" + "},\n" + "10);\n" + ""; + + QList scripts; + QWebEngineProfile *p = b.createProfile(name); + QWebEngineScriptCollection *col = p->scripts(); + QWebEngineScript s1; + s1.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady); + s1.setName("eventing"); + s1.setSourceCode(code); + s1.setWorldId(QWebEngineScript::MainWorld); + scripts.append(s1); + + QWebEngineScript s2; + s2.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady); + s2.setName("boilerplate"); + s2.setSourceCode(boilerplate_js); + s2.setWorldId(QWebEngineScript::MainWorld); + scripts.append(s2); + + col->insert(scripts); + + QWebEngineScriptCollection *c = p->scripts(); + QList l = c->toList(); + + _contexts[_context_counter] = p; + + cmd->result = _context_counter; + cmd->done = true; + } + break; case COMMAND_CREATE: { rkt_wv_context_t context = cmd->args[0].toInt(); rktwebview_t parent = cmd->args[1].toInt(); @@ -151,6 +237,7 @@ void Rktwebview_qt::processCommand(Command *cmd) QString js = cmd->args[1].toString(); if (_views.contains(wv)) { WebviewWindow *w = _views[wv]; + fprintf(stderr, "Running %s\n", js.toUtf8().constData()); w->runJs(js); cmd->result = true; } else { @@ -367,78 +454,20 @@ int Rktwebview_qt::nextHandle() return h; } -rkt_wv_context_t Rktwebview_qt::newContext(const char *boilerplate_js, const char *optional_server_cert_pem) +rkt_wv_context_t Rktwebview_qt::newContext(const QString &boilerplate_js, bool has_pem, const QString &optional_server_cert_pem) { - QWebEngineProfileBuilder b; - if (optional_server_cert_pem != nullptr) { - QByteArray scp = QByteArray(optional_server_cert_pem); - QList certs; - QSslCertificate cert(scp); - certs.append(cert); - b.setAdditionalTrustedCertificates(certs); - } - _context_counter += 1; - QString name = QString::asprintf("profile-%d", _context_counter); + Command c(COMMAND_NEW_CONTEXT); - QString code = "if (window.rkt_event_queue === undefined) { window.rkt_event_queue = []; }\n" - "window.rkt_evt_frame_el = null;\n" - "window.rkt_evt_frame_win = null;\n" - "window.rkt_send_event = function(obj) {\n" - " //console.log('Sending event: ' + obj);\n" - " window.rkt_event_queue.push(obj);\n" - " if (window.rkt_evt_frame_el) {\n" - " window.rkt_evt_frame_win.print();\n" - " }\n" - "};\n" - "window.rkt_get_events = function() {\n" - " let q = window.rkt_event_queue;\n" - " window.rkt_event_queue = [];\n" - " let json_q = JSON.stringify(q);\n" - " return json_q;\n" - "};\n" - "// add hidden hover element to body if necessary\n" - "setInterval(function () {\n" - " if (window.rkt_evt_frame_el === null || window.rkt_evt_frame_el === undefined) {\n" - " window.rkt_evt_frame_el = document.createElement('iframe');\n" - " window.rkt_evt_frame_el.style.display = 'none';\n" - " window.rkt_evt_frame_el.setAttribute('id', 'rkt-evt-frame');\n" - " window.rkt_evt_frame_el.setAttribute('name', 'rkt-evt-frame');\n" - " document.body.append(window.rkt_evt_frame_el);\n" - " window.rkt_evt_frame_win = window.rkt_evt_frame_el.contentWindow;\n" - " } else {" - " if (window.rkt_event_queue.length > 0) {\n" - " window.rkt_evt_frame_win.print();\n" - " }\n" - " }\n" - "},\n" - "10);\n" - ""; + c.args.push_back(boilerplate_js); + c.args.push_back(has_pem); + c.args.push_back(optional_server_cert_pem); - QList scripts; - QWebEngineProfile *p = b.createProfile(name); - QWebEngineScriptCollection *col = p->scripts(); - QWebEngineScript s1; - s1.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady); - s1.setName("eventing"); - s1.setSourceCode(code); - s1.setWorldId(QWebEngineScript::MainWorld); - scripts.append(s1); + postCommand(&c); - QWebEngineScript s2; - s2.setInjectionPoint(QWebEngineScript::InjectionPoint::DocumentReady); - s2.setName("boilerplate"); - s2.setSourceCode(boilerplate_js); - s2.setWorldId(QWebEngineScript::MainWorld); - scripts.append(s2); + while(!c.done) { doEvents(); } - col->insert(scripts); - - QWebEngineScriptCollection *c = p->scripts(); - QList l = c->toList(); - - _contexts[_context_counter] = p; - - return _context_counter; + int id = c.result.toInt(); + return id; } int Rktwebview_qt::rktWebViewCreate(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_evt_cb) @@ -512,6 +541,8 @@ result_t Rktwebview_qt::rktSetHtml(rktwebview_t wv, const char *html) rkt_data_t *Rktwebview_qt::rktCallJs(rktwebview_t wv, const char *js) { + fprintf(stderr, "calljs: %s\n", js); + Command c(COMMAND_CALL_JS); QString _js(js); c.args.push_back(wv); @@ -523,16 +554,17 @@ rkt_data_t *Rktwebview_qt::rktCallJs(rktwebview_t wv, const char *js) r->kind = js_result; r->data.js_result.result = c.js_result_ok ? result_t::oke : result_t::eval_js_failed; r->data.js_result.value = copyString(c.result.toString().toUtf8()); + fprintf(stderr, "js-result: %s\n", r->data.js_result.value); return r; } -result_t Rktwebview_qt::rktRunJs(rktwebview_t wv, const char *js) +result_t Rktwebview_qt::rktRunJs(rktwebview_t wv, const QString &js) { + fprintf(stderr, "rktRunJs: %s\n", js.toUtf8().constData()); Command c(COMMAND_RUN_JS); - QString _js(js); c.args.push_back(wv); - c.args.push_back(_js); + c.args.push_back(js); postCommand(&c); while(!c.done) { doEvents(); } bool r = c.result.toBool(); @@ -604,6 +636,12 @@ window_state_t Rktwebview_qt::rktWindowState(rktwebview_t w) return ws; } +void Rktwebview_qt::rktQuit() +{ + Command c(COMMAND_QUIT); + postCommand(&c); +} + result_t Rktwebview_qt::fileDlg(rktwebview_t w, const char *title, const char *base, const char *filters,QFileDialog::FileMode mode, QFileDialog::AcceptMode am, QString evt_ok, QString evt_cancel) { if (_views.contains(w)) { @@ -836,6 +874,7 @@ void Rktwebview_qt::deleteApp() void Rktwebview_qt::initApp() { _app = new QApplication(_argc, _argv); + _app->setQuitOnLastWindowClosed(false); // See Qt 6.10 remark at doEvents. //connect(&_evt_loop_timer, &QTimer::timeout, this, &Rktwebview_qt::stopEventloop); @@ -843,17 +882,17 @@ void Rktwebview_qt::initApp() // Because we are using processEvents only (Qt 6.10), we need this dispatcher to // handle deferred Deletes. - const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); + /*const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, QThread::currentThread(), []{ if (QThread::currentThread()->loopLevel() == 0) QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); } ); - - + */ } + void Rktwebview_qt::runJs(rktwebview_t wv, const char *js) { if (_views.contains(wv)) { @@ -888,7 +927,7 @@ void Rktwebview_qt::doEvents() //QTime ct = QTime::currentTime(); //QTime expire = QTime::currentTime().addMSecs(2); //while(QTime::currentTime() <= expire) { - _app->processEvents(); + //_app->processEvents(); //} // Qt 6.10 --> this leads to a core dump @@ -901,6 +940,7 @@ void Rktwebview_qt::doEvents() //_evt_loop.exec(); _app->exec(); }*/ + QThread::usleep(500); } void Rktwebview_qt::stopEventloop() @@ -912,15 +952,15 @@ void Rktwebview_qt::stopEventloop() -Rktwebview_qt::Rktwebview_qt() : QObject() +Rktwebview_qt::Rktwebview_qt(int argc, char *argv[]) : QObject() { - _argc = 1; - _argv[0] = const_cast("Rktwebview_qt"); - _context_counter = 0; _current_handle = 0; _evt_loop_depth = 0; + _argc = argc; + _argv = argv; + _app = nullptr; } diff --git a/rktwebview_qt/rktwebview_qt.h b/rktwebview_qt/rktwebview_qt.h index 2901364..67ec898 100644 --- a/rktwebview_qt/rktwebview_qt.h +++ b/rktwebview_qt/rktwebview_qt.h @@ -1,9 +1,8 @@ #ifndef RKTWEBVIEW_QT_H #define RKTWEBVIEW_QT_H -#include "rktwebview_qt_global.h" -#include "rktwebview_internal.h" #include "rktutils.h" +#include "rktwebview_types.h" #include #include @@ -21,7 +20,7 @@ class WebviewWindow; class Command; class CommandEvent; -class RKTWEBVIEW_QT_EXPORT Rktwebview_qt : public QObject +class Rktwebview_qt : public QObject { Q_OBJECT private: @@ -39,7 +38,7 @@ private: QTimer _evt_loop_timer; int _argc; - char *_argv[1]; + char **_argv; private: void runJs(rktwebview_t wv, const char *js); @@ -71,7 +70,7 @@ public: int nextHandle(); public: - rkt_wv_context_t newContext(const char *boilerplate_js, const char *optional_server_cert_pem); + rkt_wv_context_t newContext(const QString &boilerplate_js, bool has_pem, const QString &optional_server_cert_pem); int rktWebViewCreate(rkt_wv_context_t context, rktwebview_t parent, event_cb_t js_evt_cb); void rktWebViewClose(int wv); void rktSetOUToken(rktwebview_t wv, const char *ou_token); @@ -79,7 +78,7 @@ public: result_t rktOpenDevtools(rktwebview_t wv); result_t rktSetUrl(rktwebview_t wv, const char *url); result_t rktSetHtml(rktwebview_t wv, const char *html); - result_t rktRunJs(rktwebview_t wv, const char *js); + result_t rktRunJs(rktwebview_t wv, const QString &js); rkt_data_t *rktCallJs(rktwebview_t wv, const char *js); result_t rktMove(rktwebview_t wv, int x, int y); @@ -92,6 +91,8 @@ public: result_t rktShowNormalWindow(rktwebview_t w); window_state_t rktWindowState(rktwebview_t w); + void rktQuit(); + result_t rktChooseDir(rktwebview_t w, const char *title, const char *base_dir); result_t rktFileOpen(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); result_t rktFileSave(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts); @@ -117,7 +118,7 @@ public: void runCommandThread(); public: - Rktwebview_qt(); + Rktwebview_qt(int argc, char *argv[]); ~Rktwebview_qt(); }; diff --git a/rktwebview_qt/rktwebview_qt_global.h b/rktwebview_qt/rktwebview_qt_global.h deleted file mode 100644 index 98ed696..0000000 --- a/rktwebview_qt/rktwebview_qt_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef RKTWEBVIEW_QT_GLOBAL_H -#define RKTWEBVIEW_QT_GLOBAL_H - -#include - -#if defined(RKTWEBVIEW_QT_LIBRARY) -#define RKTWEBVIEW_QT_EXPORT Q_DECL_EXPORT -#else -#define RKTWEBVIEW_QT_EXPORT Q_DECL_IMPORT -#endif - -#endif // RKTWEBVIEW_QT_GLOBAL_H diff --git a/rktwebview_qt/rktwebview_test.cpp b/rktwebview_qt/rktwebview_test.cpp new file mode 100644 index 0000000..eca74bb --- /dev/null +++ b/rktwebview_qt/rktwebview_test.cpp @@ -0,0 +1,32 @@ +#include "rktwebview.h" +#include +#include + +int main(int argc, char *argv[]) +{std::string me = argv[0]; + int idx = me.rfind("/"); + + std::string loc = me.substr(0, idx); + std::string prg = loc + "/rktwebview_prg"; + + setenv("RKT_WEBVIEW_PRG", prg.c_str(), true); + setenv("LD_LIBRARY_PATH", loc.c_str(), true); + + int context = rkt_webview_new_context("", nullptr); + + int wv = rkt_webview_create(context, 0); + + rkt_webview_move(wv, 100, 200); + rkt_webview_resize(wv, 800, 600); + rkt_webview_set_url(wv, "https://wikipedia.org"); + + while(rkt_webview_events_waiting() > 0) { + rkt_data_t *d = rkt_webview_get_event(); + rkt_webview_free_data(d); + } + sleep(10); + + rkt_webview_close(wv); + + rkt_webview_cleanup(); +} \ No newline at end of file diff --git a/rktwebview_qt/rktwebview_types.h b/rktwebview_qt/rktwebview_types.h new file mode 100644 index 0000000..51dcaea --- /dev/null +++ b/rktwebview_qt/rktwebview_types.h @@ -0,0 +1,84 @@ +#ifndef RKTWEBVIEW_TYPES_H +#define RKTWEBVIEW_TYPES_H + +extern "C" { + +typedef int rktwebview_t; +typedef int rkt_wv_context_t; + +typedef struct { + rktwebview_t wv; + char *event; +} rkt_event_t; + +typedef enum { + no_result_yet = -1, + oke = 0, + set_html_failed = 1, + set_navigate_failed = 2, + eval_js_failed = 3, + no_devtools_on_platform = 4, + no_delegate_for_context = 5, + webview_missing_dependency = 6, + webview_canceled = 7, + webview_invalid_state = 8, + webview_invalid_argument = 9, + webview_unspecified = 10, + webview_dispatch_failed = 11, + move_failed = 12, + resize_failed = 13, + choose_dir_failed = 14, + open_file_failed = 15, + save_file_failed = 16, + failed = 17 +} result_t; + +typedef struct { + result_t result; + char *value; +} rkt_js_result_t; + +typedef enum { + invalid = -1, + normal = 0, + minimized = 1, + maximized = 2, + hidden = 3, + normal_active = 16, + maximized_active = 18 +} window_state_t; + +typedef enum { + info = 1, + error = 2, + warning = 3, + yes_no = 4, + oke_cancel = 5 +} rkt_messagetype_t; + +typedef struct { + int api_major; + int api_minor; + int api_patch; +} rkt_version_t; + +typedef enum { + version = 1, + event = 2, + js_result = 3 +} rkt_data_kind_t; + +typedef struct { + rkt_data_kind_t kind; + union { + rkt_version_t version; + rkt_event_t event; + rkt_js_result_t js_result; + } data; +} rkt_data_t; + +typedef void (*event_cb_t)(rkt_data_t *); + +} + +#endif // RKTWEBVIEW_TYPES_H diff --git a/rktwebview_qt/shm.cpp b/rktwebview_qt/shm.cpp index 1360fcc..e2b4b59 100644 --- a/rktwebview_qt/shm.cpp +++ b/rktwebview_qt/shm.cpp @@ -10,13 +10,14 @@ #include #include #include +#include #include typedef struct __shm_item__ { - struct __shm_item__ *next; - struct __shm_item__ *prev; - size_t size; + ShmPlace next; + ShmPlace prev; + size_t size; } ShmItem; @@ -34,10 +35,9 @@ private: char *_sem_name; size_t *_used; - ShmItem **__first; - ShmItem **__free_list; - ShmPlace *_slots; + ShmPlace *_first; + ShmPlace *_free_list; int _in_critical; @@ -66,57 +66,82 @@ public: return _mem_name; } +public: + template void ref(int place, T** p) { + if (place == SHM_NULL) { + *p = nullptr; + } else { + *p = reinterpret_cast(reinterpret_cast(_mem) + place); + } + } + + inline void *ref(int place) + { + if (place == SHM_NULL) { + return nullptr; + } + + return reinterpret_cast(_mem) + place; + } + public: int alloc(size_t bytes) { enterCritical(); - ShmItem *_free_list = *__free_list; - ShmItem *_first = *__first; - - ShmItem *i = _free_list; + ShmPlace p_i = *_free_list; + ShmItem *i; + ref(p_i, &i); while (i != nullptr && i->size < bytes) { - i = i->next; + p_i = i->next; + ref(p_i, &i); } int place; if (i != nullptr) { - if (i->prev != nullptr) { - i->prev->next = i->next; + if (i->prev != SHM_NULL) { + ShmItem *prev_i; + ref(i->prev, &prev_i); + prev_i->next = i->next; } - if (i->next != nullptr) { - i->next->prev = i->prev; + if (i->next != SHM_NULL) { + ShmItem *next_i; + ref(i->next, &next_i); + next_i->prev = i->prev; } - if (i->prev == nullptr) { - _free_list = i->next; + if (i->prev == SHM_NULL) { + *_free_list = i->next; } - i->next = _first; - if (_first != nullptr) { - _first->prev = i; + i->next = *_first; + if (*_first != SHM_NULL) { + ShmItem *first_i; + ref(*_first, &first_i); + first_i->prev = p_i; } - i->prev = nullptr; + i->prev = SHM_NULL; - _first = i; - *__first = _first; - *__free_list = _free_list; - - place = (reinterpret_cast(i) + sizeof(ShmItem)) - reinterpret_cast(_mem); + *_first = p_i; + place = p_i + sizeof(ShmItem); } else { - i = reinterpret_cast(reinterpret_cast(_mem) + *_used); + ShmPlace p_i = *_used; + i = reinterpret_cast(reinterpret_cast(_mem) + p_i); size_t u = *_used + sizeof(ShmItem) + bytes; if (u >= _size) { - place = -1; + place = SHM_NULL; } else { *_used = u; - i->prev = nullptr; + i->prev = SHM_NULL; i->size = bytes; - i->next = _first; + i->next = *_first; + if (*_first != SHM_NULL) { + ShmItem *first_i; + ref(*_first, &first_i); + first_i->prev = p_i; + } - _first = i; - *__first = _first; - - place = (reinterpret_cast(i) + sizeof(ShmItem)) - reinterpret_cast(_mem); + *_first = p_i; + place = p_i + sizeof(ShmItem); } } @@ -124,39 +149,42 @@ public: return place; } - void free(int place) { + void free(ShmPlace place) { + if (place == SHM_NULL) { + return; + } + enterCritical(); - ShmItem *i = reinterpret_cast(reinterpret_cast(_mem) + place - sizeof(ShmItem)); - ShmItem *_free_list = *__free_list; - ShmItem *_first = *__first; + ShmPlace p_i = place - sizeof(ShmItem); + ShmItem *i; + ref(p_i, &i); - if (i->prev != nullptr) { - i->prev->next = i->next; + if (i->prev != SHM_NULL) { + ShmItem *prev_i; + ref(i->prev, &prev_i); + prev_i->next = i->next; } - if (i->next != nullptr) { - i->next->prev = i->prev; + if (i->next != SHM_NULL) { + ShmItem *next_i; + ref(i->next, &next_i); + next_i->prev = i->prev; } - if (i->prev == nullptr) { - _first = i->next; + if (i->prev == SHM_NULL) { + *_first = i->next; } - i->next = _free_list; - if (_free_list != nullptr) { - _free_list->prev = i; + i->next = *_free_list; + if (*_free_list != SHM_NULL) { + ShmItem *fl; + ref(*_free_list, &fl); + fl->prev = p_i; } - i->prev = nullptr; - _free_list = i; + i->prev = SHM_NULL; + *_free_list = p_i; - *__first = _first; - *__free_list = _free_list; leaveCritical(); } - inline void *ref(int place) - { - return reinterpret_cast(_mem) + place; - } - void enterCritical() { if (_in_critical > 0) { _in_critical++; @@ -188,25 +216,28 @@ public: size_t slots_size = sizeof(ShmPlace) * SHM_MAX_SLOTS; size += slots_size; - _sem = sem_open(_sem_name, O_CREAT); - _shm_fd = shm_open(name, O_CREAT | O_RDWR, 0600); - ftruncate(_shm_fd, size); + if (owner) { + _sem = sem_open(_sem_name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR, 0); + _shm_fd = shm_open(name, O_CREAT | O_RDWR, 0600); + ftruncate(_shm_fd, size); + } else { + _sem = sem_open(_sem_name, O_RDWR, S_IRUSR | S_IWUSR, 0); + _shm_fd = shm_open(name, O_RDWR, 0600); + } _size = size; _mem = mmap(nullptr, _size, PROT_READ|PROT_WRITE, MAP_SHARED, _shm_fd, 0); - _slots = reinterpret_cast (reinterpret_cast(_mem) + sizeof(size_t) + sizeof(ShmItem *) + sizeof(ShmItem *)); - + _slots = reinterpret_cast (reinterpret_cast(_mem) + sizeof(size_t) + sizeof(ShmPlace) + sizeof(ShmPlace)); _used = reinterpret_cast(_mem); - __first = reinterpret_cast(reinterpret_cast(_mem) + sizeof(size_t)); - - __free_list = reinterpret_cast(reinterpret_cast(_mem) + sizeof(size_t) + sizeof(ShmItem *)); + _first = reinterpret_cast(reinterpret_cast(_mem) + sizeof(size_t)); + _free_list = reinterpret_cast(reinterpret_cast(_mem) + sizeof(size_t) + sizeof(ShmPlace)); _owner = owner; if (_owner) { - *__first = nullptr; - *__free_list = nullptr; + *_first = SHM_NULL; + *_free_list = SHM_NULL; *_used = sizeof(size_t) + sizeof(ShmItem *) + sizeof(ShmItem *) + slots_size; sem_post(_sem); } @@ -320,26 +351,38 @@ Shm::~Shm() delete _shm_api; } -template void ref(Shm *shm, int place, T **p) -{ - *p = reinterpret_cast(shm->ref(place)); -} + void ShmSem::post() { sem_post(reinterpret_cast(_sem)); } void ShmSem::wait() { - sem_wait(reinterpret_cast(_sem)); + int r = sem_wait(reinterpret_cast(_sem)); + if (r != 0) { + fprintf(stderr, "sem_wait error: %d, %s\n", errno, strerror(errno)); + } } bool ShmSem::trywait() { - return sem_trywait(reinterpret_cast(_sem)) == 0; + int r = sem_trywait(reinterpret_cast(_sem)); + if (r != 0 && r != EAGAIN) { + fprintf(stderr, "sem_wait error: %d, %s\n", errno, strerror(errno)); + } + + return (r == 0); } ShmSem::ShmSem(const char *n, bool owner) { _name = strdup(n); - _sem = reinterpret_cast(sem_open(n, O_CREAT)); + + sem_t *s; + if (owner) { + s = sem_open(n, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR, 0); + } else { + s = sem_open(n, O_RDWR, S_IRUSR | S_IWUSR, 0); + } + _sem = reinterpret_cast(s); _owner = owner; } diff --git a/rktwebview_qt/shm.h b/rktwebview_qt/shm.h index 05793f9..1b567df 100644 --- a/rktwebview_qt/shm.h +++ b/rktwebview_qt/shm.h @@ -55,6 +55,9 @@ public: ~Shm(); }; -template void ref(Shm *shm, int place, T **p); +template inline void ref(Shm *shm, int place, T **p) +{ + *p = reinterpret_cast(shm->ref(place)); +} #endif // SHM_H diff --git a/rktwebview_qt/shmqueue.cpp b/rktwebview_qt/shmqueue.cpp index ece7412..e0e255c 100644 --- a/rktwebview_qt/shmqueue.cpp +++ b/rktwebview_qt/shmqueue.cpp @@ -1,4 +1,5 @@ #include "shmqueue.h" +#include ShmQueue::ShmQueue(Shm *shm, ShmSlot slot, bool owner) { @@ -43,15 +44,15 @@ int ShmQueue::depth() return d; } -void ShmQueue::enqueue(int cmd, const QString &json_data) +void ShmQueue::enqueue(int cmd, const std::string &json_data) { - QByteArray b(json_data.toUtf8()); + size_t jd_size = json_data.size(); + int str_place = _shm->alloc(jd_size + 1); - int str_place = _shm->alloc(b.size() + 1); char *s; ref(_shm, str_place, &s); - memcpy(s, b.constData(), b.size()); - s[b.size()] = '\0'; + memcpy(s, json_data.data(), jd_size); + s[jd_size] = '\0'; int item_place = _shm->alloc(sizeof(ShmQueueItem)); ShmQueueItem *item; @@ -60,6 +61,11 @@ void ShmQueue::enqueue(int cmd, const QString &json_data) item->data_place = str_place; item->prev = _queue->last; item->next = SHM_NULL; + if (_queue->last != SHM_NULL) { + ShmQueueItem *last_i; + ref(_shm, _queue->last, &last_i); + last_i->next = item_place; + } _shm->lock(); _queue->last = item_place; @@ -71,7 +77,13 @@ void ShmQueue::enqueue(int cmd, const QString &json_data) _queue_sem->post(); } -bool ShmQueue::dequeue(int &cmd, QString &json_data, bool wait) +void ShmQueue::enqueue(int cmd) +{ + std::string s; + enqueue(cmd, s); +} + +bool ShmQueue::dequeue(int &cmd, std::string &json_data, bool wait) { if (wait) { _queue_sem->wait(); @@ -96,7 +108,7 @@ bool ShmQueue::dequeue(int &cmd, QString &json_data, bool wait) ShmPlace data_place = item->data_place; char *data; ref(_shm, data_place, &data); - json_data = QString::fromUtf8(data, strlen(data)); + json_data = data; _shm->free(data_place); cmd = item->cmd; diff --git a/rktwebview_qt/shmqueue.h b/rktwebview_qt/shmqueue.h index 21f59f1..61176fe 100644 --- a/rktwebview_qt/shmqueue.h +++ b/rktwebview_qt/shmqueue.h @@ -2,10 +2,7 @@ #define SHMQUEUE_H #include "shm.h" -#include - -#define COMMAND_SLOT 1 -#define EVENT_SLOT 2 +#include typedef struct __ShmQueueItem__ { @@ -40,8 +37,9 @@ public: int depth(); public: - bool dequeue(int &cmd, QString &json_data, bool wait = false); - void enqueue(int cmd, const QString &json_data); + bool dequeue(int &cmd, std::string &json_data, bool wait = false); + void enqueue(int cmd, const std::string &json_data); + void enqueue(int cmd); public: ShmQueue(Shm *shm, ShmSlot slot, bool owner);