Author: jflesch
Date: 2006-07-10 01:21:28 +0000 (Mon, 10 Jul 2006)
New Revision: 9538
Added:
trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
Modified:
trunk/apps/Thaw/src/thaw/core/Config.java
trunk/apps/Thaw/src/thaw/core/Core.java
trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
trunk/apps/Thaw/src/thaw/fcp/FCPConnection.java
trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java
trunk/apps/Thaw/src/thaw/i18n/thaw.properties
Log:
Thaw can now resume downloads (but still not cancel them)
Modified: trunk/apps/Thaw/src/thaw/core/Config.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Config.java 2006-07-10 00:57:45 UTC (rev
9537)
+++ trunk/apps/Thaw/src/thaw/core/Config.java 2006-07-10 01:21:28 UTC (rev
9538)
@@ -269,7 +269,7 @@
return false;
}
- serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-15");
+ serializer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
serializer.setOutputProperty(OutputKeys.INDENT,"yes");
/* final step */
@@ -295,9 +295,9 @@
public void setDefaultValues() {
setValue("nodeAddress", "127.0.0.1");
setValue("nodePort", "9481");
- setValue("maxSimultaneousDownloads", "5");
+ setValue("maxSimultaneousDownloads", "10");
setValue("maxSimultaneousInsertions", "2");
- setValue("thawId", "thaw-"+(new Integer((new
Random()).nextInt(1000))).toString());
+ setValue("thawId", "thaw_"+(new Integer((new
Random()).nextInt(1000))).toString());
}
}
Modified: trunk/apps/Thaw/src/thaw/core/Core.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-10 00:57:45 UTC (rev
9537)
+++ trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-10 01:21:28 UTC (rev
9538)
@@ -82,6 +82,9 @@
if(!initPluginManager())
return false;
+ if(!restorePreviousState())
+ return false;
+
mainWindow.setStatus(I18n.getMessage("thaw.statusBar.ready"));
mainWindow.setVisible(true);
@@ -147,23 +150,22 @@
clientHello = new FCPClientHello(queryManager,
config.getValue("thawId"));
+ queueManager = new FCPQueueManager(queryManager,
+
config.getValue("thawId"),
+ (new
Integer(config.getValue("maxSimultaneousDownloads"))).intValue(),
+ (new
Integer(config.getValue("maxSimultaneousInsertions"))).intValue());
+
if(!clientHello.start(null)) {
new WarningWindow(this,
I18n.getMessage("thaw.error.idAlreadyUsed"));
+ connection.disconnect();
} else {
Logger.debug(this, "Hello successful");
Logger.debug(this, "Node name :
"+clientHello.getNodeName());
Logger.debug(this, "FCP version :
"+clientHello.getNodeFCPVersion());
Logger.debug(this, "Node version :
"+clientHello.getNodeVersion());
- queueManager = new
FCPQueueManager(queryManager,
-
config.getValue("thawId"),
- (new
Integer(config.getValue("maxSimultaneousDownloads"))).intValue(),
- (new
Integer(config.getValue("maxSimultaneousInsertions"))).intValue());
queueManager.startScheduler();
- FCPWatchGlobal watchGlobal = new
FCPWatchGlobal(true);
- watchGlobal.start(queueManager);
-
}
}
@@ -183,6 +185,17 @@
return true;
}
+
+ public boolean restorePreviousState() {
+ if(connection.isConnected()) {
+ QueueKeeper.loadQueue(queueManager, "thaw.queue.xml");
+
+ FCPWatchGlobal watchGlobal = new FCPWatchGlobal(true);
+ watchGlobal.start(queueManager);
+ }
+
+ return true;
+ }
public FCPConnection getConnectionManager() {
return connection;
@@ -243,6 +256,9 @@
connection.deleteObserver(this);
connection.disconnect();
+ Logger.info(this, "Saving queue state ...");
+ QueueKeeper.saveQueue(queueManager, "thaw.queue.xml");
+
Logger.info(this, "Saving configuration ...");
if(!config.saveConfig()) {
Logger.error(this, "Config was not saved correctly !");
Added: trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -0,0 +1,288 @@
+package thaw.core;
+
+
+import java.util.HashMap;
+import java.io.File;
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.Observer;
+
+
+/* XML */
+import org.w3c.dom.Document;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import org.w3c.dom.DOMImplementation;
+import javax.xml.transform.stream.StreamResult;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.OutputKeys;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+
+import thaw.fcp.*;
+
+/**
+ * Used when Thaw start and stop: Save the queue state.
+ */
+public class QueueKeeper {
+ private final static int MIN_PRIORITY = 6;
+
+ /**
+ * Used to be able to call Logger functions.
+ */
+ public QueueKeeper() {
+
+ }
+
+
+ private static void loadQuery(FCPQueueManager queueManager, Element
queryEl, boolean runningQueue) {
+ FCPQuery newQuery = null;
+ HashMap params = new HashMap();
+
+ NodeList paramList = queryEl.getElementsByTagName("param");
+
+ for(int i = 0;i < paramList.getLength(); i++) {
+ Node param = paramList.item(i);
+
+ if(param != null && param.getNodeType() ==
Node.ELEMENT_NODE) {
+ Element paramEl = (Element)param;
+
+ Logger.verbose(new QueueKeeper(),
paramEl.getAttribute("name") + "=>" + paramEl.getAttribute("value"));
+
+ params.put(paramEl.getAttribute("name"),
+ paramEl.getAttribute("value"));
+ }
+ }
+
+ if(queryEl.getAttribute("type") == null
+ || queryEl.getAttribute("type").equals("1")) {
+ newQuery = new FCPClientGet(queueManager, params);
+ } else {
+ Logger.error(new QueueKeeper(), "Insert resuming TODO");
+ /* TODO */ /* FCPClientPut */
+ }
+
+ if(runningQueue)
+ queueManager.addQueryToTheRunningQueue(newQuery, false);
+ else
+ queueManager.addQueryToThePendingQueue(newQuery);
+
+ if(runningQueue && !newQuery.isPersistent() &&
!newQuery.isFinished()) /* We restart */
+ newQuery.start(queueManager);
+
+ }
+
+
+ private static void loadQueries(FCPQueueManager queueManager, Element
queriesEl, boolean runningQueue) {
+ NodeList queries = queriesEl.getElementsByTagName("query");
+
+ for(int i = 0;i < queries.getLength(); i++) {
+ Node queryNode = queries.item(i);
+
+ if(queryNode != null && queryNode.getNodeType() ==
Node.ELEMENT_NODE) {
+ loadQuery(queueManager, (Element)queryNode,
runningQueue);
+ }
+ }
+ }
+
+
+ public static boolean loadQueue(FCPQueueManager queueManager, String
fileName) {
+ File file = new File(fileName);
+
+ if(!file.exists() || !file.canRead()) {
+ Logger.notice(new QueueKeeper(), "Unable to find
previous queue state file '"+file.getPath()+"'");
+ return false;
+ }
+
+
+ Document xmlDoc = null;
+ DocumentBuilderFactory xmlFactory = null;
+ DocumentBuilder xmlBuilder = null;
+
+ Element rootEl = null;
+
+ xmlFactory = DocumentBuilderFactory.newInstance();
+
+ try {
+ xmlBuilder = xmlFactory.newDocumentBuilder();
+ } catch(javax.xml.parsers.ParserConfigurationException e) {
+ Logger.warning(new QueueKeeper(), "Unable to load queue
because: "+e);
+ return false;
+ }
+
+ try {
+ xmlDoc = xmlBuilder.parse(file);
+ } catch(org.xml.sax.SAXException e) {
+ Logger.warning(new QueueKeeper(), "Unable to load queue
because: "+e);
+ return false;
+ } catch(java.io.IOException e) {
+ Logger.warning(new QueueKeeper(), "Unable to load queue
because: "+e);
+ return false;
+ }
+
+ rootEl = xmlDoc.getDocumentElement();
+
+
+ NodeList runningQueues =
rootEl.getElementsByTagName("runningQueue");
+
+ for(int i = 0;i < runningQueues.getLength(); i++) {
+
+ Node runningQueueNode = runningQueues.item(i);
+
+ if(runningQueueNode != null &&
runningQueueNode.getNodeType() == Node.ELEMENT_NODE) {
+ loadQueries(queueManager,
(Element)runningQueueNode, true);
+ }
+ }
+
+ NodeList pendingQueues =
rootEl.getElementsByTagName("pendingQueue");
+
+ for(int i = 0;i < pendingQueues.getLength(); i++) {
+
+ Node pendingQueueNode = pendingQueues.item(i);
+
+ if(pendingQueueNode != null &&
pendingQueueNode.getNodeType() == Node.ELEMENT_NODE) {
+ loadQueries(queueManager,
(Element)pendingQueueNode, false);
+ }
+ }
+
+
+
+ return true;
+ }
+
+
+ private static Element saveQuery(FCPQuery query, Document xmlDoc) {
+ HashMap params = query.getParameters();
+
+ Element queryEl = xmlDoc.createElement("query");
+
+ queryEl.setAttribute("type", ((new
Integer(query.getQueryType())).toString()));
+
+ for(Iterator keys = params.keySet().iterator();
+ keys.hasNext();) {
+
+ String key = (String)keys.next();
+
+ Element paramEl = xmlDoc.createElement("param");
+
+ paramEl.setAttribute("name", key);
+ paramEl.setAttribute("value", ((String)params.get(key))
);
+
+ queryEl.appendChild(paramEl);
+ }
+
+ return queryEl;
+ }
+
+ public static boolean saveQueue(FCPQueueManager queueManager, String
fileName) {
+ Vector runningQueue = queueManager.getRunningQueue();
+ Vector[] pendingQueue = queueManager.getPendingQueues();
+
+ File file = new File(fileName);
+ StreamResult fileOut;
+
+ try {
+ if( (!file.exists() && !file.createNewFile())
+ || !file.canWrite()) {
+ Logger.warning(new QueueKeeper(), "Unable to
write config file '"+file.getPath()+"' (can't write)");
+ return false;
+ }
+ } catch(java.io.IOException e) {
+ Logger.warning(new QueueKeeper(), "Error while checking
perms to save config: "+e);
+ }
+
+
+
+ fileOut = new StreamResult(file);
+
+ Document xmlDoc = null;
+ DocumentBuilderFactory xmlFactory = null;
+ DocumentBuilder xmlBuilder = null;
+ DOMImplementation impl = null;
+
+ Element rootEl = null;
+
+ xmlFactory = DocumentBuilderFactory.newInstance();
+
+ try {
+ xmlBuilder = xmlFactory.newDocumentBuilder();
+ } catch(javax.xml.parsers.ParserConfigurationException e) {
+ Logger.error(new QueueKeeper(), "Unable to save queue
because: "+e.toString());
+ return false;
+ }
+
+
+ impl = xmlBuilder.getDOMImplementation();
+
+ xmlDoc = impl.createDocument(null, "queue", null);
+
+ rootEl = xmlDoc.getDocumentElement();
+
+
+
+ Element runningQueueEl = xmlDoc.createElement("runningQueue");
+
+ for(Iterator runIt = runningQueue.iterator() ;
+ runIt.hasNext(); ) {
+ FCPQuery query = (FCPQuery)runIt.next();
+
+ runningQueueEl.appendChild(saveQuery(query, xmlDoc));
+
+ }
+
+ rootEl.appendChild(runningQueueEl);
+
+ Element pendingQueueEl = xmlDoc.createElement("pendingQueue");
+
+ for(int i = 0 ; i <= MIN_PRIORITY ; i++) {
+
+ for(Iterator runIt = pendingQueue[i].iterator() ;
+ runIt.hasNext(); ) {
+
+ FCPQuery query = (FCPQuery)runIt.next();
+
+ Element toSave = saveQuery(query, xmlDoc);
+
+ if(toSave != null)
+ pendingQueueEl.appendChild(toSave);
+
+ }
+
+ }
+
+ rootEl.appendChild(pendingQueueEl);
+
+ /* Serialization */
+ DOMSource domSource = new DOMSource(xmlDoc);
+ TransformerFactory transformFactory =
TransformerFactory.newInstance();
+
+ Transformer serializer;
+
+ try {
+ serializer = transformFactory.newTransformer();
+ } catch(javax.xml.transform.TransformerConfigurationException
e) {
+ Logger.error(new QueueKeeper(), "Unable to save queue
because: "+e.toString());
+ return false;
+ }
+
+ serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
+ serializer.setOutputProperty(OutputKeys.INDENT,"yes");
+
+ /* final step */
+ try {
+ serializer.transform(domSource, fileOut);
+ } catch(javax.xml.transform.TransformerException e) {
+ Logger.error(new QueueKeeper(), "Unable to save queue
because: "+e.toString());
+ return false;
+ }
+
+ return true;
+ }
+
+}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -5,6 +5,8 @@
import java.util.Observer;
import java.util.Observable;
+import java.util.HashMap;
+
import thaw.core.Logger;
/**
@@ -27,7 +29,7 @@
private int attempt = 0;
private String status;
- private String id;
+ private String identifier;
private int progress; /* in pourcent */
private long fileSize;
@@ -36,6 +38,20 @@
private boolean successful = false;
/**
+ * See setParameters().
+ */
+ public FCPClientGet(FCPQueueManager queueManager, HashMap parameters) {
+ this.queueManager = queueManager;
+ setParameters(parameters);
+
+ if(progress != 100 && identifier != null &&
!identifier.equals("")) {
+
this.queueManager.getQueryManager().deleteObserver(this);
+ this.queueManager.getQueryManager().addObserver(this);
+ }
+ }
+
+
+ /**
* @param persistence 0 = Forever ; 1 = Until node reboot ; 2 = Until
the app disconnect
*/
public FCPClientGet(String key, int priority,
@@ -76,7 +92,8 @@
status = "Requesting";
- this.id = queueManager.getAnID();
+ if(this.identifier == null || this.identifier.equals(""))
+ this.identifier = queueManager.getAnID();
Logger.info(this, "Requesting key : "+getFileKey());
@@ -84,7 +101,7 @@
queryMessage.setMessageName("ClientGet");
queryMessage.setValue("URI", getFileKey());
- queryMessage.setValue("Identifier", id);
+ queryMessage.setValue("Identifier", identifier);
queryMessage.setValue("Verbosity", "1");
queryMessage.setValue("MaxRetries", "0");
queryMessage.setValue("PriorityClass", (new
Integer(priority)).toString());
@@ -103,6 +120,7 @@
queryMessage.setValue("ReturnType", "direct");
+ queueManager.getQueryManager().deleteObserver(this);
queueManager.getQueryManager().addObserver(this);
queueManager.getQueryManager().writeMessage(queryMessage);
@@ -115,7 +133,7 @@
FCPMessage message = (FCPMessage)arg;
if(message.getValue("Identifier") == null
- || !message.getValue("Identifier").equals(id))
+ || !message.getValue("Identifier").equals(identifier))
return;
@@ -130,7 +148,7 @@
FCPMessage getRequestStatus = new FCPMessage();
getRequestStatus.setMessageName("GetRequestStatus");
- getRequestStatus.setValue("Identifier", id);
+ getRequestStatus.setValue("Identifier",
identifier);
if(globalQueue)
getRequestStatus.setValue("Global",
"true");
else
@@ -150,6 +168,7 @@
if(message.getMessageName().equals("IdentifierCollision")) {
Logger.notice(this, "IdentifierCollision ! Resending
with another id");
+ identifier = null;
start(queueManager);
setChanged();
@@ -176,15 +195,18 @@
if(message.getMessageName().equals("GetFailed")) {
Logger.debug(this, "GetFailed !");
+ int code = ((new
Integer(message.getValue("Code"))).intValue());
+
attempt++;
- if(attempt >= MAX_RETRIES) {
+ if(attempt >= MAX_RETRIES || code == 25) {
status = "Failed";
progress = 100;
running = false;
queueManager.getQueryManager().deleteObserver(this);
} else {
status = "Retrying";
+ start(queueManager);
}
setChanged();
@@ -218,6 +240,8 @@
if(message.getMessageName().equals("AllData")) {
Logger.debug(this, "AllData !");
+ progress = 98;
+
status = "Loading";
fileSize = message.getAmountOfDataWaiting();
@@ -360,4 +384,60 @@
public boolean isRunning() {
return running;
}
+
+ public HashMap getParameters() {
+ HashMap result = new HashMap();
+
+ result.put("key", key);
+ result.put("filename", filename);
+ result.put("priority", ((new Integer(priority)).toString()));
+ result.put("persistence", ((new
Integer(persistence)).toString()));
+ result.put("globalQueue", ((new
Boolean(globalQueue)).toString()));
+ result.put("destinationDir", destinationDir);
+ result.put("attempt", ((new Integer(attempt)).toString()));
+ result.put("status", status);
+ result.put("identifier", identifier);
+ result.put("progress", ((new Integer(progress)).toString()));
+ result.put("fileSize", ((new Long(fileSize)).toString()));
+ result.put("running", ((new Boolean(running)).toString()));
+ result.put("successful", ((new
Boolean(successful)).toString()));
+
+ return result;
+ }
+
+ public boolean setParameters(HashMap parameters) {
+
+ key = (String)parameters.get("key");
+
+ Logger.debug(this, "Resuming key : "+key);
+
+ filename = (String)parameters.get("filename");
+ priority = ((new
Integer((String)parameters.get("priority"))).intValue());
+ persistence = ((new
Integer((String)parameters.get("persistence"))).intValue());
+ globalQueue = ((new
Boolean((String)parameters.get("globalQueue"))).booleanValue());
+ destinationDir = (String)parameters.get("destinationDir");
+ attempt = ((new
Integer((String)parameters.get("attempt"))).intValue());
+ status = (String)parameters.get("status");
+ identifier = (String)parameters.get("identifier");
+
+ Logger.info(this, "Resuming id : "+identifier);
+
+ progress = ((new
Integer((String)parameters.get("progress"))).intValue());
+ fileSize = ((new
Long((String)parameters.get("fileSize"))).longValue());
+ running = ((new
Boolean((String)parameters.get("running"))).booleanValue());
+ successful = ((new
Boolean((String)parameters.get("successful"))).booleanValue());
+
+ if(persistence == 2) {
+ progress = 0;
+ status = "Waiting";
+ }
+
+ return true;
+ }
+
+
+ public boolean isPersistent() {
+ return (persistence < 2);
+ }
+
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -2,6 +2,7 @@
import java.util.Observer;
import java.util.Observable;
+import java.util.HashMap;
import thaw.core.Logger;
@@ -188,5 +189,17 @@
return successful;
}
+
+ public HashMap getParameters() {
+ return null;
+ }
+
+ public boolean setParameters(HashMap parameters) {
+ return true;
+ }
+
+ public boolean isPersistent() {
+ return false;
+ }
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPConnection.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPConnection.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPConnection.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -185,8 +185,6 @@
try {
result = "";
- /* result = reader.readLine(); */
-
int c = 0;
while(c != '\n') {
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-10 00:57:45 UTC (rev
9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-10 01:21:28 UTC (rev
9538)
@@ -1,5 +1,7 @@
package thaw.fcp;
+import java.util.HashMap;
+
/**
* This interface was designed for file query (insertions / downloads)
* but it's used sometimes for other things.
@@ -81,4 +83,19 @@
* Query is considered as a failure is isFinished() && !isSuccesful()
*/
public boolean isSuccessful();
+
+ /**
+ * Use to save the query in an XML file / a database / whatever.
+ * @return A HashMap : String (parameter name) -> String (parameter
value) or null.
+ */
+ public HashMap getParameters();
+
+ /**
+ * Opposite of getParameters().
+ * @return true if successful (or ignored) ; false if not.
+ */
+ public boolean setParameters(HashMap parameters);
+
+
+ public boolean isPersistent();
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -105,8 +105,14 @@
Logger.debug(this, "Adding done");
}
+ /**
+ * will call start() function of the query.
+ */
+ public void addQueryToTheRunningQueue(FCPQuery query) {
+ addQueryToTheRunningQueue(query, true);
+ }
- public void addQueryToTheRunningQueue(FCPQuery query) {
+ public void addQueryToTheRunningQueue(FCPQuery query, boolean
callStart) {
Logger.debug(this, "Adding query to the running queue ...");
runningQueries.add(query);
@@ -114,12 +120,22 @@
setChanged();
notifyObservers(query);
- query.start(this);
+ if(callStart)
+ query.start(this);
Logger.debug(this, "Adding done");
}
+
+ /**
+ * *Doesn't* call stop() from the query.
+ */
+ public void moveFromRunningToPendingQueue(FCPQuery query) {
+ /* TODO */
+ }
+
+
public void remove(FCPQuery query) {
runningQueries.remove(query);
@@ -274,7 +290,7 @@
lastId = 0;
}
- return (thawId+"-"+(new Integer(lastId)).toString());
+ return (thawId+"_"+(new Integer(lastId)).toString());
}
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -1,5 +1,7 @@
package thaw.fcp;
+import java.util.HashMap;
+
public class FCPWatchGlobal implements FCPQuery {
private boolean watch;
@@ -12,6 +14,7 @@
FCPMessage message = new FCPMessage();
message.setMessageName("WatchGlobal");
+
if(watch)
message.setValue("Enabled", "true");
else
@@ -41,7 +44,7 @@
}
public int getProgression() {
- return 0;
+ return 100;
}
public String getFileKey() {
@@ -71,4 +74,19 @@
public boolean isRunning() {
return false;
}
+
+ public HashMap getParameters() {
+ return null;
+ }
+
+ public boolean setParameters(HashMap parameters) {
+ return true;
+ }
+
+
+ public boolean isPersistent() {
+ return false;
+ }
+
+
}
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-10 00:57:45 UTC
(rev 9537)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-10 01:21:28 UTC
(rev 9538)
@@ -27,7 +27,7 @@
thaw.common.selectFiles=Select file(s)
-thaw.common.persistence=Keep inserting
+thaw.common.persistence=Continue
thaw.common.persistenceForever=Until the transfer completes
thaw.common.persistenceReboot=Until the freenode reboots
thaw.common.persistenceConnection=Until Thaw is closed