OvernetDownload.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.xnap.plugin.overnet.net |
![]() |
![]() |
XNap 3 |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/*
* XNap - A P2P framework and client.
*
* See the file AUTHORS for copyright information.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.xnap.plugin.overnet.net;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import org.apache.log4j.Logger;
import org.xnap.XNap;
import org.xnap.gui.Dialogs;
import org.xnap.gui.XNapFrame;
import org.xnap.gui.action.SubmenuAction;
import org.xnap.gui.util.*;
import org.xnap.peer.Peer;
import org.xnap.plugin.Plugin;
import org.xnap.plugin.overnet.OvernetPlugin;
import org.xnap.plugin.overnet.net.msg.MessageHandler;
import org.xnap.plugin.overnet.net.msg.OvernetMessage;
import org.xnap.plugin.overnet.net.msg.client.CancelDownloadMessage;
import org.xnap.plugin.overnet.net.msg.client.GetGapsMessage;
import org.xnap.plugin.overnet.net.msg.client.PauseDownloadMessage;
import org.xnap.plugin.overnet.net.msg.client.ResumeDownloadMessage;
import org.xnap.plugin.overnet.net.msg.client.SetDownloadPriorityMessage;
import org.xnap.plugin.overnet.net.msg.core.GapsMessage;
import org.xnap.plugin.overnet.net.msg.core.MessageListener;
import org.xnap.plugin.overnet.net.msg.core.NewDownloadMessage;
import org.xnap.plugin.overnet.net.msg.core.RemoveDownloadMessage;
import org.xnap.plugin.overnet.net.msg.core.UpdateDownloadMessage;
import org.xnap.plugin.overnet.util.OvernetPreferences;
import org.xnap.transfer.AbstractDownload;
import org.xnap.transfer.Segment;
import org.xnap.transfer.action.AbstractDeleteAction;
import org.xnap.transfer.action.AbstractResumeAction;
import org.xnap.transfer.action.AbstractStopAction;
import org.xnap.util.Scheduler;
import org.xnap.util.XNapTask;
public class OvernetDownload extends AbstractDownload
implements MessageListener
{
//--- Constant(s) ---
private static final int STATUS_LOOKING = 2;
private static final int STATUS_DOWNLOADING = 3;
private static final int STATUS_COMPLETING = 9;
private static final int STATUS_COMPLETE = 10;
private static final int STATUS_COMPLETE_CORRUPTED = 11;
private static final String[] STATUS_STRINGS = new String[] {
XNap.tr("Hashing") + "...",
XNap.tr("Queued"),
XNap.tr("Looking" ),
XNap.tr("Downloading") + "...",
XNap.tr("Paused"),
XNap.tr("Insufficient Disk Space."),
XNap.tr("No Sources"),
XNap.tr("Hashing") + "...",
XNap.tr("Error Loading."),
XNap.tr("Completing") + "...",
XNap.tr("Complete"),
XNap.tr("Complete, but corrupted."),
XNap.tr("Transferring") + "...",
XNap.tr("Resuming") + "...",
XNap.tr("Pausing") + "...",
};
//--- Data Field(s) ---
private String filename;
private long filesize;
private int status = -1;
private int bytesTransferred;
private int totalBytesTransferred;
private int startSize = -1;
private long currentRate = -1;
private byte[] hash;
private boolean removed = false;
private XNapTask updateTask;
private OvernetSegment[] segments;
private byte priority;
private static OvernetDownload hordeDl = null;
private boolean available = false;
private int sources = 0;
private static Logger logger = Logger.getLogger(OvernetDownload.class);
//--- Constructor(s) ---
public OvernetDownload(NewDownloadMessage nm)
{
filename = nm.filename;
filesize = nm.filesize;
hash = nm.hash;
priority = nm.priority;
if (priority == NewDownloadMessage.PRIORITY_HIGHEST) {
hordeDl = this;
}
MessageHandler handler = OvernetPlugin.getMessageHandler();
handler.subscribe(RemoveDownloadMessage.TYPE, this);
if (!OvernetPreferences.getInstance().getNewDownloadID()) {
handler.subscribe(GapsMessage.TYPE, this);
}
updateTask = new UpdateGapsListTask();
Scheduler.run(0, 10 * 1000, updateTask);
transferStarted();
}
//--- Method(s) ---
public long getTotalBytesTransferred()
{
return totalBytesTransferred;
}
public long getBytesTransferred()
{
return bytesTransferred;
}
public Action[] getActions()
{
return new Action[] { new ResumeAction(), new PauseAction(),
new DeleteAction(), new PriorityMenuAction(),
};
}
public long getFilesize()
{
return filesize;
}
public String getFilename()
{
return filename;
}
public File getFile()
{
return null;
}
public String getStatus()
{
if (removed && status != STATUS_COMPLETE
&& status != STATUS_COMPLETING) {
return XNap.tr("Deleted");
}
if (status >=0 && status < STATUS_STRINGS.length) {
return STATUS_STRINGS[status];
}
return XNap.tr("Status unknown");
}
public Icon getIcon()
{
return OvernetPlugin.ICON_16;
}
public Peer getPeer()
{
return null;
}
public Plugin getPlugin()
{
return OvernetPlugin.getInstance();
}
public boolean isDone()
{
return removed || status == STATUS_COMPLETE;
}
public boolean isRunning()
{
return status == STATUS_DOWNLOADING;
}
public boolean isFailed()
{
return status == STATUS_COMPLETE_CORRUPTED;
}
public long getCurrentRate()
{
return currentRate;
}
private String getPrio()
{
switch (priority) {
case NewDownloadMessage.PRIORITY_LOW:
return XNap.tr("Low");
case NewDownloadMessage.PRIORITY_HIGH:
return XNap.tr("High");
case NewDownloadMessage.PRIORITY_HIGHEST:
return XNap.tr("Highest");
case NewDownloadMessage.PRIORITY_NORMAL:
default:
return XNap.tr("Normal");
}
}
public String getDescription()
{
return "<html><table>"
+ GUIHelper.tableRow(XNap.tr("Filename"), getFilename())
+ GUIHelper.tableRow(XNap.tr("Priority"), getPrio())
+ GUIHelper.tableRow(XNap.tr("Completely Available"), available ?
XNap.tr("Yes") : XNap.tr("No"))
+ GUIHelper.tableRow(XNap.tr("Sources"), sources + "")
+ "</table></table>";
}
public void update(UpdateDownloadMessage um)
{
currentRate = (int)(1024 * um.speed);
available = um.availability == 100;
sources = um.sources;
updateStatus((int)um.status);
totalBytesTransferred = um.transferred;
if (startSize == -1) {
startSize = um.transferred;
}
else {
bytesTransferred = totalBytesTransferred - startSize;
}
}
private void updateStatus(int newStatus)
{
if (newStatus == STATUS_LOOKING && currentRate > 0) {
newStatus = STATUS_DOWNLOADING;
}
if (newStatus != status) {
status = newStatus;
stateChanged();
}
if (status == STATUS_COMPLETE) {
transferStopped();
}
}
public void transferStopped()
{
logger.debug("overnet transfer stopped cleanup");
// do some cleanup here before calling the super method
MessageHandler handler = OvernetPlugin.getMessageHandler();
handler.unsubscribe(RemoveDownloadMessage.TYPE, this);
if (!OvernetPreferences.getInstance().getNewDownloadID()) {
handler.unsubscribe(GapsMessage.TYPE, this);
}
updateTask.cancel();
super.transferStopped();
}
public void messageReceived(OvernetMessage msg)
{
if (msg instanceof RemoveDownloadMessage) {
RemoveDownloadMessage rm = (RemoveDownloadMessage)msg;
if (Arrays.equals(hash, rm.hash)) {
removed = true;
transferStopped();
}
}
else if (msg instanceof GapsMessage) {
GapsMessage gm = (GapsMessage)msg;
if (Arrays.equals(hash, gm.hash)) {
updateGaps(gm);
}
}
}
public void updateGaps(GapsMessage gm)
{
for (int i = 0; i < gm.segments.length; i++) {
gm.segments[i].setTotal(getFilesize());
}
segments = gm.segments;
}
public Segment[] getSegments()
{
return segments;
}
private class UpdateGapsListTask extends XNapTask
{
public void run()
{
OvernetCore.send(new GetGapsMessage(hash));
}
}
private class ResumeAction extends AbstractResumeAction
{
public void actionPerformed(ActionEvent e)
{
OvernetCore.send(new ResumeDownloadMessage(hash));
}
}
private class PauseAction extends AbstractStopAction
{
public void actionPerformed(ActionEvent e)
{
OvernetCore.send(new PauseDownloadMessage(hash));
}
}
private class DeleteAction extends AbstractDeleteAction
{
public DeleteAction()
{
putValue(Action.NAME, XNap.tr("Delete Transfer"));
putValue(Action.SHORT_DESCRIPTION,
XNap.tr("Deletes the selected transfers and deletes their files."));
putValue(IconHelper.XNAP_ICON, "editdelete.png");
}
public void actionPerformed(ActionEvent e)
{
if (Dialogs.showConfirmDialog
(XNapFrame.getInstance().getTransferPanel(),
"DeleteDownloads",
XNap.tr("Delete Download"),
XNap.tr("Do you really want to delete\n{0}?", filename),
JOptionPane.YES_NO_OPTION,
OvernetPreferences.getInstance()) == JOptionPane.YES_OPTION) {
OvernetCore.send(new CancelDownloadMessage(hash));
}
}
}
private class SetDownloadPriorityAction extends AbstractAction
{
private byte priority;
public SetDownloadPriorityAction(byte priority, String name)
{
this.priority = priority;
putValue(Action.NAME, name);
}
public void actionPerformed(ActionEvent e)
{
OvernetDownload.this.priority = priority;
if (priority == NewDownloadMessage.PRIORITY_HIGHEST) {
if (hordeDl != null && hordeDl != OvernetDownload.this) {
logger.debug("hordeDl != null");
hordeDl.priority = NewDownloadMessage.PRIORITY_HIGH;
hordeDl = OvernetDownload.this;
}
}
OvernetCore.send(new SetDownloadPriorityMessage(hash, priority));
}
}
private class PriorityMenuAction extends SubmenuAction
{
public PriorityMenuAction()
{
super(new Action[] {
new SetDownloadPriorityAction(NewDownloadMessage.PRIORITY_LOW,
XNap.tr("Low")),
new SetDownloadPriorityAction(NewDownloadMessage.PRIORITY_NORMAL,
XNap.tr("Normal")),
new SetDownloadPriorityAction(NewDownloadMessage.PRIORITY_HIGH,
XNap.tr("High")),
new SetDownloadPriorityAction(NewDownloadMessage.PRIORITY_HIGHEST,
XNap.tr("Highest")),
});
putValue(Action.NAME, XNap.tr("Set Priority"));
}
}
}
The table below shows all metrics for OvernetDownload.java.




