download functionality

pull/34/head
Zlatin Balevsky 2019-12-08 09:38:34 +00:00
parent c59e038c2a
commit 80a89a5ac0
2 changed files with 94 additions and 5 deletions

View File

@ -1,7 +1,11 @@
package com.muwire.webui;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
@ -9,7 +13,11 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.muwire.core.Core;
import com.muwire.core.InfoHash;
import com.muwire.core.Persona;
import com.muwire.core.download.UIDownloadEvent;
import com.muwire.core.search.UIResultEvent;
import com.muwire.webui.BrowseManager.Browse;
import net.i2p.data.Base64;
@ -18,6 +26,8 @@ import net.i2p.data.DataHelper;
public class BrowseServlet extends HttpServlet {
private BrowseManager browseManager;
private DownloadManager downloadManager;
private Core core;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
@ -64,6 +74,7 @@ public class BrowseServlet extends HttpServlet {
browse.getResults().forEach(result -> {
sb.append("<Result>");
sb.append("<Name>").append(Util.escapeHTMLinXML(result.getName())).append("</Name>");
sb.append("<Downloading>").append(downloadManager.isDownloading(result.getInfohash())).append("</Downloading>");
sb.append("<Size>").append(DataHelper.formatSize2Decimal(result.getSize(), false)).append("B").append("</Size>");
sb.append("<InfoHash>").append(Base64.encode(result.getInfohash().getRoot())).append("</InfoHash>");
if (result.getComment() != null) {
@ -106,12 +117,66 @@ public class BrowseServlet extends HttpServlet {
}
browseManager.browse(host);
resp.sendRedirect("/MuWire/BrowseHost.jsp");
} // TODO: implement canceling of browse
} else if (action.equals("download")) {
if (core == null) {
resp.sendError(403, "Not initialized");
return;
}
String personaB64 = req.getParameter("host");
if (personaB64 == null) {
resp.sendError(403,"Bad param");
return;
}
Persona host;
try {
host = new Persona(new ByteArrayInputStream(Base64.decode(personaB64)));
} catch (Exception bad) {
resp.sendError(403,"Bad param");
return;
}
String infoHashB64 = req.getParameter("infoHash");
if (infoHashB64 == null) {
resp.sendError(403, "Bad param");
return;
}
final InfoHash infoHash;
try {
infoHash = new InfoHash(Base64.decode(infoHashB64));
} catch (Exception bad) {
resp.sendError(403, "Bad param");
return;
}
Browse browse = browseManager.getBrowses().get(host);
if (browse == null)
return;
Set<UIResultEvent> results = browse.getResults().stream().filter(e -> e.getInfohash().equals(infoHash)).
collect(Collectors.toSet());
if (results.isEmpty())
return;
UIDownloadEvent event = new UIDownloadEvent();
UIResultEvent[] resultsArray = results.toArray(new UIResultEvent[0]);
event.setResult(resultsArray);
// TODO: sequential
// TODO: possible sources
event.setSources(Collections.emptySet());
event.setTarget(new File(core.getMuOptions().getDownloadLocation(), resultsArray[0].getName()));
core.getEventBus().publish(event);
try {
Thread.sleep(100);
} catch (InterruptedException ignore) {}
}
// TODO: implement canceling of browse
}
@Override
public void init(ServletConfig cfg) throws ServletException {
browseManager = (BrowseManager) cfg.getServletContext().getAttribute("browseManager");
downloadManager = (DownloadManager) cfg.getServletContext().getAttribute("downloadManager");
core = (Core) cfg.getServletContext().getAttribute("core");
}
}

View File

@ -1,9 +1,10 @@
class Result {
constructor(name, size, comment, infoHash) {
constructor(name, size, comment, infoHash, downloading) {
this.name = name
this.size = size
this.infoHash = infoHash
this.comment = comment
this.downloading = downloading
}
}
@ -89,6 +90,7 @@ function showResults(host) {
for (i = 0; i < results.length; i++) {
var name = results[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue
var size = results[i].getElementsByTagName("Size")[0].childNodes[0].nodeValue
var downloading = results[i].getElementsByTagName("Downloading")[0].childNodes[0].nodeValue
var infoHash = results[i].getElementsByTagName("InfoHash")[0].childNodes[0].nodeValue
var comment = results[i].getElementsByTagName("Comment")
if (comment != null && comment.length == 1)
@ -96,18 +98,22 @@ function showResults(host) {
else
comment = null
var result = new Result(name, size, comment, infoHash)
var result = new Result(name, size, comment, infoHash, downloading)
resultsByInfoHash.set(infoHash, result)
}
var tableHtml = "<table><thead><tr><th>Name</th><th>Size</th></tr></thead><tbody>"
var tableHtml = "<table><thead><tr><th>Name</th><th>Size</th><th>Download</th></tr></thead><tbody>"
for (var [infoHash, result] of resultsByInfoHash) {
tableHtml += "<tr>"
tableHtml += "<td>" + result.name + "</td>"
tableHtml += "<td>" + result.size + "</td>"
// TODO: download and show comment link
if (result.downloading == "true")
tableHtml += "<td>Downloading</td>"
else
tableHtml += "<td>" + getDownloadLink(host, infoHash) + "</td>"
// TODO: show comment link
tableHtml += "</tr>"
}
@ -119,4 +125,22 @@ function showResults(host) {
}
xmlhttp.open("GET", "/MuWire/Browse?section=results&host="+browse.hostB64, true)
xmlhttp.send()
}
function getDownloadLink(host, infoHash) {
return "<a href='#' onclick='window.download(\"" + host + "\",\"" + infoHash + "\");return false;'>Download</a>"
}
function download(host,infoHash) {
var result = resultsByInfoHash.get(infoHash)
var hostB64 = browsesByHost.get(host).hostB64
var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
showResults(host)
}
}
xmlhttp.open("POST", "/MuWire/Browse", true)
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("action=download&infoHash="+infoHash+"&host="+hostB64)
}