From 911a2789269e21d9a0daa9fe07bac43b84a0381d Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 25 May 2010 13:08:34 +0000 Subject: [PATCH] snark listing icons and cleanups --- LICENSE.txt | 2 + apps/i2psnark/_icons/application.png | Bin 0 -> 464 bytes apps/i2psnark/_icons/book.png | Bin 0 -> 593 bytes apps/i2psnark/_icons/bug.png | Bin 0 -> 774 bytes apps/i2psnark/_icons/cancel.png | Bin 0 -> 587 bytes apps/i2psnark/_icons/clock.png | Bin 0 -> 882 bytes apps/i2psnark/_icons/compress.png | Bin 0 -> 766 bytes apps/i2psnark/_icons/film.png | Bin 0 -> 653 bytes apps/i2psnark/_icons/folder.png | Bin 0 -> 537 bytes apps/i2psnark/_icons/html.png | Bin 0 -> 578 bytes apps/i2psnark/_icons/music.png | Bin 0 -> 385 bytes apps/i2psnark/_icons/package.png | Bin 0 -> 853 bytes apps/i2psnark/_icons/page.png | Bin 0 -> 635 bytes apps/i2psnark/_icons/page_white_acrobat.png | Bin 0 -> 591 bytes apps/i2psnark/_icons/photo.png | Bin 0 -> 589 bytes apps/i2psnark/_icons/plugin.png | Bin 0 -> 591 bytes apps/i2psnark/_icons/tick.png | Bin 0 -> 537 bytes apps/i2psnark/java/build.xml | 2 +- .../org/klomp/snark/web/I2PSnarkServlet.java | 136 +++++++++++------- installer/resources/themes/console/snark.css | 12 +- 20 files changed, 101 insertions(+), 51 deletions(-) create mode 100644 apps/i2psnark/_icons/application.png create mode 100644 apps/i2psnark/_icons/book.png create mode 100644 apps/i2psnark/_icons/bug.png create mode 100644 apps/i2psnark/_icons/cancel.png create mode 100644 apps/i2psnark/_icons/clock.png create mode 100644 apps/i2psnark/_icons/compress.png create mode 100644 apps/i2psnark/_icons/film.png create mode 100644 apps/i2psnark/_icons/folder.png create mode 100644 apps/i2psnark/_icons/html.png create mode 100644 apps/i2psnark/_icons/music.png create mode 100644 apps/i2psnark/_icons/package.png create mode 100644 apps/i2psnark/_icons/page.png create mode 100644 apps/i2psnark/_icons/page_white_acrobat.png create mode 100644 apps/i2psnark/_icons/photo.png create mode 100644 apps/i2psnark/_icons/plugin.png create mode 100644 apps/i2psnark/_icons/tick.png diff --git a/LICENSE.txt b/LICENSE.txt index 002fc1862..d178230aa 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -139,6 +139,7 @@ Applications: I2PSnark: Copyright (C) 2003 Mark J. Wielaard See licenses/LICENSE-GPLv2.txt + Silk icons: See licenses/LICENSE-SilkIcons.txt I2PTunnel: (c) 2003 - 2004 mihi @@ -176,6 +177,7 @@ Applications: Router console: Public domain. Flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/ + Silk icons: See licenses/LICENSE-SilkIcons.txt GeoIP Data: Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved. diff --git a/apps/i2psnark/_icons/application.png b/apps/i2psnark/_icons/application.png new file mode 100644 index 0000000000000000000000000000000000000000..1dee9e366094e87db68c606d0522d72d4b939818 GIT binary patch literal 464 zcmV;>0WbcEP)8e6`gpm!y1M!N^ZV(=IC*t) z{^;nqJv-tM$9J1L2QJ2DN!#51=1_l@G`2=6e0lehL%sic%`_4--LFM}IF!KzJCseW zq1I3__Z40|e?qyK1__gzP(qrBf-G7SQbQ`#Lw94WVe(o`qg+f4hy;Qju)q#I(9{`% zQmAGomzhQ!b|gq>KqL@IkO~$=Koi}a$u6d07kiS}NoYVMJjAeZpaB*;wwcDdEbK@K zNP;B7RzhQ|H9AlUO<`J>m1(5R)Pb-iLBb@7Jp)}LHdAb-VVgYxVoTzGoqu{~a>6uj zeqCRFI9pC#h09bGwy9;oHcp6(RB%jeY^F=Ll!S+9JkVe4nDG7tJMQiP0000l6k>CGhc0FIuigU9U^L+D`6bSr zIEp(+L4eIgaZT(|{B!*DbrTYc1t0J9*MLJm+n zOEVloE20S^g6s|1rvjjuW1W$TV;&TbK2|slm=91)Q{X{Kg;c!Saglq7xo8`(>{A}G zw@`8gScq(adr(4@;>^%e<~7+uNMv&?8L0#%0yj~@DW&fPImKeyFHkRKuNERO3(SOB z?S)niZbFEN`0<|w+LjBKR#DU7F3d&rQGGY&Y)Fv0w002i=Jm_>x9jBX>wg3XCKK`E f>xbvJ_5i;DeEQXvyE?}U00000NkvXXu0mjfKqCEw literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/bug.png b/apps/i2psnark/_icons/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5fb90ec6ee08f53947e0266a87b03f75893446 GIT binary patch literal 774 zcmV+h1Nr=kP) zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/cancel.png b/apps/i2psnark/_icons/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..c149c2bc017d5ce5a8ae9330dd7dbd012482e0f4 GIT binary patch literal 587 zcmV-R0<`^!P)FS^-G}e*;M)Q6>s#cP zI`Y#S($G6W`W@NI5g|L-MKl0Zmu$m^(0~^Lwo5OO~d#(vPfzZkp%;s8}r$h6cUMpt8KZ&`memftw9r2BH zXZp!+CFaEnJk?xA$eKJbHrNPn>;Axd{TeCT;zL2Z2lqOE#$fse--k~9GCAnb$WrIY zUzF=05;%7ScRp;-^ba=g4+!_yjOVxZHrAy=-Qy;3W{V_ws3i3@rj zN6Uq**d4Ifp5hMksmBf!JrmJQC(GkeNV1GOW##ZtQFwF|H80+P{}RL%{YNk_%ft(I z#;Cz`v~ti@ZP83cwQ@*mu2Dwn=d>z@4RV(M%#h6&LDo!N4vuc zo|;?G=MQ0U0&vMd?WX`v6t{tSSteePbgELlMO}xKy8^QHBD{2ALkbX%5TpZC;3a)d zD?(MwgLzpdUa8!vFvP literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/compress.png b/apps/i2psnark/_icons/compress.png new file mode 100644 index 0000000000000000000000000000000000000000..8606ff0fd23c97d71d43afa0bd587e47c1e90441 GIT binary patch literal 766 zcmVZcJ%1+b$|lEg|m$p?$2s-?aFIU^lhS4 zt=5>B*onJiX5((A#g&zdZ;7N+zyNUJY~v8{(NtqH{`+@8xk&m zG`u_jq?FJb9n=hw%`FbbD_m;*4&fCDuR=V`pUsP7fU1Tp7Q?_nK-IQ85K85YX7gRJ zgwtoomKC%RWTO%Skh+*{%b>T>VfXA~9;mZE6vn=~?YHE7)8Zq;mfF}l;^WAReVKbv2dyl8I zZdsNM9oTISwn$ahzw_tMS*<#q^{;+1adq)i5#6)A{L5!4^#~!-uOE5i^$%Jv0}EmF z8*kM!$D7UP9;w~?<@c-q)vuj615`xxpt}~#kmfz_<WO3(`_cf+b25@DJ#zdQm}8GzWtq2-QnZ8W6mB^kfeK5f%S{ zUW%tGMCwrwic~ZrQcG=4f?5bkV+3dRk8hw6bk~y$KX#b!y*J4EJ~>;dRASqrSu;ZpM>?P}K~6AT zWv6Dmq?v&9LdXC(m%WCO6ma_di$R(v$@ad_>@R41N3N5lSJq9@6CGhX84-$%Xrd_6 z;){?{E|Ytt5$S-&Au>t4wDlIxdkfe-a22LMj``McG};r8@{GsRPm*+8fFey6C)@ifDBXVyTw(N@Xd41b45OFg6x_QA zpwLiigyy~cVoPxW^r~C7ZQpr%>1$*HKmv~AY-qJw4;gUecS--wnqslISSS=^KA&Ic n@BK|Onfz#3R%n{$a)0j^sqv5F(1NTL00000NkvXXu0mjf3S}fX literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/folder.png b/apps/i2psnark/_icons/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..784e8fa48234f4f64b6922a6758f254ee0ca08ec GIT binary patch literal 537 zcmV+!0_OdRP)x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWdis)>+`f+#3Rv=dSV4I&~|Vk?LiBG~#L1X~NSQGbAyogj#ie_$n8 z*oYwUieR#5zw>=_v)By?+NE%sVPM|5yzfjE5$wfk_Go)9(A<0e{hvFiJ0eb2MFf%t zDJxl&RDw>Nl#~WweRba-&_F#fn|ifCG!S=00#QfIDe64k{5mZFusu=CnSq>Qvt$j5 zI$4b(K~|@Tvozn3#yaJ|Be;BKfh@+AwFR!7UF7D*61OfavvGQ!VN-Ga+zO*%#qEoS z8E0dX4NpRyRS|XCrXq{e4r(61{zg^7gBPDUwmjg}k(Q%NLkD6fm6*tZ=)6^ARRw9CNHr!!-b)EovamKwdDMpr>=!|-tf?S+boQE&JP}G_9P5@nR zSOjlBPI$jHA&U_KsTjQko(uJ_ROpKn!K^ckXTHmZd+_Mh7C&~BUYvvb=Xi2w6%i+L zP+hwJF0QUE^66)$h?CXHvdjEbu3a_69GS^`e5Gac*$0~K9VHcGVKhe>RE(rT+Ca5J zv_?D-3(OpKFrQAl`$E;pyKkaTN=V?@iK2u!kqwFy=F?aM-2b}R>c4;EZ`t2+*gqpJ QK>z>%07*qoM6N<$f@8}2CIA2c literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/music.png b/apps/i2psnark/_icons/music.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b3ede3df956f8d505543b190bc8d1b5b4dce75 GIT binary patch literal 385 zcmV-{0e=38P)klCE>?a@fNhGaV ftv%qM$TQzJ6;XjO8erVL00000NkvXXu0mjfw}q7O literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/package.png b/apps/i2psnark/_icons/package.png new file mode 100644 index 0000000000000000000000000000000000000000..da3c2a2d74bab159ba0f65d7db601768258afcb2 GIT binary patch literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/page.png b/apps/i2psnark/_icons/page.png new file mode 100644 index 0000000000000000000000000000000000000000..03ddd799fa0a3aec561c75d4221f195db65d6eb9 GIT binary patch literal 635 zcmV->0)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4k~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/apps/i2psnark/_icons/photo.png b/apps/i2psnark/_icons/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2aaaaaf33ec07184ae0f5824ef24c82c41106f GIT binary patch literal 589 zcmV-T029`oe)=`;M0Ve`z_rRHM)ytw;{NqJ92_6VOk@C*y0Ex)o5ihL^ph1#5YinO zyxORvZUfgg!GxzCWTNIM`)KJS{p1Ntor?_ABp3_=gaD2H85Y)0(rUlQOh{nzR6z<5 zEO0De$IN)yJIjF82x73(uJW{bfy*E6{#GD4S;+brQ?z@ND2z~($5eI$1QYf0H)an^QOO;qRuu9YpYp4SM;xg>M8uf2eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GFHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p --> - + diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 85c0e917c..b9a97fe3f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -53,6 +53,7 @@ public class I2PSnarkServlet extends Default { private Log _log; private SnarkManager _manager; private static long _nonce; + private Resource _resourceBase; public static final String PROP_CONFIG_FILE = "i2psnark.configFile"; @@ -67,48 +68,33 @@ public class I2PSnarkServlet extends Default { configFile = "i2psnark.config"; _manager.loadConfig(configFile); _manager.start(); - super.init(new DefaultServletConfig(cfg, _manager.getDataDir().getAbsolutePath())); + try { + _resourceBase = Resource.newResource(_manager.getDataDir().getAbsolutePath()); + } catch (IOException ioe) {} + super.init(cfg); } - /** - * A ServletConfig we will pass to super - */ - private static class DefaultServletConfig implements ServletConfig { - private final ServletConfig _sc; - private final String _path; - - DefaultServletConfig(ServletConfig sc, String path) { - _sc = sc; - _path = path; - } - - public String getInitParameter(String name) { - if ("acceptRanges".equals(name) || "dirAllowed".equals(name)) - return "true"; - if ("resourceBase".equals(name)) - return _path; - return _sc.getInitParameter(name); - } - - public Enumeration getInitParameterNames() { - return _sc.getInitParameterNames(); - } - - public ServletContext getServletContext() { - return _sc.getServletContext(); - } - - public String getServletName() { - return _sc.getServletName(); - } - } - @Override public void destroy() { _manager.stop(); super.destroy(); } + /** + * We override this instead of passing a resource base to super(), because + * if a resource base is set, super.getResource() always uses that base, + * and we can't get any resources (like icons) out of the .war + */ + @Override + protected Resource getResource(String pathInContext) throws IOException + { + if (pathInContext == null || pathInContext.equals("/") || pathInContext.equals("/index.jsp") || + pathInContext.equals("/index.html") || pathInContext.startsWith("/_icons/")) + return super.getResource(pathInContext); + // files in the i2psnark/ directory + return _resourceBase.addPath(pathInContext); + } + /** * Some parts modified from: *
@@ -1261,26 +1247,30 @@ public class I2PSnarkServlet extends Default {
             long length = item.length();
             if (item.isDirectory()) {
                 complete = true;
-                status = _("Directory");
+                status = " " +
+                         _("Directory");
             } else {
                 if (snark == null) {
-                    status = "Snark not found?";
+                    // Assume complete, perhaps he removed a completed torrent but kept a bookmark
+                    complete = true;
+                    status = " " +
+                                         _("Torrent not found?");
                 } else {
                     try {
                         File f = item.getFile();
                         if (f != null) {
                             long remaining = snark.storage.remaining(f.getCanonicalPath());
-                            if (remaining == 0) {
+                            if (remaining < 0) {
                                 complete = true;
-                                status = _("Complete");
-                            } else if (remaining < 0) {
+                                status = " " +
+                                         _("File not found in torrent?");
+                            } else if (remaining == 0 || length <= 0) {
                                 complete = true;
-                                status = _("File not found in torrent?");
-                            } else if (length <= 0) {
-                                complete = true;
-                                status = _("Complete");
+                                status = " " +
+                                         _("Complete");
                             } else {
-                                status = (100 - (100 * remaining / length)) + "% " + _("complete") +
+                                status = " " +
+                                         (100 - (100 * remaining / length)) + "% " + _("complete") +
                                          " (" + DataHelper.formatSize(remaining) + " bytes remaining)";
                             }
                         } else {
@@ -1295,24 +1285,72 @@ public class I2PSnarkServlet extends Default {
             String path=URI.addPaths(base,encoded);
             if (item.isDirectory() && !path.endsWith("/"))
                 path=URI.addPaths(path,"/");
+            String plc = path.toLowerCase();
+
+            // pick an icon; try to catch the common types in an i2p environment
+            String icon;
+            if (item.isDirectory()) {
+                icon = "folder";
+            } else {
+                // Should really just add to the mime.properties file in org.mortbay.jetty.jar
+                // instead of this mishmash. We can't get to HttpContext.setMimeMapping()
+                // from here? We could do it from a web.xml perhaps.
+                // Or could we put our own org/mortbay/http/mime.properties file in the war?
+                String mime = getServletContext().getMimeType(path);
+                if (mime == null)
+                    mime = "";
+                if (mime.equals("text/html"))
+                    icon = "html";
+                else if (mime.equals("text/plain") || plc.endsWith(".nfo"))
+                    icon = "page";
+                else if (mime.equals("application/java-archive") || plc.endsWith(".war"))
+                    icon = "package";
+                else if (plc.endsWith(".xpi2p"))
+                    icon = "plugin";
+                else if (mime.equals("application/pdf"))
+                    icon = "page_white_acrobat";
+                else if (mime.startsWith("image/") || plc.endsWith(".ico"))
+                    icon = "photo";
+                else if (mime.startsWith("audio/") || mime.equals("application/ogg") ||
+                         plc.endsWith(".flac") || plc.endsWith(".m4a") || plc.endsWith(".wma") ||
+                         plc.endsWith(".ape"))
+                    icon = "music";
+                else if (mime.startsWith("video/") || plc.endsWith(".mkv") || plc.endsWith(".m4v") ||
+                         plc.endsWith(".mp4"))
+                    icon = "film";
+                else if (mime.equals("application/zip") || mime.equals("application/x-gtar") ||
+                         mime.equals("application/compress") || mime.equals("application/gzip") ||
+                         mime.equals("application/x-tar") ||
+                         plc.endsWith(".rar") || plc.endsWith(".bz2") || plc.endsWith(".7z"))
+                    icon = "compress";
+                else if (plc.endsWith(".exe"))
+                    icon = "application";
+                else
+                    icon = "bug";
+            }
             if (complete) {
+                buf.append("\"\"\"\" ");
+                } else {
+                    buf.append("height=\"16\" width=\"16\" src=\"/i2psnark/_icons/").append(icon).append(".png\"> ");
                 }
                 buf.append("");
+            } else {
+                buf.append(" ");
             }
             buf.append(ls[i]);
             if (complete)
                 buf.append("");
-            buf.append("");
+            buf.append("");
             if (!item.isDirectory())
                 buf.append(DataHelper.formatSize(length)).append(' ').append(_("Bytes"));
-            buf.append("");
+            buf.append("");
             //buf.append(dfmt.format(new Date(item.lastModified())));
             buf.append(status);
             buf.append("\n");
diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css
index 70091b13f..4c673c142 100644
--- a/installer/resources/themes/console/snark.css
+++ b/installer/resources/themes/console/snark.css
@@ -110,6 +110,15 @@ td {
 
 .snarkFileName {
      min-width: 25em;
+     padding: 4px 10px;
+}
+
+.snarkFileSize {
+     padding: 4px 10px;
+}
+
+.snarkFileStatus {
+     padding: 4px 10px;
 }
 
 .thumb {
@@ -225,7 +234,8 @@ textarea {
 
 img {
      border: none;
-     margin: 5px 5px 0px 5px;
+     margin: 4px 8px 4px 4px;
+     vertical-align: middle;
      opacity: 1.0;
      line-height: 100%;
 }