From c25d6483210d681185ba668499ef4a8d8a9f7522 Mon Sep 17 00:00:00 2001 From: cailue Date: Thu, 24 Aug 2023 22:34:12 +0800 Subject: [PATCH] refactor: adjust windows file layout Signed-off-by: cailue --- libs/clipboard/Cargo.toml | 2 +- libs/clipboard/docs/assets/scene3.png | Bin 5480 -> 5475 bytes libs/clipboard/docs/assets/win_A_B.png | Bin 43658 -> 43619 bytes libs/clipboard/docs/assets/win_B_A.png | Bin 43515 -> 43447 bytes libs/clipboard/src/cliprdr.rs | 573 ----------- libs/clipboard/src/context_send.rs | 45 +- libs/clipboard/src/lib.rs | 594 +---------- libs/clipboard/src/platform/mod.rs | 10 + libs/clipboard/src/platform/windows.rs | 1214 +++++++++++++++++++++++ libs/clipboard/src/windows/wf_cliprdr.c | 25 +- src/client/io_loop.rs | 16 +- src/ui_cm_interface.rs | 14 +- 12 files changed, 1309 insertions(+), 1184 deletions(-) delete mode 100644 libs/clipboard/src/cliprdr.rs create mode 100644 libs/clipboard/src/platform/mod.rs create mode 100644 libs/clipboard/src/platform/windows.rs diff --git a/libs/clipboard/Cargo.toml b/libs/clipboard/Cargo.toml index bc20ecfc5..27c5f7382 100644 --- a/libs/clipboard/Cargo.toml +++ b/libs/clipboard/Cargo.toml @@ -2,7 +2,7 @@ name = "clipboard" version = "0.1.0" edition = "2021" -build= "build.rs" +build = "build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/libs/clipboard/docs/assets/scene3.png b/libs/clipboard/docs/assets/scene3.png index a65a7ac063ca2f91d8f3c7ed263939b13c9cf486..748369878f56f3164a4dbc0953546482f5c58f11 100644 GIT binary patch literal 5475 zcmZ`-c|4T+_eWF+b%(gwDrqcbDC>AovLrNRh_VxMF|x&2%QluF8QDF$C8KODn5U%MWy zaM%c;zBaeod zn@`$%Ueorf`+yl;2h^sHHW20p=K4w*;T+t!;VP%s{bi8i^p(xYmec0oe${I^#i^(g zRkNtHH=5IScs^#MYTzXmbuJNHh76%}weQv5x2B8y*2Nxt9N+gfBJd_hfB)rmV^vh67h{Kca}vrKJmLkpoW1!ptHYD}ye}qRWgF4X24%jx4e(zC65-^78TM zvnKqLt~l9cZXz|6-f+?w=;#+wuT-zPJsQ4o$bWrtxb4UsjeKA3+%K&Otv$_p_cvzl z9RY8++iVV^mhW8X?`Ngd2U>J8O{Z3}&vFW#6Fpm&MCMB)x3;z#XDK^5 zIaLnhem(VCB~`znX4;sl-u6CgxuMQ@PRt7LfHPysZ%QUjRhi;!>*w?OYl8_te(OcR z*4m(FUx{^AYHEIsJptW8+sJt;u)0WHNnJ=waPq_9PT6TR(`J*=E^cnVuC?1|7>gg} z)mv$VCekp@{9|=J*3B)eXQTm;)ide?xl9PmWZ>m}cgy@huodB-a2C>m|M3nJvA|AV z!s2lZ5f)(p;JLcsyq}QP*~wY*!2|$?gSO(oHcsqr@STAgTd_AtN^Mf?%Tlk^E+il! z)2q`Ljoc1QJ$Npt(|i-GKLt&+z^Zm^z*zd1iQ|}wSOwUHbn}8FTmtV@S1Q`}ruT$& zBfQ}X7Bv3j8kDC2oB5BUP@d-hc#0CmWJK$q*L0T?-ZfKO{kh1R>eS4>d{Bh#FT>t2S-9ef_*b>X}l#@E9~b$Q=xfj)iCa=^+x7)w@qMRmCz$$72N!A zwRw+)xAz%bwPOn}q2c__X$4xoPdyzU6SFZ&5a$&|n_{tuy?~jiDN$7Y&X29t_J{4lag32g>KD|qobpP))&t|mV?+Krm$sgpb}14P>_In zv$3{&PE}#EG;-(43=M%mSl+l%wq%Mo`z_8UXWBh==yZ23_UXz~6YKm5`MnurEcr5P z;xjC{mridpfA#9s?ZjV-O2B!FD=j~x!+G-3)vI0e{jZO4?{zx5S6m?v9riQ$Cv-9`orf@Yh!SC>SIpfa-l6Xl>6|hH$j`(-=fjie`X(#y(2y6&pCZ3 z!t}P$CCgKlnR(CWk{kGqKzTY@}US%^v zIY+r9v&{+XWdFrR(gRPya*U zp?20Ts;M&r_&`@%Miop*uSv{qV?uBZCNxiqp#1 zXUMr@wcXr;a=w{l3DkWJw}8+uo1=+>m{|-%imD5u1>ur0W6L8XZ%2P_W>Ng99pMgb z0Achz8F?kNu$L|)T_3EHg(3;My%h4cl-U%kg{UAsYJK0@!XP2*3(nzgijud|sBMDq zo!~)M&->TR&Eq|ZfW6!GvN&clLGGM{9#M$mz5TqfkpAM;kD1F^Eo+}wOmAmR$_C|% zs^<6~R(2he-kSc3~R_ z%a?h@-lzv}$m3r5OkZ|C^mg!0K*3X4fc50ipJipHc*8@3?QHW$k(gmqMra7KDEAHE zHK~5R(kigLt-oy5wTSK*kJ`RaS@IC+UPkk??eFh*_^b=wjAoW-^%{9S?we!1SA#s) zaaQ5;a)L`pimZiS6Ev4}>;kjV%E#xdo<>wu)L?~2gwh$z&pndF9v$inPPgxC3y|6u z(z=G&2&E% z(x{C>2D~h(&CAP6BHB!v~gnc_a6;iE-|g z%GAT8zZ$JX5WU!zA`wQ6i5>K{L%@`OJ0s>3tm-F=V?>yFg_FZo5wW(j>YEo;ZrYXT zgClMeoQyFwpDDW!k7JSB%jrU6Cm}s*{Teeion~J{(*>D(#Fncw&bm0bZo@QG-3(`Y zce#pV^MQVeRX{r4I9)(Sg;nwm+ss~Gkr;7$DB#L1>i`WL-k}KT;D8-^j0&BI-Qh*g zs`tkSW+Ou6cbQXSr+WR(oLmxra|-<04y*pXw=4h6urO?D)U}K|POCTvLZgrVXCx|0ZVsy*uRfkM>>8=8E`>%>HdS>il0k zzRM%KuKz`O_Vrj_-<7(M?=ZC5u)7qS47Xl)*X-i&SPUc7_GC% zuD#e>RipUi`4gB+L?EOlMEG@km6^02k998$bFa3`m?mDbWs>xH(uIt#<`d5Sk$v3-V@ zFE^bRFYLvGCRnA^%)j0 z94dj$L@jcwd%%+Ktt1)&kR-! zk|#Xe)Ln0F9>m9W46Ir@8_Dy%JLY>9&SkF^eoOkz@R z>hDMDpUWyLHS@{chq{P&T8_tH8DK3idc5?Q|h8EqdO>Q=RovG}IlC_jM zVwfXVlsTRa2McNpBqD1p1zmo-edfGv1Z&S)d-HKZb+@Euh3e#<&|RQdyujBB-?8}B zTP;JYGqTyAj7%tNPrk(suQc zg;bkI4~dK;0&NF!w8BEajnt~XYk{Xd3XU|bz$z7}%()|zNIWo! zmb%(N>bjM!?2$RRaINGn`QDy=V}*qK8)ic;$PfN+jB;z3$L+7RP3ip0**p(~r zI1N>;P0XA7}E)nZI~b9A%PDAa-Xot@@#nn7!)WMpPf1EcKY(mTB&%BJScA9R`Q zn&3^7`A_vx+}vDT+Hg8V&I}gEsjK2gm~66F+E;7x*+@@#*JnoBL?tlkF~-@dhaTNJ zQj^{>-3Nq>Qj6d^q?~{l{PfnQ99P1(;Bza3q&I z5bHyuHT09=6Mj;4Og`v@K1^X;jGaDkht#y?;2hu0{h6*O`kxtwU=MsHg0E*&zB3}G z6*9;22%g`6Z{ktn5pNl64T`q|sZ$Q?B0)eaD-5@O<|&LCui35R3NrV`C10 zOT@y=4!G|EIRGANj70=|1Ka}wnO|7J84kTG26f^7D_9eg7kn(hvo4SM&o5OxM^YBv zj#$^2Aq{&3z}qT-+>?2=yWnTerY?9IWW}3+Y%_zDZ|Mq-%zb(XBR?`t{VvF$muI(2 z`%Qj0N_)hv+^p?Mmr%Mn3Zw(}hKIyrzAv?izkdB%T@y`CMt+T+9=8eV*6jmp@LW&C zh{a4l?nXq(I97+6D57@!{>+QCkhS^#^78VDnPE6h@_I^bwYHO}KGTUU<6UpDYu}P@ z?K4tMBl4Y3PN_8UR=$V{OKm4fmhPeQi-0e#2fqvF5PEKRCW_M<84#|@l>Bs#6VTPu z8_jNrJ5z3T9S@Fzdy+r_e7L&$cKzZX!&&v>^-aqzn(Bad@s%luwxsZT z$tMQ#%9^@sy;N;}B)6P$^4!mh5dw)vl(-6k&+3W$sBrul^;kc@RmOr}_8^G%lR0*5 z6i$6jQ54*#b%Gk{sBv~w6Yo2T0`@Fr&ynC?KSQo2!jaCW*}$l!ij5$B7`GWb0)U2% z1U|GLHsyNFC>vj<%u8!K`bJv4fN$a@0G~ptxj_XEmPzBbh>cFEqlGI1n$h;7(> zcRdKcW64zU1kbqEZ}Xzcp~&A5h^5cNHES=75<8n5r5Xr)j0%seBjD`pEYla<$bT^s zX+HzcE=?3&xD{Hq460|?#m|U=s0Q)zk2OAN{uf`R$e<*#nWlJSF%=F18CpZvU5}=F zZBjYJmx@ZaCc(_i%(Ar!ytw8e%;!Up-H=hDiAt^Ac_*Tnh+Su)EbR>dv7e>)qL|6fl!9SNp1lUMJyy11_2wV(gbn{4hlh%LI~sm@IT#gRypHEm?LZe zRWn>`cVH^ra%sK#S8O2rimg#u(de|8z)I9N0p)uu>>A=QxpG$?d}k~Pft)}t+DX?* zr-)U=KBqvEB1wt8-dg~81lS9@frH|p#NNGNcp#jF*t3d-#liyM&EG#it0N(!aF}hF zwkkhS0B5fexa>2h$F^-Nw_FglZXQW5ziynttr2Ou$M7uIrS89H`5(Pk*~d@Euu3oN zAN4KgZ=-SbV^c?;H4mvwGo9}2nZ@V486K0pi+HPyZJHV41~%32y~yUzv$Kd__fA18 zyBb7hB$GlDV1%9fHLgn!qOQCAO;|D;7%GWgZ4RqEu6A6pOn%?q?$EbhC)2m8yOStN zQ{NCf;cbc@0R^->;?;dTtj@Q`GV`4S1(>bwarro)wVmVh;T~9#@{!pRw-tmmjjaE% zmq7d_CLzq3Z1F4C%Q`Ob`D@}YG}5Hx=@|M3scMdQD;vC;ii)qLT$sfNxQw}T}2`O<-L=LlsG z6qPvd!4}u}i#IM0J`*w=0aUr4fXhz~cTqI#{#y&Gi$NLlRolZ3dp-2VxOL@?sQRDk zHF4F`1`vYSj;hncp$83LZm_doyqzr9+}cftyhKh)xcDX(rX5-D{rmWXq>t7`r-#Mz zS#RhCfVoO7;cXRcwLR-{9E_lXg%G%S3FNV``*9%Npb;Sa)OCnx47v@1^BO&f)%bTr z=#s1cdunco3MjLXjGt^7w*ah*{hA=CEpEx`llR}crT2BvB%HwQa(RHb2@Z59oVqWu z37!@J2Tuf#B9N?q?AyoVp&kAP}4t3j-Ync^lm0d?58c z_Ph&j2*q{DfMe&PcMc^M7BI#rtiy=ot1DJB7*Tw;ih$ZB4W!(^*VbFD2u-C$wA>3g z)9%L;e@>-!b+T;tO6u-WlHD8s^_hh1fulw8>aK@c@sM;q({k(I4Fi5&_$&A@mSd?| z&jEe6e`E>g0B~JrbWBXvBB{qwxgXSG8vKs-P|d%`il07tqOle<_VO=Lb8~YvYO2=5 z9`rzTJNdbV)9XJI7cN`~ME`Y}iIJWj?zIWIHUh>5)Ln-k?^RRwdQ(Nc znm?MMhziL*N~54=j$)HLZ29YQTU*)_5W}I?vPo(L2coz*w@^R2w^J$z6Iz7G4sxNJIC>IqH z^77@&FSbKgEBzT)yXk=Io_C>rR-z37gM*I=I~Jfh25o5~8YKGGE)>~VH2(OrU!84w zN;Onhl&K(pebaJt`ZfDDJsVqt)3gkxiMCT9O&jY)dRqX~?5%bqL~655_a@4=G^*^U zL-)I*kj3_BGW>hzkKJnLHUeWwX6*%g>I`EQN&d~&8BCLqoeNUxz)gFlr0ejc``rdo zsYiWZoSH=vWISYi z5AF%A=;w-K>A9Z1T*NtVC1hqQyzIRCF+eH0(&P7&BKZ6&h^Of)=S;7#peug7VZo|~ z+FnZEhgt4DhsYR8bzo8q4;|03SY%u^Q|-cO$C@BG(&%a}bt{?YOcndx;aXVO_2>t8 z3?P9#Se0_<*ckawFT;|}uKs?Csg!0iz%E!IK+w3d^-D^h<8Lyegk66=hJ}Uk3JB;v zu#*O;z#-qEitQbTGS-Uay0~1rl7YFH&DPjlpMAXGv)Y~UQVRo)co;!1veHrn2YsWp zqV?fH^sAzs!H=3F%d6jyIGr!e;C+0)du&#p;);f4ars6Z;I@bIed&^BCC^D}8H|uY z+OJV3>Z7_Bc;ZJwXzRNav0oVoA?d25m`DDJ{2q|nMRe`BL#3S0-t%j{Jjk#?&Zl(8 zBPri^%gBUctgNgw6sVCcqh*%-L6_NOXjaEd7vCX+nM};GLlXsytCA;s%$Uv61vFbb z@sdXfX2drhZMdLuL$5%yB;zTRBKSU`I2L9S*6P1i@U(bAkg=|PW2QcGWsCspGRKy4Q{1|CzA^?orb>WkOcaGGL-@5^d>rfpx zfNIZo(Ujei{MpklW?*I#DZ3mI5mB-h9uqVB6)9Rs3$MAGQ1aM~y@RI^G+CHi6Kqd^ zMCuNHDoCDQBKTc{uG!R5!pfB9n}GQJoRsSKUKQ}t>LE6Qm?z%kPVCdqCWZzEc~J#8 zsBGir4*P4LOgW#*r^Tj{&NJlt;ODiUnFlZ!+S#oE$d*~cP@fL(l1^lR0tU#C5ton{ zO$S4=_wHIBR*uE^*;c5nT{L^RH2&aMY-9Tq%SqabbofbDY_4uD;#u8m$K~Es13Bb^ zx>xCNY9!O$+8HraQhct=l{y)az}~|6gYk6zsiGJEVnHA>>gvpNQ8 zVUhBB+RE5hAIO|~YTukS{NA{&4OhiAbP5g7uCSOo3Y8~kjdB8S#O~mGtwf!m6ufCq z0N$UkW}%}}Sg#gnx1?~M?Jn2EcHTz98EsY$2XH{rPH~pz(4(Tu$`;;@U^SPX&)e-B zVh2HE3^#8fFEkX}3Q>q@xf&l9?Z4GO7oN9TGLsLkyAX5ev_4*H6MYr~cNvoceL=>$ zJ?aK0e6Tg%Mk0$}kB5Z&dZ4?Y(U;D?K95Cp*x5f6>c-rd%iBqyt^~WN<3AWc=C(mTmM_0#fu!kZJh1TGE1Mm^{(DtEioC`FP&11)>8_0wjMaH= zWXO6lGBD@|=jNk^us6DuEEL##$jTG9gne|2>-l+rsB465X`DKg?JcwT8c0-WUPitW zqjW6^0|%wMEzQrnL`on?^SmE*p?DUOM_ z{AFqHojioa+Hn4dZH#xc(U*)@*^?6ovjjapKdNYf$i6aDKf@_!H}v(fZr#a8#_mSS z*i%WY#K&dNH|g^|oUM8qSUc?8-1D!LAV2bb(rxtj%P?k^boy#P_L=T!O9g{xv-Hu% zvN69xAx(ci8=#43&9RAMZ&;;5y3+Un@9aQ=rlqB2j8t8fvlYZ6p>IN zpx{|2Vop=lxj<%GpOxiTZ#ea2D(2bCH#-dpaAEN!5HGp0v9ZU;zE$RZaKD4iN3WNi z+`GQt?DFq8x0`45_Wv?FXxnxgrE{a6oBLnL6ZXIQA9LS6kMSTpoWXRYEo4qK)U5%o zQS@;J1c5NlHc!6CrnvU84nLdKME2bAU`=?tQWr;$>qtjThg$^5F_jPS1`MU6$*7+% z_C!Ej&#&3qKQOOZ{5C$08LC;vXxKj28eMiDT36weuMjOS$?g_5$t<$M`t2(_jYyfU zgu|o96W4nzCM#H-39Tj7k^JSM$p#SxteWUXpV3dlL4%)YPG+n>rDl&|F4U%>;C%4E zU52+o2BJN5h+O>UR^I0E%ESTDP`?(owjd-W!S|CzI8}=%y_pjByN^cc#G?i6m;nY( zpYn(Z?vCSZID19=G!g2`*zc6ZuY6PDVk1X}CS6$`NaUoVi(b3;xtxx9{o|+AMxO09 z?Oj*>7#Vep2eqL|-R|i-WyAbe4wmfyrB|Wxth49>kA?X{^2IXTv8p<*$^>Be|*$VzYy-!cys<7J|x2SxmhE7hd@;iFHx^eE7FA?z@?)ytyTdQ38R;l9l zN&Tsa44E5L6vAGcbIojW-e6LcchWvnTVYskm68nx-jr4ciMmGj6vv%kKhR0Pb`P6_ zFaE}WZ?y#%!r?cgrQ>ukUUSptmN@hF4=QetqtpTH*XsnX>tH@Ng`ci-35o&ffK}eN zS_3-@R+<(aS7Jll;=A;8bZ&8d;sE&g_)d=YW8S`Hq=`qP?P$R~KS#%GHP1KcCO@00 zW=))Fnv0MSC3`f(0|IV3Hn%O3357xlEWT5r25M?*z|7!NVWHlGCf!Iz!OgXKPWedW zXp!+)sYORf2zhh7tZ`5qdzs5(`$ZbI;r4~MaL350M?(54xCY+RA{%k+OPjwzjrL$V-GyF1v{XJGcD$b>CyvF`&5+6Je6LeaE=Lp>$sfd+fEl1F8Tdph*V_K<1sV&w`eN zL!rpQa$kCl+sbJW4D(#>BULTn1(tCaE;G*IKvkeMa}XKKOiWK%z`)Ksi_f0^)-@UA z`Ad;+F|Qbv)|Yey!d(de0aA7#cwc)poj7L$bY%vYlhI;0Gv zTg%oDjyKdYMBc?S7+l7GRM^BP%7((DStPG$GSGYGA~FVzjKeLNCbZ~yw3@iSg;Fcm zSc@^cK%M(B(!UbUl5z}3}k{2IW+3gqH97+AqHe(}Sg(1{zoUZkO) ze}Hl2x0#cQAIgX(gOK}kpuVm&fCCT~76vjNX-IsuBV$F^zSBA~zcy@{m6gT7z)-zI zVMDGgRlJvs%JoTwJ&*<7^O*|q%ep9XTd0~k{q^XzI+)}TxRkKh8|T9(MQ)sP-#?Uc zPAlG93m5kG(Xa|)_NPR~BI_K(CbuRN9{Tdt>?((a+h{E8B)Js0An_PK%a#~~~W%LAG03=B)& zzcCuvcP#jrqj>~VhUklJ`X_P*#`7NAt#s{M^!r<2=@u@2bFVChT|r(}7EF)iiKp34 zeBtx&nyvF3aH_JO45~zXkJMxy@^mp`i zw6fk6PykmiHh3BF2IfjQPK4dW8X-y3##f-}IzP43C8&$U-u zW`3v3VwQD1?@1n7MH+_NR#N9r2ForQiunTqpHDbzMY|;2964BIEa{Fc@nn_sXJTMD z3Civ5?Oo}w9<2l`Ldr{*h-FNN$9KOLFuG)!wnN!8gaXxcpc0PbCG+#&P-sdJ_fZI+ zwXx#a0_ET^xtpw2dYe10r6!h%k-Lg(buLXW?7a2KVSwjJd9XrttZLKz{IgiNXfCh*wkE@+sJPfTQ3i^@CNRGBhI-FQ{ZD$h?9-iXlM zbnjKi`m+;Sd%-kW)kIMd;_uMi-JP(NM%eMsbwC{0Pm0voW5UHAH1_)a=?R7-C1147 zPgrj;0|t^c)>tmw-*JVm@`e5uh6hUWatW6CZS) z@x%umc$-Mi1zuT!SBU51|MO)CyuK&Fqr>-_FaTaz-U0&PB%O5NH6ww%lkWd%A7`ZZ W@8tc(%LU$`Ley0eDxZ~}2mKdgBeJOg diff --git a/libs/clipboard/docs/assets/win_A_B.png b/libs/clipboard/docs/assets/win_A_B.png index b65e571e7573d89be9d828df762b0629d2025763..87fe702dd9b6b39c024eafcc21830aabc4496a39 100644 GIT binary patch delta 41334 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 D`^MM_ delta 41354 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 diff --git a/libs/clipboard/docs/assets/win_B_A.png b/libs/clipboard/docs/assets/win_B_A.png index 4484b21ac6c4c8daec7ed6ecfa8ce676a459586d..e4c9f3246018cb2d234cbb266c570fe54a1f6c5c 100644 GIT binary patch literal 43447 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 UINT, ->; -pub type pcCliprdrClientCapabilities = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - capabilities: *const CLIPRDR_CAPABILITIES, - ) -> UINT, ->; -pub type pcCliprdrMonitorReady = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - monitorReady: *const CLIPRDR_MONITOR_READY, - ) -> UINT, ->; -pub type pcCliprdrTempDirectory = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - tempDirectory: *const CLIPRDR_TEMP_DIRECTORY, - ) -> UINT, ->; -pub type pcNotifyClipboardMsg = - ::std::option::Option UINT>; -pub type pcCliprdrClientFormatList = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatList: *const CLIPRDR_FORMAT_LIST, - ) -> UINT, ->; -pub type pcCliprdrServerFormatList = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatList: *const CLIPRDR_FORMAT_LIST, - ) -> UINT, ->; -pub type pcCliprdrClientFormatListResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatListResponse: *const CLIPRDR_FORMAT_LIST_RESPONSE, - ) -> UINT, ->; -pub type pcCliprdrServerFormatListResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatListResponse: *const CLIPRDR_FORMAT_LIST_RESPONSE, - ) -> UINT, ->; -pub type pcCliprdrClientLockClipboardData = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - lockClipboardData: *const CLIPRDR_LOCK_CLIPBOARD_DATA, - ) -> UINT, ->; -pub type pcCliprdrServerLockClipboardData = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - lockClipboardData: *const CLIPRDR_LOCK_CLIPBOARD_DATA, - ) -> UINT, ->; -pub type pcCliprdrClientUnlockClipboardData = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - unlockClipboardData: *const CLIPRDR_UNLOCK_CLIPBOARD_DATA, - ) -> UINT, ->; -pub type pcCliprdrServerUnlockClipboardData = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - unlockClipboardData: *const CLIPRDR_UNLOCK_CLIPBOARD_DATA, - ) -> UINT, ->; -pub type pcCliprdrClientFormatDataRequest = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatDataRequest: *const CLIPRDR_FORMAT_DATA_REQUEST, - ) -> UINT, ->; -pub type pcCliprdrServerFormatDataRequest = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatDataRequest: *const CLIPRDR_FORMAT_DATA_REQUEST, - ) -> UINT, ->; -pub type pcCliprdrClientFormatDataResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatDataResponse: *const CLIPRDR_FORMAT_DATA_RESPONSE, - ) -> UINT, ->; -pub type pcCliprdrServerFormatDataResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - formatDataResponse: *const CLIPRDR_FORMAT_DATA_RESPONSE, - ) -> UINT, ->; -pub type pcCliprdrClientFileContentsRequest = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - fileContentsRequest: *const CLIPRDR_FILE_CONTENTS_REQUEST, - ) -> UINT, ->; -pub type pcCliprdrServerFileContentsRequest = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - fileContentsRequest: *const CLIPRDR_FILE_CONTENTS_REQUEST, - ) -> UINT, ->; -pub type pcCliprdrClientFileContentsResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - fileContentsResponse: *const CLIPRDR_FILE_CONTENTS_RESPONSE, - ) -> UINT, ->; -pub type pcCliprdrServerFileContentsResponse = ::std::option::Option< - unsafe extern "C" fn( - context: *mut CliprdrClientContext, - fileContentsResponse: *const CLIPRDR_FILE_CONTENTS_RESPONSE, - ) -> UINT, ->; - -// TODO: hide more members of clipboard context -#[repr(C)] -#[derive(Debug, Clone)] -pub struct _cliprdr_client_context { - pub Custom: *mut ::std::os::raw::c_void, - pub EnableFiles: BOOL, - pub EnableOthers: BOOL, - pub IsStopped: BOOL, - pub ResponseWaitTimeoutSecs: UINT32, - pub ServerCapabilities: pcCliprdrServerCapabilities, - pub ClientCapabilities: pcCliprdrClientCapabilities, - pub MonitorReady: pcCliprdrMonitorReady, - pub TempDirectory: pcCliprdrTempDirectory, - pub NotifyClipboardMsg: pcNotifyClipboardMsg, - pub ClientFormatList: pcCliprdrClientFormatList, - pub ServerFormatList: pcCliprdrServerFormatList, - pub ClientFormatListResponse: pcCliprdrClientFormatListResponse, - pub ServerFormatListResponse: pcCliprdrServerFormatListResponse, - pub ClientLockClipboardData: pcCliprdrClientLockClipboardData, - pub ServerLockClipboardData: pcCliprdrServerLockClipboardData, - pub ClientUnlockClipboardData: pcCliprdrClientUnlockClipboardData, - pub ServerUnlockClipboardData: pcCliprdrServerUnlockClipboardData, - pub ClientFormatDataRequest: pcCliprdrClientFormatDataRequest, - pub ServerFormatDataRequest: pcCliprdrServerFormatDataRequest, - pub ClientFormatDataResponse: pcCliprdrClientFormatDataResponse, - pub ServerFormatDataResponse: pcCliprdrServerFormatDataResponse, - pub ClientFileContentsRequest: pcCliprdrClientFileContentsRequest, - pub ServerFileContentsRequest: pcCliprdrServerFileContentsRequest, - pub ClientFileContentsResponse: pcCliprdrClientFileContentsResponse, - pub ServerFileContentsResponse: pcCliprdrServerFileContentsResponse, - pub LastRequestedFormatId: UINT32, -} - -// #[link(name = "user32")] -// #[link(name = "ole32")] -extern "C" { - pub(crate) fn init_cliprdr(context: *mut CliprdrClientContext) -> BOOL; - pub(crate) fn uninit_cliprdr(context: *mut CliprdrClientContext) -> BOOL; - pub(crate) fn empty_cliprdr(context: *mut CliprdrClientContext, connID: UINT32) -> BOOL; -} - -#[derive(Error, Debug)] -pub enum CliprdrError { - #[error("invalid cliprdr name")] - CliprdrName, - #[error("failed to init cliprdr")] - CliprdrInit, - #[error("unknown cliprdr error")] - Unknown, -} - -impl CliprdrClientContext { - pub fn create( - enable_files: bool, - enable_others: bool, - response_wait_timeout_secs: u32, - notify_callback: pcNotifyClipboardMsg, - client_format_list: pcCliprdrClientFormatList, - client_format_list_response: pcCliprdrClientFormatListResponse, - client_format_data_request: pcCliprdrClientFormatDataRequest, - client_format_data_response: pcCliprdrClientFormatDataResponse, - client_file_contents_request: pcCliprdrClientFileContentsRequest, - client_file_contents_response: pcCliprdrClientFileContentsResponse, - ) -> Result, CliprdrError> { - let context = CliprdrClientContext { - Custom: 0 as *mut _, - EnableFiles: if enable_files { TRUE } else { FALSE }, - EnableOthers: if enable_others { TRUE } else { FALSE }, - IsStopped: FALSE, - ResponseWaitTimeoutSecs: response_wait_timeout_secs, - ServerCapabilities: None, - ClientCapabilities: None, - MonitorReady: None, - TempDirectory: None, - NotifyClipboardMsg: notify_callback, - ClientFormatList: client_format_list, - ServerFormatList: None, - ClientFormatListResponse: client_format_list_response, - ServerFormatListResponse: None, - ClientLockClipboardData: None, - ServerLockClipboardData: None, - ClientUnlockClipboardData: None, - ServerUnlockClipboardData: None, - ClientFormatDataRequest: client_format_data_request, - ServerFormatDataRequest: None, - ClientFormatDataResponse: client_format_data_response, - ServerFormatDataResponse: None, - ClientFileContentsRequest: client_file_contents_request, - ServerFileContentsRequest: None, - ClientFileContentsResponse: client_file_contents_response, - ServerFileContentsResponse: None, - LastRequestedFormatId: 0, - }; - let mut context = Box::new(context); - unsafe { - if FALSE == init_cliprdr(&mut (*context)) { - println!("Failed to init cliprdr"); - Err(CliprdrError::CliprdrInit) - } else { - Ok(context) - } - } - } -} - -impl Drop for CliprdrClientContext { - fn drop(&mut self) { - unsafe { - if FALSE == uninit_cliprdr(&mut *self) { - println!("Failed to uninit cliprdr"); - } else { - println!("Succeeded to uninit cliprdr"); - } - } - } -} diff --git a/libs/clipboard/src/context_send.rs b/libs/clipboard/src/context_send.rs index 76f8e4d7a..66c0d37fb 100644 --- a/libs/clipboard/src/context_send.rs +++ b/libs/clipboard/src/context_send.rs @@ -1,34 +1,32 @@ -use crate::cliprdr::*; -use hbb_common::log; +use hbb_common::{log, ResultType}; use std::sync::Mutex; +use crate::CliprdrServiceContext; + const CLIPBOARD_RESPONSE_WAIT_TIMEOUT_SECS: u32 = 30; lazy_static::lazy_static! { - static ref CONTEXT_SEND: ContextSend = ContextSend{addr: Mutex::new(0)}; + static ref CONTEXT_SEND: ContextSend = ContextSend{addr: Mutex::new(None)}; } pub struct ContextSend { - addr: Mutex, + addr: Mutex>>, } impl ContextSend { #[inline] pub fn is_enabled() -> bool { - *CONTEXT_SEND.addr.lock().unwrap() != 0 + CONTEXT_SEND.addr.lock().unwrap().is_some() } pub fn set_is_stopped() { - let _res = Self::proc(|c| { - c.IsStopped = TRUE; - 0 - }); + let _res = Self::proc(|c| c.set_is_stopped().map_err(|e| e.into())); } pub fn enable(enabled: bool) { let mut lock = CONTEXT_SEND.addr.lock().unwrap(); if enabled { - if *lock == 0 { + if lock.is_none() { match crate::create_cliprdr_context( true, false, @@ -36,7 +34,7 @@ impl ContextSend { ) { Ok(context) => { log::info!("clipboard context for file transfer created."); - *lock = Box::into_raw(context) as _; + *lock = Some(context) } Err(err) => { log::error!( @@ -47,27 +45,20 @@ impl ContextSend { } } } else { - if *lock != 0 { - unsafe { - let _ = Box::from_raw(*lock as *mut CliprdrClientContext); - } + if let Some(_clp) = lock.take() { + *lock = None; log::info!("clipboard context for file transfer destroyed."); - *lock = 0; } } } - pub fn proc) -> u32>(f: F) -> u32 { - let lock = CONTEXT_SEND.addr.lock().unwrap(); - if *lock != 0 { - unsafe { - let mut context = Box::from_raw(*lock as *mut CliprdrClientContext); - let code = f(&mut context); - std::mem::forget(context); - code - } - } else { - 0 + pub fn proc) -> ResultType<()>>( + f: F, + ) -> ResultType<()> { + let mut lock = CONTEXT_SEND.addr.lock().unwrap(); + match lock.as_mut() { + Some(context) => f(context), + None => Ok(()), } } } diff --git a/libs/clipboard/src/lib.rs b/libs/clipboard/src/lib.rs index 84179621d..5679393c5 100644 --- a/libs/clipboard/src/lib.rs +++ b/libs/clipboard/src/lib.rs @@ -1,4 +1,8 @@ -use cliprdr::*; +use std::{ + ffi::{CStr, CString}, + sync::{Arc, Mutex, RwLock}, +}; + use hbb_common::{ allow_err, lazy_static, log, tokio::sync::{ @@ -8,19 +12,47 @@ use hbb_common::{ ResultType, SessionID, }; use serde_derive::{Deserialize, Serialize}; -use std::{ - boxed::Box, - ffi::{CStr, CString}, - sync::{Arc, Mutex, RwLock}, -}; +use thiserror::Error; -pub mod cliprdr; pub mod context_send; +pub mod platform; pub use context_send::*; const ERR_CODE_SERVER_FUNCTION_NONE: u32 = 0x00000001; const ERR_CODE_INVALID_PARAMETER: u32 = 0x00000002; +pub(crate) use platform::create_cliprdr_context; + +/// Ability to handle Clipboard File from remote rustdesk client +/// +/// # Note +/// There actually should be 2 parts to implement a useable clipboard file service, +/// but this only contains the RPC server part. +/// The local listener and transport part is too platform specific to wrap up in typeclasses. +pub trait CliprdrServiceContext: Send + Sync { + /// set to be stopped + fn set_is_stopped(&mut self) -> Result<(), CliprdrError>; + /// clear the content on clipboard + fn empty_clipboard(&mut self, conn_id: i32) -> bool; + + /// run as a server for clipboard RPC + fn server_clip_file(&mut self, conn_id: i32, msg: ClipboardFile) -> Result<(), CliprdrError>; +} + +#[derive(Error, Debug)] +pub enum CliprdrError { + #[error("invalid cliprdr name")] + CliprdrName, + #[error("failed to init cliprdr")] + CliprdrInit, + #[error("cliprdr out of memory")] + CliprdrOutOfMemory, + #[error("cliprdr internal error")] + ClipboardInternalError, + #[error("unknown cliprdr error")] + Unknown(u32), +} + #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(tag = "t", content = "c")] pub enum ClipboardFile { @@ -164,554 +196,6 @@ fn send_data(conn_id: i32, data: ClipboardFile) { } } -pub fn empty_clipboard(context: &mut Box, conn_id: i32) -> bool { - unsafe { TRUE == cliprdr::empty_cliprdr(&mut (**context), conn_id as u32) } -} - -pub fn server_clip_file( - context: &mut Box, - conn_id: i32, - msg: ClipboardFile, -) -> u32 { - let mut ret = 0; - match msg { - ClipboardFile::NotifyCallback { .. } => { - // unreachable - } - ClipboardFile::MonitorReady => { - log::debug!("server_monitor_ready called"); - ret = server_monitor_ready(context, conn_id); - log::debug!("server_monitor_ready called, return {}", ret); - } - ClipboardFile::FormatList { format_list } => { - log::debug!("server_format_list called"); - ret = server_format_list(context, conn_id, format_list); - log::debug!("server_format_list called, return {}", ret); - } - ClipboardFile::FormatListResponse { msg_flags } => { - log::debug!("format_list_response called"); - ret = server_format_list_response(context, conn_id, msg_flags); - log::debug!("server_format_list_response called, return {}", ret); - } - ClipboardFile::FormatDataRequest { - requested_format_id, - } => { - log::debug!("format_data_request called"); - ret = server_format_data_request(context, conn_id, requested_format_id); - log::debug!("server_format_data_request called, return {}", ret); - } - ClipboardFile::FormatDataResponse { - msg_flags, - format_data, - } => { - log::debug!("format_data_response called"); - ret = server_format_data_response(context, conn_id, msg_flags, format_data); - log::debug!("server_format_data_response called, return {}", ret); - } - ClipboardFile::FileContentsRequest { - stream_id, - list_index, - dw_flags, - n_position_low, - n_position_high, - cb_requested, - have_clip_data_id, - clip_data_id, - } => { - log::debug!("file_contents_request called"); - ret = server_file_contents_request( - context, - conn_id, - stream_id, - list_index, - dw_flags, - n_position_low, - n_position_high, - cb_requested, - have_clip_data_id, - clip_data_id, - ); - log::debug!("server_file_contents_request called, return {}", ret); - } - ClipboardFile::FileContentsResponse { - msg_flags, - stream_id, - requested_data, - } => { - log::debug!("file_contents_response called"); - ret = server_file_contents_response( - context, - conn_id, - msg_flags, - stream_id, - requested_data, - ); - log::debug!("server_file_contents_response called, return {}", ret); - } - } - ret -} - -pub fn server_monitor_ready(context: &mut Box, conn_id: i32) -> u32 { - unsafe { - let monitor_ready = CLIPRDR_MONITOR_READY { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: 0 as UINT16, - dataLen: 0 as UINT32, - }; - if let Some(f) = (**context).MonitorReady { - let ret = f(&mut (**context), &monitor_ready); - ret as u32 - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn server_format_list( - context: &mut Box, - conn_id: i32, - format_list: Vec<(i32, String)>, -) -> u32 { - unsafe { - let num_formats = format_list.len() as UINT32; - let mut formats = format_list - .into_iter() - .map(|format| { - if format.1.is_empty() { - CLIPRDR_FORMAT { - formatId: format.0 as UINT32, - formatName: 0 as *mut _, - } - } else { - let n = match CString::new(format.1) { - Ok(n) => n, - Err(_) => CString::new("").unwrap(), - }; - CLIPRDR_FORMAT { - formatId: format.0 as UINT32, - formatName: n.into_raw(), - } - } - }) - .collect::>(); - - let format_list = CLIPRDR_FORMAT_LIST { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: 0 as UINT16, - dataLen: 0 as UINT32, - numFormats: num_formats, - formats: formats.as_mut_ptr(), - }; - - let ret = if let Some(f) = (**context).ServerFormatList { - f(&mut (**context), &format_list) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - }; - - for f in formats { - if !f.formatName.is_null() { - // retake pointer to free memory - let _ = CString::from_raw(f.formatName); - } - } - - ret as u32 - } -} - -pub fn server_format_list_response( - context: &mut Box, - conn_id: i32, - msg_flags: i32, -) -> u32 { - unsafe { - let format_list_response = CLIPRDR_FORMAT_LIST_RESPONSE { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: msg_flags as UINT16, - dataLen: 0 as UINT32, - }; - - if let Some(f) = (**context).ServerFormatListResponse { - f(&mut (**context), &format_list_response) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn server_format_data_request( - context: &mut Box, - conn_id: i32, - requested_format_id: i32, -) -> u32 { - unsafe { - let format_data_request = CLIPRDR_FORMAT_DATA_REQUEST { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: 0 as UINT16, - dataLen: 0 as UINT32, - requestedFormatId: requested_format_id as UINT32, - }; - if let Some(f) = (**context).ServerFormatDataRequest { - f(&mut (**context), &format_data_request) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn server_format_data_response( - context: &mut Box, - conn_id: i32, - msg_flags: i32, - mut format_data: Vec, -) -> u32 { - unsafe { - let format_data_response = CLIPRDR_FORMAT_DATA_RESPONSE { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: msg_flags as UINT16, - dataLen: format_data.len() as UINT32, - requestedFormatData: format_data.as_mut_ptr(), - }; - if let Some(f) = (**context).ServerFormatDataResponse { - f(&mut (**context), &format_data_response) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn server_file_contents_request( - context: &mut Box, - conn_id: i32, - stream_id: i32, - list_index: i32, - dw_flags: i32, - n_position_low: i32, - n_position_high: i32, - cb_requested: i32, - have_clip_data_id: bool, - clip_data_id: i32, -) -> u32 { - unsafe { - let file_contents_request = CLIPRDR_FILE_CONTENTS_REQUEST { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: 0 as UINT16, - dataLen: 0 as UINT32, - streamId: stream_id as UINT32, - listIndex: list_index as UINT32, - dwFlags: dw_flags as UINT32, - nPositionLow: n_position_low as UINT32, - nPositionHigh: n_position_high as UINT32, - cbRequested: cb_requested as UINT32, - haveClipDataId: if have_clip_data_id { TRUE } else { FALSE }, - clipDataId: clip_data_id as UINT32, - }; - if let Some(f) = (**context).ServerFileContentsRequest { - f(&mut (**context), &file_contents_request) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn server_file_contents_response( - context: &mut Box, - conn_id: i32, - msg_flags: i32, - stream_id: i32, - mut requested_data: Vec, -) -> u32 { - unsafe { - let file_contents_response = CLIPRDR_FILE_CONTENTS_RESPONSE { - connID: conn_id as UINT32, - msgType: 0 as UINT16, - msgFlags: msg_flags as UINT16, - dataLen: 4 + requested_data.len() as UINT32, - streamId: stream_id as UINT32, - cbRequested: requested_data.len() as UINT32, - requestedData: requested_data.as_mut_ptr(), - }; - if let Some(f) = (**context).ServerFileContentsResponse { - f(&mut (**context), &file_contents_response) - } else { - ERR_CODE_SERVER_FUNCTION_NONE - } - } -} - -pub fn create_cliprdr_context( - enable_files: bool, - enable_others: bool, - response_wait_timeout_secs: u32, -) -> ResultType> { - Ok(CliprdrClientContext::create( - enable_files, - enable_others, - response_wait_timeout_secs, - Some(notify_callback), - Some(client_format_list), - Some(client_format_list_response), - Some(client_format_data_request), - Some(client_format_data_response), - Some(client_file_contents_request), - Some(client_file_contents_response), - )?) -} - -extern "C" fn notify_callback(conn_id: UINT32, msg: *const NOTIFICATION_MESSAGE) -> UINT { - log::debug!("notify_callback called"); - let data = unsafe { - let msg = &*msg; - let details = if msg.details.is_null() { - Ok("") - } else { - CStr::from_ptr(msg.details as _).to_str() - }; - match (CStr::from_ptr(msg.msg as _).to_str(), details) { - (Ok(m), Ok(d)) => { - let msgtype = format!( - "custom-{}-nocancel-nook-hasclose", - if msg.r#type == 0 { - "info" - } else if msg.r#type == 1 { - "warn" - } else { - "error" - } - ); - let title = "Clipboard"; - let text = if d.is_empty() { - m.to_string() - } else { - format!("{} {}", m, d) - }; - ClipboardFile::NotifyCallback { - r#type: msgtype, - title: title.to_string(), - text, - } - } - _ => { - log::error!("notify_callback: failed to convert msg"); - return ERR_CODE_INVALID_PARAMETER; - } - } - }; - // no need to handle result here - send_data(conn_id as _, data); - - 0 -} - -extern "C" fn client_format_list( - _context: *mut CliprdrClientContext, - clip_format_list: *const CLIPRDR_FORMAT_LIST, -) -> UINT { - log::debug!("client_format_list called"); - - let conn_id; - let mut format_list: Vec<(i32, String)> = Vec::new(); - unsafe { - let mut i = 0u32; - while i < (*clip_format_list).numFormats { - let format_data = &(*(*clip_format_list).formats.offset(i as isize)); - if format_data.formatName.is_null() { - format_list.push((format_data.formatId as i32, "".to_owned())); - } else { - let format_name = CStr::from_ptr(format_data.formatName).to_str(); - let format_name = match format_name { - Ok(n) => n.to_owned(), - Err(_) => { - log::warn!("failed to get format name"); - "".to_owned() - } - }; - format_list.push((format_data.formatId as i32, format_name)); - } - // log::debug!("format list item {}: format id: {}, format name: {}", i, format_data.formatId, &format_name); - i += 1; - } - conn_id = (*clip_format_list).connID as i32; - } - let data = ClipboardFile::FormatList { format_list }; - // no need to handle result here - if conn_id == 0 { - // msg_channel is used for debug, VEC_MSG_CHANNEL cannot be inspected by the debugger. - let msg_channel = VEC_MSG_CHANNEL.read().unwrap(); - msg_channel - .iter() - .for_each(|msg_channel| allow_err!(msg_channel.sender.send(data.clone()))); - } else { - send_data(conn_id, data); - } - - 0 -} - -extern "C" fn client_format_list_response( - _context: *mut CliprdrClientContext, - format_list_response: *const CLIPRDR_FORMAT_LIST_RESPONSE, -) -> UINT { - log::debug!("client_format_list_response called"); - - let conn_id; - let msg_flags; - unsafe { - conn_id = (*format_list_response).connID as i32; - msg_flags = (*format_list_response).msgFlags as i32; - } - let data = ClipboardFile::FormatListResponse { msg_flags }; - send_data(conn_id, data); - - 0 -} - -extern "C" fn client_format_data_request( - _context: *mut CliprdrClientContext, - format_data_request: *const CLIPRDR_FORMAT_DATA_REQUEST, -) -> UINT { - log::debug!("client_format_data_request called"); - - let conn_id; - let requested_format_id; - unsafe { - conn_id = (*format_data_request).connID as i32; - requested_format_id = (*format_data_request).requestedFormatId as i32; - } - let data = ClipboardFile::FormatDataRequest { - requested_format_id, - }; - // no need to handle result here - send_data(conn_id, data); - - 0 -} - -extern "C" fn client_format_data_response( - _context: *mut CliprdrClientContext, - format_data_response: *const CLIPRDR_FORMAT_DATA_RESPONSE, -) -> UINT { - log::debug!("cconn_idlient_format_data_response called"); - - let conn_id; - let msg_flags; - let format_data; - unsafe { - conn_id = (*format_data_response).connID as i32; - msg_flags = (*format_data_response).msgFlags as i32; - if (*format_data_response).requestedFormatData.is_null() { - format_data = Vec::new(); - } else { - format_data = std::slice::from_raw_parts( - (*format_data_response).requestedFormatData, - (*format_data_response).dataLen as usize, - ) - .to_vec(); - } - } - let data = ClipboardFile::FormatDataResponse { - msg_flags, - format_data, - }; - send_data(conn_id, data); - - 0 -} - -extern "C" fn client_file_contents_request( - _context: *mut CliprdrClientContext, - file_contents_request: *const CLIPRDR_FILE_CONTENTS_REQUEST, -) -> UINT { - log::debug!("client_file_contents_request called"); - - // TODO: support huge file? - // if (!cliprdr->hasHugeFileSupport) - // { - // if (((UINT64)fileContentsRequest->cbRequested + fileContentsRequest->nPositionLow) > - // UINT32_MAX) - // return ERROR_INVALID_PARAMETER; - // if (fileContentsRequest->nPositionHigh != 0) - // return ERROR_INVALID_PARAMETER; - // } - - let conn_id; - let stream_id; - let list_index; - let dw_flags; - let n_position_low; - let n_position_high; - let cb_requested; - let have_clip_data_id; - let clip_data_id; - unsafe { - conn_id = (*file_contents_request).connID as i32; - stream_id = (*file_contents_request).streamId as i32; - list_index = (*file_contents_request).listIndex as i32; - dw_flags = (*file_contents_request).dwFlags as i32; - n_position_low = (*file_contents_request).nPositionLow as i32; - n_position_high = (*file_contents_request).nPositionHigh as i32; - cb_requested = (*file_contents_request).cbRequested as i32; - have_clip_data_id = (*file_contents_request).haveClipDataId == TRUE; - clip_data_id = (*file_contents_request).clipDataId as i32; - } - - let data = ClipboardFile::FileContentsRequest { - stream_id, - list_index, - dw_flags, - n_position_low, - n_position_high, - cb_requested, - have_clip_data_id, - clip_data_id, - }; - send_data(conn_id, data); - - 0 -} - -extern "C" fn client_file_contents_response( - _context: *mut CliprdrClientContext, - file_contents_response: *const CLIPRDR_FILE_CONTENTS_RESPONSE, -) -> UINT { - log::debug!("client_file_contents_response called"); - - let conn_id; - let msg_flags; - let stream_id; - let requested_data; - unsafe { - conn_id = (*file_contents_response).connID as i32; - msg_flags = (*file_contents_response).msgFlags as i32; - stream_id = (*file_contents_response).streamId as i32; - if (*file_contents_response).requestedData.is_null() { - requested_data = Vec::new(); - } else { - requested_data = std::slice::from_raw_parts( - (*file_contents_response).requestedData, - (*file_contents_response).cbRequested as usize, - ) - .to_vec(); - } - } - let data = ClipboardFile::FileContentsResponse { - msg_flags, - stream_id, - requested_data, - }; - send_data(conn_id, data); - - 0 -} - #[cfg(test)] mod tests { // #[test] diff --git a/libs/clipboard/src/platform/mod.rs b/libs/clipboard/src/platform/mod.rs new file mode 100644 index 000000000..1bca4493c --- /dev/null +++ b/libs/clipboard/src/platform/mod.rs @@ -0,0 +1,10 @@ +#[cfg(target_os = "windows")] +pub mod windows; +#[cfg(target_os = "windows")] +pub fn create_cliprdr_context( + enable_files: bool, + enable_others: bool, + response_wait_timeout_secs: u32, +) -> crate::ResultType> { + windows::create_cliprdr_context(enable_files, enable_others, response_wait_timeout_secs) +} diff --git a/libs/clipboard/src/platform/windows.rs b/libs/clipboard/src/platform/windows.rs new file mode 100644 index 000000000..1ab1aa839 --- /dev/null +++ b/libs/clipboard/src/platform/windows.rs @@ -0,0 +1,1214 @@ +//! windows implementation +#![allow(dead_code)] +#![allow(non_camel_case_types)] +#![allow(unused_variables)] +#![allow(non_snake_case)] +#![allow(deref_nullptr)] + +use std::{boxed::Box, result::Result}; + +use crate::{ + allow_err, log, send_data, CStr, CString, ClipboardFile, CliprdrError, CliprdrServiceContext, + ResultType, ERR_CODE_INVALID_PARAMETER, ERR_CODE_SERVER_FUNCTION_NONE, VEC_MSG_CHANNEL, +}; + +// only used error code will be recorded here +/// success +const CHANNEL_RC_OK: u32 = 0; +/// error code from WinError.h +/// success +const ERROR_SUCCESS: u32 = 0; +/// allocation failure +const CHANNEL_RC_NO_MEMORY: u32 = 12; +/// error code from WinError.h +/// used by FreeRDP to represent errors. +const ERROR_INTERNAL_ERROR: u32 = 0x54F; + +pub type size_t = ::std::os::raw::c_ulonglong; +pub type __vcrt_bool = bool; +pub type wchar_t = ::std::os::raw::c_ushort; + +pub type POINTER_64_INT = ::std::os::raw::c_ulonglong; +pub type INT8 = ::std::os::raw::c_schar; +pub type PINT8 = *mut ::std::os::raw::c_schar; +pub type INT16 = ::std::os::raw::c_short; +pub type PINT16 = *mut ::std::os::raw::c_short; +pub type INT32 = ::std::os::raw::c_int; +pub type PINT32 = *mut ::std::os::raw::c_int; +pub type INT64 = ::std::os::raw::c_longlong; +pub type PINT64 = *mut ::std::os::raw::c_longlong; +pub type UINT8 = ::std::os::raw::c_uchar; +pub type PUINT8 = *mut ::std::os::raw::c_uchar; +pub type UINT16 = ::std::os::raw::c_ushort; +pub type PUINT16 = *mut ::std::os::raw::c_ushort; +pub type UINT32 = ::std::os::raw::c_uint; +pub type PUINT32 = *mut ::std::os::raw::c_uint; +pub type UINT64 = ::std::os::raw::c_ulonglong; +pub type PUINT64 = *mut ::std::os::raw::c_ulonglong; +pub type LONG32 = ::std::os::raw::c_int; +pub type PLONG32 = *mut ::std::os::raw::c_int; +pub type ULONG32 = ::std::os::raw::c_uint; +pub type PULONG32 = *mut ::std::os::raw::c_uint; +pub type DWORD32 = ::std::os::raw::c_uint; +pub type PDWORD32 = *mut ::std::os::raw::c_uint; +pub type INT_PTR = ::std::os::raw::c_longlong; +pub type PINT_PTR = *mut ::std::os::raw::c_longlong; +pub type UINT_PTR = ::std::os::raw::c_ulonglong; +pub type PUINT_PTR = *mut ::std::os::raw::c_ulonglong; +pub type LONG_PTR = ::std::os::raw::c_longlong; +pub type PLONG_PTR = *mut ::std::os::raw::c_longlong; +pub type ULONG_PTR = ::std::os::raw::c_ulonglong; +pub type PULONG_PTR = *mut ::std::os::raw::c_ulonglong; +pub type SHANDLE_PTR = ::std::os::raw::c_longlong; +pub type HANDLE_PTR = ::std::os::raw::c_ulonglong; +pub type UHALF_PTR = ::std::os::raw::c_uint; +pub type PUHALF_PTR = *mut ::std::os::raw::c_uint; +pub type HALF_PTR = ::std::os::raw::c_int; +pub type PHALF_PTR = *mut ::std::os::raw::c_int; +pub type SIZE_T = ULONG_PTR; +pub type PSIZE_T = *mut ULONG_PTR; +pub type SSIZE_T = LONG_PTR; +pub type PSSIZE_T = *mut LONG_PTR; +pub type DWORD_PTR = ULONG_PTR; +pub type PDWORD_PTR = *mut ULONG_PTR; +pub type LONG64 = ::std::os::raw::c_longlong; +pub type PLONG64 = *mut ::std::os::raw::c_longlong; +pub type ULONG64 = ::std::os::raw::c_ulonglong; +pub type PULONG64 = *mut ::std::os::raw::c_ulonglong; +pub type DWORD64 = ::std::os::raw::c_ulonglong; +pub type PDWORD64 = *mut ::std::os::raw::c_ulonglong; +pub type KAFFINITY = ULONG_PTR; +pub type PKAFFINITY = *mut KAFFINITY; +pub type PVOID = *mut ::std::os::raw::c_void; +pub type CHAR = ::std::os::raw::c_char; +pub type SHORT = ::std::os::raw::c_short; +pub type LONG = ::std::os::raw::c_long; +pub type WCHAR = wchar_t; +pub type PWCHAR = *mut WCHAR; +pub type LPWCH = *mut WCHAR; +pub type PWCH = *mut WCHAR; +pub type LPCWCH = *const WCHAR; +pub type PCWCH = *const WCHAR; +pub type NWPSTR = *mut WCHAR; +pub type LPWSTR = *mut WCHAR; +pub type PWSTR = *mut WCHAR; +pub type PZPWSTR = *mut PWSTR; +pub type PCZPWSTR = *const PWSTR; +pub type LPUWSTR = *mut WCHAR; +pub type PUWSTR = *mut WCHAR; +pub type LPCWSTR = *const WCHAR; +pub type PCWSTR = *const WCHAR; +pub type PZPCWSTR = *mut PCWSTR; +pub type PCZPCWSTR = *const PCWSTR; +pub type LPCUWSTR = *const WCHAR; +pub type PCUWSTR = *const WCHAR; +pub type PZZWSTR = *mut WCHAR; +pub type PCZZWSTR = *const WCHAR; +pub type PUZZWSTR = *mut WCHAR; +pub type PCUZZWSTR = *const WCHAR; +pub type PNZWCH = *mut WCHAR; +pub type PCNZWCH = *const WCHAR; +pub type PUNZWCH = *mut WCHAR; +pub type PCUNZWCH = *const WCHAR; +pub type PCHAR = *mut CHAR; +pub type LPCH = *mut CHAR; +pub type PCH = *mut CHAR; +pub type LPCCH = *const CHAR; +pub type PCCH = *const CHAR; +pub type NPSTR = *mut CHAR; +pub type LPSTR = *mut CHAR; +pub type PSTR = *mut CHAR; +pub type PZPSTR = *mut PSTR; +pub type PCZPSTR = *const PSTR; +pub type LPCSTR = *const CHAR; +pub type PCSTR = *const CHAR; +pub type PZPCSTR = *mut PCSTR; +pub type PCZPCSTR = *const PCSTR; +pub type PZZSTR = *mut CHAR; +pub type PCZZSTR = *const CHAR; +pub type PNZCH = *mut CHAR; +pub type PCNZCH = *const CHAR; +pub type TCHAR = ::std::os::raw::c_char; +pub type PTCHAR = *mut ::std::os::raw::c_char; +pub type TBYTE = ::std::os::raw::c_uchar; +pub type PTBYTE = *mut ::std::os::raw::c_uchar; +pub type LPTCH = LPCH; +pub type PTCH = LPCH; +pub type LPCTCH = LPCCH; +pub type PCTCH = LPCCH; +pub type PTSTR = LPSTR; +pub type LPTSTR = LPSTR; +pub type PUTSTR = LPSTR; +pub type LPUTSTR = LPSTR; +pub type PCTSTR = LPCSTR; +pub type LPCTSTR = LPCSTR; +pub type PCUTSTR = LPCSTR; +pub type LPCUTSTR = LPCSTR; +pub type PZZTSTR = PZZSTR; +pub type PUZZTSTR = PZZSTR; +pub type PCZZTSTR = PCZZSTR; +pub type PCUZZTSTR = PCZZSTR; +pub type PZPTSTR = PZPSTR; +pub type PNZTCH = PNZCH; +pub type PUNZTCH = PNZCH; +pub type PCNZTCH = PCNZCH; +pub type PCUNZTCH = PCNZCH; +pub type PSHORT = *mut SHORT; +pub type PLONG = *mut LONG; +pub type ULONG = ::std::os::raw::c_ulong; +pub type PULONG = *mut ULONG; +pub type USHORT = ::std::os::raw::c_ushort; +pub type PUSHORT = *mut USHORT; +pub type UCHAR = ::std::os::raw::c_uchar; +pub type PUCHAR = *mut UCHAR; +pub type PSZ = *mut ::std::os::raw::c_char; +pub type DWORD = ::std::os::raw::c_ulong; +pub type BOOL = ::std::os::raw::c_int; +pub type BYTE = ::std::os::raw::c_uchar; +pub type WORD = ::std::os::raw::c_ushort; +pub type FLOAT = f32; +pub type PFLOAT = *mut FLOAT; +pub type PBOOL = *mut BOOL; +pub type LPBOOL = *mut BOOL; +pub type PBYTE = *mut BYTE; +pub type LPBYTE = *mut BYTE; +pub type PINT = *mut ::std::os::raw::c_int; +pub type LPINT = *mut ::std::os::raw::c_int; +pub type PWORD = *mut WORD; +pub type LPWORD = *mut WORD; +pub type LPLONG = *mut ::std::os::raw::c_long; +pub type PDWORD = *mut DWORD; +pub type LPDWORD = *mut DWORD; +pub type LPVOID = *mut ::std::os::raw::c_void; +pub type LPCVOID = *const ::std::os::raw::c_void; +pub type INT = ::std::os::raw::c_int; +pub type UINT = ::std::os::raw::c_uint; +pub type PUINT = *mut ::std::os::raw::c_uint; +pub type va_list = *mut ::std::os::raw::c_char; + +pub const TRUE: ::std::os::raw::c_int = 1; +pub const FALSE: ::std::os::raw::c_int = 0; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_HEADER { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, +} +pub type CLIPRDR_HEADER = _CLIPRDR_HEADER; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_CAPABILITY_SET { + pub capabilitySetType: UINT16, + pub capabilitySetLength: UINT16, +} +pub type CLIPRDR_CAPABILITY_SET = _CLIPRDR_CAPABILITY_SET; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_GENERAL_CAPABILITY_SET { + pub capabilitySetType: UINT16, + pub capabilitySetLength: UINT16, + pub version: UINT32, + pub generalFlags: UINT32, +} +pub type CLIPRDR_GENERAL_CAPABILITY_SET = _CLIPRDR_GENERAL_CAPABILITY_SET; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_CAPABILITIES { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub cCapabilitiesSets: UINT32, + pub capabilitySets: *mut CLIPRDR_CAPABILITY_SET, +} +pub type CLIPRDR_CAPABILITIES = _CLIPRDR_CAPABILITIES; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_MONITOR_READY { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, +} +pub type CLIPRDR_MONITOR_READY = _CLIPRDR_MONITOR_READY; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_TEMP_DIRECTORY { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub szTempDir: [::std::os::raw::c_char; 520usize], +} +pub type CLIPRDR_TEMP_DIRECTORY = _CLIPRDR_TEMP_DIRECTORY; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FORMAT { + pub formatId: UINT32, + pub formatName: *mut ::std::os::raw::c_char, +} +pub type CLIPRDR_FORMAT = _CLIPRDR_FORMAT; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FORMAT_LIST { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub numFormats: UINT32, + pub formats: *mut CLIPRDR_FORMAT, +} +pub type CLIPRDR_FORMAT_LIST = _CLIPRDR_FORMAT_LIST; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FORMAT_LIST_RESPONSE { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, +} +pub type CLIPRDR_FORMAT_LIST_RESPONSE = _CLIPRDR_FORMAT_LIST_RESPONSE; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_LOCK_CLIPBOARD_DATA { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub clipDataId: UINT32, +} +pub type CLIPRDR_LOCK_CLIPBOARD_DATA = _CLIPRDR_LOCK_CLIPBOARD_DATA; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_UNLOCK_CLIPBOARD_DATA { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub clipDataId: UINT32, +} +pub type CLIPRDR_UNLOCK_CLIPBOARD_DATA = _CLIPRDR_UNLOCK_CLIPBOARD_DATA; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FORMAT_DATA_REQUEST { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub requestedFormatId: UINT32, +} +pub type CLIPRDR_FORMAT_DATA_REQUEST = _CLIPRDR_FORMAT_DATA_REQUEST; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FORMAT_DATA_RESPONSE { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub requestedFormatData: *const BYTE, +} +pub type CLIPRDR_FORMAT_DATA_RESPONSE = _CLIPRDR_FORMAT_DATA_RESPONSE; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FILE_CONTENTS_REQUEST { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub streamId: UINT32, + pub listIndex: UINT32, + pub dwFlags: UINT32, + pub nPositionLow: UINT32, + pub nPositionHigh: UINT32, + pub cbRequested: UINT32, + pub haveClipDataId: BOOL, + pub clipDataId: UINT32, +} +pub type CLIPRDR_FILE_CONTENTS_REQUEST = _CLIPRDR_FILE_CONTENTS_REQUEST; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _CLIPRDR_FILE_CONTENTS_RESPONSE { + pub connID: UINT32, + pub msgType: UINT16, + pub msgFlags: UINT16, + pub dataLen: UINT32, + pub streamId: UINT32, + pub cbRequested: UINT32, + pub requestedData: *const BYTE, +} +pub type CLIPRDR_FILE_CONTENTS_RESPONSE = _CLIPRDR_FILE_CONTENTS_RESPONSE; +pub type CliprdrClientContext = _cliprdr_client_context; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct _NOTIFICATION_MESSAGE { + pub r#type: UINT32, // 0 - info, 1 - warning, 2 - error + pub msg: *const BYTE, + pub details: *const BYTE, +} +pub type NOTIFICATION_MESSAGE = _NOTIFICATION_MESSAGE; +pub type pcCliprdrServerCapabilities = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + capabilities: *const CLIPRDR_CAPABILITIES, + ) -> UINT, +>; +pub type pcCliprdrClientCapabilities = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + capabilities: *const CLIPRDR_CAPABILITIES, + ) -> UINT, +>; +pub type pcCliprdrMonitorReady = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + monitorReady: *const CLIPRDR_MONITOR_READY, + ) -> UINT, +>; +pub type pcCliprdrTempDirectory = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + tempDirectory: *const CLIPRDR_TEMP_DIRECTORY, + ) -> UINT, +>; +pub type pcNotifyClipboardMsg = ::std::option::Option< + unsafe extern "C" fn(connID: UINT32, msg: *const NOTIFICATION_MESSAGE) -> UINT, +>; +pub type pcCliprdrClientFormatList = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatList: *const CLIPRDR_FORMAT_LIST, + ) -> UINT, +>; +pub type pcCliprdrServerFormatList = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatList: *const CLIPRDR_FORMAT_LIST, + ) -> UINT, +>; +pub type pcCliprdrClientFormatListResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatListResponse: *const CLIPRDR_FORMAT_LIST_RESPONSE, + ) -> UINT, +>; +pub type pcCliprdrServerFormatListResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatListResponse: *const CLIPRDR_FORMAT_LIST_RESPONSE, + ) -> UINT, +>; +pub type pcCliprdrClientLockClipboardData = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + lockClipboardData: *const CLIPRDR_LOCK_CLIPBOARD_DATA, + ) -> UINT, +>; +pub type pcCliprdrServerLockClipboardData = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + lockClipboardData: *const CLIPRDR_LOCK_CLIPBOARD_DATA, + ) -> UINT, +>; +pub type pcCliprdrClientUnlockClipboardData = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + unlockClipboardData: *const CLIPRDR_UNLOCK_CLIPBOARD_DATA, + ) -> UINT, +>; +pub type pcCliprdrServerUnlockClipboardData = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + unlockClipboardData: *const CLIPRDR_UNLOCK_CLIPBOARD_DATA, + ) -> UINT, +>; +pub type pcCliprdrClientFormatDataRequest = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatDataRequest: *const CLIPRDR_FORMAT_DATA_REQUEST, + ) -> UINT, +>; +pub type pcCliprdrServerFormatDataRequest = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatDataRequest: *const CLIPRDR_FORMAT_DATA_REQUEST, + ) -> UINT, +>; +pub type pcCliprdrClientFormatDataResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatDataResponse: *const CLIPRDR_FORMAT_DATA_RESPONSE, + ) -> UINT, +>; +pub type pcCliprdrServerFormatDataResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + formatDataResponse: *const CLIPRDR_FORMAT_DATA_RESPONSE, + ) -> UINT, +>; +pub type pcCliprdrClientFileContentsRequest = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + fileContentsRequest: *const CLIPRDR_FILE_CONTENTS_REQUEST, + ) -> UINT, +>; +pub type pcCliprdrServerFileContentsRequest = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + fileContentsRequest: *const CLIPRDR_FILE_CONTENTS_REQUEST, + ) -> UINT, +>; +pub type pcCliprdrClientFileContentsResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + fileContentsResponse: *const CLIPRDR_FILE_CONTENTS_RESPONSE, + ) -> UINT, +>; +pub type pcCliprdrServerFileContentsResponse = ::std::option::Option< + unsafe extern "C" fn( + context: *mut CliprdrClientContext, + fileContentsResponse: *const CLIPRDR_FILE_CONTENTS_RESPONSE, + ) -> UINT, +>; + +// TODO: hide more members of clipboard context +#[repr(C)] +#[derive(Debug, Clone)] +pub struct _cliprdr_client_context { + pub Custom: *mut ::std::os::raw::c_void, + pub EnableFiles: BOOL, + pub EnableOthers: BOOL, + pub IsStopped: BOOL, + pub ResponseWaitTimeoutSecs: UINT32, + pub ServerCapabilities: pcCliprdrServerCapabilities, + pub ClientCapabilities: pcCliprdrClientCapabilities, + pub MonitorReady: pcCliprdrMonitorReady, + pub TempDirectory: pcCliprdrTempDirectory, + pub NotifyClipboardMsg: pcNotifyClipboardMsg, + pub ClientFormatList: pcCliprdrClientFormatList, + pub ServerFormatList: pcCliprdrServerFormatList, + pub ClientFormatListResponse: pcCliprdrClientFormatListResponse, + pub ServerFormatListResponse: pcCliprdrServerFormatListResponse, + pub ClientLockClipboardData: pcCliprdrClientLockClipboardData, + pub ServerLockClipboardData: pcCliprdrServerLockClipboardData, + pub ClientUnlockClipboardData: pcCliprdrClientUnlockClipboardData, + pub ServerUnlockClipboardData: pcCliprdrServerUnlockClipboardData, + pub ClientFormatDataRequest: pcCliprdrClientFormatDataRequest, + pub ServerFormatDataRequest: pcCliprdrServerFormatDataRequest, + pub ClientFormatDataResponse: pcCliprdrClientFormatDataResponse, + pub ServerFormatDataResponse: pcCliprdrServerFormatDataResponse, + pub ClientFileContentsRequest: pcCliprdrClientFileContentsRequest, + pub ServerFileContentsRequest: pcCliprdrServerFileContentsRequest, + pub ClientFileContentsResponse: pcCliprdrClientFileContentsResponse, + pub ServerFileContentsResponse: pcCliprdrServerFileContentsResponse, + pub LastRequestedFormatId: UINT32, +} + +// #[link(name = "user32")] +// #[link(name = "ole32")] +extern "C" { + pub(crate) fn init_cliprdr(context: *mut CliprdrClientContext) -> BOOL; + pub(crate) fn uninit_cliprdr(context: *mut CliprdrClientContext) -> BOOL; + pub(crate) fn empty_cliprdr(context: *mut CliprdrClientContext, connID: UINT32) -> BOOL; +} + +unsafe impl Send for CliprdrClientContext {} + +unsafe impl Sync for CliprdrClientContext {} + +impl CliprdrClientContext { + pub fn create( + enable_files: bool, + enable_others: bool, + response_wait_timeout_secs: u32, + notify_callback: pcNotifyClipboardMsg, + client_format_list: pcCliprdrClientFormatList, + client_format_list_response: pcCliprdrClientFormatListResponse, + client_format_data_request: pcCliprdrClientFormatDataRequest, + client_format_data_response: pcCliprdrClientFormatDataResponse, + client_file_contents_request: pcCliprdrClientFileContentsRequest, + client_file_contents_response: pcCliprdrClientFileContentsResponse, + ) -> Result, CliprdrError> { + let context = CliprdrClientContext { + Custom: 0 as *mut _, + EnableFiles: if enable_files { TRUE } else { FALSE }, + EnableOthers: if enable_others { TRUE } else { FALSE }, + IsStopped: FALSE, + ResponseWaitTimeoutSecs: response_wait_timeout_secs, + ServerCapabilities: None, + ClientCapabilities: None, + MonitorReady: None, + TempDirectory: None, + NotifyClipboardMsg: notify_callback, + ClientFormatList: client_format_list, + ServerFormatList: None, + ClientFormatListResponse: client_format_list_response, + ServerFormatListResponse: None, + ClientLockClipboardData: None, + ServerLockClipboardData: None, + ClientUnlockClipboardData: None, + ServerUnlockClipboardData: None, + ClientFormatDataRequest: client_format_data_request, + ServerFormatDataRequest: None, + ClientFormatDataResponse: client_format_data_response, + ServerFormatDataResponse: None, + ClientFileContentsRequest: client_file_contents_request, + ServerFileContentsRequest: None, + ClientFileContentsResponse: client_file_contents_response, + ServerFileContentsResponse: None, + LastRequestedFormatId: 0, + }; + let mut context = Box::new(context); + unsafe { + if FALSE == init_cliprdr(&mut (*context)) { + println!("Failed to init cliprdr"); + Err(CliprdrError::CliprdrInit) + } else { + Ok(context) + } + } + } +} + +impl Drop for CliprdrClientContext { + fn drop(&mut self) { + unsafe { + if FALSE == uninit_cliprdr(&mut *self) { + println!("Failed to uninit cliprdr"); + } else { + println!("Succeeded to uninit cliprdr"); + } + } + } +} + +impl CliprdrServiceContext for CliprdrClientContext { + fn set_is_stopped(&mut self) -> Result<(), CliprdrError> { + self.IsStopped = TRUE; + Ok(()) + } + + fn empty_clipboard(&mut self, conn_id: i32) -> bool { + empty_clipboard(self, conn_id) + } + + fn server_clip_file(&mut self, conn_id: i32, msg: ClipboardFile) -> Result<(), CliprdrError> { + let ret = server_clip_file(self, conn_id, msg); + ret_to_result(ret) + } +} + +fn ret_to_result(ret: u32) -> Result<(), CliprdrError> { + match ret { + #[allow(unreachable_patterns)] + // CHANNEL_RC_OK is unreachable, but ignore it + ERROR_SUCCESS | CHANNEL_RC_OK => Ok(()), + CHANNEL_RC_NO_MEMORY => Err(CliprdrError::CliprdrOutOfMemory), + ERROR_INTERNAL_ERROR => Err(CliprdrError::ClipboardInternalError), + e => Err(CliprdrError::Unknown(e)), + } +} + +fn empty_clipboard(context: &mut CliprdrClientContext, conn_id: i32) -> bool { + unsafe { TRUE == empty_cliprdr(context, conn_id as u32) } +} + +fn server_clip_file(context: &mut CliprdrClientContext, conn_id: i32, msg: ClipboardFile) -> u32 { + let mut ret = 0; + match msg { + ClipboardFile::NotifyCallback { .. } => { + // unreachable + } + ClipboardFile::MonitorReady => { + log::debug!("server_monitor_ready called"); + ret = server_monitor_ready(context, conn_id); + log::debug!( + "server_monitor_ready called, conn_id {}, return {}", + conn_id, + ret + ); + } + ClipboardFile::FormatList { format_list } => { + log::debug!( + "server_format_list called, conn_id {}, format_list: {:?}", + conn_id, + &format_list + ); + ret = server_format_list(context, conn_id, format_list); + log::debug!( + "server_format_list called, conn_id {}, return {}", + conn_id, + ret + ); + } + ClipboardFile::FormatListResponse { msg_flags } => { + log::debug!("server_format_list_response called"); + ret = server_format_list_response(context, conn_id, msg_flags); + log::debug!( + "server_format_list_response called, conn_id {}, msg_flags {}, return {}", + conn_id, + msg_flags, + ret + ); + } + ClipboardFile::FormatDataRequest { + requested_format_id, + } => { + log::debug!("server_format_data_request called"); + ret = server_format_data_request(context, conn_id, requested_format_id); + log::debug!( + "server_format_data_request called, conn_id {}, requested_format_id {}, return {}", + conn_id, + requested_format_id, + ret + ); + } + ClipboardFile::FormatDataResponse { + msg_flags, + format_data, + } => { + log::debug!("server_format_data_response called"); + ret = server_format_data_response(context, conn_id, msg_flags, format_data); + log::debug!( + "server_format_data_response called, conn_id {}, msg_flags: {}, return {}", + conn_id, + msg_flags, + ret + ); + } + ClipboardFile::FileContentsRequest { + stream_id, + list_index, + dw_flags, + n_position_low, + n_position_high, + cb_requested, + have_clip_data_id, + clip_data_id, + } => { + log::debug!("server_file_contents_request called"); + ret = server_file_contents_request( + context, + conn_id, + stream_id, + list_index, + dw_flags, + n_position_low, + n_position_high, + cb_requested, + have_clip_data_id, + clip_data_id, + ); + log::debug!("server_file_contents_request called, conn_id {}, stream_id: {}, list_index {}, dw_flags {}, n_position_low {}, n_position_high {}, cb_requested {}, have_clip_data_id {}, clip_data_id {}, return {}", conn_id, + stream_id, + list_index, + dw_flags, + n_position_low, + n_position_high, + cb_requested, + have_clip_data_id, + clip_data_id, + ret + ); + } + ClipboardFile::FileContentsResponse { + msg_flags, + stream_id, + requested_data, + } => { + log::debug!("server_file_contents_response called"); + ret = server_file_contents_response( + context, + conn_id, + msg_flags, + stream_id, + requested_data, + ); + log::debug!("server_file_contents_response called, conn_id {}, msg_flags {}, stream_id {}, return {}", + conn_id, + msg_flags, + stream_id, + ret + ); + } + } + ret +} + +fn server_monitor_ready(context: &mut CliprdrClientContext, conn_id: i32) -> u32 { + unsafe { + let monitor_ready = CLIPRDR_MONITOR_READY { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: 0 as UINT16, + dataLen: 0 as UINT32, + }; + if let Some(f) = context.MonitorReady { + let ret = f(context, &monitor_ready); + ret as u32 + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +fn server_format_list( + context: &mut CliprdrClientContext, + conn_id: i32, + format_list: Vec<(i32, String)>, +) -> u32 { + unsafe { + let num_formats = format_list.len() as UINT32; + let mut formats = format_list + .into_iter() + .map(|format| { + if format.1.is_empty() { + CLIPRDR_FORMAT { + formatId: format.0 as UINT32, + formatName: 0 as *mut _, + } + } else { + let n = match CString::new(format.1) { + Ok(n) => n, + Err(_) => CString::new("").unwrap(), + }; + CLIPRDR_FORMAT { + formatId: format.0 as UINT32, + formatName: n.into_raw(), + } + } + }) + .collect::>(); + + let format_list = CLIPRDR_FORMAT_LIST { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: 0 as UINT16, + dataLen: 0 as UINT32, + numFormats: num_formats, + formats: formats.as_mut_ptr(), + }; + + let ret = if let Some(f) = context.ServerFormatList { + f(context, &format_list) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + }; + + for f in formats { + if !f.formatName.is_null() { + // retake pointer to free memory + let _ = CString::from_raw(f.formatName); + } + } + + ret as u32 + } +} + +fn server_format_list_response( + context: &mut CliprdrClientContext, + conn_id: i32, + msg_flags: i32, +) -> u32 { + unsafe { + let format_list_response = CLIPRDR_FORMAT_LIST_RESPONSE { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: msg_flags as UINT16, + dataLen: 0 as UINT32, + }; + + if let Some(f) = context.ServerFormatListResponse { + f(context, &format_list_response) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +fn server_format_data_request( + context: &mut CliprdrClientContext, + conn_id: i32, + requested_format_id: i32, +) -> u32 { + unsafe { + let format_data_request = CLIPRDR_FORMAT_DATA_REQUEST { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: 0 as UINT16, + dataLen: 0 as UINT32, + requestedFormatId: requested_format_id as UINT32, + }; + if let Some(f) = context.ServerFormatDataRequest { + f(context, &format_data_request) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +fn server_format_data_response( + context: &mut CliprdrClientContext, + conn_id: i32, + msg_flags: i32, + mut format_data: Vec, +) -> u32 { + unsafe { + let format_data_response = CLIPRDR_FORMAT_DATA_RESPONSE { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: msg_flags as UINT16, + dataLen: format_data.len() as UINT32, + requestedFormatData: format_data.as_mut_ptr(), + }; + if let Some(f) = context.ServerFormatDataResponse { + f(context, &format_data_response) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +fn server_file_contents_request( + context: &mut CliprdrClientContext, + conn_id: i32, + stream_id: i32, + list_index: i32, + dw_flags: i32, + n_position_low: i32, + n_position_high: i32, + cb_requested: i32, + have_clip_data_id: bool, + clip_data_id: i32, +) -> u32 { + unsafe { + let file_contents_request = CLIPRDR_FILE_CONTENTS_REQUEST { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: 0 as UINT16, + dataLen: 0 as UINT32, + streamId: stream_id as UINT32, + listIndex: list_index as UINT32, + dwFlags: dw_flags as UINT32, + nPositionLow: n_position_low as UINT32, + nPositionHigh: n_position_high as UINT32, + cbRequested: cb_requested as UINT32, + haveClipDataId: if have_clip_data_id { TRUE } else { FALSE }, + clipDataId: clip_data_id as UINT32, + }; + if let Some(f) = context.ServerFileContentsRequest { + f(context, &file_contents_request) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +fn server_file_contents_response( + context: &mut CliprdrClientContext, + conn_id: i32, + msg_flags: i32, + stream_id: i32, + mut requested_data: Vec, +) -> u32 { + unsafe { + let file_contents_response = CLIPRDR_FILE_CONTENTS_RESPONSE { + connID: conn_id as UINT32, + msgType: 0 as UINT16, + msgFlags: msg_flags as UINT16, + dataLen: 4 + requested_data.len() as UINT32, + streamId: stream_id as UINT32, + cbRequested: requested_data.len() as UINT32, + requestedData: requested_data.as_mut_ptr(), + }; + if let Some(f) = context.ServerFileContentsResponse { + f(context, &file_contents_response) + } else { + ERR_CODE_SERVER_FUNCTION_NONE + } + } +} + +pub(super) fn create_cliprdr_context( + enable_files: bool, + enable_others: bool, + response_wait_timeout_secs: u32, +) -> ResultType> { + let boxed = CliprdrClientContext::create( + enable_files, + enable_others, + response_wait_timeout_secs, + Some(notify_callback), + Some(client_format_list), + Some(client_format_list_response), + Some(client_format_data_request), + Some(client_format_data_response), + Some(client_file_contents_request), + Some(client_file_contents_response), + )? as Box; + + Ok(boxed) +} + +extern "C" fn notify_callback(conn_id: UINT32, msg: *const NOTIFICATION_MESSAGE) -> UINT { + log::debug!("notify_callback called"); + let data = unsafe { + let msg = &*msg; + let details = if msg.details.is_null() { + Ok("") + } else { + CStr::from_ptr(msg.details as _).to_str() + }; + match (CStr::from_ptr(msg.msg as _).to_str(), details) { + (Ok(m), Ok(d)) => { + let msgtype = format!( + "custom-{}-nocancel-nook-hasclose", + if msg.r#type == 0 { + "info" + } else if msg.r#type == 1 { + "warn" + } else { + "error" + } + ); + let title = "Clipboard"; + let text = if d.is_empty() { + m.to_string() + } else { + format!("{} {}", m, d) + }; + ClipboardFile::NotifyCallback { + r#type: msgtype, + title: title.to_string(), + text, + } + } + _ => { + log::error!("notify_callback: failed to convert msg"); + return ERR_CODE_INVALID_PARAMETER; + } + } + }; + // no need to handle result here + send_data(conn_id as _, data); + + 0 +} + +extern "C" fn client_format_list( + _context: *mut CliprdrClientContext, + clip_format_list: *const CLIPRDR_FORMAT_LIST, +) -> UINT { + let conn_id; + let mut format_list: Vec<(i32, String)> = Vec::new(); + unsafe { + let mut i = 0u32; + while i < (*clip_format_list).numFormats { + let format_data = &(*(*clip_format_list).formats.offset(i as isize)); + if format_data.formatName.is_null() { + format_list.push((format_data.formatId as i32, "".to_owned())); + } else { + let format_name = CStr::from_ptr(format_data.formatName).to_str(); + let format_name = match format_name { + Ok(n) => n.to_owned(), + Err(_) => { + log::warn!("failed to get format name"); + "".to_owned() + } + }; + format_list.push((format_data.formatId as i32, format_name)); + } + // log::debug!("format list item {}: format id: {}, format name: {}", i, format_data.formatId, &format_name); + i += 1; + } + conn_id = (*clip_format_list).connID as i32; + } + log::debug!( + "client_format_list called, client id: {}, format_list: {:?}", + conn_id, + &format_list + ); + let data = ClipboardFile::FormatList { format_list }; + // no need to handle result here + if conn_id == 0 { + // msg_channel is used for debug, VEC_MSG_CHANNEL cannot be inspected by the debugger. + let msg_channel = VEC_MSG_CHANNEL.read().unwrap(); + msg_channel + .iter() + .for_each(|msg_channel| allow_err!(msg_channel.sender.send(data.clone()))); + } else { + send_data(conn_id, data); + } + + 0 +} + +extern "C" fn client_format_list_response( + _context: *mut CliprdrClientContext, + format_list_response: *const CLIPRDR_FORMAT_LIST_RESPONSE, +) -> UINT { + let conn_id; + let msg_flags; + unsafe { + conn_id = (*format_list_response).connID as i32; + msg_flags = (*format_list_response).msgFlags as i32; + } + log::debug!( + "client_format_list_response called, client id: {}, msg_flags: {}", + conn_id, + msg_flags + ); + let data = ClipboardFile::FormatListResponse { msg_flags }; + send_data(conn_id, data); + + 0 +} + +extern "C" fn client_format_data_request( + _context: *mut CliprdrClientContext, + format_data_request: *const CLIPRDR_FORMAT_DATA_REQUEST, +) -> UINT { + let conn_id; + let requested_format_id; + unsafe { + conn_id = (*format_data_request).connID as i32; + requested_format_id = (*format_data_request).requestedFormatId as i32; + } + let data = ClipboardFile::FormatDataRequest { + requested_format_id, + }; + log::debug!( + "client_format_data_request called, conn_id: {}, requested_format_id: {}", + conn_id, + requested_format_id + ); + // no need to handle result here + send_data(conn_id, data); + + 0 +} + +extern "C" fn client_format_data_response( + _context: *mut CliprdrClientContext, + format_data_response: *const CLIPRDR_FORMAT_DATA_RESPONSE, +) -> UINT { + let conn_id; + let msg_flags; + let format_data; + unsafe { + conn_id = (*format_data_response).connID as i32; + msg_flags = (*format_data_response).msgFlags as i32; + if (*format_data_response).requestedFormatData.is_null() { + format_data = Vec::new(); + } else { + format_data = std::slice::from_raw_parts( + (*format_data_response).requestedFormatData, + (*format_data_response).dataLen as usize, + ) + .to_vec(); + } + } + log::debug!( + "client_format_data_response called, client id: {}, msg_flags: {}", + conn_id, + msg_flags + ); + let data = ClipboardFile::FormatDataResponse { + msg_flags, + format_data, + }; + send_data(conn_id, data); + + 0 +} + +extern "C" fn client_file_contents_request( + _context: *mut CliprdrClientContext, + file_contents_request: *const CLIPRDR_FILE_CONTENTS_REQUEST, +) -> UINT { + // TODO: support huge file? + // if (!cliprdr->hasHugeFileSupport) + // { + // if (((UINT64)fileContentsRequest->cbRequested + fileContentsRequest->nPositionLow) > + // UINT32_MAX) + // return ERROR_INVALID_PARAMETER; + // if (fileContentsRequest->nPositionHigh != 0) + // return ERROR_INVALID_PARAMETER; + // } + + let conn_id; + let stream_id; + let list_index; + let dw_flags; + let n_position_low; + let n_position_high; + let cb_requested; + let have_clip_data_id; + let clip_data_id; + unsafe { + conn_id = (*file_contents_request).connID as i32; + stream_id = (*file_contents_request).streamId as i32; + list_index = (*file_contents_request).listIndex as i32; + dw_flags = (*file_contents_request).dwFlags as i32; + n_position_low = (*file_contents_request).nPositionLow as i32; + n_position_high = (*file_contents_request).nPositionHigh as i32; + cb_requested = (*file_contents_request).cbRequested as i32; + have_clip_data_id = (*file_contents_request).haveClipDataId == TRUE; + clip_data_id = (*file_contents_request).clipDataId as i32; + } + let data = ClipboardFile::FileContentsRequest { + stream_id, + list_index, + dw_flags, + n_position_low, + n_position_high, + cb_requested, + have_clip_data_id, + clip_data_id, + }; + log::debug!("client_file_contents_request called, data: {:?}", &data); + send_data(conn_id, data); + + 0 +} + +extern "C" fn client_file_contents_response( + _context: *mut CliprdrClientContext, + file_contents_response: *const CLIPRDR_FILE_CONTENTS_RESPONSE, +) -> UINT { + let conn_id; + let msg_flags; + let stream_id; + let requested_data; + unsafe { + conn_id = (*file_contents_response).connID as i32; + msg_flags = (*file_contents_response).msgFlags as i32; + stream_id = (*file_contents_response).streamId as i32; + if (*file_contents_response).requestedData.is_null() { + requested_data = Vec::new(); + } else { + requested_data = std::slice::from_raw_parts( + (*file_contents_response).requestedData, + (*file_contents_response).cbRequested as usize, + ) + .to_vec(); + } + } + let data = ClipboardFile::FileContentsResponse { + msg_flags, + stream_id, + requested_data, + }; + log::debug!( + "client_file_contents_response called, conn_id: {}, msg_flags: {}, stream_id: {}", + conn_id, + msg_flags, + stream_id + ); + send_data(conn_id, data); + + 0 +} diff --git a/libs/clipboard/src/windows/wf_cliprdr.c b/libs/clipboard/src/windows/wf_cliprdr.c index 801fa71f3..c8f2038a1 100644 --- a/libs/clipboard/src/windows/wf_cliprdr.c +++ b/libs/clipboard/src/windows/wf_cliprdr.c @@ -1367,6 +1367,11 @@ static UINT cliprdr_send_format_list(wfClipboard *clipboard, UINT32 connID) if (!clipboard) return ERROR_INTERNAL_ERROR; + if (!IsClipboardFormatAvailable(CF_HDROP)) + { + return ERROR_SUCCESS; + } + ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST)); /* Ignore if other app is holding clipboard */ @@ -1392,21 +1397,11 @@ static UINT cliprdr_send_format_list(wfClipboard *clipboard, UINT32 connID) } index = 0; - - if (IsClipboardFormatAvailable(CF_HDROP)) - { - UINT fsid = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW); - UINT fcid = RegisterClipboardFormat(CFSTR_FILECONTENTS); - - formats[index++].formatId = fsid; - formats[index++].formatId = fcid; - } - else - { - while (formatId = EnumClipboardFormats(formatId) && index < numFormats) - formats[index++].formatId = formatId; - } - + // IsClipboardFormatAvailable(CF_HDROP) is checked above + UINT fsid = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW); + UINT fcid = RegisterClipboardFormat(CFSTR_FILECONTENTS); + formats[index++].formatId = fsid; + formats[index++].formatId = fcid; numFormats = index; if (!CloseClipboard()) diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index ff1387dd0..ab47f5698 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -6,7 +6,7 @@ use std::sync::{ }; #[cfg(windows)] -use clipboard::{cliprdr::CliprdrClientContext, empty_clipboard, ContextSend}; +use clipboard::ContextSend; use crossbeam_queue::ArrayQueue; use hbb_common::config::{PeerConfig, TransferSerde}; use hbb_common::fs::{ @@ -27,7 +27,7 @@ use hbb_common::tokio::{ sync::mpsc, time::{self, Duration, Instant, Interval}, }; -use hbb_common::{allow_err, fs, get_time, log, message_proto::*, Stream}; +use hbb_common::{allow_err, fs, get_time, log, message_proto::*, ResultType, Stream}; use scrap::CodecFormat; use crate::client::{ @@ -281,9 +281,9 @@ impl Remote { #[cfg(windows)] { let conn_id = self.client_conn_id; - ContextSend::proc(|context: &mut Box| -> u32 { - empty_clipboard(context, conn_id); - 0 + let _ = ContextSend::proc(|context| -> ResultType<()> { + context.empty_clipboard(conn_id); + Ok(()) }); } } @@ -1578,8 +1578,10 @@ impl Remote { "Process clipboard message from server peer, stop: {}, is_stopping_allowed: {}, file_transfer_enabled: {}", stop, is_stopping_allowed, file_transfer_enabled); if !stop { - ContextSend::proc(|context: &mut Box| -> u32 { - clipboard::server_clip_file(context, self.client_conn_id, clip) + let _ = ContextSend::proc(|context| -> ResultType<()> { + context + .server_clip_file(self.client_conn_id, clip) + .map_err(|e| e.into()) }); } } diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index e5a5c8e3b..2acf76eff 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -16,7 +16,7 @@ use crate::ipc::Connection; #[cfg(not(any(target_os = "ios")))] use crate::ipc::{self, Data}; #[cfg(windows)] -use clipboard::{cliprdr::CliprdrClientContext, empty_clipboard, ContextSend}; +use clipboard::ContextSend; #[cfg(not(any(target_os = "android", target_os = "ios")))] use hbb_common::tokio::sync::mpsc::unbounded_channel; #[cfg(windows)] @@ -34,6 +34,7 @@ use hbb_common::{ sync::mpsc::{self, UnboundedSender}, task::spawn_blocking, }, + ResultType, }; use serde_derive::Serialize; @@ -175,9 +176,9 @@ impl ConnectionManager { #[cfg(windows)] { - ContextSend::proc(|context: &mut Box| -> u32 { - empty_clipboard(context, id); - 0 + let _ = ContextSend::proc(|context| -> ResultType<()> { + context.empty_clipboard(id); + Ok(()) }); } @@ -414,8 +415,9 @@ impl IpcTaskRunner { ContextSend::set_is_stopped(); } else { let conn_id = self.conn_id; - ContextSend::proc(|context: &mut Box| -> u32 { - clipboard::server_clip_file(context, conn_id, _clip) + let _ = ContextSend::proc(|context| -> ResultType<()> { + context.server_clip_file(conn_id, _clip) + .map_err(|e| e.into()) }); } }