From 7c461cd04c718cef7bf034b15eea37d720b7bff9 Mon Sep 17 00:00:00 2001 From: ioacademy-jikim Date: Thu, 14 Jun 2018 17:24:32 +0900 Subject: [PATCH] 8 --- 03_day.pptx | Bin 166647 -> 198528 bytes 03_day/binder_5/Android.bp | 18 +++++++++++ 03_day/binder_5/ILedService.cpp | 46 ++++++++++++++++++++++++++ 03_day/binder_5/ILedService.h | 41 +++++++++++++++++++++++ 03_day/binder_5/LedService.cpp | 10 ++++++ 03_day/binder_5/LedService.h | 13 ++++++++ 03_day/binder_5/ProcessState.cpp | 54 +++++++++++++++++++++++++++++++ 03_day/binder_5/my_client.cpp | 23 +++++++++++++ 03_day/binder_5/my_server.cpp | 22 +++++++++++++ 03_day/binder_6/Android.bp | 18 +++++++++++ 03_day/binder_6/ILedService.cpp | 49 ++++++++++++++++++++++++++++ 03_day/binder_6/ILedService.h | 42 ++++++++++++++++++++++++ 03_day/binder_6/LedService.cpp | 11 +++++++ 03_day/binder_6/LedService.h | 13 ++++++++ 03_day/binder_6/ProcessState.cpp | 54 +++++++++++++++++++++++++++++++ 03_day/binder_6/my_client.cpp | 25 ++++++++++++++ 03_day/binder_6/my_server.cpp | 22 +++++++++++++ 17 files changed, 461 insertions(+) create mode 100644 03_day/binder_5/Android.bp create mode 100644 03_day/binder_5/ILedService.cpp create mode 100644 03_day/binder_5/ILedService.h create mode 100644 03_day/binder_5/LedService.cpp create mode 100644 03_day/binder_5/LedService.h create mode 100644 03_day/binder_5/ProcessState.cpp create mode 100644 03_day/binder_5/my_client.cpp create mode 100644 03_day/binder_5/my_server.cpp create mode 100644 03_day/binder_6/Android.bp create mode 100644 03_day/binder_6/ILedService.cpp create mode 100644 03_day/binder_6/ILedService.h create mode 100644 03_day/binder_6/LedService.cpp create mode 100644 03_day/binder_6/LedService.h create mode 100644 03_day/binder_6/ProcessState.cpp create mode 100644 03_day/binder_6/my_client.cpp create mode 100644 03_day/binder_6/my_server.cpp diff --git a/03_day.pptx b/03_day.pptx index 2ab9872d1a44074cda6fa25c4e2d3b292a73b256..adc9d51b5ab802acd72c69f93f8b1fdd40069891 100644 GIT binary patch delta 34804 zcmZs?1yCMK6E=#wy9ReBI0V<=?v~*04vV|LxCeI#FYXd7xVr@l?!n>aob&zl-&=L7 zdZ&AOrhB(`X12PYnY~X%3QRyDP?3j*!GVB-K!AXNpnzETU3sAo1p!e&^PPYl3XrV_ zd2GPkej(F-E}uV#_Zo#Pq-n+_)_Qx*5oO|;nVoDha!4e3&bbMdoZ_Gcjjc7yEzYm# zRWa-yWzZCVHe9gbFc)zUPGHsflBJZ9Hc zthK5^tQKHV+o2^Oa*CIkw9nR704T%`AL>@5QteCEPW4%U61dWv+_Qi`+N`8LoT2FSxl&ji#Qi z^R7H;W^%B8B-JJ3tyUzPa)Z#EI&_yyW!0`hm%9fwO&AX}rZ%+;Mn#y|0lVk{sf&+e zts>iOip}ZIateZ3d?Zs87*4??N-DjGliM(dPQfis!N`1lf_#u=}BXyF(ZpK47$^^9(^{#OY|4Sl4`SV_a z2mhCV|5fn31ph~LmkCsx@qbPK-(=|}m}h#rJZ#{;x=f%v7XD)xVUhbaUfe1Ffgng< zO@3|aGKRgFUr+VT?)R!ak9#u=}N)`a6%B)I!ke%4NX9DLN?V2^Sm%BL@xYM}7g-V!VKUBEFZ8P&CnX`ilb;QhE#?6gsG$Wf$bjwE%Krp-Zp%tNq)2 z1!_Wj0Zkyhg1S+5Ku!cipcK4kP$up(C=X`=?1N1W2~NPDh5n}{{oMAiNgdW0sDOet zJ>T|!?z3J0b#x6%U|T@qWi}cY`#bNcK7h4J*&qQi$2n1qunXB2c-xD(F7Pgwl)Fzw zqK~M!N8mE#DfNpBA#~ z{^s%DaO?Q#=j{hHaq22`SNX4be&Za*nAmta%U)Cdc4ytraGp(JF~@3HJuY0bW0*HQ zAxr}J8Qe&)R^}4ifC-HpT=G}T>-BZIE^Ap+{sAl^!{^9s%EP9hWt*;Q;4#0EK zvSxvO{ycFn@q5-dfGWXWJ;GW-T45b6%WqiJ4HIx`-Lj;dCg7bx|U;ZogL;y4fG26vA4J>V^JZ zecd>XJjOX7&TF>VE?OkN^ZQFlRmjn?&e5?+J0p`JZYfiZs!4u*XZ?~v&osvYqdBMvfv zETv<{oES@LTPUDI7$5cltuUfNx-x`HQx~QJRftbFavV<^ZIPSuH??0c!W*GLlGW?_C&?{8mn z5wZFzmDj77nV4_Ib=)cHSwmp~sGTXH?{MY4h{rnRJLER>$lN%E;SDMh6gDZ~Lg{Pc zwM%}|H7B?M%NSY2F?2h4CL{S5kEn%uKynYi&SRG4OM1=Un}BK>cgAUz^`#8v0uJ0BWku zy}7qR*^Xm9+Z?4%r#k!jCpOdSd7%35nr+2iIPq3M%)buaUtc-O?AfKHR>Er;1yDpB z$$(@tegehU-#3>yp@c~Igb1!A;iDh_UVk|o&)^PLC^8PKItHtAhG-McFheZ-;tgMj zGm5qg!LSQW3ROmJs2j{$>U6wG=k=*}(B0>984NOc3No<(=CA;q$L}~#s(Zs~zh#oh zKXT(^shkh|0h@?L;qiO(LWuL zUitnMO-FncLGtJSD&oe~DOt~NTnkhOVpaYQ<1CND>I()7H3OJpJ{U$<%<}Q5 z-5FPEnS`M5JS#7rJ9NK0MEVeP!N*txZL$Q;hf5H;sd}<;kaQ{}J+x?8m1~`7(N72< zB|otI86VRlh$&HgS4koNy(I=pf?Ai2?r6-#!{p1wz?If5p$`X3kM7QwF}} z_J&NWCq5s5cl#!T4b>r9>q#warHcl+9iA?^NB2Q3!Z!V6x5osL8H&uhNMLKp_9!{l zQifWhOh(c0Xwr??SKWQW2_^M*LyNcKxfYF1HT1(|JeqEcusQwD4bSN#y=Em~>1c}Y zSa5eL%Ej@lLyOVxS=!M!{-=Dm+1TYf4ZjCsP2#-^k^rrH_TsxN(P|)7qTu|MYbR{N z1l~IoNQ@W<{E>ed8Eoir00WM8o`V5**-gNJk)^Uw!ECwpSm3PWR3tE8#24h2vn9xK z=yZ91C=5{P6GjWS3*;+YI{g2ses_R0gKpU|fviUbOZeU)r=NKI*AYCZ_CN^Us>6g! zXYz%@0GB?+VuF2#i9fb*qCkrCfG?Y3Fk9?(A>H891^xat!E8wthg`;MNnL{^L~O}_ zfMiE#QMiIshes+EzZ0TEgMer%0Tn#q0o)v{UiNmUh8qr4Ex6rm)1DY^Q{3-BEFa`3 z#aiJS?ed0DAZ6T=xS1S*HLnp&n`|OJ!gL`^V$9|(ycBD2p{V1N-T&+9Be7rOEyAV5_74n6``GS8J=jTvjsmCYqoJ{@lLyp$iK zz)u@(OtyNWOw4ZRztq!f0i-?EBBwQ)K=;e?nh1Y&{2bubJUJ?cPxP+&)R7*aN_V5w z!@n%@X;tLONn+(qby>y7(L1Q?Bfg^Y!utB)@Xpw<_iF;1F>tqmz6Ah}bNTPfrW=E2 zLU|MEynhObKDdb_Bneajo6d!JBimP#(NnWCR2+xx@+wARQ7-kS%SA_#%fLkhBv_(EwiU9A<{9bxmY<+rj zJ45rw`9H6=i;Nb08+;B92$l2OtV4Wn$IF!G39LR@qyZ8o&2_wAt98DdeuO~c!{#!ZA7p%`$^R z{5|6#gDZ9>8}iI68E)CTwG#p^U-Od_*U&bO`xJ!4Cy%l}gCt7d`CQclK1$o6B8XJE zd&=x@&r}27FV5G9AN(7&+GeP*Sh#iTHA=fMBWE%Cs0vLwC8diqt|pO2?KK2%BV#GC zEF*Y=u+n6SsFoaNr2w0%>}1!7YMGEt(%IF(Ypv^0GLN!h&QP!VE4Iz?fUPJL_xq4~$3 zP(v1O8;o4kRYE7kUnFK@@BfI^rs19R+u#7GEEwC_l3K3OX0fz-3Q#m_SVxw@1ML$Z zl%Mh^k3R^+;ZCeXUK&(qlvd8MU)u){PVQLoz20G^Ynf6V#zw=NMTBk>0-dZ`&}bEy=@aC`6c?EUh{WCa_* z-#Y$hVBGI8*gc$uv#F9-VmPLI&g<61&$RXvG}v$-3vgg(!)79pzil69k<- zyB7;MI+n$Tlzi4)W9Vxw6`Y#V)WN)b0hgSQt7S*M24x;ICUkNxG#@0U(uKn#sxv;g zMXEz>GRDE-rV-fC@P@Z{aABl&smQFh#n(;0fyOTlXbMiIi9huWcsXzsdASF2$=>g#mW%=5d3USl zBrs%J&6C{ADKizm%upHz+#|XTrvgD#oBL}K*`E~mcT-b-21Dxap1nGz@p3%dWpRp4 zx}{4Lxs0^)@t+!@?3D}5kx;y=6~RjNQBnQ zlVC}T8qBxy31Rx#@<}43%`#&F>4cG-7+ohT@_ynbTzfDFn)PFgnPjUO2G8V+QnWXSWNvVRRDT*kvb*~c3)a$ud`yeDX@AP3$vc)QnxpR(~&|P=+UrDL~+{@ zuSP~qu4~Kq;aK|_UqK~pGQ)tax;zv)UjkZ+ng&@@09%LqRy~cNQRj=O^3p;V1A(<| z{12GE5Obm<+1^>c{SgES%%WoUN$dj;#zN{Wj=V2%3ekHy)F4XUtH~BhOKaOvUF8}u zgwPM4kXB}-JtQU-df9?3z!uiw8qGP9Gq_K4s#q4TP$7Cg2z%6TL^HBO@1WzC#AL~nBk z*Zv%UF9mdKNR4!@^_Ni9Kh%>8kw-&6i1Nsq^&*N>)0ep65J78t?Cs_+XI~wEnA-lF0=eBww4%{(!(w0s*4pn3g8UT&zLc4+o5i5u!Y-M2*gP8XU%^) zP;--^*5sFgu|3<(yaUdf!_>Hb1(R@GBYoe$KAvTw?Mm9rYW!QoWW{BW(szXoKOvbZ z1ZH1}3!3^Dgsqe;MsZSs9?jLLhbc30+M+zWQxB4xv|I_Bs^u_G_#|>#BXcfc`eGTN zO+%-@q!%M-N+#_^SgKJ&tI|p}9Jmnw=qhM4vtIxVd`26K7|CUF#d5Bpf~N3Q`!Z7a zOrU>z@^&PcBKXdRw;@{MO7i)zK>f@bt8VKwWctt0K)~Qqv{B|qN23h+dIS?WBiN)^ z3z>|hgLp9+tHdn0Wn9l<@tRe4>~{08N_T9r8zvNI)2BaiL5zx(!C>P{1cHKhxalsi zeZOYL!nR~kYI6C9D_uNrc-o5fqwOQBHS6Qw0ol}=pxKH3+DFnb$?>Bme#CoHr69$Z zihXIYh8B@^$)GkFrlqiLe%hy1ju450<{PrzWY!pbhS4_D#QyQ%f&GHE-mh3hVM=>k zna)I{Q%oitzVsjyeDl_9mRiJ_{)_{l1XGfcVX1TJWiit5#QJyKE!REAxWd~^R&KK< zFe2{rHQ8L&i_UbD8YxqS52r@c6yuPRoK#no0KPABR@&esj%_Jlm!HGs8!3;1)AzT$^c-4X%(@|> zgtR-e?xw(qZ?pxI=DIl=EA!(dZYY)X+|XLfVYBq|M1-n1K~(3Y(pgrq zp)5Ip+r0!0W3Na2eEiHMMc^I)^qPBmVWvCHgLwd}i{V(s90^Y*HO~<4hM{O7aa@(ckP zg$<>PPkAk-M`Wm>W>=Njy~9|sXMRpjju|SSYDDC%D@uu|Dp!^Qo$L#g3SpG#j~Y05 z71m@bVUqtUQ==@YkuX4tU|vUHq(tY$3t|VdJ3iG^+qON zoLi)GW}K&ZDIDzUJ7bn`5O}PvE(Ps)<;9}0#nuL3^i!98MpnBB@7CU0yMF)KkQWcv zWExkwbyrH(T`j|JU}vP&EzG5Ou#WSIB{`4u_?7IR47jDD6LKA?h0_}niZnet01Bgp zs2cJDIbG);akvCh0uJL^ z=GLvj=GT`Gz@d542W7Uoh1-+ip0@?im`|&AU#exj!|0z>bjlE;mTCmE&iMMPZ;;8d=DZvqVx}S0k@Vjs6QCMyyn*?coL^;*WB~|We zNqeFM8c1}#BuJh~9x-`G)Jmx;?L;$QzSSu1sj8JJE%z9*5m7qQ+ho$Xw=v>R6cro% zAtJ*=`yF{1u+kXvnx}3TS4LF~MM8O=1o22)A2}n7ZO3(0{O~OuI@a5(U3dJ+`u=9C zq9Lx+gE59!n&V=g95q$i;UvzbwxTds_-~#G)b{EzT&Zf-WjW5e@LLkitm_nf%h&&9w8 zkQ0a6IRk)wchn_UT{}iLaACD4ccP=u`A<)%V;FT(Zu|iL9=nsSKswQ4hwFlI(xG3J z{7ga3$))Fwd39N!=ECRlb+U5I!?M9taRva6=1~Fn)x^Kk zDqCbW3{Z+T7r6?mGPu$;+as|9ogk_Kodb^gFR9$4nQ`g50V}n7I*FFfU7xd2eXE5_ zH^&uAYPN*X0=bVLsB5Mm>+O{yc+#`+ZpxfVMf8kmVtTp$(vO~M8i#MKK!2T5hLO%FzN#0l5$Qh;U4&Xn)>{wKl8#3Lgi~x` z!%*Az)l?9RV&%FgntmYAG#(eGI%cg)nI<(F4j4kS6q*X7Bnh@E63Qp4 zQI-SyAun+qeEgw?vMBOLkt!DvAXTKgr(LA$2C@Xj{3?b@ zYx!@_=gRLHov$a^`R_NSit6w`yO_7J)>O!2X~foH;JoMW6YKo`Nh&FQl+O*v;BeM@ zhwHKVFB|eSVjdF*o^u>H>{{w4wzQKSzc~#>&2)V?=hMDz|4xHIqjmuZShb36Rh7nr z=fH4_s*nmAi=?|7;s@S4iP)Cj8si&`p|D1l5D`LW&(<-W5%u@v3mbNw@ZSO)cs6@| z;fY&(K1{oHJbv-WVtW#$F#A+P$u>P=`ENd%M}Z~9o|RaE0RN$FNrKdd3)|rgyQG}9 z2=XHlyKyTd_8wum8PI6FDbWaXVW#I=pdeo!(N=&t8w(qWU7dvaQ%1OKUT3H#D)`wA zCu}+^K~fOwOtz79A|9qAJw$diM#oa;riZ?AX}|WfBz)hf;hEeUZjA*=B>zQX4nnXs1P87`Re(*txMZfs`r5`$;VOljOPyy9#eJ`pDSB&o`^JX4^R|9n3eZ1 z3*PHL#BvVVe(mk!hcDG6?mZbKkl5gGa%Jf6_|lV``mzCO`eqron8-C`p9j9HTpLNy z*OwsA>i1+3`%k=(D*qV*b+H|oIilpAN`3DLncq_>npblv;YP$%4~l3lfxKowRFN$C z({xwQP4)$UV<&lIq@HRZUhJ5|r@`?y)B(1_F(!}1W?WA-UxkDahKrb-RU=Y}g8qwY zFBMTThQTbLOz_FNr9_`~y-BIBYrPd(S=-d*mD~m;OQ^U2(J+EO0{eqc`IW3vFgXe; z`DZ6GA8kDAZ_vdhmrxb;XpQ%oN?xsItsUOODQQ_o9T?)FYHFibp@-cbv$O%3TDr5H zl^0IhuM|FHZujq><|I(vY^J<|QZccD79yW1WZ;N_unb(BlSK7{u>0TsfwmM++4>q^ zM(c8ad`4xae14ZG>sPsi5XMxIDf?BQ6U{a^;*qcuK>=sb){;l+w*cUQJ&!ZfnXA~{5l}u1$|D>_@=lClgT;C@#z97zl5?TYqxsc+oK@(Q` zc)x*NQp(Yjt>J~1L$sr5UC?5Xe5Ky;QM5yJqiclEJM=%{MLO=^I3oRT9D&iIkp}q{ z9f_Erf!h!Z0)p%O-vEM(?>`h>khw>M`LjB|iM3W`7}vflQ9rLzk<1Ppot>3MZLF;TI&iJDrCT zv}<5nSTH<1aqWJZJj#E$U3jd&DKu7u-<=u7^hPIhe=6Dp9^BY{JX~&Xrl{0pa*wJ7 z1Altms+dY(r2M%}zt<$M!LmD}lLrYymupxs^T3-9+%L4QY~qlDRZ zu(SJSZb{t&cz3SynUnO+&r5*=Z}@Pd@3&Pq@HaNt1%t)vE{40u&=34{@>{CQsq_0Yc<{^pXchQa2q^7#H_9a`iFwz2^UVQH zda~SoCK9?9>bef|?N*xah3rf@!lYg6vH(!WI%)Io$-@d~!GMKtGB+O|y#(}g z=F%6o_kN!cRP6u#CRrmwHV4{4#8H|vst}Tz|H|&<#Z>mu?CG8)V;M%qOh2D_EYOZC z+Xb)qc3nNbSg;K#w10v*prXw`T-wyvZyC+8M1U%i)pd&Gv*lh$^RDjBG!Ax~jG1c3 z9|mqdOm*bdiCg|*yyMxLl)txkpK0FYkR&Jyj(M`cs1&Wd>lj8f&nZ8sMZkz%h+}qC zydN#jnhaPZ%lEwQA5~qrm^iN5^iNW1S#kR=_vXzNAF@-=-*r$-t9*TwACS5fkR+@Q z7-?;o!4{c)m&vu^aoaWhfaM)>^uv!|J_5)fYg-YnBT%wbwlqe4zFSeg&VM>&B(-0j zFqtO%mM`+@*ewE_aB|T@P}K8UEo{-;r)v3Up%_>^E1B6%7K@MAFiQmWRo@GFOu-M# z`%WJ*3SDT;z1eX)m9?x~v5C4JEy}P@uH3aBRPlMM9d9O8_ELt)c`wRy(OX z+!UmHV~N17_)XW7+W-|F@oQ~p6*2+$#I_oG>x|_q*p1t!vxb7fc%++HD;IwwRDHvU z?NbImy{=bRiZ0ZGzlYJeYKzc^8V_Nz*rA1HXkgrkMc<*> z(P!&cV5@!5s@qxzy4ywPKZk3?-L||-B)HlKaj_O3UX{kSHiL&Au;1j_4is(PI3p$bf-Bo@ z(hcuO2HYa1r15!H2Vf0)R{+IIM}e0*0!{FN2A7HMgVUcC&uqf0D8~sE^Kq+b=oSM(v(hZ zidY|GL?BkUU9>4i!m<>xTk-PQFy3MdHCuqt`RfdiB>G*85#nQ*)~&XE^(&MuH|&C3zeTas(j+Gv{%f zU^=0?FS8_xA2DLBa_p-KFBuG0Gprfc&A*`_dA7xPvU>JY%q&_vighK=QVz=@Rl_2W zaQ0);f3vpHlT!XWL~6)+{-u7tSlinZgctpWc;r3?z+Ywd`Njj<{ZwB2A28Wpy{Si2;*98{sIO)t2jWyy} z$wbuS&`|i-Ftt>&&R8lo{M66;LskHr1tWbrpK)texryWmYKaENoVfmn;O4#T*&+Kz znnq1vZ{#m}RxY}z7Sbyj&((q^CGO@nDP1*4I-8d1(;nTN;wh_-)R(c%o^P9y(KjT~ zF`b4U-@NCB-yX=TT@!ZnsV{n4eLxr?KQ9G_s;FGNf0|1#?sk<-?f8e-t{IkVJ4A+B z`!sAAtJe=VF&9H*Qzz^Lqn~+u_NmD>`+Q{p6jh(DB!n~-O^qaEa1=&LyiLCKw>23` zgU?BmMPhnlI(aC1%K13G`~COyNh7($9t$GADM2HwPl%g(ub~A$`N=Rm`)Kb+Op04A z=w;=EVCh1B-D5|ZiQG&;B~7k4u|GQP2s4Xgp(rGW%d8V6JC(TSY1f*HHSE==Chmy= z)V$Z4tjpZtOImQs^r(x$QuF3J6sB;xbf{mFv6)b}>%qca_yhWSOTWIgO0{axnRaIG zEXcptn+A)f9#ngCe*8vYt#B%iBFUj;r-b!+JJ1&E>fDYUo=3xZrQp)NZ)Q+-|ChyJ z@I{)2j+S6snugV6kN*&IXoppC14FuAdMGAw>n-gmsH@)71~bh- zUT+tJ4$5hCms#|-b#y}9elxW71*-|senH%Mj9(q9ErUb|p&+p^ytppbr1U#4@DNZw zkwZ`#YUh;p5iXk{Cv25@{$NAzNR6tyadz>zkBXLACxQz)rq?B`IttHP%8C=zv%mm1aC0Op1rRV1<~WXaO5}a*URhtQ6jD&Cxf{~iv#*sFFOiP6 z4nvq(E`@dE?vi)aU!D&pY`yW0kO!kms!|*f{ip$>>Xhf`<)S7a^bK2>rmObX&)w^oz7CMDN#Y1I(A;AMWhm-dV&&2)~T$F6{}_0wf~3K05-Y~;T#1g+EH_>l|NTG3_;LeHgK? z`C?=*+uYG)2Qd<-ff;DaSOLllm1vMA29x(%77m@n<7XUCOEr>yZagzIZ(T^4mLBO; z6-uv9Ywj)AE&9vis+%O@94#@TnvH*Vk1|m8WX%}B-X6jGNW748=`jz^1E`x#+YhW3 zm3S6Dx*X|aAkUKmc(YiMlS6{+`QO;#dvt zq7MHbdzO;EY8oR^(I9g`kt}pLUym5|ECIn)CswyfvJRYNex-+@2fI{`qee9^93hm>JI*TZAoa<8a9K; zl6uBTc66QS8nBs!WJ~r5fZ1b7`7E}{Lw@l$9vm(Iz5ge8KFuLNXl++Y?V_^>u{@(s52%zjan86dKUj5E)!#+#j+CV$o+CY~) zr(w!M%3lU0!{ki8G<8$Dz3X~#_i(~F&@*92OxxM?>w3m&SL>^jI`a+w^K>sUy zpBI@!!yt4xO-V2 zE=b!sdSAM&6)PKe+rOAGHd(n9{d$J@dd0T?f}J> z=m?PVGrju9Dy(nxSPO<}@t9S|9G3M(Y`eF#Bk^%F_g0Ye0YMxJ&Fz>Y3yAUy8Wr0Ew@-fzI|xNaV*s>q8FA9{^7 zwYA@d{2L!}a)8CSco7S>wqdoo6xC!3abUbGW1(uumor=khcrFNR?%R+>E}H$pm)~L zFtZctvZkmx;(yGDr|utV!{216Qn$)jj-DZV6ecRH6A~yG%LNxci-^gFdY8PFZ52XI zpi*L`8fEjLL$B6M^<0_OzOJWkHH()#*n)>&l%6-d_jhE9GDnZ`*S&V+N)B_#xtM^bo8gwq|;Pu1{Wpdfbq9Pyxxz;i!n zNtB3S5Cf7%N(_>20be4Tfr_ax0-xtdimrJA7M2^i!#lFKyJwNtsS}ZRz*we9(^j$u zc@ZHj2N^0z1=4zq)Fn%1ihu*-B8OaWBHCb2J5?t$5eo$rhY$J)7t3}UY0K(Jk6~<1 z#i_|1;H|&4Qz?Eq=;;;MJwO$$eXHgT#*J~aMUH1gSVoAGRbqu9WZ|UdM^Uw*5VBZK z9MD=G)=-^I0lsneG&xBCj|gq#j9eI!6=@SsP-3vbNH8@L82T0~{&}&(@y6~t`q-zf zEutBp%fD*oweiq4ecNih%t8Pl;F zdr%vqIk7|Du{FEHG$&rV?sRlAMOWp3Tc6tTjv$BeeUJ@CmPJ3Q7qz{ckAx-_g#baYzH?mfAhYJQU>J_($t0JP3#)DM-+_ zCtQGw|9@zeBh~1CXw`3uWq-b^_MG+!JzEWT&6+s7hL~J;Bj~JO;|Qg)!F!XFtIP1j zZ_sd9KOkQ)$epnW0@#BgJOcO7&*I-DD%<6vie;nPRpydy0+Z+)vKP_?jPq|6JSQJF z@3(T$1nQnaN269=ZlWUO@VRe5J+FW;VYiUL!wf#=t(c|230gu&$X^J-?b03axqMA{ zyJqX=4d5Xq@toZpI0B!~^i{3cy_{Y;t@qX*_3?zMUMTwSIH)`*fMY7H*^KAkE#IBmD`p5u3@*m z(2?@o(!6gS$*j!LxX%>)@Z-JP%V6==R9$$TNM3Ayf=Ko}+56ea6m2eO*R2apVBp-k zof$sj2K^v=0YEceVnbW<0NT7({Qn#b?s2^<9WHvix+Su{Ej=EZ2GqSw0n zf4)o>uSqxyf4z2o8}~gt=J4LMaum?n=VsTFQ&N`!xPtxPOxSZj<@o^*`d${)1atW=+!O9*jCI=I=Q^J{x%o_}1~i-jnsUEqJoMzPUYYu6BK1uq>y>+RZD z!14VE9oTwXBD-d))I<6~;j}MF#MkFcl=~4$3kGH=MKyH~MPeN@@^EPn3X09JiiLc< z95b4ifSEAK2Q}nyN^&pU^k&85fi#DDd>yGrK0|QAL|3_W=kOK($Yy>jf#}Ok*r|4i z+@U+~jzi0me7y9l6@SiO7|SO~<;8B8pU1d)7w~(2>NM(-bZzC;eRDMG z#I)uIVeGYcbwqk&}~O1?+bedGSg;v1s;AN464 zg?EIVsyRK*0RsC2o^;yBC2hX(BDRR(eB&MNGMUFwXOEl{5n49DkB4IRQ>57yx$%k} z`>9`Qt`GP7gA0|lcnQl~)7x*&`_`>aAh-7NF)`*7>-Qp3l*{fjD<|P=DZy2Yq#PNF z-1GW-n-uZ4O}p9k$Cz(2@uTe_=>sKkwL4I?o2T}FdVK2iPq-b1DTI)h*aj%wps>{!ca~rfM`_}w!=#wQuoIx_A)uA3aShRCA*{L_c&3Gv`Ym2BJVdM zov(wy`=fS`?k}WFtBTj;+fZCReFP=#z*rY2hG0lcIb1{bq@-gX15oH~Nu6%_P zL9X1AsmbNCw)~#R7<{t*K&NwSUg@Tn)FpE=nv&?lzU!`~6jxTQ8Bx_y01r9afV#6a zI5=mLb_0}NXJH+Hip?HNtH}NxmKbhemA0KOgk7lC($a;Jj?Q`#{mC-tt0`;UutD_4 zu72~_AglNu|Fm!o>X=IANJbF`b070i7jo#U_#ccW%L}s({RHf$T*qxvI0p?FaA9qo z-#l3-J8$Hj%WFOe#-(XV0|?U$v2cx>A+@u=qg{@JRW`#luZ$e#u3bBUo1xmgJ*oO;Z`%+cp(N&C<kh=%o1*AS=&WkyhEK+vn{f zg8cUgp2er59xuJ>5*7Svjb_aUe8l}eO%px=Q93R@Vp0M{T~53sQlN)yF}b8~I8OhPY^Cy&!jrxY{sn{d&T*gx?L)F&(*DnvtSG>L;B|Xq{sx7Yc;a>sAHx80kh{mdl1&YyG8o z)L$#Auow|}& z7|O5B#X)A-sx9Bs|9q=ePs=)ePK;&}6=NVsf7AHjZ4!iiuk!by|)KDkplCLYmCwfNq`e68KI zLxs8!y#XotR8L{Mxqb}AT%mdalb%Z=Xrm0SLxh=mfLrWdL9`L6-Ch$@HO|OIqHpc= zM4+#ifVj70rv?=!b^Ct*1go#usOnhTZv(1bIo%xKYd6h$1W9hDp0>K~+1m<}XyWl7 zBSli;sW2kyu_F1^9DIcD8~t|piF7DQ zH^)SPko@NI!RMe9Rfgk*+Kz>ejb6OyYYQ^0Hbb0>hNftZQA2jMps(xu3y5fXZ4i}} zjp_YJ^1n&5DvUCYq@oOH2^{H?)~rgyF>3IHaxCbVe$G?kyX<6G^z4Og85Z=`0@sKDb6cRyQ03LYcSOiTYF{= zTP@0;$;-uM$}1u#7?M1fQKUZ?140*`D)gy_47g3n@=o!c_7fipHsvL7f(l$au(Rb+ zyt8f)BBxU|=eLDvT$x5}Lq!`#etE->=+mbLciM|?dY2^^rgy-dI!vOg+E1V(#$yZu zG_Z^`P(*Bf%LPG%zcNx;v3jOn63v&TzJyxXw#CAFAfMvV`f6XUY3T2<<||zAb+>SCBuxz)#ECr{kzkQf1Q`VAoRrn^WUtD z8PU8v`MY?%WXViX;Wj;3)LOigQF{{`xZl5XE;guP!^WwrgK)fh@_@~sXoIS(X@hFN z*3b}w0wwJ=2;t@YVD$D+m7vVo^>W;%f>Be?=!O!8^>d)gQ)Bx1$Wn>2phenM#fKim zNG?uAP6Q_)jUu+Vx))q9QJc6ZPj)hP1L$5>Hzlr9g}%R{y2I296_a zryhIZ;?Kd<wlNOaPyfFC_{OFZ6{OBn<^6p%TLPGEvr|52b49n7vUFihwD9?8M zBTbY49}MDm`~NTqDM##oF$iQMXFPuD+c6fPR|8fH7EVj@tQ;%&w2A$h^EgekqrgFI zV?E}~jq9Z6{w)I5-BWsF;s~w1<_L|$0jND{h0k+qAg57b$MV-L1I0 zyS<_8zTdumJNJ*tcaoEwB=^qEBq#Y|iJD{gD<$o-7m{u>=`oOV;f8hO1ttLD2z*GT zvGh6Dx(8Y!Kr6hykMiMjwDn`ol=ZiwfyEJPMEXhai`BE6@ozh)U#1{J2a}zT0C$qU z=e7fQy9p9LR%#2=)sSm2oBsFMKiw8x6sDEoDlr-14NY;JOV2#ziUo@;tA#WFn0!ju z<9EafD-@EbNm*hpn6bi{gcD0RQ}#t0284!sQ}j{*NzgC*Im&-Ghj5$vLh6L#CKPNH z7H`VpZeI4~3|(G3YM;XzvHziggFn;vo|YID>f)q@_{F20((FoJRBqmW)+?f<_s z5L?&?i__Q$l)e%Du<#{o-ouQe)R-$-SwdMzkq0%p^Bgzim_u@_X@75C$=xGmps#Kn zmm|5BAwfCz4LyTCavxC@CEt5jtJ1TC+%M_`bMhObS;G&o_NKx#J0S4y4d=&ao_rz^u{D1s@o3-0kJHbk_cR1_CQo zeelPb2^H>-XN)eno1adypP1^C713zmgOQ8XzC7a%F zBl@v#LYE&SRJ?ZNilv`=g?cp4hIN{%qeS54*4nOL%v$y+qJv**x_Mk3n=?RU$5JFo86 z0X1WcV_%Y<2g;zlk4&N?Iyb*rq@eWtGWhfMl#Rb4}oZNAk;8uKX;@ z2@Fy3?d7^!vE9XI>ok<*QBUrzYssx3_PyrDw8aNx$YpEO0>5c0uRGp-{V|*Wwl_X2 ziBp4_T5e{kWKqx10T+^`jd!t?Qipy#U@-^j!ABPFC}(&CO5k>(p`*s!mg=H*ib~$D zG(Hq_bXck_g8{!BJvc@YK4y(GMObn-RQ1>r<)sqX4-7Zw8=qSnO>eFyqd``z z?_x0Ob48tV6Mna~qccIgg%v1-8AUI-NQ4P%+*(@1b&bKub46%CIuml-aO}i%T88%E znMv=>_#=OEIj+{hiztMi1ZrjAO+d{PlV$wzG`Z2zVGYC%#Zdk<)OE|@DIH}qXlXHYS$wbFp!W2ta6x!2$g?Vy9oC?cgDvNTF zf+*MzNgxwEGW=x*dAhpC@2AmAiJhJ2a+(rrEOSGS^4hwulKKYxl@L2{Y#^)=Ah&0G zpn*m6d`$jhhE(CT@OzrtFqiSJ-42tAn#GWX2pNT|DG7*}_7zx_x&AEbYqGUiNB zjondzE)|t;b{mH@TT6{qFnjWcOf%(}z+gyQ<|^c9$tqfwN;sY7c2!X(tj1N`oNmA=Z-ce+$<9iI&o9k$mQ7f7 zDqyN>HGun6a3FL&Kj{VoAQA@k1}>YoY2(NH@4+| zEvU8gA)5Os5i3StWOLwFvm*yr=(1<9q}B&;e?A^m$hC&rJ3c6%@xPcErN0#ZkDG(^$DHTp?(F+bPv@RuPYAOLhO4zZ1SP~aIgW6Qr?RO-YkMnQwKr!? z@!y!5amepM`kk&6q5EjDkZ|Do{Ye;UF72%N+}?O1(WU3o&{5QZrNbk?08~y%uT!-< zVy6$M70FS8a5HI>>Grl2YyR1eWPOC-RIguz9n4yx-BF#~If5(bX`#(M7TORj;eE;+ zWR&C+)-I-MM&}{@{KvCB%0LBlHwxp0`0yu@Mhhd+#yDi2@$F1MY>^?f?%bcXdG(Aj z?UNm2f#z676`t&I`_XgKOS}FVlb%#8r2Sx4M zOv(3^OdhaJP0Nnl+lk!K+4Co#xg{7SMD}^{v)^T~yPC2|j$V(S%-d2)(*CLH%b|zu z(=vg#m-^jwO~jSL6}FnYV0lU-TQ{f5$*--i#hGliuZ39?k6}Sf9R>8>8sjrHM3$!b zcrjeCr?tPpbIg@&fJynyurHiNOxk#w0edI}c!0pnrImwQ zbxd$WI|=I>K0}K)5_Ukh(1}keX)uIStu5a#_QM+3d+(-*)l%NZs?Pgl<3lzp)sxhE z)AJf^R+qZ;R&eCGV5p5JH@5e?T&My$NK=u&5@_}kYwjWS*DI%t|6y->6ALRe9L3$) zbKY(jLF(7H?9h|mQbs|E!o9ChbXRKEU1BnE{_(6n|M7_o0^&JNf(Qfg2uOUUf&>BK z8TRVH$@O9s5zWeM{KEC5CypnB{;mV;7uUK ziRV?kNm=i0`TIgOUEi^#k$!A-iG|=xWd`n7^U9xB^+x8gRc&7QT>~GBuW^G09$YZ( z@di3COx?6*!aDu@HV-%jg;$#xR~~QeN=BkCMGSw`UmL+-ks6m$Xb&i@2}X$-92`} zCf>r~q~p=rzOFG&ho`Wu^9(+a&SadXv%Qn6lhfU<$oyO(nY3p`LwkGo$7D6fgvKS} z2J_(o@UGXh#^;BV$2#Gs$8s!=!(!lhUzM)vfhL!5l2zgqqaHQ@3$)FRP53X?XyOv?&wEWag(Rfha-rgZbj?f7FqEGy- zee$Y}A~&a_fC#+_ zrbi{g$MLPHjdw#)c`^nRpCfM7s+zvPLsMFrsnl%Iw!S9XqVXot6S#*$&+-MnEO@tfWU#H(A|l;R2O?pH^Wqd7XEYo z_wL(OzXm!%BRx`LK z7tMSedz@jV64&abCoGT#k|BlWE>1#9{ZoVYbM5A5wXCpSU8~J;!=oqg0doO3S1WJ1 z@S{3Oq;&F;(`}C2ZC82>xF7L>*%=u>k~u?0q&#yJ;EVh%@)MhF725@47k0M|db14X zn1I)X)Xg7cG9h>}Zsi->@ARfk(DHB5=o8UR1VoFn=02ST4gJZ>R1;;=J z!89SoN7Bo13VNS@J6@-*Fu|=dNg?X(r(V(TG<-hExTDPTsfGp^VdnTd`|w)oofree zrL*>kR*7a7o&BQ-{iBE(Jc9H36$5;tlOSXT0fF>LzTf3+5~jwFP=rD$e;fNN_>YLs zJoHnR)Q1`K7caYB19_BA8#|WfBu{_!lv|;eH@5{P!#_>5(h5JVv$3__FGm5Nwl_AH zTb@^2mwC1)rF|?htz$6Y;rGl&Ve3&uq|jabFc0GKy0b`pnvPPc_p228=hO$Byb~RN z)t;g5%vHEml$RAe$=>7UF}Y^f@es7yxnZ5h#d);cbcSjQ0#9Thgti{F(?(gv=KGw7 z-ugn18a_=F=uNBg1KqTO2-Kj>6I7k^iQ3ZfoU#4+Q@2}qt@9nERfhcHH#O6%7%p)} z{7AkFBHxp^G~3MTIgLRaB+FD`4kcewNx#bjp-6- z^$V7ddo7KN8kniV#I9jW(}m*`Qd?O-AtV;Ao=ZACzedPBme^)r6jT#J1FP zNSSVkRB~8fwcpK~vjV65L*i>v=Zc+YGx}tA1rc?w3AywotuVVQwW6(Q?%$Qh_Ke4r zFPt<(PZCM4m38n-cX74XtG_{*p+a)$LTy$92H))A+b0#>dw>GTX^8vP^wHIzvw7;Z zLK3q~feeHJxjXAS5{~&@T2P^ocWY%>-8+35)T+{up+rOUF(s8ab}P}&(ITbq8WjW{ zaXtBZB${N%rhjRKh1KZsdY!O)HMqVNdN9qUpIQQh`oc>85FN4*L;arEf#JjKWUg@2 z9!)M)UY1DdMd?NA1TldTzPHR0VeB%XxejYc03Y3trQG(tdpzD}}qd{5I_dGo$JU_U^kvwO+ zLP2V=kr_lu5vaK$`ExnS5g&gD8~ytmE0p!oA`N6DtPSj(@ zw?MYY?3x4afvMH+;_s$2#4RyYm-yRUZ{QpJ09y3O(cU358n)s`-|8E>7N@mvuNQ*< zL`+u+tbgU*LyzJ*K&Pd&4N`9V4*Fu;P0k)NAtL98g{vYeI+%7cp*gUoYltC?AuK$i zA>kC#*qME~G|C>_q}V2!!s)(3o{@PD@d=p7+a*X%dfcbs@SN$K8d4BZzTi!oi+=iX zN3yP{Zd5|TdKSa2M3fvCF|t$wLJK#Mk(VA>79NtkPRgQ-H_t<%0RZpTMx=_96+o{Q z+`X!b!y-}lIV)y$1&?EX1>|pzgae15imcd)U@CUx&52A|0Ka9fhfCQ}5!@*H{s7pG zGrzd|wuyw3z#>JigUdu^w}Q~(%5ORZ5Gx8-631TP8Irgr>vkH5UPEefhD~`s%g{5qj=q`UAef??&zS1EWA~V}h(sNN1xGT5aZ>b7*({7-*Bq=d=N`XSr)duf!_JS5!Ir@H+E$5M(t5pSRLXTKW zCiG;5^8usA5NQ=6sZ8#78M%lgsPD23QQoc7XU=26M&lxm`iqk1{v;puF%<_YQ4%+e z=!pILt#YZoBbJHZf_X*s1{-`ixFe&$WsFtAW?-zRQgZ&8HCue}Q^WF>BGC_&HEli( zKfZgq+cpS(gB@A!qWm6N5_~O^itodh(22%=aD9_$h*BqpDi+BLIjxOA&xJ{EhUxul z)%V+1@_G~>+K+5C_IBF17{D$KL+bk7;~e&QY&b46<7S!-oUQOwnQEUXi;mMKS-kfX zSYDe4mXiJZl;+mNNJ)QQ!{4RUc{umeu2?MV@SVT&j=^JbT?G^#kCF)OaU)0O)J9!uiDxVdN|NwF>G zFSc|y9}9K`U2w=uTtpwgc&Z@U==Nv~pg}-Pw7rhKdH#Fz)ConjcYNLvsPes(4he-l zwdss&eqS0%M+)s&j>%V+o%X;dZy$U+2w{Bb6zD)Qe{ydU@>}uwDWJ3}Pag$e3JIz+ z-@?yNY)u!r4g2;j{M*IfL-tyO z9Z?eemP|k6(kQjk@$!K;pr^Vx^9dfMI*ge7>^mJBs|Kp2T<4KR&`A=E zq(&B>FEKxrrjei&EuCxZ-R{7P_eKr7cUB3sw$5)po$l^d=>4*L9yrfR;R;acD&PsT z5fUVl&kGx;ZH(tG3^fBX=e4*WCJ04x?F$p2j9)vPRWpWO6gS=2ak+BbHWev6cXn;7 ze&r25oH~qeKA&Y?%)Sk|HNIRv%X+e_wgYdO8d*BsG;>UAFcQgWYy)6emPlztw?tAd3vgjTR zn7fQWGD2H^N5l5NK~glOXHR29XOAHb(|@z7m*0pXe55Y9IGfH4hq5-qzvnSq-aT=; zdyxHfoQ!akH7HK zoyVi%tW__*I%;3DuE}wOSXpI)^4GyfjRk^_8q0UPdMi-GkJmgV!vl>3KDcIvl_()~ z`&6~!d%CU)o!5wNc<5FvTj<1WPNDqe`u-AqV!-v?BYa>)hQf%OUl!lsN-1^x;jRHgLBY_1*(R`Vxv44J>+Dxk!>xx#WU&=Ycv;$?&&!;O z6YO#8bGZa)x;gh=xUJdYDnDaLqRfd86CQusr6k?`EZV&sbGV{j)Oh|eNp>2!w4+&X zuOt{*>t?Whx7WpB%aL+9B6jS-8%h;h#LF?_HdXyy=OfO9=aE3se*96o=Y!cB z7iASZCF_Y*shzz~l6*H!>X$7VYF@f?#+%y_rw~j))fy?IeWhyrcQwD8NuB1@W^-8r zbZm@(6@T97^M;(Fz|j6=$RZ@nAlN?@Q0EL z9er}50MVXk6<>4(1#y;vEnHHd4&u@$5OYkTzR~ol=#3%>X=Y!TvGSY{O zmQLp8m?JAV45ojXr#V0!MD+{8e3>SS^x!K9a%d_bl%gQQIcNG*ST_hOKz`*^unbvx zOte>?WQsJIFIt5@lw3n4QCsxB;0LGnFJ#6X3T0jhKP7Lia35?@zzDD+Vw=22idaJ! zQ+5jA2cxcR3IBn%tIF#FUZzr^UsEX;v&yNuSSPf$@iDXZ?$Pc`DYAydBHes;JP{yV z6k3ET!v3=xE$X3nm58oyu&=-I04J4=N!OJ``r(pILFtiAC{cTKyf^!B))E~`bR?3< zkN9p;==IC%03l@AKfOQ$sq}Cm0?#Xx!0DzHYyCh)?bJ1Yby5o^2lAe36nYO)yT}c{B()Aq;ZQ zWvNcA?V9F2Bo;{$7m1h=;VXss7S11-lD8LKY+77t2+!m@)>sWx<&cZl%;K()NH-cO zY+NuypsponvnI@pctVm@4#3XfHIo#r`i=ST@xK7IaBE;wiXr7v?u2>mL{;il#n{&$ z&iW*t^GRMJOp=9HxQf^b!u`my#eT%>ECEyi&4Wq7Ote7gHw|X=#ut4%=h9FK^7_+v zN8M4YT+6_4qMJ8=)D$92&0fd<=u_?Sh~4f0-!)o#L+bU$GQ6XXD4O?)MDSIdVI=Y7 zofy{?>FxoF@GyTal3s@Yq4)bg3^+bsd5sz^Kq1>{Qy~jt`{0}S;4vipKf`~ragA(z z3a;%0qND>I*ao8{=3=>0TVNhXr@f+zrsn*d^dhNF@B*Q3FiTdyHXLshnbJ2!5u^Y} zOm>$D7@m!2sXfBIX>85myci{(Pe%7yBUd+Kf2JYC@g@98WFZZ8rGAEs>ifP7|DnR% zGRU{mM)Na!?MW+Nx_2pfPRIHEYcNej;E zd_Tu^F>1nZAWN}U{2kO>uq5sl{3m*+z7&J(-(!Ci9O6qD8h?mr?d%!@;!j=*MIGj_ zM}w%wA6HNLm5iNstgi^>NO#1vh;}dwY8CC!3kZHtf z9nMG|`q>Nw??6cVIzIh9vF&BtZyK5_F~UzzPT=p9Ms6YArSGAq?O0lriHlXzwE^h1{r&9}op40r^{C3Kl%eNtp(25GS zoC*any@c5n9KS_f;kYv6L`q5VomKH6D96YRJdVVu3ukSc)+MA8R%H!?L9IW!6(i&D zOGfTzOlr1OZS2QcdW^?(eyr}Tz8%vWHo!QKP2R6la1yX1I8KTBp61u;%6%_tQvrlO zyvq<^geCi!EWFry7~gd+k9EV<6#P~A;2>G_wB2N0L&}!rH(?Ez3z9ix0z5kXuuf=Z zhKPAKWQ{Kc5ii!4nS}2=@fMP6CDP`ViDL8(F;?PAvc`KQ%u{eN<}M*w3}?L?4g~wv zlhIKEU_V3~w&xR&I`E+t)!bq*4g`dDqr=f>V4vGtkbD^m3L zj`1B`P@=3euGQ8dm7qZq__X95(E})I29cui^dFMH@%W9J;vYs3tHZlg3+FJ86s>Rh<|jb5(c*64F{nnL7f~f{Nq^xXDdr`d-V9a+zS^n;8>1hm*pyGm2ugk(V zxYkiM?4&Kc4kIWl6Fyc62|FKOB$NV2nz0BiL|lmrCz$I4VOO|)LwyarFGjvCY!!UgAoC6MBohL)A+#b!DFHLQ!yT)8@Ih-E zK8_%!XfvdCWC$iv;rm}eF$N18-7oK=EkWz;X`1?EB~A_>KbUEEVOx~Z*8xluxi#OW z0Ct;T+Q~NxC9qfTPme9cpg`g*CVF7nDc^gUUmhyMj5zS>^1Au=CxTlt_Okl zj4PY3L{xhlNO*^EBkM!X>o+0d&({$sHREzOZ*e7m=wJ$(_iO^1sMA@|GbEnRQp1F( z5XIGs5a&yV5u)H@U*KZelLgHkJl?6*%em2*maijg5wT;%)2bn?Vfo_DAC%QGr&(I9C$X8tyo{9(lws-p2HV(YpEJMR0N!abCdRDsWzWvrllW^gW!#qzXm>NF9rURJIaiE1CrJeu83U8Jg2`_hC#ZfIxMw#(D%v7{rMe9euhjbnb8e^W^c5LqV z+8GQ2LJ4A+$-8QA3yf%FSM>CQ><5n0ghsqKo8J+>6PC>t1BvY_R~ZtzI42T=GFalA z?@Oy`tcv5PD#z_Y`PgCi<30T$yTV~0DR4@-+6#2fhYrQGY4>(%=j~b0+K9#zQ?NP+ zbS%@6`b;Smz^YXdA+&^89JM(ck`*Q7(>d8bY%|*fUlX@aZVJOg@|u zU(!GxPmywS3&ZBabhE8I@Rh`6lbdMOfBzuW*gHgh94*4G%JEU`%uKT_^IQdcI=yP2_-FQt*qI?cmp{z5e(pEoCDmpXbEReKNdCcLtJ;);6K2`deRdtyugSoRc zUM#0PwC?$g_HvX8;xcYypAPu!wTv&X|Nc2&SKdC_{OKm}K8Cp?!*w@DTTeYkquBQr zw~x)RHq?+mMg}plbkHEg#^e$TQSXq!M`tmNileb0VhiF+qBUQj<(>g|PAt@`3SCOI zk{t#4gEwqjzAn8#ZaPQ3Y!BMrcd$>4pJE)@`s9EnPbY)B9j5BUk?wUh3jyRyRdI}G z$>JP|y}h6;%p+TR-c=Byk1TR{Q(5?Pk3LC3VZVVlX{hLiQ}g{)bCWd3z4Z^!enD;2 zW}l^!l!9g1zC$3z#!tuU{yfh+d(g$LeSK&gc~t9XI?Y96Wm+?pg(UU-;w(aYCa1nq z`nZ0RiM$rI-1}PNQ@aM!GF9N|uMe?XtOEB1%#mS1#`kyXU(p8o%)i`Q@b_ia9479T z0LR{2kp295Wpbr_7PrdH&##xbzh%C_&6loVwXMh5`t_rRy{^I0?+As? znAxA1-g60JFKce@HGB@H!<%}o4G(w6%fiolUCyn^(Pnz7aH@hT2LnKRu5=+TSPNW2 z#PDV)Y;!~hX&mF>(tVs^(3&l7wRq~JTtc;oa z*CzfLFqI8hPfipGS!33sN!}0S1&_xa$mTc^CUC!tAZ(%~xH*{JN|;8Q-)6Hv344!Q z*IL=!^<{a>!p{rX{B(J%_`Gjuy~&(Bi6>bVZoo9yvT2wml^E4k6shpBS~qtnUd72g zP0Bc7Qae(mPKL*VXey`tcwel%N>Z8IC$+bRE!OgsoiY1;a_zO%Vs-Ozm~-XfLaig^ z!f@7?vue!i&Pn6!$y_*D9X59U6I=M4RKmu? zg}#kaM4j>iR)qOi3lIJvAa+`IKJZ#ALAHU{;X~B1D^P>g8;7{1P;9AaU{w`TsEqG6pf(KmvuhA+jlNh|q;%E~MZ<;@Ymv(y{oT!*@L*w_4<__Z z*4EP1@+7Ty06`sI;Eez5iQJXMeeL|87&|r1yN@#RE+F z{Pc8t{p_;jUkC*g3lFfwzwpNRoybZL6)Oi%h)nL6v*w|$YCFNFG-Hf*b`w@al2KH9 z3`-WQ%Ny9o)ui;8oG7g`tnPNtxLyXW*Y(HfM_H&In%Dvq+82Wb>P8Zl-pmd*mJ|0V z)D9p_W+|cD+kM7+JU2&stp$Qa&B~#HvK*pbkVzeQrA;gMORZ^sb%aV;Nqnvh+0VX9 zE|EWwTI&P_2U{zjTenyG``RaT+?m4tgArR@$LhOZBir;P-cvs%--}b%Ikx-;3I88*z|ckluE{H-V!_vMbRbw|O{2(deFcBJh6RjO$QCF{}Kp{_|_iKPDq50{ZKF4qACIqi{RNQro5A)p+-Q&`a2B7!}Mk&9p`mXCa`afKK~@If^bzPJjq0 zrR+*;VJZu1Au=Q@!ESD(Nh9&ipoYs5}+ z^dxaaiF=qT2*wP)0B?@a2XuQQrV6$TWy)y#OL?!)-SogSPC!CUx{*p8y zPIo>VQGq>wmI7bKA7C~n(C7vvIn<(L6X<*ck`~C%Bw)evGc8Oa=56QgwU@{F&C-rv z6zg#4n5!F}( zMg?^_Y0(BHYf4k?K7H!k&n%(&BsUEQ4qwd6HgO2p zZwG3fr+I$ZFyii;xZNoJ*;KM1R@BsMu6Mq{U6S~7vn^UcSjQbw@<5jP)e z-l}`Oi`u3uFXM=C8E#KlzUsHz>urVNG0VMsi+7Aa-!8MP`yGjaN^UjNc;MjFtAzDP zOoH&}rZjJ^tcY}oBRscTk<;N;KYJ+wqi7HN`ZnkKcH`2j<326K-RV2}`9&lLs@43< zf2SDizq9v`{|*($QPH`JW;x@PDwhBu@Q`?VkRLHc7yuqiROce{e#q(SAoy^@L&38a z6vt@8e?M`VBl<8ek~%~?<-sRhNcM5->tb*@Z6q0$M57rNBk-O}N<&8elSq9l-4p^W z0>*E3sc%xH0a7tG4PGaXx}H3xygNyYHLcFQtoOyv6&2{x9ZvZ8J)hZY1Z|}m3fax! z{A~kx7YP#%Y?WB{qt0*V=!uCVianHhJX2HeWou>BWjb~@o4$WsETK;#n>uIvpcDZ< zk=OJf#mAOwOB>i1YJbt84ik2CR>b$z=%u+~6+3coXk6Fju$wIZj_a7CW+w))lNt#p@*z2kiLM2Eh3)|}4 z?hW1El*%$8Rekb^foa*Ixp|lcsZK^EFY67r+X#c*kg|_iP#d{zQ0|-__rp{l>w5km zY4H{5v7W_QuI0|Thzy4fLfOA5rpsp)NXGG!Ro=|sGE-wYzr&;+XxtDmCB!+KArl(T z?{Nh>9>MUWSm&12$Ac#FH4{8*tvzSv9rqiTZfI(ss;o*!xzA0xJPCi?o1IkYo{anW z&Y15aD-etl6Nse3mFJB@_;Sj9k}qwu)>}~xWe8uUbV&_cArW$+@~{p>I}Si2qW9o+ zKs09(O=3p^`|e1C>|cC$as&0N*h-_YhJhK_7(y6AXgd2$XS;D{&ET1DT1HQSZ|WEJ zAhd)==8xflgc<&_BBgT8ckihy*ek;^XacI-*Ip*?G1V7h8qv}k8^ZSw1v1pHvec2W zo4fNuBz1c>eccoADxsyt$wlTVXe{?!JFfy>Chw_>nlPH}nmym&6zJac`g8;Vsa4F1 z*wHyCyp_YeY5O7A!0yS$m}Xb7WRe(b936BW+nM{G=VzJ;2?LhO;H@GyS!>P#&2eF8 zzdFkif@X9VIzK``@9JffJ)eTqmmiONgrC1%?Aa_opDZ7D@^LAWTlAoe10Y3NF6YU4 zNPFP{#W9_QRboWdRM9i3aWy)?D;J?#`#I#%s;e0_AxIJ;HMFZKoGBf%rIuCu1qB~^t3AmpKH#EZBr=$IqBii)a6R_2xX~Db` zffwj3hUtlpx&fG3Ue)LG*q4nES($eb_FuvsG+YjQ%4Ha4piLv-y|v5}?9G1svQdx6 zaYvv;#Kcw4k7*v`bW(o+UI=t#X1aASl);EA13Gxmi_#}W@;*cK=S(t4jOH)ndEv+Z z!s!l9f4Lg9gKCM_tSeA6Gw*s3ikaoZA>Mr~eIGkbZWjz$j$>!RTU+Q7w?$!>?Mh$q zfHE5-WR_*A`<3Br-$qpHm(^(bI;n{Yr<-OqcC&UOWs`AFvkDLo)}oY~wmIWb4@R2|ktLW%lhtN0PmY&E*R0AV?Y0I2OD>N(D6g@FZAscCmB+(oaOYoq} ziVk@!N>rvO8h{Pg+$)32EJ>Wxn-|?Cq3M*acE@sM9~t73{8VgLhzl}rwS8FedZ<1( zak-I+&*H3vRRnHa3iop&vLW#4hhQ^c^scBJA_(JS{@$6YQU0y)dqf;Xo8K4gEtVUD zY{O^vN1wV=+;Q$?z^YV641%h|HG*Bnrz#O5|Cf`jMc++XIg0a}SeU3pq7tK3KBsau zj)Oil*KJZU3ha|2sM0pf!jES>M~`D_SCMo5cbzDwitAuT80<(>6K|X^&SY^08CZGV zZQ(RhZ&43D%Vy}Mq#e6Ar`4{w{dBWRnHfKHo)nG$v`NDE5|OT7+K5IljOJQ{YSa-0zo{HNmiT+vS$8Jn0W1cGyr zO|?QDKOP+*V(k!1-~DFOeH_Po25PCO2%SY@3@FBlY*S=P(XfdbaRJvH-45H#n}lD$ zYpe1`go}>ce;%@sKtd5?aH@q_!v70~Gca;Cf~mT3A|H7Fm1FV-w+CymK=#3$`QSN) z7lzu8fxXaQ_wZW?_H{klF0CiD6o>UQ@h;Zx`L{!H?G^-{*`QuUK^*1Z6=E8If)u^L zJfO7SZ&*5o%+F#3G~F~dqe9rkeAX3cFp0~4p24nLV{O$ZFWx(v&xtSd_zN%II|5+m zoyT@khk|xe;#;mz8srQKdJz&ok^V^tsW&p5lJYqxLhEPszf~NQ)&Ba{mAnP z(XBp77PQ(WQLna|i;cp4gq)aUQ!A+j`{8Wuy!hd4M3vvLOTGHxEE!cz2d25ojGu>L z5EOxjYC-b;z+G`EDA{NjEjg%?gh?6(9NizSFg{Y5Aj0}zEMdV0KxSqI>xX+>nGA#C zW}SM<4KAdRe>>u2_2a%@x7XcTM-eqMIi|cVx{`FDsoT9bHpvI^i-+0+9o*{b-nMGE z>J+0`xRO|Yr;o#Dq=U3qbcyg0$*9L@lMen~j#1fXl|{M~-efO@UcZLvo0&7qW|7r& zB&tgn)&&&@oON_q)iMYol%)@l2)t{|$9?ibQ$K{7;|$V}%|w30 zjrW8s)K_2ra1%$(3z7_JJ_fdU*`m!lh7V|c4kBDyWA94Lg~kUHD>?*2^kHs;HlQhJ zxMXZ<47Z6e)Fbiz4(0=qKd>`o{W=o;yxg~Kaei51)lc-Z%^Z>EeJZ(msqcLbETIyd zX%Vz^3Lat)e6G~MZ*(GPJD(j#(F;0ftlwP^lDaHgKdVry-~}`-KLFsdq~I|MJSCSV ztuC8!f2|wL_i8IWvTDEMvytjqE*WN;NYR33u!+;9MX2NPl>ny(jC?J6f3+&h}3iHqUo7E(yS{WoNWf+WNg5gSq0jbR!H8orFF^7&7 zSYqPh6RZ;=^R&@!;vfEWe}Q|VjD14;7Rz0o4JONoi;}V{k-!_sfy`M&<6p)nXy{wC zZ(a`PS%k#RY?(u)noej@RK_Ggveh1Vv2-Dd?_8--@~h&j$ju5Hw5BLssRqe+Aj_T{ z+mXU??KPBk)JiR9e4QqlG)AK{tQSK}s~ z@;s1=7=EzNrpi|X?Y(OU=%!7^NeDaz5ZKC0QWwT29rcd~t@zq36zs&BZ!Zu|!S zO9tnVk??|3)3es#+mYp;wL!R#{WJ%W6kZe&o^xojkk;(WaBm{DuEQhhYWGrLWb^@c z1KGrTY7FCG&7}kDBjD<#eO8P!cNaBge7D=Yqbm6`B zvyt~567aK-ey+>R7E1ztND1x;;*v?A-_p_STm7vaJyr!9k#R{z;Jl*CDIdSENS$!d zYTvFyHi1?h3-F{qrU6^azGxe^=egap^sU2nSjJf2y{!u|N)Y#=EFOvH5CI?6*NyO$ zn78&)!@UI0Jce6<`<{eLKCJRf`O!q8$u^_5?~ZF~QH&>tCy6NJKcILHrqoV(TbHu4 zke;Zwy~s)DohB#};~4|8JY#Py*TQ;A`y6Dvz@)X$&vBAO=rHO&OGc4(c*X#FNZ>j< zdf>72J!;HxVXC5Rr7{&uFqU+}j``RUvpfAXt&v z>NnEXrSL(i7%U0O4*h47Tcsk1$b8rt&7CrA?Z+i>+P`d&<~N`;>4lkAwHMef#wVs6d#mC+7$9Xf z6IGlf)gPQ=Sa>eC;0OW`b{B-y`i?JC7yC#J7-YB&t8n6;{Lz!pW$%DV(?V0NNMXiE z&pfDx9Kmt=#N*Wp6A@_L3Ep%yB)})*1Duz>fr3z!g9NZZ{4WxD(B@Zw5@I|w1caWw zvE?^5kkU5*8=w|0t`dO&)NKaf1XRJlgu#s9h#+kX03)Cb0gS0Y`+nd<)>q5`gn%MM zkew;uBOnhcE)#_cWNi*kl!Xi$`vxEY0W82dq@n!H&G{v_B-Gc458uEb5$zR#dBh1{ z^NL0PD*I^DMI7*6%Sy*ac+p0WbHhRh9asSn z0XF!5ix9K~yaiYhylBTo;UR*&tiW2Pgnw};J|bxF1sf9m%^m&4G+pAqao&W8uO(=b z{EY*%oBykNDx`5S7*rrad$6J+*=wc1Ea#kn59F`5M6vxOFybtO>KGGBr z5OF#rWUsjlQ@<1e;N%2h*n_R@r}| zf7{i-@Gp_lOMlfez90Z6&ugAlOn)KQn^#!I{0iCsLdYVJ54fWNoP4jbd91Ixyst2e z?FE7;U&>7bvu5KE#5GbQf|hK-4UhyT(+1;KDnwA!3r^(ti-B(uK|n_^j(z)rL9~uw zlOj1^8*9b^3_`hH8!L<*@wE{G!6e<_oYI+IZv%iYn5`SES!NGT?8W;x3})Tt1h|0- zyTR!O$PxeJ_I2X_n_$}poWNe-ZHiH+JAu`ZT)}Dxv`=6>r9xt(= ztC#Y5gZ?w7BJgia6*va84+Lj~8T(g2=nWQt>4pgb4GDh*Zk}KPm~fa7Fq86E!2KfV z^Z*OAGyV$BJir2B7q9@S3@pHZtv{HFm=FNb@Yh^IXRzt0gW&MLA{Aat$De$OjIDrq zRRHr869O3KLGRrG^dKTPFzDI`@wfrR0LphDcknlq8!RNK%?%(5^$80S1nmx>1KEIe zpjJpBL88cz|7!Q2FWE4?1&z3aHDhH!SRUZ);=tuWQK~|MDqO+pOgfOD3sTM(>sO$z@3Y!nOck93+NJ9|27XTZy z1#U9-e@K!cAixLr{l}*^6%xYM)`9JtrJ0fOx7RQ5V+8r43g*E2&rZQ80SN-Zc13}k z8|ttYTrF2f+}GBr_WyrU+H`=9Ji#f!#94%Z;|Wlm7Z`x4vj_o4%OHmr04C4+&#Xna zK;AD|FTJE;*$3T$)3E49 z7WR4R3PM1_65wAw20j6i5XzPg0P-FLH}3-YJVem9mli+Z0Dz*s!3F)tX^8*TwxPoR zqaeP&1+o3JU-ZAti%|O?T8UoZUi`<;{l9f^4E~1>&)<^R|5+dZZ!K*5|DnbCs`byT z_J3>Ty8RC=?$_ok_XqdiLjcImA3zNP{|i6_4f%k7c>qDL5)xnVj~0CJE6_#?M!gD;UxfV8uOI>+oXcMW3iXK5=MTZ(t zK@ixMiQ3l~@?dZ>>4q2Z5fIh-Dg;-Y9f0ur6`+QIQzZ1g0-X?W%=8c_Dg+<`*q#K9 zg#d*A&jgNKg~UZcQEG8OQGUVnhn>LE&a?~Yoto>@1G|`%We~kE1_lA7jL*Q}cys!M rE+!=zaFdvkfngJ{uO^71;`^QH=en4r`8pUn7}lvXFzmSxRKfrNO#Mq7 delta 5578 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 BhED(h diff --git a/03_day/binder_5/Android.bp b/03_day/binder_5/Android.bp new file mode 100644 index 0000000..6ea477f --- /dev/null +++ b/03_day/binder_5/Android.bp @@ -0,0 +1,18 @@ +cc_binary { + name: "my_server_cpp_3", + shared_libs: ["liblog", "libutils", "libbinder"], + srcs: [ + "my_server.cpp", + "ILedService.cpp", + "LedService.cpp", + ], +} + +cc_binary { + name: "my_client_cpp_3", + shared_libs: ["liblog", "libutils", "libbinder"], + srcs: [ + "my_client.cpp", + "ILedService.cpp", + ], +} diff --git a/03_day/binder_5/ILedService.cpp b/03_day/binder_5/ILedService.cpp new file mode 100644 index 0000000..d8c6244 --- /dev/null +++ b/03_day/binder_5/ILedService.cpp @@ -0,0 +1,46 @@ +#define LOG_TAG "LedService" + +#include "ILedService.h" + +#include +#include +#include + +namespace android { + +// ---------------------------------------------------------------------- + +class BpLedService : public BpInterface +{ +public: + explicit BpLedService(const sp& impl) + : BpInterface(impl) + { + } + + virtual void ledOn(void) + { + printf("BpLedService::ledOn()\n"); + Parcel data, reply; + remote()->transact(LED_ON, data, &reply); + } +}; + +IMPLEMENT_META_INTERFACE(LedService, "android.os.ILedService"); + +// ---------------------------------------------------------------------- + +status_t BnLedService::onTransact( + uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) +{ + switch (code) { + case LED_ON: { + ledOn(); + return NO_ERROR; + } break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} +// ---------------------------------------------------------------------- +}; // namespace android diff --git a/03_day/binder_5/ILedService.h b/03_day/binder_5/ILedService.h new file mode 100644 index 0000000..1def502 --- /dev/null +++ b/03_day/binder_5/ILedService.h @@ -0,0 +1,41 @@ +#ifndef ANDROID_ILED_SERVICE_H +#define ANDROID_ILED_SERVICE_H + +#include +#include + +namespace android { + +// ---------------------------------------------------------------------- + +class ILedService : public IInterface +{ +public: + DECLARE_META_INTERFACE(LedService) + + virtual void ledOn() = 0; + + enum { + LED_ON = IBinder::FIRST_CALL_TRANSACTION + }; +}; + +// ---------------------------------------------------------------------- + +class BnLedService : public BnInterface +{ +public: + virtual status_t onTransact( uint32_t code, + const Parcel& data, + Parcel* reply, + uint32_t flags = 0); +}; + +// ---------------------------------------------------------------------------- +}; // namespace android + +#endif // ANDROID_ISERVICE_MANAGER_H + + + + diff --git a/03_day/binder_5/LedService.cpp b/03_day/binder_5/LedService.cpp new file mode 100644 index 0000000..a62c39f --- /dev/null +++ b/03_day/binder_5/LedService.cpp @@ -0,0 +1,10 @@ +#include "LedService.h" +#include + +namespace android +{ + void LedService::ledOn(void) + { + printf("LedService::ledOn()\n"); + } +}; diff --git a/03_day/binder_5/LedService.h b/03_day/binder_5/LedService.h new file mode 100644 index 0000000..27508ba --- /dev/null +++ b/03_day/binder_5/LedService.h @@ -0,0 +1,13 @@ +#ifndef ANDROID_LED_SERVICE_H +#define ANDROID_LED_SERVICE_H +#include "ILedService.h" + +namespace android { + class LedService : public BnLedService + { + public : + void ledOn(void); + }; +}; + +#endif diff --git a/03_day/binder_5/ProcessState.cpp b/03_day/binder_5/ProcessState.cpp new file mode 100644 index 0000000..07b6867 --- /dev/null +++ b/03_day/binder_5/ProcessState.cpp @@ -0,0 +1,54 @@ +#if 1 +#include +class ProcessState +{ + static ProcessState *gProcess; + ProcessState() + { + printf("fd=open(\"/dev/binder\", O_RDWR)\n"); + } + public: + static ProcessState *self() + { + if( gProcess == 0 ) + gProcess = new ProcessState; + return gProcess; + } + ~ProcessState() + { + printf("close(fd)\n"); + } +}; +ProcessState *ProcessState::gProcess = 0; + +int main() +{ + ProcessState *p1 = ProcessState::self(); + ProcessState *p2 = ProcessState::self(); + //ProcessState process; + return 0; +} +#endif + +#if 0 +#include +class ProcessState +{ + public: + ProcessState() + { + printf("fd=open(\"/dev/binder\", O_RDWR)\n"); + } + ~ProcessState() + { + printf("close(fd)\n"); + } +}; + +int main() +{ + ProcessState p1; + ProcessState p2; + return 0; +} +#endif diff --git a/03_day/binder_5/my_client.cpp b/03_day/binder_5/my_client.cpp new file mode 100644 index 0000000..c651d64 --- /dev/null +++ b/03_day/binder_5/my_client.cpp @@ -0,0 +1,23 @@ + +#include +#include +#include +#include +#include +#include "ILedService.h" + +using namespace android; + +int main() +{ + sp proc(ProcessState::self()); + sp sm(defaultServiceManager()); + sp binder = sm->getService( String16("led.service") ); + sp led = interface_cast( binder ); + led->ledOn(); + + return 0; +} + + + diff --git a/03_day/binder_5/my_server.cpp b/03_day/binder_5/my_server.cpp new file mode 100644 index 0000000..18816ac --- /dev/null +++ b/03_day/binder_5/my_server.cpp @@ -0,0 +1,22 @@ + +#include +#include +#include +#include +#include +#include "LedService.h" + +using namespace android; + +int main() +{ + sp proc(ProcessState::self()); + sp sm(defaultServiceManager()); + sm->addService( String16("led.service"), new LedService ); + IPCThreadState::self()->joinThreadPool(); + + return 0; +} + + + diff --git a/03_day/binder_6/Android.bp b/03_day/binder_6/Android.bp new file mode 100644 index 0000000..6ea477f --- /dev/null +++ b/03_day/binder_6/Android.bp @@ -0,0 +1,18 @@ +cc_binary { + name: "my_server_cpp_3", + shared_libs: ["liblog", "libutils", "libbinder"], + srcs: [ + "my_server.cpp", + "ILedService.cpp", + "LedService.cpp", + ], +} + +cc_binary { + name: "my_client_cpp_3", + shared_libs: ["liblog", "libutils", "libbinder"], + srcs: [ + "my_client.cpp", + "ILedService.cpp", + ], +} diff --git a/03_day/binder_6/ILedService.cpp b/03_day/binder_6/ILedService.cpp new file mode 100644 index 0000000..a9529ad --- /dev/null +++ b/03_day/binder_6/ILedService.cpp @@ -0,0 +1,49 @@ +#define LOG_TAG "LedService" + +#include "ILedService.h" + +#include +#include +#include + +namespace android { + +// ---------------------------------------------------------------------- + +class BpLedService : public BpInterface +{ +public: + explicit BpLedService(const sp& impl) + : BpInterface(impl) + { + } + + virtual void connect(sp& client) + { + printf("BpLedService::ledOn()\n"); + Parcel data, reply; + data.writeStrongBinder(ILedClient::asBinder(client)); + remote()->transact(CONNECT, data, &reply); + } +}; + +IMPLEMENT_META_INTERFACE(LedService, "android.os.ILedService"); + +// ---------------------------------------------------------------------- + +status_t BnLedService::onTransact( + uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) +{ + switch (code) { + case CONNECT: { + sp client; + data.readStrongBinder(&client); + connect(client); + return NO_ERROR; + } break; + default: + return BBinder::onTransact(code, data, reply, flags); + } +} +// ---------------------------------------------------------------------- +}; // namespace android diff --git a/03_day/binder_6/ILedService.h b/03_day/binder_6/ILedService.h new file mode 100644 index 0000000..9a67220 --- /dev/null +++ b/03_day/binder_6/ILedService.h @@ -0,0 +1,42 @@ +#ifndef ANDROID_ILED_SERVICE_H +#define ANDROID_ILED_SERVICE_H + +#include +#include +#include "ILedClient.h" + +namespace android { + +// ---------------------------------------------------------------------- + +class ILedService : public IInterface +{ +public: + DECLARE_META_INTERFACE(LedService) + + virtual void connect(sp& client) = 0; + + enum { + CONNECT = IBinder::FIRST_CALL_TRANSACTION + }; +}; + +// ---------------------------------------------------------------------- + +class BnLedService : public BnInterface +{ +public: + virtual status_t onTransact( uint32_t code, + const Parcel& data, + Parcel* reply, + uint32_t flags = 0); +}; + +// ---------------------------------------------------------------------------- +}; // namespace android + +#endif // ANDROID_ISERVICE_MANAGER_H + + + + diff --git a/03_day/binder_6/LedService.cpp b/03_day/binder_6/LedService.cpp new file mode 100644 index 0000000..55b4ca0 --- /dev/null +++ b/03_day/binder_6/LedService.cpp @@ -0,0 +1,11 @@ +#include "LedService.h" +#include + +namespace android +{ + void LedService::connect(sp& client) + { + printf("LedService::ledOn()\n"); + client->dataCallback(222); + } +}; diff --git a/03_day/binder_6/LedService.h b/03_day/binder_6/LedService.h new file mode 100644 index 0000000..1bb5d4a --- /dev/null +++ b/03_day/binder_6/LedService.h @@ -0,0 +1,13 @@ +#ifndef ANDROID_LED_SERVICE_H +#define ANDROID_LED_SERVICE_H +#include "ILedService.h" + +namespace android { + class LedService : public BnLedService + { + public : + void connect(sp& client); + }; +}; + +#endif diff --git a/03_day/binder_6/ProcessState.cpp b/03_day/binder_6/ProcessState.cpp new file mode 100644 index 0000000..07b6867 --- /dev/null +++ b/03_day/binder_6/ProcessState.cpp @@ -0,0 +1,54 @@ +#if 1 +#include +class ProcessState +{ + static ProcessState *gProcess; + ProcessState() + { + printf("fd=open(\"/dev/binder\", O_RDWR)\n"); + } + public: + static ProcessState *self() + { + if( gProcess == 0 ) + gProcess = new ProcessState; + return gProcess; + } + ~ProcessState() + { + printf("close(fd)\n"); + } +}; +ProcessState *ProcessState::gProcess = 0; + +int main() +{ + ProcessState *p1 = ProcessState::self(); + ProcessState *p2 = ProcessState::self(); + //ProcessState process; + return 0; +} +#endif + +#if 0 +#include +class ProcessState +{ + public: + ProcessState() + { + printf("fd=open(\"/dev/binder\", O_RDWR)\n"); + } + ~ProcessState() + { + printf("close(fd)\n"); + } +}; + +int main() +{ + ProcessState p1; + ProcessState p2; + return 0; +} +#endif diff --git a/03_day/binder_6/my_client.cpp b/03_day/binder_6/my_client.cpp new file mode 100644 index 0000000..e7bb9d1 --- /dev/null +++ b/03_day/binder_6/my_client.cpp @@ -0,0 +1,25 @@ + +#include +#include +#include +#include +#include +#include "ILedService.h" + +using namespace android; + +int main() +{ + sp proc(ProcessState::self()); + sp sm(defaultServiceManager()); + sp binder = sm->getService( String16("led.service") ); + sp led = interface_cast( binder ); + led->connect( new Led ); + IPCThreadState::self()->joinThreadPool(); + + + return 0; +} + + + diff --git a/03_day/binder_6/my_server.cpp b/03_day/binder_6/my_server.cpp new file mode 100644 index 0000000..18816ac --- /dev/null +++ b/03_day/binder_6/my_server.cpp @@ -0,0 +1,22 @@ + +#include +#include +#include +#include +#include +#include "LedService.h" + +using namespace android; + +int main() +{ + sp proc(ProcessState::self()); + sp sm(defaultServiceManager()); + sm->addService( String16("led.service"), new LedService ); + IPCThreadState::self()->joinThreadPool(); + + return 0; +} + + +