Changeset 77e0cb9


Ignore:
Timestamp:
Nov 4, 2010 4:24:23 AM (11 years ago)
Author:
HungryHobo <HungryHobo@…>
Branches:
master
Children:
8593931
Parents:
853f941 (diff), 2b2c3cf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge of '01966a37ff4e50e48ab6eeb9d215baa8b75fc46d'

and '85cbdd70a9896ae9b2257bfe8f25f045b1cd0b2d'

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r853f941 r77e0cb9  
    134134                String pathInfo = req.getPathInfo();
    135135                String pathInContext = URI.addPaths(path, pathInfo);
     136                req.setCharacterEncoding("UTF-8");
    136137                resp.setCharacterEncoding("UTF-8");
    137138                resp.setContentType("text/html; charset=UTF-8");
     
    141142                } else {
    142143                    String base = URI.addPaths(req.getRequestURI(), "/");
    143                     String listing = getListHTML(resource, base, true);
     144                    String listing = getListHTML(resource, base, true, method.equals("POST") ? req.getParameterMap() : null);
    144145                    if (listing != null)
    145146                        resp.getWriter().write(listing);
     
    171172        PrintWriter out = resp.getWriter();
    172173        out.write("<html>\n" +
    173                   "<head>\n" +
     174                  "<head><link rel=\"shortcut icon\" href=\"/themes/snark/ubergine/favicon.ico\">\n" +
    174175                  "<title>");
    175176        out.write(_("I2PSnark - Anonymous BitTorrent Client"));
     
    192193            out.write(_("Refresh page"));
    193194            out.write("\" class=\"snarkRefresh\">");
     195            out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/arrow_refresh.png\"> ");
    194196            out.write(_("I2PSnark"));
    195197            out.write("</a> <a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\" target=\"_blank\">");
     
    219221
    220222        if (isConfigure) {
    221             out.write("</div>\n");
     223            out.write("<div class=\"logshim\"></div></div>\n");
    222224            writeConfigForm(out, req);
    223225        } else {
     
    239241        String uri = req.getRequestURI();
    240242        out.write(TABLE_HEADER);
     243        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\"");
     244        out.write(" title=\"");
     245        out.write(_("Status"));
     246        out.write("\"> ");
    241247        out.write(_("Status"));
    242248        if (_manager.util().connected() && !snarks.isEmpty()) {
    243             out.write(" (<a href=\"");
     249            out.write(" <a href=\"");
    244250            out.write(req.getRequestURI());
    245251            if (peerParam != null) {
    246252                out.write("\">");
     253                out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/showpeers.png\" title=\"");
    247254                out.write(_("Hide Peers"));
     255                out.write("\" alt=\"");
     256                out.write(_("Hide Peers"));
     257                out.write("\">");
    248258            } else {
    249259                out.write("?p=1\">");
     260                out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/hidepeers.png\" title=\"");
    250261                out.write(_("Show Peers"));
    251             }
    252             out.write("</a>)<br>\n");
     262                out.write("\" alt=\"");
     263                out.write(_("Show Peers"));
     264                out.write("\">");
     265            }
     266            out.write("</a><br>\n");
    253267        }
    254268        out.write("</th>\n<th align=\"left\">");
     269        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/torrent.png\" title=\"");
     270        out.write(_("Torrent"));
     271        out.write("\">");
    255272        out.write(_("Torrent"));
    256273        out.write("</th>\n<th align=\"center\">");
     274        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/eta.png\" title=\"");
     275        out.write(_("Estimated Download Time"));
     276        out.write("\">");
    257277        out.write(_("ETA"));
    258         out.write("</th>\n<th align=\"right\">");
     278        out.write("</th>\n<th align=\"center\">");
     279        out.write("<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"");
    259280        out.write(_("Downloaded"));
    260         out.write("</th>\n<th align=\"right\">");
     281        out.write("\">");
     282        out.write(_("RX"));
     283        out.write("</th>\n<th align=\"center\">");
     284        out.write("<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"");
    261285        out.write(_("Uploaded"));
    262         out.write("</th>\n<th align=\"right\">");
     286        out.write("\">");
     287        out.write(_("TX"));
     288        out.write("</th>\n<th align=\"center\">");
     289        out.write("<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"");
    263290        out.write(_("Down Rate"));
    264         out.write("</th>\n<th align=\"right\">");
     291        out.write("\">Rate");
     292        out.write("</th>\n<th align=\"center\">");
     293        out.write("<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"");
    265294        out.write(_("Up Rate"));
     295        out.write("\">");
     296        out.write(_("Rate"));
    266297        out.write("</th>\n");
    267    
    268298        out.write("<th align=\"center\">");
    269299        if (_manager.util().connected()) {
     
    272302            out.write(_("Stop all torrents and the I2P tunnel"));
    273303            out.write("\">");
     304            out.write("<img src=\"/themes/snark/ubergine/images/stop_all.png\" title=\"");
     305            out.write(_("Stop all torrents and the I2P tunnel"));
     306            out.write("\" alt=\"");
    274307            out.write(_("Stop All"));
     308            out.write("\">");
    275309            out.write("</a>");
    276310        } else if (!snarks.isEmpty()) {
     
    279313            out.write(_("Start all torrents and the I2P tunnel"));
    280314            out.write("\">");
    281             out.write(_("Start All"));
     315            out.write("<img src=\"/themes/snark/ubergine/images/start_all.png\" title=\"");
     316            out.write(_("Start all torrents and the I2P tunnel"));
     317            out.write("\" alt=\"Start All\">");
    282318            out.write("</a>");
    283319        } else {
     
    293329
    294330        if (snarks.isEmpty()) {
    295             out.write("<tr class=\"snarkTorrentEven\">" +
    296                       "<td class=\"snarkTorrentEven\" align=\"center\"" +
     331            out.write("<tr class=\"snarkTorrentNoneLoaded\">" +
     332                      "<td class=\"snarkTorrentNoneLoaded\"" +
    297333                      " colspan=\"8\"><i>");
    298334            out.write(_("No torrents loaded."));
     
    302338                      "    <th align=\"left\" colspan=\"2\">");
    303339            out.write(_("Totals"));
    304             out.write(" (");
     340            out.write(" &raquo;&nbsp;");
    305341            out.write(ngettext("1 torrent", "{0} torrents", snarks.size()));
    306342            out.write(", ");
    307343            out.write(DataHelper.formatSize2(stats[5]) + "B, ");
    308344            out.write(ngettext("1 connected peer", "{0} connected peers", (int) stats[4]));
    309             out.write(")</th>\n" +
     345            out.write("</th>\n" +
    310346                      "    <th>&nbsp;</th>\n" +
    311347                      "    <th align=\"right\">" + formatSize(stats[0]) + "</th>\n" +
     
    479515            String upLimit = req.getParameter("upLimit");
    480516            String upBW = req.getParameter("upBW");
    481             String startupDel = req.getParameter("startupDelay");
     517            String startupDel = req.getParameter("startupDelay");
    482518            boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
    483519            String openTrackers = req.getParameter("openTrackers");
     
    503539                        if (torrentFile.exists())
    504540                            throw new IOException("Cannot overwrite an existing .torrent file: " + torrentFile.getPath());
    505                         _manager.saveTorrentStatus(info, s.getBitField()); // so addTorrent won't recheck
     541                        _manager.saveTorrentStatus(info, s.getBitField(), null); // so addTorrent won't recheck
    506542                        // DirMonitor could grab this first, maybe hold _snarks lock?
    507543                        FileOutputStream out = new FileOutputStream(torrentFile);
     
    530566            }
    531567            if (_manager.util().connected()) {
     568                // Give the stopped announces time to get out
     569                try { Thread.sleep(2000); } catch (InterruptedException ie) {}
    532570                _manager.util().disconnect();
    533571                _manager.addMessage(_("I2P tunnel closed."));
     
    601639
    602640    private static final int MAX_DISPLAYED_FILENAME_LENGTH = 44;
    603     private static final int MAX_DISPLAYED_ERROR_LENGTH = 40;
     641    private static final int MAX_DISPLAYED_ERROR_LENGTH = 6;
    604642    private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean showDebug) throws IOException {
    605643        String filename = snark.torrent;
     
    659697        if (err != null) {
    660698            if (isRunning && curPeers > 0 && !showPeers)
    661                 statusString = "<a title=\"" + err + "\">" + _("TrackerErr") + "</a> (" +
    662                                "<a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    663                                curPeers + '/' +
    664                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>)";
     699                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/trackererror.png\" title=\"" + _("Tracker Error") +
     700                               "\"><a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
     701                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     702                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    665703            else if (isRunning)
    666                 statusString = "<a title=\"" + err + "\">" + _("TrackerErr") + " (" + curPeers + '/' +
    667                                ngettext("1 peer", "{0} peers", knownPeers) + ')';
     704                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/trackererror.png\" title=\"" + _("Tracker Error") +
     705                               "\">" + ' ' + curPeers + "&thinsp;/&thinsp;" +
     706                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    668707            else {
    669708                if (err.length() > MAX_DISPLAYED_ERROR_LENGTH)
    670709                    err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "&hellip;";
    671                 statusString = _("TrackerErr") + "<br>(" + err + ")";
     710                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/trackererror.png\" title=\"" + _("Tracker Error") +
     711                "\"> " + err + "</a>";
    672712            }
    673713        } else if (remaining <= 0) {
    674714            if (isRunning && curPeers > 0 && !showPeers)
    675                 statusString = _("Seeding") + " (" +
     715                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/seeding.png\" title=\"" + _("Seeding") + "\">" +
    676716                               "<a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    677                                curPeers + '/' +
    678                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>)";
     717                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     718                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    679719            else if (isRunning)
    680                 statusString = _("Seeding") + " (" + curPeers + "/" +
    681                                ngettext("1 peer", "{0} peers", knownPeers) + ')';
     720                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/seeding.png\" title=\"" + _("Seeding") + "\">" +
     721                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     722                               ngettext("1 peer", "{0} peers", knownPeers)  + "</a>";
    682723            else
    683                 statusString = _("Complete");
     724                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/complete.png\" title=\"" + _("Complete") + "\"> " + _("Complete");
    684725        } else {
    685726            if (isRunning && curPeers > 0 && downBps > 0 && !showPeers)
    686                 statusString = _("OK") + " (" +
     727                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/downloading.png\" title=\"" + _("Downloading") + "\">" +
    687728                               "<a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    688                                curPeers + "/" +
    689                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>)";
     729                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     730                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    690731            else if (isRunning && curPeers > 0 && downBps > 0)
    691                 statusString = _("OK") + " (" + curPeers + "/" +
    692                                ngettext("1 peer", "{0} peers", knownPeers) + ')';
     732                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/downloading.png\" title=\"" + _("Downloading") + "\">" +
     733                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     734                               ngettext("1 peer", "{0} peers", knownPeers);
    693735            else if (isRunning && curPeers > 0 && !showPeers)
    694                 statusString = _("Stalled") + " (" +
     736                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/stalled.png\" title=\"" + _("Stalled") + "\">" +
    695737                               "<a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    696                                curPeers + '/' +
    697                                ngettext("1 peer", "{0} peers", knownPeers) + "</a>)";
     738                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     739                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    698740            else if (isRunning && curPeers > 0)
    699                 statusString = _("Stalled") + " (" + curPeers + '/' +
    700                                ngettext("1 peer", "{0} peers", knownPeers) + ')';
     741                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/stalled.png\" title=\"" + _("Stalled") + "\">" +
     742                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     743                               ngettext("1 peer", "{0} peers", knownPeers);
    701744            else if (isRunning)
    702                 statusString = _("No Peers") + " (0/" + knownPeers + ')';
     745                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/nopeers.png\" title=\"" + _("No Peers") + "\">" +
     746                               ' ' + curPeers + "&thinsp;/&thinsp;" +
     747                               ngettext("1 peer", "{0} peers", knownPeers);
    703748            else
    704                 statusString = _("Stopped");
     749                statusString = "<img border=\"0\" src=\"/themes/snark/ubergine/images/stopped.png\" title=\"" + _("Stopped") + "\"> " + _("Stopped");
    705750        }
    706751       
     
    747792                    continue;
    748793                baseURL = baseURL.substring(e + 1);
    749                 out.write("&nbsp;&nbsp;&nbsp;[<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash=");
     794                out.write("&nbsp;<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash=");
    750795                out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
    751                 out.write("\" title=\"" + name + ' ' + _("Tracker") + "\">");
    752                 out.write(_("Details"));
    753                 out.write("</a>]");
     796                out.write("\" title=\"" + name + ' ' + _("Tracker") + "\" target=\"_blank\">");
     797                out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/details.png\">");
     798                out.write("</a>");
    754799                break;
    755800            }
     
    763808        out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
    764809        if (remaining > 0)
    765             out.write(formatSize(total-remaining) + " / " + formatSize(total)); // 18MB/3GB
     810            out.write(formatSize(total-remaining) + "&thinsp;/&thinsp;" + formatSize(total)); // 18MB/3GB; thin space so it will line break well
    766811        else
    767812            out.write(formatSize(total)); // 3GB
     
    786831            out.write(_("Stop the torrent"));
    787832            out.write("\">");
     833            out.write("<img src=\"/themes/snark/ubergine/images/stop.png\" title=\"");
     834            out.write(_("Stop the torrent"));
     835            out.write("\" alt=\"");
    788836            out.write(_("Stop"));
     837            out.write("\">");
    789838            out.write("</a>");
    790839        } else {
     
    794843                out.write(_("Start the torrent"));
    795844                out.write("\">");
     845                out.write("<img src=\"/themes/snark/ubergine/images/start.png\" title=\"");
     846                out.write(_("Start the torrent"));
     847                out.write("\" alt=\"");
    796848                out.write(_("Start"));
    797                 out.write("</a>\n");
     849                out.write("\">");
     850                out.write("</a>");
    798851            }
    799852            out.write("<a href=\"" + uri + "?action=Remove" + parameters
     
    806859            out.write(_("Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?", fullFilename));
    807860            out.write("')) { return false; }\">");
     861            out.write("<img src=\"/themes/snark/ubergine/images/remove.png\" title=\"");
     862            out.write(_("Remove the torrent from the active list, deleting the .torrent file"));
     863            out.write("\" alt=\"");
    808864            out.write(_("Remove"));
    809             out.write("</a><br>");
     865            out.write("\">");
     866            out.write("</a>");
    810867            out.write("<a href=\"" + uri + "?action=Delete" + parameters
    811868                      + "\" title=\"");
     
    817874            out.write(_("Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?", fullFilename));
    818875            out.write("')) { return false; }\">");
     876            out.write("<img src=\"/themes/snark/ubergine/images/delete.png\" title=\"");
     877            out.write(_("Delete the .torrent file and the associated data file(s)"));
     878            out.write("\" alt=\"");
    819879            out.write(_("Delete"));
     880            out.write("\">");
    820881            out.write("</a>");
    821882        }
     
    873934                if (remaining > 0) {
    874935                    if (peer.isInteresting() && !peer.isChoked()) {
    875                         out.write("<font color=#008000>");
     936                        out.write("<font color=#00ff00>");
    876937                        out.write(formatSize(peer.getDownloadRate()) + "ps</font>");
    877938                    } else {
    878                         out.write("<font color=#a00000><a title=\"");
     939                        out.write("<font color=#ff0000><a title=\"");
    879940                        if (!peer.isInteresting())
    880941                            out.write(_("Uninteresting (The peer has no pieces we need)"));
     
    889950                if (pct != 100.0) {
    890951                    if (peer.isInterested() && !peer.isChoking()) {
    891                         out.write("<font color=#008000>");
     952                        out.write("<font color=#00ff00>");
    892953                        out.write(formatSize(peer.getUploadRate()) + "ps</font>");
    893954                    } else {
    894                         out.write("<font color=#a00000><a title=\"");
     955                        out.write("<font color=#ff0000><a title=\"");
    895956                        if (!peer.isInterested())
    896957                            out.write(_("Uninterested (We have no pieces the peer needs)"));
     
    9391000        out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
    9401001        out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
     1002        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/add.png\">");
    9411003        out.write(_("Add Torrent"));
    942         out.write("</span><br>\n<table border=\"0\"><tr><td>");
     1004        out.write("</span><hr>\n<table border=\"0\"><tr><td>");
    9431005        out.write(_("From URL"));
    944         out.write(":<td><input type=\"text\" name=\"newURL\" size=\"80\" value=\"" + newURL + "\" > \n");
     1006        out.write(":<td><input type=\"text\" name=\"newURL\" size=\"85\" value=\"" + newURL + "\" > \n");
    9451007        // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve)
    946         //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
    947         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
     1008        //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>");
     1009        out.write("<input type=\"submit\" value=\"");
    9481010        out.write(_("Add torrent"));
    9491011        out.write("\" name=\"foo\" ><br>\n");
    9501012        out.write("<tr><td>&nbsp;<td><span class=\"snarkAddInfo\">");
    951         out.write(_("Alternately, you can copy .torrent files to the directory {0}.", _manager.getDataDir().getAbsolutePath()));
     1013        out.write(_("You can also copy .torrent files to: {0}.", "<code>" + _manager.getDataDir().getAbsolutePath () + "</code>"));
    9521014        out.write("\n");
    953         out.write(_("Removing a .torrent file will cause the torrent to stop."));
     1015        out.write(_("Removing a .torrent will cause it to stop."));
    9541016        out.write("<br></span></table>\n");
    9551017        out.write("</form>\n</span></div>"); 
     
    9701032        out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
    9711033        out.write("<span class=\"snarkConfigTitle\">");
     1034        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/create.png\">");
    9721035        out.write(_("Create Torrent"));
    973         out.write("</span><br>\n<table border=\"0\"><tr><td>");
     1036        out.write("</span><hr>\n<table border=\"0\"><tr><td>");
    9741037        //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
    9751038        out.write(_("Data to seed"));
    976         out.write(":<td>" + _manager.getDataDir().getAbsolutePath() + File.separatorChar
    977                   + "<input type=\"text\" name=\"baseFile\" size=\"40\" value=\"" + baseFile
     1039        out.write(":<td><code>" + _manager.getDataDir().getAbsolutePath() + File.separatorChar
     1040                  + "</code><input type=\"text\" name=\"baseFile\" size=\"58\" value=\"" + baseFile
    9781041                  + "\" title=\"");
    9791042        out.write(_("File or directory to seed (must be within the specified path)"));
     
    9951058        out.write("</select>\n");
    9961059        out.write(_("or"));
    997         out.write("<tr><td>&nbsp;<td><input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
     1060        out.write("&nbsp;<input type=\"text\" name=\"announceURLOther\" size=\"57\" value=\"http://\" " +
    9981061                  "title=\"");
    9991062        out.write(_("Specify custom tracker announce URL"));
    10001063        out.write("\" > ");
    1001         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
     1064        out.write("<input type=\"submit\" value=\"");
    10021065        out.write(_("Create torrent"));
    10031066        out.write("\" name=\"foo\" ></table>\n");
     
    10141077       
    10151078        out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
    1016         out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
     1079        out.write("<div class=\"configsectionpanel\"><span class=\"snarkConfig\">\n");
    10171080        out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
    10181081        out.write("<input type=\"hidden\" name=\"action\" value=\"Save\" >\n");
    10191082        out.write("<span class=\"snarkConfigTitle\">");
     1083        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/config.png\">");
    10201084        out.write(_("Configuration"));
    1021         out.write("</span><br>\n");
     1085        out.write("</span><hr>\n");
    10221086        out.write("<table border=\"0\"><tr><td>");
    10231087        out.write(_("Data directory"));
     
    10371101        out.write("\" >");
    10381102
    1039         out.write("<tr><td>");
     1103        out.write("<tr><td>");
    10401104        out.write(_("Startup delay"));
    10411105        out.write(": <td><input name=\"startupDelay\" size=\"3\" class=\"r\" value=\"" + _manager.util().getStartupDelay() + "\"> ");
     
    11331197        out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" >"
    11341198                  + opts.toString() + "</textarea><br>\n");
    1135        
    11361199
    11371200        out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
     
    11451208        out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
    11461209        out.write("<span class=\"snarkConfigTitle\"><a href=\"configure\">");
     1210        out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/config.png\">");
    11471211        out.write(_("Configuration"));
    11481212        out.write("</a></span></span></div>\n");
     
    12021266    private static String formatSize(long bytes) {
    12031267        if (bytes < 5*1024)
    1204             return bytes + " B";
     1268            return bytes + "&nbsp;B";
    12051269        else if (bytes < 5*1024*1024)
    1206             return ((bytes + 512)/1024) + " KB";
     1270            return ((bytes + 512)/1024) + "&nbsp;KB";
    12071271        else if (bytes < 10*1024*1024*1024l)
    1208             return ((bytes + 512*1024)/(1024*1024)) + " MB";
     1272            return ((bytes + 512*1024)/(1024*1024)) + "&nbsp;MB";
    12091273        else
    1210             return ((bytes + 512*1024*1024)/(1024*1024*1024)) + " GB";
     1274            return ((bytes + 512*1024*1024)/(1024*1024*1024)) + "&nbsp;GB";
    12111275    }
    12121276   
     
    12141278    private static String urlify(String s) {
    12151279        StringBuilder buf = new StringBuilder(256);
    1216         buf.append("<a href=\"").append(s).append("\">").append(s).append("</a>");
     1280        // browsers seem to work without doing this but let's be strict
     1281        String link = s.replace("&", "&amp;");
     1282        buf.append("<a href=\"").append(link).append("\">").append(link).append("</a>");
    12171283        return buf.toString();
    12181284    }
    12191285
    1220     private static final String HEADER = "<link href=\"/themes/console/snark.css\" rel=\"stylesheet\" type=\"text/css\" >";
     1286    private static final String HEADER = "<link href=\"/themes/snark/ubergine/snark.css\" rel=\"stylesheet\" type=\"text/css\" >";
    12211287                                       
    12221288
     
    12531319     * @param base The base URL
    12541320     * @param parent True if the parent directory should be included
     1321     * @param postParams map of POST parameters or null if not a POST
    12551322     * @return String of HTML
    12561323     * @since 0.7.14
    12571324     */
    1258     private String getListHTML(Resource r, String base, boolean parent)
     1325    private String getListHTML(Resource r, String base, boolean parent, Map postParams)
    12591326        throws IOException
    12601327    {
     
    12811348            torrentName = title;
    12821349        Snark snark = _manager.getTorrentByBaseName(torrentName);
     1350
     1351        if (snark != null && postParams != null)
     1352            savePriorities(snark, postParams);
     1353
    12831354        if (title.endsWith("/"))
    12841355            title = title.substring(0, title.length() - 1);
    12851356        title = _("Torrent") + ": " + title;
    12861357        buf.append(title);
    1287         buf.append("</TITLE>").append(HEADER).append("</HEAD><BODY>\n<div class=\"snarknavbar\">");
    1288         buf.append(title);
     1358        buf.append("</TITLE>").append(HEADER).append("<link rel=\"shortcut icon\" href=\"/themes/snark/ubergine/favicon.ico\"></HEAD><BODY>\n<center><div class=\"snarknavbar\"> <a href=\"/i2psnark/\" title=\"Torrents\"");
     1359        buf.append(" class=\"snarkRefresh\">I2PSnark</a>").append("</div>");
    12891360       
    12901361        if (parent)
     
    12981369        }
    12991370       
    1300         buf.append("</div><div class=\"page\"><div class=\"mainsection\">" +
    1301                    "<TABLE BORDER=0 class=\"snarkTorrents\" cellpadding=\"5px 10px\">" +
    1302                    "<thead><tr><th>").append(_("File")).append("</th><th>").append(_("Size"))
    1303            .append("</th><th>").append(_("Status")).append("</th></tr></thead>");
     1371        buf.append("</div><div class=\"page\"><div class=\"mainsection\">");
     1372        boolean showPriority = snark != null && !snark.storage.complete();
     1373        if (showPriority)
     1374            buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
     1375        buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" cellpadding=\"5px 10px\">" +
     1376                   "<thead><tr><th>").append("<img border=\"0\" src=\"/themes/snark/ubergine/images/file.png\" title=\"").append(_("File")).append("\" alt=\"").append(_("File")).append("\">&nbsp;").append(title).append("</th><th align=\"right\">").append("<img border=\"0\" src=\"/themes/snark/ubergine/images/size.png\" title=\"").append(_("FileSize")).append("\" alt=\"").append(_("FileSize")).append("\">").append(_("Size"));
     1377        buf.append("</th><th>").append("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\" title=\"").append(_("Download Status")).append("\">").append(_("Status")).append("</th>");
     1378        if (showPriority)
     1379            buf.append("<th>").append(_("Priority")).append("</th>");
     1380        buf.append("</tr></thead>\n");
    13041381        //DateFormat dfmt=DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
    13051382        //                                               DateFormat.MEDIUM);
     1383        boolean showSaveButton = false;
    13061384        for (int i=0 ; i< ls.length ; i++)
    13071385        {   
     
    13411419                                status = toImg("tick") + _("Complete");
    13421420                            } else {
    1343                                 status = toImg("clock") +
     1421                                status =
     1422                                         (snark.storage.getPriority(f.getCanonicalPath()) < 0 ? toImg("cancel") : toImg("clock")) +
    13441423                                         (100 * (length - remaining) / length) + "% " + _("complete") +
    13451424                                         " (" + DataHelper.formatSize2(remaining) + _("bytes remaining") + ")";
     
    13851464            //buf.append(dfmt.format(new Date(item.lastModified())));
    13861465            buf.append(status);
    1387             buf.append("</TD></TR>\n");
     1466            buf.append("</TD>");
     1467            if (showPriority) {
     1468                buf.append("<td>");
     1469                File f = item.getFile();
     1470                if ((!complete) && (!item.isDirectory()) && f != null) {
     1471                    int pri = snark.storage.getPriority(f.getCanonicalPath());
     1472                    buf.append("<input type=\"radio\" value=\"5\" name=\"pri.").append(f.getCanonicalPath()).append("\" ");
     1473                    if (pri > 0)
     1474                        buf.append("checked=\"true\"");
     1475                    buf.append('>').append(_("High"));
     1476
     1477                    buf.append("<input type=\"radio\" value=\"0\" name=\"pri.").append(f.getCanonicalPath()).append("\" ");
     1478                    if (pri == 0)
     1479                        buf.append("checked=\"true\"");
     1480                    buf.append('>').append(_("Normal"));
     1481
     1482                    buf.append("<input type=\"radio\" value=\"-9\" name=\"pri.").append(f.getCanonicalPath()).append("\" ");
     1483                    if (pri < 0)
     1484                        buf.append("checked=\"true\"");
     1485                    buf.append('>').append(_("Do not download"));
     1486                    showSaveButton = true;
     1487                }
     1488                buf.append("</td>");
     1489            }
     1490            buf.append("</TR>\n");
     1491        }
     1492        if (showSaveButton) {
     1493            buf.append("<thead><tr><th colspan=\"3\">&nbsp;</th><th align=\"center\"><input type=\"submit\" value=\"");
     1494            buf.append(_("Save priorities"));
     1495            buf.append("\" name=\"foo\" ></th></tr></thead>\n");
    13881496        }
    13891497        buf.append("</TABLE>\n");
     1498        if (showPriority)
     1499            buf.append("</form>");
    13901500        buf.append("</div></div></BODY></HTML>\n");
    13911501       
     
    14321542            icon = "music";
    14331543        else if (mime.startsWith("video/") || plc.endsWith(".mkv") || plc.endsWith(".m4v") ||
    1434                  plc.endsWith(".mp4") || plc.endsWith(".wmv") || plc.endsWith(".flv"))
     1544                 plc.endsWith(".mp4") || plc.endsWith(".wmv") || plc.endsWith(".flv") ||
     1545                 plc.endsWith(".ogm"))
    14351546            icon = "film";
    14361547        else if (mime.equals("application/zip") || mime.equals("application/x-gtar") ||
     
    14511562    private static String toImg(String icon) {
    14521563        return "<img alt=\"\" height=\"16\" width=\"16\" src=\"/i2psnark/_icons/" + icon + ".png\"> ";
     1564    }
     1565
     1566    /** @since 0.8.1 */
     1567    private void savePriorities(Snark snark, Map postParams) {
     1568        Set<Map.Entry> entries = postParams.entrySet();
     1569        for (Map.Entry entry : entries) {
     1570            String key = (String)entry.getKey();
     1571            if (key.startsWith("pri.")) {
     1572                try {
     1573                    String file = key.substring(4);
     1574                    String val = ((String[])entry.getValue())[0];   // jetty arrays
     1575                    int pri = Integer.parseInt(val);
     1576                    snark.storage.setPriority(file, pri);
     1577                    //System.err.println("Priority now " + pri + " for " + file);
     1578                } catch (Throwable t) { t.printStackTrace(); }
     1579            }
     1580        }
     1581        if (snark.coordinator != null)
     1582            snark.coordinator.updatePiecePriorities();
     1583        _manager.saveTorrentStatus(snark.storage.getMetaInfo(), snark.storage.getBitField(), snark.storage.getFilePriorities());
    14531584    }
    14541585
  • history.txt

    r853f941 r77e0cb9  
     12010-11-03 zzz
     2    * Merge and snark fixups
     3
    142010-11-01 zzz
    25    * ClientConnectionRunner: Add synch to fix race causing AIOOBE
  • router/java/src/net/i2p/router/RouterVersion.java

    r853f941 r77e0cb9  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 8;
     21    public final static long BUILD = 10;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.