From f84df92e1388285f712fb20062c7abf602031231 Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Fri, 26 Nov 2004 07:20:03 +0000 Subject: [PATCH] Add: ScreenPackages --- .../Graphics/ScreenPackages DownloadBG.png | Bin 0 -> 441 bytes .../Graphics/ScreenPackages PackagesBG.png | Bin 0 -> 10779 bytes .../default/Graphics/ScreenPackages WebBG.png | Bin 0 -> 10606 bytes .../Graphics/ScreenPackages WebSel.png | Bin 0 -> 1796 bytes stepmania/Themes/default/metrics.ini | 54 ++ stepmania/src/Makefile.am | 2 +- stepmania/src/Screen.cpp | 2 + stepmania/src/ScreenPackages.cpp | 699 ++++++++++++++++++ stepmania/src/ScreenPackages.h | 124 ++++ stepmania/src/StepMania-net2003.vcproj | 6 + stepmania/src/StepMania.dsp | 8 + stepmania/src/StepMania.vcproj | 6 + stepmania/src/StepManiaXbox.vcproj | 6 + 13 files changed, 906 insertions(+), 1 deletion(-) create mode 100644 stepmania/Themes/default/Graphics/ScreenPackages DownloadBG.png create mode 100644 stepmania/Themes/default/Graphics/ScreenPackages PackagesBG.png create mode 100644 stepmania/Themes/default/Graphics/ScreenPackages WebBG.png create mode 100644 stepmania/Themes/default/Graphics/ScreenPackages WebSel.png create mode 100644 stepmania/src/ScreenPackages.cpp create mode 100644 stepmania/src/ScreenPackages.h diff --git a/stepmania/Themes/default/Graphics/ScreenPackages DownloadBG.png b/stepmania/Themes/default/Graphics/ScreenPackages DownloadBG.png new file mode 100644 index 0000000000000000000000000000000000000000..179c1287d5e66cdb10818b22d9424d07869ca037 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yo3VtQ&&YGO)d;mK4Rpef#-E{-7;w~}~xcv2)-7bl4D z_%aAM_$+ob;Bq^7ft7*LWLBg5K@EvR3*tC^4I_k6<`~lh9)rd*)i%T TvT`2-hCPF)tDnm{r-UW|3D|gQ literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenPackages PackagesBG.png b/stepmania/Themes/default/Graphics/ScreenPackages PackagesBG.png new file mode 100644 index 0000000000000000000000000000000000000000..7554ef6bc896aa5f4820c8967c58713f0ca1b0bc GIT binary patch literal 10779 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 MZQANw?#NF3AAW8+^#A|> literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenPackages WebBG.png b/stepmania/Themes/default/Graphics/ScreenPackages WebBG.png new file mode 100644 index 0000000000000000000000000000000000000000..a08d8b17e1fb3ccd63454eb1414c14f8580f5ab5 GIT binary patch literal 10606 zcmeHt`9GBX_y0AkF~+{lSTc-|r5H1!#Mo7;5lN`VHl{%+sbrb446;{brqXESMiGTn z@5)xm)+kELoh7-o=vJvj_+FRs{`?Q$$K(CeFmqk6*Xumb^DM7(P8NN;n=DoX3jl!Z zW_RbE;O8I!z&IE*_}7M5!^7YQGR$F{0{~p>T#q{W0sNm3>*5>h6~&A_8h9uaa0rPC z3MFoi3=9k185$UJJmztzEdZweprljhKTrV6*0+cv|^{XI^Vzui1^u>Q=s?BcS;k;mSXapt;Vrl4lah)(rNh5aR8bL5n&Yg{d#8WC5g zD!v|{&sc3~A)?MND)fJD=hp*p%rFgQnRidw)Tut`alln;vYK+9h78jXQP?=h0+r*Q z#$JO)_YBGp2@;cqAHK_%Hf;8&aM}O11EWBjHAwEa#K-d-pZH$YXPPEt$GBPc8xb4V zJ)k+-pDe+pn|Liac`eCrS^|&?GKjCKDm}h}I8Q%#WkNLSpD%n%?OKZJ@gVex|EyCkByonwD)(~IYogL?q^)0F1Nr-L zN7<9jqncCgFUFm|WRF(k=ze}6Y1(MVtS=0C(yX)=Od{Gpdsw4QUDb#3;5*5xWo5B5 z6*`uMsY;Wn8qLOtt7c{#K=1O7^e8d>wZcZtVh5QLyP&yU&Ex@=fo9}S#f|Q;Zto$s z5!!UFAez4$!nE~XjGj$uSzOS8e|Q#RYpE-9sRgt!R^Xr zMt1?epR9uLGYD}BHy&e?$M!O%6lfi#o(`4Lnc=^cG!b8pn*?m51yBcBObt|8-0!jQ zxj>V;m>+k2F$45tNBu!I)LyvX5m93}@T9G%KU4cEzUHzkte%uSgkBS!E4CQH=MV>a zNO5OT2+&=aE7)0|F8RB~)LM`>tM)pN31Zsq@k72Fqf_gUWsgfcJD|v(YyB<{KFio# zm(~Y#-0Uq)r(KkJA>KeLei{;67o<`^cIVdo&WH*$t-YsQwpSJT;tCuhOWGa1Wb zJC(BbtP=N5#N=@vjL7kg-mLKQzFx&oJ@3PccNU`{*O8#99206hBgo-*`ekJe^dR3M zz|+b-IvxLAD*k)HkcV53S^>nz%*e%2fy%?P&r2}nVVBM&nggKKIL9N0r?h9)@MDLp z*R-F3JoQMox4E6N+^u9JHX-3d3Ae-}O%CLs|HYF7^VN8K<{h)Nft`V|<54P%ZucDD zInSk-oH+}nJtL>%`*rXAX@i!vRx&NS@eBWTrWKz#gRcq$@|YEcGWhzCwE-VX@brA# zyqk~~*7D3PD1`V$Yl{jMa&;*g_{<(!nw7>WFKiB^x-Ao=fnU1RsZ(dZM~(Wvh1E6z)oefpW`k!6cL##_nB%xOEu}Wr|dVc=Y@Z zXP1^v+HAB>^}$ROs3Bvfeh^#Nkr37Zp)KdF;4e}Ns8Uev$A)s_OVVfgs6}?X9GAli4 zy_9zMpt;oqki5#Omhx4*roosx)0dMo<*V%>q94 z&Wj%opX^qMOHXDMp`+Z|+Rq(os43h`>g6VF+( zof@ew|3L%$R=;p__X@d%fG|mkRW6?hz`ZSN-k6_leL81X;)>pQ^FYenz7fA_{dJjD zM(dB!JrrRQ8$rm?2vz#)F}AZKqb0c(V^ZDpgg^Fla$w9p^DQ@`da+IwZRZ)!^L4DH z8f?H612Q(8H84o8%RvfG!@qvb{o*ia9;E5B|IX8bTlZd_J3?FlL;Lb$Mu6-E(F>2d z&HDqKK7vq>o&Rg>{rp$^)eA!xxiiWu=F9*nx3=~P?8E@N@>;qat+#!b=EUOj{u4i= zhzlsmQsRh_)~-r?RE2bwb^g;Gjyl4Y;uwbT=(pQTKg?b)lClS_B9}xp^M8hE^D77o zH*kJr(}l;nncBKiAoQ{CvN4Bw3;YPBqX} zt!0DYkkx9_>&VytZ6%$k%Ryc0H$3V_`CNADLQ1$TC5sbZCVC2QL+Fy~3>6C%$!DTms>f zh2OCB-CNct`mZmgQde9fyc!{9wAbI*gcrq6Hp;SY=-w-I2;eIpX9SyrcNxf0atweo z1X|Wb@jXK^vEvQj$2n}fm_EI1Z1Yx>1ZalxIU80l8sU#*Z34Zqi8E722u*V`&X8Hsw%uD9h^ z#YvfkwiU%N4too8FgrI603d~)gOadEkj1&_LO<+XCfv+KaF<1Rt08lyp2xOSkeC|? zrq6dyM_s5K{h?l6V=!IEi6_5;qc>t`B0u`a4aPR7hzN0UUYU7pp3MLK*6fq*v}03S zWqrZ9Y@r9TnqPO})B5F&<-Bv?)!er03&;A3%;DF9|v?r6~y8EKxH}5ZlOTxjS^O9+Jt}SeH0?CR?siN z(R!^El2U?Cpg%kB34&F|X-3>Rx(2+)Ex+Q7hzOsf@&6LW>TEGc**2S^)-}e)>V4Ar zh)|w{I1~=6n5{@Y&fq~b0*u15bB#Bw3z+FaRz^&z zAUXXW=?4Kw)^a+EOnNtsk#~i{|MuHKi&E8P}dWteR?XdYa-q zt&_zYO?IDMr-Z)XJFj^%+2QLB;vzTgzSGzB@R_5OMEk-XTkEaqD8y z`6R8kFWMUQf{gyn)>B`h2OhZV!wtpJZzwcTq|4E_c&CcyIe~rjVRe_~yybYcCkOUs z(>1Q8Lc}e_%3fdkd<2VQ$|z{Z0Fn|D|Do{+jEIM)ko!XO-sT|oYH{Aaar%-f zdszm_l9iZj3Q(KNn{324y&iY?4q9pIzHF`_A?@IHtpgHHDxN8G-}450?k~r;v6wF3 zFZ;}7>vby0@TL&n1%>bolYrNE~O*qvMT- zbyV>ni+E}Ux(R?X&3T&vuX*p(=OI*85iWQQS*fO=tz2RM-B>*1gcc?##7`mbNUwVF zwzBYc>e&E^t>F<7FNQ`me1WWAK)89pwoXr)t%PFEmNFK-pMwNqa2ucaJ`5_fi@QV^RasmIV`J!)p-E z*M8IHPCv`bMcZXbaMXpuOz37LN95!S!5HxkPbJ z$duH~Ux!+yKZr&T^v_k?)NvNss zunc$u+870IFqPH;hVR^o{=nj0QUKXMxod+{tQbDLCG?>L}8yde_{n3^zT{(1Q1$>#03TR=EqftADtX-CyCF0zc zSe}BEP=I-z7Z3snPHTKP>e{a?u{Sh8nc2qLx{>89ZnroQ`@lvU3INRNKsb$*vhnAR z2OG&4jdJ|sv-SNe4jc}JxO1`&_yM=J!5oBH(rRXBV)@_dE>Vz-;Y(;6Fhxl%Rw&E- zdV>38s6B3u1Ci=at@lz&BgT*dJJT~6F# zEKPJ1E*&>*R-PV89M?TcXKFmY86#dfMY&M=iQSqI!2jQjd#jN)B<|cEp<-L$25H+# zi2x258dZJ`DK?GQ?T~%IEkCqEM?yagtf`0lY5U&soXmR#aVj{RSWli!+77fxSdmI};?6lX15L_#G=M_M3s+M2KAn4zqGc`N1_lt@ z{4>Ps32cAgNswu9J`g*Zz>pX)3|(jTZPxYIv@D+#Ri9Ds*4iRTI1tE!U+Wcbv}sv| z2eYYrP~<%<|2%PSjiK#U{& zY2SBtCa$JGY>D%gY4UjKK2EOiq$Mw(>SP{phF_rmIE7uhxYiAKq~rW17&$Cf-dS|6gf zhHxT76gpO2c%%KFW#CjVfEu@LvRRWb|5w42Qck_wx%5;?P`ISq@_ctn?sOSK+_CoF z;QP88hCY$!*9*!(szH|ELIOS-?jfkA{!=721fvcu;w*}xDc#`{4&FZ?Cra_^2U_x! z5U`&YMze(cGz3v^yqb=oPqh;bP{~dZ+ z+HbHb(44i-2--_<@+6SBAFP&1`8|^IOUz3mXwG(t_xOmoHfa(>jp2J3$r)!f&}XFU zWiS6aYBOr9eLw}5B!TlJaHb3!6A-YCefZ!PkM4dz`;tWZA{gtC`fGN~(DuDSuK&{J zWVZgwMNcT8zz`*XkY_w^0s+YNw0+s-R}4t$c$6#hRvSg4-K zJEfe%;1}q`4tXT)`yS%mp>bE3k2x!20K6zQROlgE`X)hFuegzJ0N?gDg{)NTAQKS& zhn5kN$E+NMEn{4W0dvykxW65(wDrj9U?t9u1$(+<(kkE6yg`DEQY)A^Aft4h`vQj0 zT8ze*M)*>R_*pg*&{}y;Xjf@}&GdhN(&PN?lX>kp=3KVMCQ;NZMBBR; zN&%o(XX;gL7P<8bsz>4Rhet71zZtzw3h3OQT=aTc`?T<$N~I6j8EDspJoETEIiL$C ztRc+SHo|^fcDLc6LY{+eTLa&4`u=kA*bZmhyr+EI5K9?O`#0`bthu1f6}_yQ^wmy< zhrXGV&0ltH?F2JKP@iHl#^$>lF;Nt@H3yEDJcXov`X)YisP1$=ZNV_%wT0{1Rk@Pi z`t6N?+;3&ql4$mRga%rZ^*a0~ZO^(vWl?sJ8wBigZ+abb^@Kz5Bp476X6Wo)ZGojp za8+UWi!!dazo1FzQitoP()FXaWQ67{kq>hTUwTR zij`+|kfXWll-Zx|;bj{T+Jy;)fbgZ}a)YL9b%$ek08P z+4|F^@L7b`-N9%TA{d&3G`174153ISxI@1Cr4u(RRifMD5{=dZ)fZ?dL|~zc2AV(z z1tj7J4=lEQz`Up+=KWW=DQD%EJ?i$3ZFd!|B|MKFpwdIwX_K&dJ%EAvTBVx;=T3UsF?*Q-8P8+_&m}jL zRVvlE7gS*z3Qz;yqyZ1a;1-cduN#aCdT7~~9=mdauWYPbb2E6!JGvLq$h>zWGDckT< zZoj3xz7$(+tlL+3`ZQFQLxSWj=<*gy`zQS4)?#o}nmRhI{n8e?9-Vc|GyCli_|6=Cm`&Q(>F5b)E{M#zzNyO$k~st`r+5wlDLyq7h^$$GEmZ z7(srUj~BN`V{Z}#YXmvD@?T!9yv{&`$}GS-`016ZG+O49)QG=aJ)e3zJy?Z~041sO zy)4(|+i~@E`_Xbs3zKJHEt80bB<%JUa-|~L--8#vTLi=zUALoO^5DzK*iJsyYMK*n zsmCfgKd@=La9dW#nvgxQ^ND(!TakXzt5@-C>@TJHL}e8DRPB1f;J_~_dsoE z*RoL_)m)olR{8);<_?MG|8j+yL7L0*KxqWD99aXn%lUgL3?Sdg{S8ksbIL6>v%s=Y zpdpCEjOo1Ao7#v5nBwporAjMDyB<`+t^v|FGyDuik(*^7(T7fTTt zjX2hj))@=h;hmENY}12PFFHq9vQ+FObX-V{A1YQY3p0w?W~ZPNTMyK3tbhom3Nq56 zs7izVAHMipq>y>Ru(X|gZu*Tb>fTiFOdnXJ4ug(n;HCN=ZCSG?uru>YetNi9;NEVl ztL^U~;TghZ1pDp9w#v0r|2A8h{@m`j@zq5Q6ao&NH>CRB7AQdg%Nj!m=ZIyeB1cEq35ho7K3SU$OIK0BC>M<$IHuy2K%j z+1EY)oj>)(aOhSN5x7*Jivy#Tr@0t{|9xCMop-&VRHnKfUwAG-SoCqSQ4KTj4u2H{ zm_b}Vq@^+AG+1fs3nYZcYCbZ;n?g3wF**EEm3Qo)OQ&4(Rl)QI12M4ETX=cP(A<`~ zTb2D~-#yJsp!fL~?h7Zh=foQ_?ZIf!y6jfU`xX$};Hhjw@z|b##us1}9RX!1o!S-B zp#Ar^_P=)%G3u5LD&xTNX-hylTI8Zz!AA!q=>VjN{}tT-*Sz@uscVz@mjBUSB|pW} zJmQ%a)R)qG^5;?8s$Px=*zfl{pR|Buxgsz`1LI@N2A&40z44)*$z8DFsI01;)BSD9 z`T6!{TRQ;(44uz`xu{xxbXvnFCE{D4aIP+`M~Wdp905Q{PJZPK9sy zMgiA6F-LSDyyM08GgkBNkB{lUmIeEW-qVxGdgG6)a`7=C<^6u)lvE4GX8(@oLFMKC z*FoE@r@s_+SkKz$u?33Rey*kyP)(Gox~BL3l70xWT4f08D>Cm(4Hp=!-J$rAsPs+Y z9oWzi+`=@ZEh-m|MpvyiNK`J`2elVH@)f#l)8@Q8&>f%+<3cLz6Hptf4xBA_z=0Wy zu4vQd2w7gvl7j{LqT)%12m_@JIbdn8e?q6MfoIaYKq4a)U#GMQ_Ja*PRE9%&G0<%L zLnq@=Ni-5o(paTkiAR;=y#E+pr#&jNd%SJl=r{%x-+dahHhW3&Lv#RD_0YvE>2Bf! z))WPsc>uoHeri?Bp!Y2HPjU$Em=G)r2I-QON2`Or7Gaxhv-Xj6!_F_U#vnusUi~%a zhJ3htMEP{zS0)*Jvh`VM2$38-dic+NBc|(^#j%*F`NN0eE9}zpA4|_s{9jch!3cTBTb7^{}7h{EhFm3ab-u*>t)LxwPU8-hJ zM(J_BSdauYNa!2A7Pw>geOWbj`VQstiAfPDjw3N|`nW|o8d z8*o1~-O%$+#Ng3x#`GVsF=L9H^IF1$m`3a}wJh#QiLjG7mBcjdwdeJ>p7f-R5mAV| ziDCPOhTl?KC+1RDJ1wj(CH=O|J#n9&=;1q{ zTwMkBXIT|`6kl$*?}EIa^7ML2@PcEvck^68@@Bkj2mtn~^`!JMvaT)cHQ;~}_NA#B zx>KE}Rs-_Vea)MNMrlkdQPx=e*O%%JDq-hrrd>i}jcVLC^$)h9H42QxSB~o zr9mF4W2UOWQoT04e%5uqPIfyn%phW$eE|Oe1#JE6q2W|j1mcTlL=f0S^KfM$74l$k z%B(o{0;E)GZ)ndUo$VWQx_0b<0X^OOC(5PBMqVagn1I}N(AP4e!!Wu8d z*ZF!(#VOExmFK{fZdjkEPqY=i#2jRRlO_SD@8gaMg2CY|Q(VcFCs})JEFeqS1daru z#)brG$zL-^Kkc?y9=}?=ysE=$elhT|d--#^NQUJGyG+Oye>oCBeQs}?Xb=!&y}KH8 z98HbMX6#Lvfmbf`swZvpHkZnWZ8yi@>I>>_t{r~!)&7xVKn~8rJFB!lx~8;cmkBgbS9$JSd7UKL+Or~PoXzz zInF$}q%-84<{SeGh`aab326DgSW8ZCXy}1{YqQnvdCyoI+`OgQ0JHY?h@dSW`{SQC zDtVTV{gw3O#~*dh#+`Hcf6%h$(qC)wBG5C%Y3#;k9G3uM0TSjw90Q1cp8@el zBn|)364ZYr!?A(?Xr4u9BkTW<#~cP6_7f|Q&)tOd{3pYIq_~+>^GE^IFoTrvpasB} z#;~~sTU;}enNElWAU#|_ECR%AKx_cSJV3k`Ab>!b${C1NfS3hp0f@c@#6NI&jFAY- z@Ua<5FpE_C@QE{$poftR|1ps0F9tHhgVOLK$1HkgC{n_ofrK>5NagTi1!8F+7KP>+ zQD~)f0U&@t)tDGkH3y*oUBQ}5l0ttSC_M?QLZA4~hMtcwK*by3(_)o+j0&-^$+u#KQg`HsZ&f|X~I^?8u zpkZ!iz%mF!$Swbn%wr(IAB4i05p4j68OHz@%|h~{5h5zB}}?_UxUJTCJH*-MH0{$VMU z{^JqD7xs*J;_W}4Oo~r0F1H|O7MLB#1pxz=^vsB+j)8!^FgrkMb&v`&kow<1{0F2E zAb?nq1ph*F90N3yJw*$o|5!SBLrn}@x*r*r@VvNvHzt32jiT?lshy_Rc5nO6~ z{*Sl)KNQ6nhKWB$#RgD}mk~a9`VU)|2Oxl$@MNk{FbYNi{y`ROL;3#!0*Hyo=Flh@ z1)~5pk1*koV*&^uoD!qqHVQ@oUVt<200huzrWysKfINV!i}Vj5fS5?sFbYP&C_v;9 zY~7@P00A_bsYbylARXXcR1Oe8ObpnUqA-qz+b9?XH~}bsFyoM81_&S~2JFLvqkXDT zFbW7~ENo(o00G2Af`(Br3Pu6`E)sZ-7a)K}`&6S~6p-Jq!a7g^5I{@>I%1<>6pRAg z847EQ4j_PV4OEO~s!=cs@b{;14OB1z1kmU}#V8mB_>DernOfW(aD?x8mVXjNROV)2zd+p}SdI%uUek#y` z6?{<44%K7@#4=FB|3EdeAX$j(Of_uk{u3dF?L0P^dDwP`;@bX=F2;<-UYK6=t?0P? z_7BZGV$P7mcGes-ntvIn7zX&l9=Yw0?iTd(6bXgte;i?e&2P*|iT)3c@FO;U|09|A zj|g@6^!_CxJu_f&GfWKTUwI%_g^GP+fE?=wI);J)Ab>yy3jnbk5OX6r2E^xNz#Lk~ zca9#e+J%vXQAJ`(bbRI!I-ih~T96oj{U@VF{ZFJl3`ExAq_ha|#R)cl;W|r?lz}Wp z0(LME2p?R17-HRsZYMEkPZAT(5)6>tzp%mybVkJ!P{srZAQq?uHv{V4{@)CQmn)HT z{vEmJ;o;It>G^Pk>>}rUKt>Yyq@JtCNQJN?*FBV+Psm6{*ist5`0Qk)AYH-a|DZJo zL6s9|d;Nca00L#CPYkFh&48-0@1uh|qhJ)^1plE;zVB##QV{W&`a!*(hLlv%d!Sj91a!tg7V6JXx|ESu;yDJJ^;jT00Ib$kaa^?PY8uLD)v(U~+`i{l_x`$V6ZS>OYRrI$}mB|6>{L!*^C6 zBbL!aTq9)vi5N{I)HM2sr!PXx2pcIQXN+W|m;YFrWdDh9AF<(#PcOdy88*GRMrxk} m@oQ)ebrpzDg9a-A0t^5LrRl1f(c5PL0000GetMetricF(m_sName,"PackagesBGWidth") +#define WEBBG_WIDTH THEME->GetMetricF(m_sName,"WebBGWidth") +#define NUM_PACKAGES_SHOW THEME->GetMetricI(m_sName,"NumPackagesShow") +#define NUM_LINKS_SHOW THEME->GetMetricI(m_sName,"NumLinksShow") + +const ScreenMessage SM_BackFromURL = ScreenMessage(SM_User+2); + +ScreenPackages::ScreenPackages( CString sClassName ) : ScreenWithMenuElements( sClassName ) +{ + m_iPackagesPos = 0; + m_iLinksPos = 0; + m_iDLorLST = 0; + m_bIsDownloading = false; + m_bCanDL = THEME->GetMetricB( sClassName, "CanDL" ); + m_sStatus = ""; + m_fLastUpdate = 0; + m_iTotalBytes = 0; + m_iDownloaded = 0; + + m_sprExistingBG.SetName( "PackagesBG" ); + m_sprExistingBG.Load( THEME->GetPathG( m_sName, "PackagesBG" ) ); + SET_XY_AND_ON_COMMAND( m_sprExistingBG ); + this->AddChild( &m_sprExistingBG ); + + m_sprWebBG.SetName( "WebBG" ); + m_sprWebBG.Load( THEME->GetPathG( m_sName, "WebBG" ) ); + SET_XY_AND_ON_COMMAND( m_sprWebBG ); + this->AddChild( &m_sprWebBG ); + + COMMAND( m_sprExistingBG, "Back" ); + COMMAND( m_sprWebBG, "Away" ); + + m_textPackages.LoadFromFont( THEME->GetPathF(m_sName,"default") ); + m_textPackages.SetShadowLength( 0 ); + m_textPackages.SetName( "Packages" ); + m_textPackages.SetMaxWidth( EXISTINGBG_WIDTH ); + SET_XY_AND_ON_COMMAND( m_textPackages ); + this->AddChild( &m_textPackages ); + RefreshPackages(); + + m_textWeb.LoadFromFont( THEME->GetPathF(m_sName,"default") ); + m_textWeb.SetShadowLength( 0 ); + m_textWeb.SetName( "Web" ); + m_textWeb.SetMaxWidth( WEBBG_WIDTH ); + SET_XY_AND_ON_COMMAND( m_textWeb ); + this->AddChild( &m_textWeb); + m_Links.push_back( " " ); + m_LinkTitles.push_back( "--Visit URL--" ); + + m_textURL.LoadFromFont( THEME->GetPathF( m_sName,"default") ); + m_textURL.SetShadowLength( 0 ); + m_textURL.SetName( "WebURL" ); + SET_XY_AND_ON_COMMAND( m_textURL ); + this->AddChild( &m_textURL ); + UpdateLinksList(); + + m_sprWebSel.SetName( "WebSel" ); + m_sprWebSel.Load( THEME->GetPathG( m_sName, "WebSel" ) ); + SET_XY_AND_ON_COMMAND( m_sprWebSel ); + this->AddChild( &m_sprWebSel ); + + m_sprDLBG.SetName( "Download" ); + m_sprDLBG.Load( THEME->GetPathG( m_sName, "DownloadBG" ) ); + SET_XY_AND_ON_COMMAND( m_sprDLBG ); + this->AddChild( &m_sprDLBG ); + + //(HTTP ELEMENTS) + m_sprDL.SetName( "Download" ); + m_sprDL.Load( THEME->GetPathG( m_sName, "Download" ) ); + SET_XY_AND_ON_COMMAND( m_sprDL ); + this->AddChild( &m_sprDL ); + m_sprDL.SetDiffuse( THEME->GetMetricC( m_sName, "DownloadProgressColor" ) ); + + m_textStatus.LoadFromFont( THEME->GetPathF(m_sName,"default") ); + m_textStatus.SetShadowLength( 0 ); + m_textStatus.SetName( "DownloadStatus" ); + SET_XY_AND_ON_COMMAND( m_textStatus ); + this->AddChild( &m_textStatus ); + + UpdateProgress(); +} + +void ScreenPackages::HandleScreenMessage( const ScreenMessage SM ) +{ + switch( SM ) + { + case SM_GoToPrevScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); + break; + case SM_GoToNextScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); + break; + case SM_BackFromURL: + if ( !ScreenTextEntry::s_bCancelledLast ) + EnterURL( ScreenTextEntry::s_sLastAnswer ); + break; + } + ScreenWithMenuElements::HandleScreenMessage( SM ); +} + +void ScreenPackages::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) +{ + ScreenWithMenuElements::Input( DeviceI, type, GameI, MenuI, StyleI ); +} + +void ScreenPackages::Update( float fDeltaTime ) +{ + HTTPUpdate(); + + m_fLastUpdate += fDeltaTime; + if ( m_fLastUpdate >= 1.0 ) + { + if ( m_bIsDownloading && m_bGotHeadder ) + m_sStatus = ssprintf( "DL @ %d KB/s", int((m_iDownloaded-m_bytesLastUpdate)/1024) ); + + m_bytesLastUpdate = m_iDownloaded; + UpdateProgress(); + m_fLastUpdate = 0; + } + + ScreenWithMenuElements::Update(fDeltaTime); +} + +void ScreenPackages::MenuStart( PlayerNumber pn ) +{ + if ( m_iDLorLST == 1 ) + { + if ( m_iLinksPos == 0 ) + SCREENMAN->TextEntry( SM_BackFromURL, "Enter URL:", "http://" ); + else + EnterURL( m_Links[m_iLinksPos] ); + } + ScreenWithMenuElements::MenuStart( pn ); +} + +void ScreenPackages::MenuUp( PlayerNumber pn, const InputEventType type ) +{ + if ( m_bIsDownloading ) + return; + if ( m_iDLorLST == 0) + { + if ( m_iPackagesPos > 0) + { + m_iPackagesPos--; + UpdatePackagesList(); + } + } + else + if ( m_iLinksPos > 0 ) + { + m_iLinksPos--; + UpdateLinksList(); + } + ScreenWithMenuElements::MenuUp( pn, type ); +} + +void ScreenPackages::MenuDown( PlayerNumber pn, const InputEventType type ) +{ + if ( m_bIsDownloading ) + return; + + if ( m_iDLorLST == 0) + { + if ( m_iPackagesPos < m_Packages.size() - 1 ) + { + m_iPackagesPos++; + UpdatePackagesList(); + } + } + else + if ( m_iLinksPos < m_LinkTitles.size() - 1 ) + { + m_iLinksPos++; + UpdateLinksList(); + } + ScreenWithMenuElements::MenuDown( pn, type ); +} + +void ScreenPackages::MenuLeft( PlayerNumber pn, const InputEventType type ) +{ + if ( m_bIsDownloading ) + return; + if ( !m_bCanDL ) + return; + + m_sprExistingBG.StopTweening( ); + m_sprWebBG.StopTweening( ); + + if ( m_iDLorLST == 0 ) + { + m_iDLorLST = 1; + COMMAND( m_sprExistingBG, "Away" ); + COMMAND( m_sprWebBG, "Back" ); + } else + { + m_iDLorLST = 0; + COMMAND( m_sprExistingBG, "Back" ); + COMMAND( m_sprWebBG, "Away" ); + } + ScreenWithMenuElements::MenuLeft( pn, type ); +} + +void ScreenPackages::MenuRight( PlayerNumber pn, const InputEventType type ) +{ + if ( m_bIsDownloading ) + return; + MenuLeft( pn, type ); + ScreenWithMenuElements::MenuRight( pn, type ); +} + +void ScreenPackages::MenuBack( PlayerNumber pn ) +{ + if ( m_bIsDownloading ) + { + SCREENMAN->SystemMessage( "Download Cancelled." ); + CancelDownload( ); + return; + } + + TweenOffScreen(); + Back( SM_GoToPrevScreen ); + ScreenWithMenuElements::MenuBack( pn ); +} + +void ScreenPackages::TweenOffScreen( ) +{ + OFF_COMMAND( m_sprExistingBG ); + OFF_COMMAND( m_sprWebBG ); + OFF_COMMAND( m_sprWebSel ); + OFF_COMMAND( m_textPackages ); + OFF_COMMAND( m_textWeb ); + OFF_COMMAND( m_sprDL ); + OFF_COMMAND( m_sprDLBG ); + OFF_COMMAND( m_textStatus ); + + if ( m_fOutputFile.IsOpen() ) + m_fOutputFile.Close(); +} + +void ScreenPackages::RefreshPackages() +{ + GetDirListing( "Packages/*.*zip", m_Packages, false, false ); + + if ( m_iPackagesPos < 0 ) + m_iPackagesPos = 0; + + if ( m_iPackagesPos >= m_Packages.size() ) + m_iPackagesPos = m_Packages.size() - 1; + + UpdatePackagesList(); +} + +void ScreenPackages::UpdatePackagesList() +{ + CString TempText=""; + int min = m_iPackagesPos-NUM_PACKAGES_SHOW; + int max = m_iPackagesPos+NUM_PACKAGES_SHOW; + for (int i=min; i= 0 ) && ( i < m_Packages.size() ) ) + TempText += m_Packages[i] + '\n'; + else + TempText += '\n'; + } + m_textPackages.SetText( TempText ); +} + +void ScreenPackages::UpdateLinksList() +{ + CString TempText=""; + if ( m_iLinksPos >= m_LinkTitles.size() ) + m_iLinksPos = m_LinkTitles.size() - 1; + int min = m_iLinksPos-NUM_LINKS_SHOW; + int max = m_iLinksPos+NUM_LINKS_SHOW; + for (int i=min; i= 0 ) && ( i < m_LinkTitles.size() ) ) + TempText += m_LinkTitles[i] + '\n'; + else + TempText += '\n'; + } + m_textWeb.SetText( TempText ); + if ( ( m_iLinksPos >=0 ) && ( m_iLinksPos < m_Links.size() ) ) + m_textURL.SetText( m_Links[m_iLinksPos] ); + else + m_textURL.SetText( " " ); +} + +void ScreenPackages::HTMLParse() +{ + m_Links.clear(); + m_LinkTitles.clear(); + m_Links.push_back( " " ); + m_LinkTitles.push_back( "--Visit URL--" ); + + //XXX: VERY DIRTY HTML PARSER! + //Only designed to find links on websites. + int i = m_sBUFFER.Find( "=0 ) + { + k = m_sBUFFER.Find( ">", i+1 ); + l = m_sBUFFER.Find( "HREF", i+1); + m = m_sBUFFER.Find( "=", l ); + + if ( ( l > k ) || ( m > k ) ) //no "href" in this tag. + { + if ( mode == 0 ) + i = m_sBUFFER.Find( "", k+1 ); + if ( j < l ) + k = j; + + CString TempLink = StripOutContainers( m_sBUFFER.substr(m+1,k-m-1) ); + if ( TempLink.substr(0,7).compare("http://") != 0 ) + TempLink = m_sBaseAddress + TempLink; + + CString TempTitle = m_sBUFFER.substr( k+1, l-k-1 ); + + m_Links.push_back( TempLink ); + m_LinkTitles.push_back( TempTitle ); + + if ( mode == 0 ) + i = m_sBUFFER.Find( "= '!' ) && ( t <= 'z' ) ) + Output+=t; + else + { + char out[2]; + itoa( t, out, 16 ); + Output += "%" + CString(out); + } + } + return Output; +} + +CString ScreenPackages::StripOutContainers( const CString & In ) +{ + if ( In.length() == 0 ) + return ""; + + int i = 0; + char t = In.at(i); + while ( ( t == ' ' ) && ( i < In.length() ) ) + { + t = In.at(++i); + } + + if ( ( t == '\"' ) || ( t == '\'' ) ) + { + int j = i+1; + char u = In.at(j); + while ( ( u != t ) && ( j < In.length() ) ) + { + u = In.at(++j); + } + if (j==i) + return StripOutContainers( In.substr(i+1) ); + else + return StripOutContainers( In.substr(i+1, j-i-1) ); + } + return In.substr( i ); +} + +void ScreenPackages::UpdateProgress() +{ + float DownloadedRatio; + + if ( m_iTotalBytes < 1 ) + DownloadedRatio = 0; + else + DownloadedRatio = float(m_iDownloaded) / float(m_iTotalBytes); + + float dLY = DownloadedRatio / 2 * m_sprDLBG.GetUnzoomedWidth(); + + m_sprDL.SetX( m_sprDLBG.GetX() - m_sprDLBG.GetUnzoomedWidth() / 2.0 + dLY ); + m_sprDL.SetWidth( dLY * 2 ); + + m_textStatus.SetText( m_sStatus ); +} + +void ScreenPackages::CancelDownload( ) +{ + m_wSocket.close(); + m_bIsDownloading = false; + m_iDownloaded = 0; + m_bGotHeadder = false; + m_fOutputFile.Close(); + m_sStatus = "Failed."; + m_sBUFFER = ""; + if ( ! FILEMAN->Remove( "Packages/" + m_sEndName ) ) + SCREENMAN->SystemMessage( "Packages/" + m_sEndName ); +} +void ScreenPackages::EnterURL( const CString & sURL ) +{ + CString Proto; + CString Server; + int Port=80; + CString Addy; + + if ( !ParseHTTPAddress( sURL, Proto, Server, Port, Addy ) ) + { + m_sStatus = "Invalid URL."; + UpdateProgress(); + return; + } + + //Determine if this is a website, or a package? + //Criteria: does it end with *zip? + if ( Addy.Right(3).CompareNoCase("zip") == 0 ) + m_bIsPackage=true; + else + m_bIsPackage = false; + + int k=0,j=0; + while ( k >= 0 ) + { + j = k+1; + k = Addy.Find( '/', j ); + } + m_sEndName = Addy.Right( Addy.length() - j + 1 ); + + if ( Port == 80 ) + m_sBaseAddress = "http://" + Server + "/" + Addy.substr(0, j); + else + m_sBaseAddress = "http://" + Server + ssprintf( ":%d/", Port ) + Addy.substr(0, j); + + //Open the file... + + //First find out if a file by this name already exists + //if so, then we gotta ditch out. + //XXX: This should be fixed by a prompt or something? + + //if we are not talking about a file, let's not worry + if ( ( m_sEndName != "" ) && m_bIsPackage ) + { + CStringArray AddTo; + GetDirListing( "Packages/"+m_sEndName, AddTo, false, false ); + if ( AddTo.size() > 0 ) + { + m_sStatus = "File Already Exists"; + UpdateProgress(); + return; + } + + if (!m_fOutputFile.Open( "Packages/"+m_sEndName, RageFile::WRITE )) + { + m_sStatus = m_fOutputFile.GetError(); + UpdateProgress(); + return; + } + } + //Continue... + + Addy = URLEncode( Addy ); + + if ( Addy != "/" ) + Addy = "/" + Addy; + + m_wSocket.close(); + m_wSocket.create(); + + m_wSocket.blocking = true; + + if (!m_wSocket.connect( Server, Port )) + { + m_sStatus = "Failed to connect."; + UpdateProgress(); + return; + } + + //Produce HTTP headder + + CString Headder=""; + + Headder = "GET "+Addy+" HTTP/1.0\r\n"; + Headder+= "Host: " + Server + "\r\n"; + Headder+= "Connection: closed\r\n\r\n"; + + m_wSocket.SendData( Headder.c_str(), Headder.length() ); + m_sStatus = "Headder Sent."; + m_wSocket.blocking = false; + m_bIsDownloading = true; + m_sBUFFER = ""; + m_bGotHeadder = false; + UpdateProgress(); + return; +} +void ScreenPackages::HTTPUpdate() +{ + if ( m_bIsDownloading ) + { + int BytesGot=0; + //Keep this as a code block + //as there may be need to "if" it out some time. + { + int Size = 1; + while ( Size > 0 ) + { + char Buffer[1024]; + Size = m_wSocket.ReadData( Buffer, 1024 ); + m_sBUFFER.append( Buffer, Size ); + BytesGot += Size; + } + if (!m_bGotHeadder) + { + m_sStatus = "Waiting for headder."; + //We don't know if we are using unix-style or dos-style + int HeadderEnd = m_sBUFFER.find("\n\n"); + if ( HeadderEnd < 0 ) + HeadderEnd = m_sBUFFER.find("\r\n\r\n"); + if ( HeadderEnd >= 0 ) + { + int i = m_sBUFFER.find(" "); + int j = m_sBUFFER.find(" ",i+1); + int k = m_sBUFFER.Find("\n",j+1); + if ( (i<0) || (j<0) || (k<0) ) + { + m_iResponceCode = -100; + m_iResponceName = "Malformed responce."; + } + m_iResponceCode = atoi(m_sBUFFER.substr(i+1,j-i).c_str()); + m_iResponceName = m_sBUFFER.substr( j+1, k-j).c_str(); + + i = m_sBUFFER.find("Content-Length:"); + j = m_sBUFFER.find("\n", i+1 ); + + if ( i > 0 ) + m_iTotalBytes = atoi(m_sBUFFER.substr(i+16,j-i).c_str()); + else + m_iTotalBytes = -1; //We don't know, so go until disconnect + + m_bGotHeadder = true; + m_sBUFFER = m_sBUFFER.substr( HeadderEnd + 4 ); + } + } + else + { + if ( m_bIsPackage ) + { + m_iDownloaded += m_sBUFFER.length(); + m_fOutputFile.Write( m_sBUFFER ); + m_sBUFFER = ""; + } + else + { + m_iDownloaded = m_sBUFFER.length(); + } + if ( ( ( m_iTotalBytes <= m_iDownloaded ) && ( m_iTotalBytes != -1 ) ) || + //We have the full doc. (And we knew how big it was) + ( ( m_iTotalBytes == -1 ) && + ( ( m_wSocket.state == EzSockets::SockState::skERROR ) || + ( m_wSocket.state == EzSockets::SockState::skDISCONNECTED ) ) ) ) + //We didn't know how big it was, and were disconnected + //So that means we have it all. + { + m_wSocket.close(); + m_bIsDownloading = false; + m_bGotHeadder=false; + m_sStatus = ssprintf( "Done;%dB", int(m_iDownloaded) ); + + if ( ( m_iResponceCode < 200 ) || ( m_iResponceCode >= 400 ) ) + m_sStatus = ssprintf( "%d", m_iResponceCode ) + m_iResponceName; + else + if ( m_bIsPackage && ( m_iResponceCode < 300 ) ) + { + m_fOutputFile.Close( ); + FlushDirCache( ); + RefreshPackages( ); + m_iDownloaded = 0; + } + else + HTMLParse(); + } + } + } + } +} + +bool ScreenPackages::ParseHTTPAddress( const CString & URL, CString & Proto, CString & Server, int & Port, CString & Addy ) +{ + int i,j,k,l; + + // [PROTO://]SERVER[:PORT][/URL] + + if ( URL.length() == 0 ) + return false; + + //PROTO + i = URL.Find( "://" ); + if ( i >= 0 ) + { + Proto = URL.substr( 0, i ); + i+=3; + } + else + i = 0; + //SERVER + j = URL.Find( '/', i ); + k = URL.Find( ':', i ); + if ( ( k >= 0 ) && ( j >= 0 ) ) + l = min ( j, k ); + else if ( k >= 0 ) + l = k; + else if ( j >= 0 ) + l = j; + else + l = URL.length(); + Server = URL.substr( i, l-i ); + + //PORT + if ( URL.substr( l, 1 ).compare(":")==0 ) + { + l++; + j = URL.Find( '/', l ); + if ( j < 0 ) + j = URL.length(); + Port = atoi( URL.substr( l, j-l ).c_str() ); + if (Port == 0) + return false; + l=j; + } + if (l m_Links; + vector m_LinkTitles; + BitmapText m_textURL; + + int m_iPackagesPos; + int m_iLinksPos; + + int m_iDLorLST; + int m_bCanDL; + + //HTTP portion + void CancelDownload( ); + void EnterURL( const CString & sURL ); + void HTTPUpdate( ); + + //True if proper string, false if improper + bool ParseHTTPAddress( const CString & URL, CString & Proto, CString & Server, int & Port, CString & Addy ); + + Sprite m_sprDL; + Sprite m_sprDLBG; + void UpdateProgress(); + + bool m_bIsDownloading; + float m_fLastUpdate; + long m_bytesLastUpdate; + + CString m_sStatus; + BitmapText m_textStatus; + + EzSockets m_wSocket; + + bool m_bGotHeadder; + + RageFile m_fOutputFile; + CString m_sEndName; + bool m_bIsPackage; + + CString m_sBaseAddress; + //HTTP Headder information responce + long m_iTotalBytes; + long m_iDownloaded; + + long m_iResponceCode; + CString m_iResponceName; + + //Raw HTTP Buffer + CString m_sBUFFER; +}; + +#endif + +#endif +/* + * (c) 2004 Charles Lohr + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/StepMania-net2003.vcproj b/stepmania/src/StepMania-net2003.vcproj index a5ff59b87c..47e88d1604 100644 --- a/stepmania/src/StepMania-net2003.vcproj +++ b/stepmania/src/StepMania-net2003.vcproj @@ -423,6 +423,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 5c79f947ae..cf630eda33 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -2680,6 +2680,14 @@ SOURCE=.\ScreenOptionsMasterPrefs.h # End Source File # Begin Source File +SOURCE=.\ScreenPackages.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenPackages.h +# End Source File +# Begin Source File + SOURCE=.\ScreenPlayerOptions.cpp # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index 08ebf7a73a..d31e5a6bd8 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -415,6 +415,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/StepManiaXbox.vcproj b/stepmania/src/StepManiaXbox.vcproj index d5859f204c..39c7b54370 100644 --- a/stepmania/src/StepManiaXbox.vcproj +++ b/stepmania/src/StepManiaXbox.vcproj @@ -554,6 +554,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + +