From 51e7151591269f7ffc3da2e432bc8c85b1d9b3a2 Mon Sep 17 00:00:00 2001 From: reger Date: Wed, 9 Mar 2016 01:01:58 +0100 Subject: [PATCH] more fixes for sevenZip parser exception on specific archives Found 2 more cases were modified code throws exceptions while original J7Zip unpacks it. Reimplemented error prone CoderMixer2ST from unmodified J7Zip.jar. --- lib/J7Zip-modified.jar | Bin 139171 -> 139602 bytes .../src/SevenZip/Archive/Common/BindInfo.java | 22 +- .../Archive/Common/CoderMixer2ST.java | 347 +++++++++++------- .../Compression/Branch/BCJ2_x86_Decoder.java | 16 +- .../src/SevenZip/ICompressCoder2.java | 2 +- 5 files changed, 230 insertions(+), 157 deletions(-) diff --git a/lib/J7Zip-modified.jar b/lib/J7Zip-modified.jar index 591256c7a655ee00adde5934ef348dde8f145f6d..f6bee9dcc2cd01db6e0a26ef1cde747ae21e2c84 100644 GIT binary patch delta 15064 zcmaKTbzD^2_ck+hBi&unAq|R@ba!`ybmPzxiogIviy$B%NVkG?H%NDjl%&)<4BmTx zeE)d)a5#%+J!`GK*N)lyoISbCD5I??n5qi!2xxG3KZ!_o@tE}RVCd}$7@i){F20u* zcH5`FyMYM-Y_PjDfERXG29kn*wLbbk9`0C`09KfG8Nda*;{yf$viV^52;e`~jF2D> z0OJ3c9|J|;^Pp~c;Q8<9l@9RvNH75(tqlPt%wTyS!vri6%2kXq=?LgC&ljEz5Eu=S>7ORf);PZO$MnKfs0j@TU&SZ4PS8gT69Bc zzPz*;B<)8dW0gTlO}#6eWUR=dY;?`aw_4U)6#V?jh@bezpYSYJ{87BY!XHQ;GL$lJmVBFtpeCt-U4wSw;h<@qUrd49Q zF%=b;fBj-EU^49qRncTGBxjJdRKfo_i9qdg9hRknjLdBcy;;2~lIn**U3K?_TS1kA`1xHOna^qdSK{+J>pyWmbV3_o?1NW}IP-o&6^(GXV2S-0^_aXmiJ*zy#P7v7 z4_kyjAGpxLiiK9K4h#h1c2mZ!R@9t#|L48<#&?*a|I=vxEk zp22M`S&g(eb|BM$yUW8>DBC|(CyUjpSx^?Dr^@$I^CgF_l7ODhheJqRo|ePMpOa+G ziX1!*dTDZ^QIbvS6Vw~XcOJTZ!`8)oMGh~8nnOynqB&9>;ylQb?0!t`OiMr4Qp>!q z&sL7O$S;BaNcT(Z27fdc{pfiob)h#8UveR#R9b4nKfBI%$zg*oRQCtwUPLGj{garV|+7U_Qmuz z#c6DNnt+RZ#f3Se+Al)deeA`vgpDuBp-*f`O49T8&6XQMa*qV;aE~`E!s*}6ITk34 zML`rvv7Jo#_1HOv77tJlr*`LKUThTkvp|kBXnzQ~P}K>wVTMKi#X1^hd83u!2z$DJhyv7q-hZ$3RpQUa+l&H`&(d z6`k%@uEF>jq%~KjH78aDjUlxE4D03mBOfMWI;DJvwXezxa&F3T_J1x8j+Co?Ix>vT z<`+!VZW&(f21fpQOeSg<^=0|Yc?Ox;4%H@FM^h2) z5hiJ~&U@8Yy(*JLR~UgR^&Ole{0r`Q#Y-YJvKiZk+2Lc&jn3xY-2JEJxU-Q(VpWI- z`t-Qdp*S{IS7JOb=M*-Q{4SpTGmE3Z-A$TJEIR<$%vi`427f1jxwsCn?&d?>4Y64< zOgOk#6krZ+UJ!bK#staj`zB}b+;OJFNBlJ_1LpPWB1ARu=wJzw=PBnc!$^@ea(3zn zFmR*<2s+O2q%+UcULqD?C3)VuyMgnaW@xYc_PvKLj5h;r z_v3ADY6FRaMreNoYYcxhtAuBKGVRK*knr!weG3)$%Vz@w3zWu^MFWcbU&8aykXt|;$A&id0xJiLP}(RKiG^x?M%>?Z-A zmgz95(5E&zQ6lV{K7^YE1CqYAjEdVDmwoe)kUUvg8WrFE=wf6fs3|raG;K2e3>~_7*)NWaJPSitc|}Z5taTZJ%A!Ys$=(TkiZk+pGrk+(}%Rs`T{7 z;GqD*dTqIF6bIIkX_sfA!3D2a9osNhuRywSezlSDpRhF2Y6^?IidNrIcmpn;Or{UF zzY+RD6Y<&Nu4jJ&MuG(}X$=g=R>1tKh83>92WpwEJ&frFP0(aqDVZ-#S5<*Hw;%uz)t8*5X1 zdWY0T!*jCJiu00g8e?@IrRy0zKQ2`z#wYsspFlf4S`2oadmFT~LOie7M8YFjr=Cx- zATW9pgT#k zEZb>gJD3`U`&F5A{lil3cJG_wvA$~pVi?lnojFeAkXA)_^=5RaJ`r}?7tqvL$0PwT zZ>o9@qav#t_{q(P$-lW+NP1?|erm92lo2r8`N56(${6IV z;-u3>pV8~Ty_FZ+^J)07Fd!ge$TJ|A6A|rQ4PFI5Wye%j)#UxGa07C%$W($7JvM1kw(WW~P^2 z(XN-U8KGEhCmQYDE5=GDp;U^^!-$+HA-2lZG;-gsN5DCPuv;mL-KYp1%SX0RI0QnK+XOXT6rUrcQ{goldlgnV=VEn;e$6PUTR)wqU zBH))_Z9&=3EW6*N8Xy@hNBv9^tcV;mR=vzU5ieH_t@7{zeV3**c@w2#@ z>OwIu1fd>I%dnXiDyVRpl0XfuPj%OXiAv~d4UDiulnsx!>fn{pp9wP@^{f! z3O92rSA>=wyEgj~gYFw1RlIQp6k+5T$`#=BGH?v9D`B;~yndqBV5gASY|k&-f;g{e z+k!d;k>4UyLPW3H232o*#76SR^9dtZt^6FvR2ipCiZQ=e+I6IQ7&PiU7Hp6K;-#q4TWyU#iYvx_v#m9~Gp zY;cm#&nCInA8uB3cR(csjoR-|9X(Oe=S33jcpIz~ttlg#JQY1ouZNs8E%F}qe47+1Hai4OLJ0Z5`?EIv=*dQUfPJZLbNm=~~6wmN9kx@Q=LCvFzjG_Cq zA?p@9T&~(p-5d19A^{@a<}3K#n9`JXJO@j;_gEtG1LSvdrf~)~1mh(+@y8vli}-Qe zqg4C}aXsEZL#r*`7?7e=ox^&Mv8i2({2GS@7?{-Qex2I#Qi@asw^hA#dP0b!g$L;F zOFr8>iKb5EW`$<>g8o!S7bKH>P6B`a!=O#NBrGqJh3_hvZi0bS+f8*->( zY0Lv5wEi&`?~u9YZ*R@MX_g3c_iw=~H*(Az@-nV!O!!0vGN8j@N>$O%hzu{@nUhY3 zRk``&Mk~yI(8c-2J^5%It7qp)*b6U&qwcrFD%3=^@JFA<#VMU6W+Q|bN(DbEA*|}p zwcs9ed6^3=az`#ktezW6L<-=nJd$9Qj}*XNQ9wCFM+vn;IB^61kpM2!hWs)Q`HA~f z2Y03T(~0^HbUOp$r0c&GPq~d>s!QN%j^;9vboep4a8gy5tlEsFf+H~m{>=cqF#6o} zI#Dnz{gBR?#?5&hBY&=s8QmeJqamc@wUW@Zuggy&oK0BK$8-RLbCL@870dgYf3|e-5z?8J zTD2b6kdnB6wdW8RrswU{m%pv77o}+~*?1{lGdr3rTFV-l-s@SIAZ6$y~b{*lgY zEk^EK(qDrLI-MYmuTjY#I{YP#HXCylJvHbu>#Pk2sgOUgO7h;|NjI$QGwyv0Wz$yas3W4!H97p9~LyEv@?Eyt%R%q$7>Y-%n9-GVE&Nq0|lRN}he- z+}j*J2H{-V@b>i(GOD0ou4(8(Z^<7&mT;u$g9f-&Vjzi#+||RZEO*hw+UcD7E>W$)m4_MZ_UL+FhDB zI+rlHV}Ifu=BGr|wma?;y=r2Y2zYTAs~hg!F#!rNd3V;HDM-E7acR!`6i4JBekxq0 zoic#&beT2l0R0fl_i2m3iaR;};tGz&seuORH{N=e;k8b)F%&cIB=q8K%lr>)dasAm zUty_#otA$2TT@NGpxLfy%zAk2d68xP)|YaHcVn8E*NN8oq7=%AvRF|hklI+bsaJdNwu#*0*y<-v z!^bbK{Rw_7-e5o6i=Bub-|xkCpN1jB_F(TfrbJTV;ov%u62vGgGi2&vTeM1DdB=NV zmx9o}0I#%oFRUxC-V1%IiNHs9`?xsdBvddG99%L692_@zxs?L^QXd6;ql#Rap^+5M#81RS zWVOjfsI z_oGM1hgI;4;6oDRtfa$Bq%3zDfr<-wp@x{mF(_O9Xz+<(LN85BQcf_XI%PO7FE+8ongYjui!(X_g9^j^aMM@w^t zZVU*0y)5{QT#&ZrrYoFL^fB%tBolkhU6YHFP^+u%LrbbUR?>=UVU^T$Sc)}s;|Gjz zuz|oO{I3P^7iG@bAR$Yq-=`D$6gNQ=rP=%}mT#xEQx=EKohpH3*I)CrKGbmB@)ti* z{uKLLnwp$3}nz(FiQ&U8AH3{(u$E%V29+^|T zl-kbd|603%iw=aU(T?wCRTUQKWIz`9mDE5|2xHw6cM`Ko@2eSzOFW}8GBx984N^|_ z#LaDXk`|)?TZ0`l5kW1ttyytTLltA1q63pgM%)nCWdgYok*cRbcAWNrDM~*hF7hj# zR~w4@YeE9OH7XN^{ZH?2o7lwI1e^K;wSCq$q}-&!MutFE;0qFhA2yb3O3%*}$X&@9^R(W>r{}2R4C?OMU4xauXE_ z*0)vQ1Y5@HXTzddI!-kGt|SL6OVZGQZZ;eF|Z{qf6{Xt*e z?howVj$XqCC6A6Rq*Nx!C6o){?Mpa zBkuPU{_u=7ZLT0Eiz?PNiXr~!({~6X1d5TSgIj0~Uj?+K(YpvX2wcHU!H;6JwU2(; zaEjNnf4@;p@0j_%YF*XNk-*E?kZ6~KNtABe(Shc!0$NK;J22y=pmca0h2@dPB56g+ z(x<7RnO~S+2f!ViM9^Ue2O@pyZj5X3bn%=r-lL0KTfS2xdAeDV#+t6H`r8Q_lkAe>ss?MNpDh(flXZI<>)ppQ4Synv zPCQrJi$I3cUOF$2`5|u?Gaje+P<%!`b*6H4N!G5Y_T0A8@?^JIKhP2l{?VoBJEcrR z3U)Thu1qXHMHVi;yq<4p5y|0H%qp}l4!Gzy%jhH%(;48M2;ly-CMcftR>nT~qk;&V z1_3j8Lg(42*|n^}FJJCos~PFu5)_dLWpNDcn$nYL{fK~i=+lAMZoHS43^tytvi7bU0K3wfm#0Y&t7J11B*w2BDwh4BQU z-m*%!=;iC@6)9@HRW`nk5-p9Lbk&%MJlEHfzLfzMu|8()Ylz)31!aHbq}g_t*>Tch zUYiA#>alu!`l+b(MLT`Rah>nN{xhE|K`FmhsMJs4fCwXbi&625%g(M|3Y5;%%OhJz zv%yYmyLEUJdl5JHEYr@SdB^j{D(ByX5}j3<*$zuF!fLr-57tq8`cR+#&<}C?*~Oq- zf<3eve+RuqMqev)!_U1JU7IU(wbfek#7vVQhU;(6laAic+jMJL(We(1b&vf^RHryq zwm(bt1{%J{I5S4BpniJXh9b5+X<^)vFc)XBSu@e1+c_v{>s@mtW7 zlYR<;B0VbgEWG7~DcHtnKYG|Dlxov=teBmhoazJeds;15y5gaWNjD4-M!MWN#j+_V ztli#(E2~^R{V`&6X|1Qhw>Zksz++3}1P-?4(~d@<|7Wr4lf&vC(<|$>8d(9}!L=?; z-=)~J#eMpB4_^Oi^^7m(o$No4!g#s($%JFPHBt7Y8c*tlmcM^uh5^^|OW?IeABja? z8!yuudkj~)Qf^~g{>c0X*VqZ0@R}YK5Kn{L&9VE7v=$WCw-^qVFa5;0W3)>Cn0AxB z%nN%LBxI2;x|5w|8|vfsmGK>?9$G;xlDFg503qukk+xc}fLycSb229$Kh&)EzAM+8 z=ilTNm$hQf#Mp8X!(Z`0~5Y_XW$3t0(2g{hi@;DB`5*AB|Sor1e4E zVl~n~0y2cG6<9k*u);acFXmgdu+@72{j8)REW+z>>e1@h)YZ1cHJFmJB5)!FNCmO* zE_)LzHAf<$=0T}tW`r5tl8l&#)Ku==$n$eOQ7C!maM?D`N$GAGS__i=HA|dV?a0oI zH*?2ztEfr?WvRmI$)?-7r^F>Ts4GAbTzNDV0$Tf47Fbv3`(izUNoDb%n9HQ?9o2Wx3khIgZlxrWkKJF%vhqMj8O@XhSb?W672FL zK^;>;W5nNha;gy^%N~ZIye?wBt|Il{qSw!nSjw=Ih+EOf+x2`9iVsMOo}5Z2Hen-4 zY~^aN#BlxbTr+OtH|%AeI$%L6%S`N(eTF)S9cQ!T2CuWG*tfj6dvT5;;AlBu-92?9 zB@vM>2W}}oYc1GzB$kQKB&)nexBJej$t+h)bgCCJ$ zpiROq@bA6sR((-E)4~D&gJ(XrrRRLW^a`sjm7gWdQI+oG@jBsXzRRZUPVcyzfxT~< zNQodJq}FmnIR>e7uYCW7Ry~cRXT1e6pW^o!G#kg2BfK##zT2QE@y>Ela{I5E6 zUQv$TLT}!LVr19TSdZ#9nXAP}E@E#Q)&42}KHmA%TAKHt9p+N?*JrM6nTJMgDt){P z>yZ`0s>?@ckdNj#>5nimf7=%s15=D6^=-&TH9re%K1cbdO@5b6#-3Mcz zBvib}X%4SNtV@_O3AY0&9tCuMj8oH7Jci(%+0*Vb>8(_~1ItLMF(kch8> ziS>=Ntq%9?Qw4p-b@tf3jaBJPR~-K#Z`#bump?zp?+W7%mC^|pBxe2Eh{C@SQfy>s96jK0UhU8S?TDW7Vp&z5!h(bw zbIy4w25FBvSdZzwh$Z4$KDkwJxE~dIw>`B3t#&%?nVBVpg?>H*ml}jt-&+QKVEuTK z-U-rWoUvIhr(B~6+9Lb*O`=z6$Jx@?QlhuMmiBA+>e19|7vqn(nI>!H{*ID$)aA5J zanbbkZ1t}k66@3=k0`mvfo-c0KJcN!1koa5T$rHK)O^n& zX&$@ZukE)i-wR`{-uJsarOv01VC2{z?T9czYu@T!^>s<)e&=?%@&4XV=63P@Q3r)X zr~AVXjVFlrwO~*W~=ujmP84TppT0XMX{4t zw}<3=%FaEhDwk{fxTbO$n!2HLSpeQvydCLL%)g#M4Ikd0^JkczLRcYrU)g9gw3oHN zyI0?E^Q!=apc>joc^)?$cMKALPK&O$1#Y7eI(86b+oU7SIu&nI>k*}UZ9$rKLftjv zV%Ua?eZ;o$f;7v0^&@h)&jJ7-+sG+chf(-DWUgabI%CvDzw|482dCY6xuLI~{Ge

8>)DN4U_!^gH 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 J(4GnR{{Z{SGnN1V delta 14892 zcmZX51z1$u_ck*~cZZ~OcbC!)QX<`rv>+fON=XU>jHHybbc=K&DP5A%5>kS|cNo0) z{`i0MJm)!!wcdB_z1H4m&)R1;qiv|!&8S$KDv0;c5pF(gNOrMU^oXp$jUS3g4BYx2 zz;Ao>H#aCTh#ip`xXXd~;D4)w$)Re~c>m+!22}}SgIkwC-0(XgSm-ZW0Dcbv|HEd4 z4HJTq{tx{KEQUw|xZy<g3M~@JR$6AmRQGZ$FyB#WFEw<&EiJnH83<>wTKO; z>{mm1JgkSa!a@~9=J%dQ?Zdg*Oit-b2h*AT(Hz<+XWY0%{*!8)m%E0h7eaO$YqRTJ zge$=v2!5ZwoX$92o)~O91zfD>nIfdN9HS<4prM zvS|65(n$;Y$RK8lSk1IJqxO7uRjX|!8dzZZ;jE1$u!o)vFE^AnY%*EpP4Vj;cSdPVeNBbu2 zBy^FRJPLg{@DqE)6_p2T021cr;k_nMm8B;0nZjl`bBVXa?md#5!G}qG@{+74?E**W zo?q-#9DOvXd`+o*ZSHl~Q6nxS^trcsuBUcAezId!sgdMo-OAi|WD}=h6O+)pIzOsg z!D>P@J!JhsKK@%84#?S`Kl!XHAD8zn#Y!sDyNn4VL6^)faV-+wgm{R#13OB0d+L0M zG?sAsOpxMbWXld?Jc_3G7|l3(VJ1rc+~anssh=^fPO|ST!%(UQ{)}j$VlIrh{WqT3-B^cY z8f@`O*4#hu4eRZOwVokEvT({>D96iPgbhEF;C{clur-V7QhwSZFYES7NxWxFfL9+% zS(YFOLKY4;QEu>-QQ;U62(%od)2zY69f;Xf;zsd%RrrEYhcDCMjBa~IHKS%-`pY?C zK7r)ey7(up8n!omnh$EiW#ZJ-rev$P^FQ^h%s=cZyoh`4FU0b-H#3}mwFWrE=N!P^dkdj4F%()h(_z%+EB=5UV5sB zD)FXyh;JSrC4QLVsQG3uRF0xq9hHc?P*_wn8-g49=Fdy3=C<||KEEGQ|19gM2sg{% zD5ZX30jRQqbp-@pG2gQXA>Ig3YVLhJU`oM$@f^ZjsQBDODv zM2??)T3S8%MJ`Br04J=0G$L8o}lcX5L11RmIfO((hh_Xc zE^jXf*+ElA;QC z1uH9eP1A^hqg-OJSfOoK@{`a>gK@8slM}m~bBc?v{2*_Ss?P9Er0}iDpox$|F@mL< zEe1W02jnXyc|3FEXbhs3i7jK<5NuUy%||QCqAYrw?;nXE?Pj`mFjnht-;;e;m={X7 z)PWgz5NK&=P$S#I!hlLR5lT1ldhmpitwwlk%tmQ8dmyuhAyZ$!#5s$vTvWB05tG?) znop{6FkH>vh&?KGdNj+f_oXr_JJex*>C8V_BO8V$oV;Qlc-R^&$Y`OL50Q8lIt7gr zlQYvvEP7Po*-`8xUN54?;!)s_nku|6!YIP<*lhI`7<%{z@!7X>IlXse8QP#1V|G>e zn^hy-56c#w7fO=bSM$Wap?`7wqj=R}Nzw8QJ))I5aYc9_<~idI;)00Y15%|f6*G%P zJ6vQKll_vN7x(BRd9UXNWFW|Dlp)Oe{XpvahEdiRnGE_`(r4W{l=6wpxxEB6>!TfY z$Oc6%lTMj6B62wW zUgY7AxT{Xr7YcIHPBx_}X+%xmch68<$M=1Twtn1DNr~jquHYCytf$+5unk{7+$>)uAll@d zpyo!G>W!Qh`Q;{L7^C3~wb=W-@?2D9)O^WCki8!T&AB<7FW25D=?S7lT6M|vmSRvg zo`caTWcA0HF69$^qXFj;VaP$Qki3}Xz{F0O!^mZWb3(j}87HTC0!6`mi%347tDud; zS$*J>)n(m3Z7q&I#x$;tX|T@c6qC?EQ;X<8(_VAV0Ov)avrmD@?EL#;jpmD|bv-TA zWpgd-2MUNT%N$scxZK8ppNVwoM@*l*er7$5A{pZn+{a!J+~?d1tAMm}HUwvKr(IX_ zuSqm=asPP#rLDy@hn5ay7Y*6KjO>i<%4TuTCjtl2+S`zM)PT~-vC=@sna}c5+O8gb zto*x{WLJ9g&Ig$_T5QA-T@EUh{e_-ipMGT1;)*KduV)=Bp<-q;Zf>eF%{-P$&zxPi zUcEM7L}c%awwFod366!>W%17~jMyl#eIiD@jt__#*z`7NYP7`sgP}%#<-90$HrxU^ zhz*Q62zltn8RmG_(IW288tRC3q~sqhRdOnW-pyKwrRErB6-a>G(2mk-lc*y}g3MKG zxybUO!`QZYKb3c8tHO5DtIB|X81vq)A#MM&=hT*unyI!7hnt-t4T!B7zQ)4R92{DG zBfNcQdWSW^%Wt3drt&NXrWVc>gw^c~8W0O#*@iOp_hgMFnbF4vIADszF`9ZkB17;H zr1Ok!Xs}hVOv0Fe7RtVmuoA7&pmOQasgKZFrF0ool1e@|K3eG7F}w(R_;XvMDYXJ| zmMbnNgznSUJ25*c$Ric4tx=l0KDhj32-6=M8#A^Rv`SryjGEg2 zl*+~}HA;j+B4M7W>r1kzS*Sf1Wpj;bErE<&7* z%j9~LogN=Y&-cSJP|Kcm&EKfUu~jejRf_Vf!b1ty-M|#7K`J|m9w~$&|N0r6mzy0D z`-k6!3rL!%2#wy47-!TeXr3qrTtsR4szC9-`4+iK5Ioj4=RU#pWfJ5*ubB~k>VQSd3Qx#yV*qfGmGG}G0t{% zGCh-As#OEgN|*%c^qa@k$)+AU?rj)t6Q~sjOR*crGnE6HhrtgrbB$M6GGzWpM?VXhO-dv@Wg$iNbhAIzK)qO)A?NRgdD>6)m)RZBaV z6xy_)>H@)+-QZN-rXNuGo@l|*^suK?1!TI}oLb37xELja{~l`el9Ux&8}_7~M4*_2 zyd-GRCxM~_8T;F8u>{ur3hxUubmd{!D4{*vu3xXt-hWKm`DCg!?!|G8dp1bqne)o# zD5~dG6NX$aUwvxJn(_Xwf|>o}r(Av1{Y7qK4*c4X%GqV&NZlT_6NTj>3qDWnA~%;% z+idxrM$QOxc}U{c6+6M(5&Um2Q*^ZJtMUs;#$%N5!ml$}85N?o+Mk1>O2&64OjAn3 zTR9?HSMo>H=1W;3HS|bN@mHv{O*c=KBk$*ylMT)XaN+&@wSJ+yvXHOBz~bhsJeNaW zD#NP?af8;H7W3M4&dznNRQBV1DG%1S zd8CjH!nJsFv9(_pI%pcP&3Pw_RWF6-K@3Yu_6nQdn4dHUu;!bq>~C+KVk*V2UzWTS z{uZ@M%EF?(nS~i*+G$lWSL{XCNjKZ^t>;wxH>7HQvn?Rn8uPU;J*`Aw1_zT-9)8(6 zUKv)<=7SQhHec|ua@z^3#jb->2Qu-oKwWH=VO;~Fsf{@#t?Zi7_kcq@diwzX*<$Dd zV}R9sPie;9zU3ODNx+a3tw|?a^I~|u6Tn(L|9YPJaOE4Ag-XiS*=p;hppv(b%ui}jD#Zb@axPF%H zOy!g58Y{p3(JYH`s#O%7Cf4WF=@mnp7MSXJ3Lc9DolfR)HpAH3L^T@4W<}ckPo*|P zMq$sGUq;GSWFD1Mj`gZQD@)^k=v0>SC_^~oBVgl(-BHFCpr%K?{AnY;AMk8tGD}V550F1+#?QJ#u^0-x2&x%B8b|vZb}}K$iGL}l&T@j=)f;k%7xFR$UvAq{r?4kKXcf(aory#D zN)q$i`>hnhx_jT=IZ1tA`}4!H84G*W|GvLQTEiOTPL*HzUh?R+ypMSpbo+{gSaBI% z=T}~+INh2Y)I@HDT=nm_LYU^?O~Es*_}jN9NV?x|-?^+CdNRZJ3noF&ZcRfWLm<4H z9mO2)ccE2G1O(Lk2nbBThJg~6h6=`lPKOad5^-ysa4~UdS``IdY0wH@^tTUcFV@Ojd}FbDl|D2+je7tMbc zrO|J%em#9nYCYXA#5P9ako1*Y;YhGb+2q@Zat+Dvyk*~!41?TTT3%tuTk&kjicmdY zhR{&C9q?H#&Pu-+3+{I93C0xX^wS_ci$>IFco&stb!m(kYTSc|hjLJb_#JvchLWCe zaDkleVQygc3k6%;Wf6(Qrq7o#z;02F#Ky7|Q7Z1B`|w3?;D?^Giqx}$zz_ABkzXuU zhB~`U>omhnMfcedOM8xVnF69FtuBNPUqI$tT+;NzzxOUYnxYX5#dP(H=5^d><)TJ2SQH-&UaU3}`-=Aw$orbvi_uX$(9uo3DZ7 zzN;ReHFT`LK-5clJ(K@Vz{1e{*~`l6adfAn(|Da=1F=iPPjSMTqJxH+W;LFtUcr~! zVls&_ql`747qw3_lg(0y98A8?Syr=tz0Xm^I5kg+8E;pEETTEnnBJDk;jC9Q>`PR! zEp$(}XLxEb;|9q=mW!qEoi!!Y=&bjbg^-@zKZfQa>n>!QSkcb?>HG zQR%k7X%E*n^9b?JBkjXtH~*rjjl9Amfp(7eyCm& z=RGzAF-fE%rZD+o!Y1zT@j&E3+XiI4;^0qYcu|av?n~}ryf6C8V?k71mDA1bTh8d` zh@zk|@?idCXJ^aC&MU?bA8fX($u_o6kdxbG8&bmg>Wn5yqDz^gM%oehN_S9K?K?BA@&VZA1jA>L+MWS&27On3-7-WImYQPOCYU!${j*bR5t82 zzD|eJ_f8R_Kkp$`vVOh2ub|7Os%(QR;@jS&S;smBF~UzqgdFyx7T5V=7c1I;5?+0ITXNiybsn3?8}TkI~n z@flc<^pFvx_3@8{tEg2iY6VY2^4!(b&dT0m$5ge;iixTwWb$GqSQnzPe$ye)t!euj z#76e0m88gKlpj)+5rzE?wmI4g9M%-h+xv4$s1O%1EMKG00~Ni*6! z@wXbaXf>X3GWTNUg08K1T*EU@wTvrst!FDL66<~zxLdh9&ljE-9(!eXKnm?Ec1spE zoLMQqh!_h(#q6nPpQ+ALpe<|vV+P`P(%wa z{unp3h-Go9mK4|&ivRvA(x9nueLCYC zi{sS&D_eGyLb_35rMkLDF2WfNaTOKCj-}WqNHe|!agw%m3wpuQO_1H>YNODGL7k#8 z2ko@%Mn==9YQ~Z-f!sov-TbSeG8KD8a%RZhhJHO_>r{XX=kB4m(tPYxF?ab>0eYJY z{Y%4QVLRA_^NecG`x;A6EdR&d4xVw(Gg_JjV0taadt_6YaE4LD{XHeelp;GyknGF7p&`-ZD-TaohTQ$a&I_ue3yZ4Y>E5~?+T@GTvBT*wi>7OcMqr%oTf*q`W z_Iv)Tu8>wQ=qn3F5UcnKf)=_q4o$TyY7N#KMKJ`iJmkD+MAx6=%QgFA!4|JJ%gm8e zd*m3g4rp*Hc`%IUdf%dcJVVH^eMC-o&Cr&Y;HUHH=c4`nQ&Ix-m}J}^^-ZVfAijxS^Bx7`#G+=-Rf$7>Nf%(iS|Zq{2p6O zXkM4BYIfM>V=q2@ACKVLvocaaDEo`3UlBNF6MxRL@_3$*hH$5>icEW;aBHaJ&`5oL z^$SGU*P9i(VO`j@i?8~_n-lN7!gmZFJUQ7?(qF%ASs=t2#0>e}(oQW&n5HZv20@hi zk&fl}gt9Qbh)Z%^(wBpUtx5YmQ^~fdMuGWJ&6juZ35izdq@)J%Wk-Hl7R&@#dXgkV8as|xD z#yp@iQv}FcdM(P2CGy0BwBnAg$P-y{+?Y(GeRUWKo=YoLDwy66)?TU#y6R@tvy86G z^6f~DV*XT2O+(ag$z0_&;>9$h4UN|i8XBAC4jRRhd!z4(z)+CzE&SB-03mUwOE5|8 z{=?}NeS>GercNxU5fY`M4-ffcoDqmVYpyE!k+StccC)%Isau|s$Og@x(#TZ3*eO8F zpL^rKBz8gX&*q(5DA8TY!XDReyJ9_eU%`>?03msE%(u>sDtGw-0opZf9)cs&qVHX=^5(d~7MTo2a}OEcH!4|nGIigg2;2toa^}n-Cm?VvqbQsg3Ur&X{*`i(|$hR=^~7YaM!CR>m5fF zwzX}Tv8TIoktL0sMq$6VmBo$HO+p6@jWUC$uBC$^7f;ihr00cr2~-blwbZ3tHv7LeqwYHV_-?Dz zpVJsTGB4hk@6o9~oBnYkz@4iDIyOJFV-T%i2WjPK{5(FTBKFMurG3|Y{6dW9&*o2+ z@)g^5;-90pQnh?*BAB$!)=_s8ca+;d*S+CO8LS*|rFtX7;+1OM!S9+E$VFZkanB~r z|7RQ#H^&+&2K(5>dj&njr7Fro91j@2k|owLqZeA{ZITuu#(AmEDrDnB=P-*iHXQ) zRclZ`-9DQ-+DW&gxbQmK@qNzaF*IB$aYmk<)@pd|^_)T7phkBRm*k_y+OLU6&Zn{8 zazaoiFIVG8ZQD*jKgfJqTHbU;DxrDFjHtYzqdMohv;9(}CeRMp0U=b5C2-$vmQddF z-wKk+cBt@uR6&*i8eCW^BE^Rbf4(%|VwzgM-R{TY+m>zxpAK(C?3=w-*8>xj3tR+* zVrr=5G)*OC4*?#W%QxMD1Q*U1tP$b6vZn9~uRll#2!2=y2=u_Ni~@#@1;(g^EhFD< z=rT4wfZ@OqouD&E6a)lbYy<=b07w9<#{v^o`fPjMZXEXyoo|0_H#Z}n3EPST+uJi+b5hTWM zQe9=Ee#qVO`W`dmt7qh>jQ)xb+ig71FjD3{rKBG|EY{3GA_~^ZQOucm_?XQ>n#1`( zAur9m3v#tpB_;YTX~wPVKm(%q=)CcCVP380!F#fW)5i7G)6`#*>nof>&6k%S5WaT1 z%g|?Xr&V#BB_M94@!e>y&{}3-5;O45zSn- z?l#^YdXwZM=g_p3+YQyaN*?n!)?#AVi#Jj)I;$Uph|=w*#a8gK24pT5zp8O`F0@rE z)^I^(A^<<2dH0<(f-$bu&fStbZq)f+_ahqx4Q>i7+1WTZi77hn@_MzsZ`r#`3o~8% z8XD{d_rnBpYFs8)j=|~Cn%wwGMZTiXbA5fk<+WkYsORDr5tok1lygdOa@+PZTYhnq zh(-No0deG>`6Q&AW*~1{Fd4&r;M3KyvuB&xQ!z}4Zmn7;W>H`z+Gk(CD^NRGlM|QH zHc~S6(-%$INVMmDzONbKG;XR&`-rQ1{i{zE4%x4a`;gF++aITqZH}#Mze&S$Zyexx zUC%>`(_h(H#pE57^r^o7Qh>W~IC>_eE4Lx~suOY*U91f|8ZAVj0|)l~NNa5}b7m!r z9(y(>)2rVo`7R>C4NvhxpCrbsUjlcYstDE^!L6oX`FXMv{|ZT5@Zbewi+B|VbK0-7 zL0R#Rp3g_JadYZ{jb*xOXutb-(x0Y`=xERstqiV)hWhsz$fp{A(bEL4;h;|sPh60n z(4#@tgiSCXXLYc2oTcP?E*(Qj2ccxfQt<)PkAU^hG*h8!4<5{-n#R<3L|A)^k)Dmut%$wtn? z3wK0}4O^g$6vx|BKi(LzLN=SBn8sNn>hB|o-gFBR6t)@TUk?y=Z%`TT@VF=mg}@l#`qu;0n9RkO_I zwsh2thE4km6N|1}6VOAOjKbdw54WswAX`aXGWOPk(NOF@R*%~EJl_#hPdqPk(v4tL z!p=)y8hEZnxC9#Pu<&uw82xf93VQ405sgEzdHQAvahSY3oJ0oB%_W{l9w{iy^iYqd z}bM7H~kszSL*)=8vJxZvUsWD65?v3`>`)=Xy=$l{xjI_K=9( zuhnn!RLc6PANiD=lgl1^F{hNa3f}We^t4j4^@?qw&ctq&%WatU!um<;BR@>O>CYN- zUmDaa9VaKVZz5oEO*@(7kEi*tw9`n18&C3U%e}Fz_&rw3An0&-uU&4UjeLlJzGKHw zc(9uM?tbedmiWxxErdh==NCw;rV5Y)8<$>zvu8RG%+KC`xEbHM`lzV2CH?SW$cvN> zTvd(l6R0s)Jtu^Q^2nJKl*fpRI#STZERfrt3+s|6SuVV^B3&CD<7Ul4^YBPc@g|K? z9yeF5{GBGr^r+F!)kxBoyg~4nzEI?5XsX5j&+jiz_FL3ey8Hy2x3s@}bjfand_5ph z<;5D*UuE@(H=FR8WXgAcB^s(@-t~Cb`?paag0?_pa*@{jI(e7Vhayx{qZZ8i>veGM zS!ys6qLyAzDGuS%B2wK;&SsDOpY}2y2r>GxNjOQC)UO<-S5C}??YhhxAS08 zOsy^ln=U;4Gg3gtGvW(e%g@=(ciwN~hQ;d02`|FUYE0XDR z*z^f?*;=Xg1*74W$0)?I{TjM^g>?T?rRMyJQ=Xwdos&Kr`tXBBJ0i)dw*~rKxt4G8 zJLDe++sabTbRs+9rIhPBbqbCIX9$O>yAjeJ5PP~|%`fAiMo3xaonhh~h-58OZxCI} z8~I1&)CEg+hRlcGzf{IMVP$~$m?XWv?DK5Q_}UuL_n8X4!Mcus z=-}h2SKvF?1t5#3?Y`i&;bzauk+bW_`Gv^bj}zaY6pA{L`7 zp*mtUJ+ZP5Y{!Ied=te}9!V&q&u56f=Rs*A6vB&-U1mFY;u)ufmz8-iG4R~;=|p<4 z`u$lJ!*DH)1?N}tV+{&?~s9#YIFrQx2@@HIR=g|hEZDzoKj*J)Q+>vn}ndNr#Q*#v4= z^BE_}Y4}!huZRB$ub?Fd(?H`RLJqe?5f}EyYXz!b+;rR8@lQuz%`v$iyN_xp)`I#? z*3Pl5pS&OSX8F>=)o$%z^hjiZPue$Jl%c8$15Y$}_Un_(2WiAwdIk{1r}nhgAA{qQ z5>?S7Q;a7DoY2L~stY%s7ChMM3uIn(VZ<0w#~9iC(ea7TRx3?Jxj0bdyR6?M;@!7h zh?0wMN-QWOt=1tOI1AnHLo)F;G=>5LT)KYw_gBii_IG&z>BjgF$-UNNzNOHWc6JTA zTM51>uKj}oB8JyowM5t;9(V~=tAq#2z`iNiYImqX3CQr;4wzjrFMx_I6dm@?0z_F` z%m{)a-M(Qb0LKL(A|Ox#B^Lc{d3AGM66S&jMz8f|2SwjHMdb#~-%1;NAhlabSO_F@ zD+P#x9N>i}Y+Dty1#f#w4a5sC8*8z&LGib+96gZGt!}{(w0o-?GzC?`E56!b3lKLa zoLlz}RDP>-f`WSCWooT(0x0{IvG5+W46hn%+tWZixBgDEKz#6$vX-L|M01PN`~r*4J|4g=*$b^fhjVM9NoL8iC4_N)Un-hgWP>Os*MaH*pMgmF7Kqx~RUbhvJ99E5f|hzHZ4fZM@# zp9AsTO8E<*+h2=nqZdJ@x4Qjh5YerKy7mv_?K%kMcB(^>m41Ul!KlD-U&V`@q0YVAeK;!Ue$24;R8NLE<-uqG8>az$14vlWDF2D)SW(>djxe zS0FLC0KEb|gbNc_AccQ`a&W=!`hTgt*MF%e*C3UfqtFSmVA&g7LIhYEejf&oNZJ1uYQxFAMG^Vew$_Z3h;>;QQcGRwykGIgAJqOilwh zRpf(l2ulO2&K0mGG2NUB|NF@aOl1d<)UaoWU}8A3PR~)W7_iO&7t22|;GPpm#|p5!a}fvuArTB5MZAOD5Wi_1+9inxLqq$E zF8i(g?IEyAMo zb^+I2Pb$iAPcM=FdP+kAJT<5QN&?sb5|{<<{`ZaYL=~=NK?YO6W2x6&Jx&Gu%>c2m z--%^P9SZ89fL3ba!=jP?#^Rc!Tcivib%4X_TzAk-ns79?E)Hx98GO5#Un2tz>T3Tr zkiaxhz?kr!n4ka#A%njLRM-a;Faf+bMdCiLEP(&#z}T|h@n7=#1`Yd(0;Yhwz(NIF zPzS?ZoQL52*Tp+O`QCAH5CRKC1;fwx!|HG7R(7?2C7u4v0 z3$8*~EIODHidBpWo5uU=!(?OezAuo7Dj&=u$5%4$q76?_=)yx_T$#Ii-G+cG1J?4O3F-yI)m0&(U8aq{0m z{`>)byiE%o-XMZ~p!z#+!m)tH-faQ~CfFe00v^EpjZ*RedVNR(Bgg)$WWffMCC5;g zQ=b2x#KY{iv>9M*k%6(LyVF?B8Gs~#MxSHDz5p482a)b8)yK9^Q<}F?f8-x$L#{V0#C@%OuVl>XJ$psID3k$&gYl^xt@lf5GT5@qZVbx&JNh?sPen^_KQetw#(G(K!)C@*R+_ab)0K+a0_b=l|fN z@xf>?ac&UKf5GZ_saXC3g4F~PBz1?$!F!iU3}fL3m{Ej((~3xKc76yjQvjym9p+1c zyG-~Y5m-Gw5OuroT@wndOcaFtUoNo;01&szzaT7_1_77=9%BTqbKA|3XaK`_H%3a; zfAQEbO!fZ_??s*GnFNp+BOo#2cRH!{_e*Mtd6BLd^YLz$_Zm$3m-_XG%s`%bSe zqi^vU#9(aL&N~nme5Bz1aESqb<+1-`2NpF9m@)C+x#o0Ze+m894*x$Z*x-$p4)(7W zA4W*>w}adyfC)AAUlRt*AQPA2tnKW zx%D#xdsi+QEg4QrCvy*v|2wsDsn9BTfVH3jxQOrY6N*4Evrixrm?7!kkQ_*X#pJvg z7D@_cg+KJ3ILxm;10)oHOnHY~`Uy5d3TA_&{@WxVAW+>weJr^_k--GWzy$E5s*r*2 zgQj4^q+lYLKN*-5&euUFTL=SqoxpW>c+$&m_=K>R6(FkruS(FCoGvK^C^r=kJ#hW= z$qDoj%DKo6Pbpn_$VNCbI#PC=j-Um#2)iC4xU`BYH&;0{myaimR0T=L( z9shoE0_$pE*#HVo`+7t3u7z#h2S0!-uqglqYCDXL0(@KUn%yXf`(Q6Az>M(u9fueA zss(uJPJpNGZk@(527-ZRfF&1W0z?K=qx`#;6g_*5ECfudNq}^>7!sI*6FA^lc=JY- zz}&2vfvbsNF_d5`xVr2{y)*Y$J+J^G`p-Sa+0_6w;C=;g&+u=UH?`>K!e4?Y)!)V0 zfC})#zXVqk!Xl}_)NuDDH)_?Dzv@LQFbzC~R+J)WV?ce`2juT=3J2C;G}M1ns6-7U zXz~}#h8oOe3~V42|ECWKIRE~Ei*S8ScM3vKlhb*`p`Returns null if no InStream for streamIndex could be - * found.

+ * @return the coder index number */ - public int[] FindInStream(int streamIndex) { + public int FindInStream(int streamIndex) { for (int i=0; iReturns null if no OutStream for streamIndex could be - * found.

+ * @return the coder index number */ - public int[] FindOutStream(int streamIndex) { + public int FindOutStream(int streamIndex) { for (int i=0; i coders = new Vector(); - int mainCoderIndex; - - public CoderMixer2ST(BindInfo bindInfo) { - this.bindInfo = bindInfo; - } - - public void AddCoderCommon(boolean isMain) { - CoderStreamsInfo csi = (CoderStreamsInfo)bindInfo.Coders.get(coders.size()); - coders.add(new STCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain)); - } - - public void AddCoder2(ICompressCoder2 coder, boolean isMain) { - AddCoderCommon(isMain); - coders.lastElement().Coder2 = coder; - } - - public void AddCoder(ICompressCoder coder, boolean isMain) { - AddCoderCommon(isMain); - coders.lastElement().Coder = coder; - } - - public void ReInit() { - } - - public void SetCoderInfo(int coderIndex, LongVector inSizes, LongVector outSizes) { - // _coders[coderIndex].SetCoderInfo(inSizes, outSizes); - coders.get(coderIndex).SetCoderInfo(inSizes, outSizes); - } + +public class CoderMixer2ST implements ICompressCoder2 , CoderMixer2 { + + BindInfo _bindInfo = new BindInfo(); + Vector _coders = new Vector(); + int _mainCoderIndex; + + public CoderMixer2ST(BindInfo bindInfo) { + this._bindInfo = bindInfo; + } + + public void AddCoderCommon(boolean isMain) { + CoderStreamsInfo csi = _bindInfo.Coders.get(_coders.size()); + _coders.add(new STCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain)); + } + + public void AddCoder2(ICompressCoder2 coder, boolean isMain) { + AddCoderCommon(isMain); + _coders.lastElement().Coder2 = coder; + } + + public void AddCoder(ICompressCoder coder, boolean isMain) { + AddCoderCommon(isMain); + _coders.lastElement().Coder = coder; + } + + @Override + public void ReInit() { + } + + @Override + public void SetCoderInfo(int coderIndex,LongVector inSizes, LongVector outSizes) { + // _coders[coderIndex].SetCoderInfo(inSizes, outSizes); + _coders.get(coderIndex).SetCoderInfo(inSizes, outSizes); + } public int GetInStream( Vector inStreams, //Object useless_inSizes, // const UInt64 **inSizes, int streamIndex, InputStream [] inStreamRes) { - java.io.InputStream seqInStream; + InputStream seqInStream; int i; - for(i = 0; i < bindInfo.InStreams.size(); i++) - if (bindInfo.InStreams.get(i) == streamIndex) { + for(i = 0; i < _bindInfo.InStreams.size(); i++) + if (_bindInfo.InStreams.get(i) == streamIndex) { seqInStream = inStreams.get(i); inStreamRes[0] = seqInStream; // seqInStream.Detach(); return HRESULT.S_OK; } - int binderIndex = bindInfo.FindBinderForInStream(streamIndex); + int binderIndex = _bindInfo.FindBinderForInStream(streamIndex); if (binderIndex < 0) return HRESULT.E_INVALIDARG; + int coderIndex = _bindInfo.FindOutStream(_bindInfo.BindPairs.get(binderIndex).OutIndex); + if (coderIndex < 0) + return HRESULT.E_INVALIDARG; - int tmp1[] = new int[2]; // TBD - //int tmp2 [] = new int[1]; // TBD - tmp1 = bindInfo.FindOutStream(bindInfo.BindPairs.get(binderIndex).OutIndex); - // , tmp1 /* coderIndex */ , tmp2 /* coderStreamIndex */ ); - int coderIndex = tmp1[0], coderStreamIndex = tmp1[0]; - - CoderInfo coder = coders.get(coderIndex); + CoderInfo coder = _coders.get(coderIndex); if (coder.Coder == null) return HRESULT.E_NOTIMPL; - seqInStream = (java.io.InputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream); + seqInStream = (InputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream); if (seqInStream == null) return HRESULT.E_NOTIMPL; - int startIndex = bindInfo.GetCoderInStreamIndex(coderIndex); + int startIndex = _bindInfo.GetCoderInStreamIndex(coderIndex); if (coder.Coder == null) return HRESULT.E_NOTIMPL; @@ -91,7 +92,7 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 { if (coder.NumInStreams > 1) return HRESULT.E_NOTIMPL; for (i = 0; i < (int)coder.NumInStreams; i++) { - InputStream [] tmp = new java.io.InputStream[1]; + InputStream [] tmp = new InputStream[1]; int res = GetInStream(inStreams, /*useless_inSizes,*/ startIndex + i, tmp /* &seqInStream2 */ ); if (res != HRESULT.S_OK) return res; InputStream seqInStream2 = tmp[0]; @@ -102,92 +103,168 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 { return HRESULT.S_OK; } - public void Code( - Vector inStreams, - //Object useless_inSizes, // const UInt64 ** inSizes , - int numInStreams, - Vector outStreams, - //Object useless_outSizes, // const UInt64 ** /* outSizes */, - int numOutStreams, - ICompressProgressInfo progress) throws IOException { - if (numInStreams != bindInfo.InStreams.size() || numOutStreams != bindInfo.OutStreams.size()) - throw new IllegalArgumentException("internal error: numInStreams != _bindInfo.InStreams.size() || numOutStreams != _bindInfo.OutStreams.size()"); - - // Find main coder - int mainCoderIndex = -1; - for (int i=0; i 1) { - if (mainCoderIndex >= 0) // TODO: description, what exactly is not implemented - throw new IOException("not implemented"); - mainCoderIndex = i; - } - - if (mainCoderIndex < 0) - mainCoderIndex = 0; - - // _mainCoderIndex = 0; - // _mainCoderIndex = _coders.Size() - 1; - CoderInfo mainCoder = coders.get(mainCoderIndex); - - Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr > - int startInIndex = bindInfo.GetCoderInStreamIndex(mainCoderIndex); - - // this original (from J7Zip 4.43a) replaces blows loop, as with LZMA BCJ2 format seqInStreams.size() is incorrect (array out of index) with modified code - for (int i = 0; i < (int)mainCoder.NumInStreams; i++) { - java.io.InputStream tmp [] = new java.io.InputStream[1]; + public int GetOutStream( + Vector outStreams, + //Object useless_outSizes, // const UInt64 **outSizes, + int streamIndex, + OutputStream [] outStreamRes) { + OutputStream seqOutStream; + int i; + for(i = 0; i < _bindInfo.OutStreams.size(); i++) + if (_bindInfo.OutStreams.get(i) == streamIndex) { + seqOutStream = outStreams.get(i); + outStreamRes[0] = seqOutStream; // seqOutStream.Detach(); + return HRESULT.S_OK; + } + int binderIndex = _bindInfo.FindBinderForOutStream(streamIndex); + if (binderIndex < 0) + return HRESULT.E_INVALIDARG; + + int coderIndex = _bindInfo.FindInStream(_bindInfo.BindPairs.get(binderIndex).InIndex); + if (coderIndex < 0 ) + return HRESULT.E_INVALIDARG; + + CoderInfo coder = _coders.get(coderIndex); + if (coder.Coder == null) + return HRESULT.E_NOTIMPL; + + try + { + seqOutStream = (OutputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialOutStream, &seqOutStream); + } catch (java.lang.ClassCastException e) { + return HRESULT.E_NOTIMPL; + } + + int startIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex); + + if (coder.Coder == null) + return HRESULT.E_NOTIMPL; + + ICompressSetOutStream setOutStream = null; + try { + setOutStream = (ICompressSetOutStream)coder.Coder; // coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream); + } catch (java.lang.ClassCastException e) { + return HRESULT.E_NOTIMPL; + } + + if (coder.NumOutStreams > 1) + return HRESULT.E_NOTIMPL; + for (i = 0; i < (int)coder.NumOutStreams; i++) { + OutputStream [] tmp = new OutputStream[1]; + int res = GetOutStream(outStreams, /*useless_outSizes,*/ startIndex + i, tmp /* &seqOutStream2 */ ); + if (res != HRESULT.S_OK) return res; + OutputStream seqOutStream2 = tmp[0]; + res = setOutStream.SetOutStream(seqOutStream2); + if (res != HRESULT.S_OK) return res; + } + outStreamRes[0] = seqOutStream; // seqOutStream.Detach(); + return HRESULT.S_OK; + } + + @Override + public int Code( + Vector inStreams, + //Object useless_inSizes, // const UInt64 ** inSizes , + int numInStreams, + Vector outStreams, + //Object useless_outSizes, // const UInt64 ** /* outSizes */, + int numOutStreams, + ICompressProgressInfo progress) throws IOException { + if (numInStreams != _bindInfo.InStreams.size() || + numOutStreams != _bindInfo.OutStreams.size()) + return HRESULT.E_INVALIDARG; + + // Find main coder + int _mainCoderIndex = -1; + int i; + for (i = 0; i < _coders.size(); i++) + if (_coders.get(i).IsMain) { + _mainCoderIndex = i; + break; + } + if (_mainCoderIndex < 0) + for (i = 0; i < _coders.size(); i++) + if (_coders.get(i).NumInStreams > 1) { + if (_mainCoderIndex >= 0) + return HRESULT.E_NOTIMPL; + _mainCoderIndex = i; + } + if (_mainCoderIndex < 0) + _mainCoderIndex = 0; + + // _mainCoderIndex = 0; + // _mainCoderIndex = _coders.Size() - 1; + CoderInfo mainCoder = _coders.get(_mainCoderIndex); + + Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr > + Vector seqOutStreams = new Vector(); // CObjectVector< CMyComPtr > + int startInIndex = _bindInfo.GetCoderInStreamIndex(_mainCoderIndex); + int startOutIndex = _bindInfo.GetCoderOutStreamIndex(_mainCoderIndex); + for (i = 0; i < (int)mainCoder.NumInStreams; i++) { + InputStream tmp [] = new InputStream[1]; int res = GetInStream(inStreams, /*useless_inSizes,*/ startInIndex + i, tmp /* &seqInStream */ ); - if (res != HRESULT.S_OK) return; - java.io.InputStream seqInStream = tmp[0]; + if (res != HRESULT.S_OK) return res; + InputStream seqInStream = tmp[0]; seqInStreams.add(seqInStream); } - /* --- replaced by above --- - for (int i=0; i seqOutStreams = new Vector(); // CObjectVector< CMyComPtr > - int startOutIndex = bindInfo.GetCoderOutStreamIndex(mainCoderIndex); - for (int i=0; i seqInStreamsSpec = new Vector(); + Vector seqOutStreamsSpec = new Vector(); + for (i = 0; i < (int)mainCoder.NumInStreams; i++) + seqInStreamsSpec.add(seqInStreams.get(i)); + for (i = 0; i < (int)mainCoder.NumOutStreams; i++) + seqOutStreamsSpec.add(seqOutStreams.get(i)); + + for (i = 0; i < _coders.size(); i++) { + if (i == _mainCoderIndex) + continue; + CoderInfo coder = _coders.get(i); + + ICompressSetOutStreamSize setOutStreamSize = null; + try + { + setOutStreamSize = (ICompressSetOutStreamSize)coder.Coder; + + /*int res =*/ setOutStreamSize.SetOutStreamSize(coder.OutSizePointers.get(0)); + //if (res != HRESULT.S_OK) return res; + } catch (java.lang.ClassCastException e) { + // nothing to do + } + } + if (mainCoder.Coder != null) { + /*int res =*/ mainCoder.Coder.Code( + seqInStreamsSpec.get(0), + seqOutStreamsSpec.get(0), + // TBD mainCoder.InSizePointers.get(0), + mainCoder.OutSizePointers.get(0), + progress); + //if (res != HRESULT.S_OK) return res; + } else { + /*int res =*/ mainCoder.Coder2.Code( + seqInStreamsSpec, // &seqInStreamsSpec.Front( + //mainCoder.InSizePointers.Front(), // &mainCoder.InSizePointers.Front() + mainCoder.NumInStreams, + seqOutStreamsSpec, // &seqOutStreamsSpec.Front() + //mainCoder.OutSizePointers.Front(), // &mainCoder.OutSizePointers.Front() + mainCoder.NumOutStreams, + progress); + //if (res != HRESULT.S_OK) return res; + } + + OutputStream stream = seqOutStreams.firstElement(); + stream.flush(); + + return HRESULT.S_OK; + } + + @Override + public void close() { + + } } diff --git a/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java b/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java index 39c32e0d6..1868aec37 100644 --- a/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java +++ b/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java @@ -7,10 +7,10 @@ import java.io.OutputStream; import java.util.Vector; import SevenZip.Compression.LZ.OutWindow; - import SevenZip.ICompressCoder2; import SevenZip.ICompressProgressInfo; import SevenZip.Common.InBuffer; +import SevenZip.HRESULT; public class BCJ2_x86_Decoder implements ICompressCoder2 { @@ -32,7 +32,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { // return ((b0 == 0x0F) && ((b1 & 0xF0) == 0x80)); // } - void CodeReal( + int CodeReal( Vector inStreams, //Object useless1, // const UInt64 ** /* inSizes */, int numInStreams, @@ -83,7 +83,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { int b = _mainInStream.read(); if (b == -1) { Flush(); - return; + return HRESULT.S_OK; } _outStream.WriteByte(b); // System.out.println("0:"+b); // if ((b != 0xE8) && (b != 0xE9) && (!IsJcc(prevByte, b))) { @@ -116,7 +116,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { src |= ((int)b0) << 8; b0 = _callStream.read(); - if (b0 == -1) return; // TODO: HRESULT.S_FALSE; + if (b0 == -1) return HRESULT.S_FALSE; src |= ((int)b0); } else { @@ -133,7 +133,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { src |= ((int)b0) << 8; b0 = _jumpStream.read(); - if(b0 == -1) return; // TODO: HRESULT.S_FALSE; + if(b0 == -1) return HRESULT.S_FALSE; src |= ((int)b0); } @@ -153,7 +153,8 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { _outStream.Flush(); } - public void Code( + @Override + public int Code( Vector inStreams, // ISequentialInStream **inStreams, //Object useless_inSizes, // const UInt64 ** /* inSizes */, int numInStreams, @@ -163,7 +164,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { ICompressProgressInfo progress) throws java.io.IOException { try { - CodeReal(inStreams, /*useless_inSizes,*/ numInStreams, + return CodeReal(inStreams, /*useless_inSizes,*/ numInStreams, outStreams, /*useless_outSizes,*/ numOutStreams, progress); } catch(java.io.IOException e) { throw e; @@ -180,6 +181,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 { _outStream.ReleaseStream(); } + @Override public void close() throws java.io.IOException { ReleaseStreams(); } diff --git a/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java b/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java index 3deb87e3c..aa8224f8e 100644 --- a/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java +++ b/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java @@ -7,7 +7,7 @@ import java.util.Vector; public interface ICompressCoder2 { - public void Code( + public int Code( Vector inStreams, //Object useless1, // const UInt64 ** /* inSizes */, int numInStreams,