package net.i2p.update;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.net.URI;
import java.util.List;
import java.util.Map;
/**
* The central resource coordinating updates.
* This must be registered with the context.
*
* The UpdateManager starts and stops all updates,
* and controls notification to the user.
*
* @since 0.9.4
*/
public interface UpdateManager {
/**
* The name we register with the ClientAppManager
* @since 0.9.12
*/
public static final String APP_NAME = "update";
/**
* Call once for each type/method pair.
*/
public void register(Updater updater, UpdateType type, UpdateMethod method, int priority);
public void register(Checker checker, UpdateType type, UpdateMethod method, int priority);
public void unregister(Updater updater, UpdateType type, UpdateMethod method);
public void unregister(Checker checker, UpdateType type, UpdateMethod method);
public void start();
public void shutdown();
/**
* Called by the Checker, either after check() was called, or it found out on its own.
* Use this if there is only one UpdateMethod; otherwise use the Map method below.
*
* @param newsSource who told us
* @param id plugin name for plugins, ignored otherwise
* @param method How to get the new version
* @param updateSources Where to get the new version
* @param newVersion The new version available
* @param minVersion The minimum installed version to be able to update to newVersion
* @return true if we didn't know already
*/
public boolean notifyVersionAvailable(UpdateTask task, URI newsSource,
UpdateType type, String id,
UpdateMethod method, List<URI> updateSources,
String newVersion, String minVersion);
/**
* Called by the Checker, either after check() was called, or it found out on its own.
* Checkers must use this method if there are multiple UpdateMethods discoverd simultaneously.
*
* @param newsSource who told us
* @param id plugin name for plugins, ignored otherwise
* @param sourceMap Mapping of methods to sources
* @param newVersion The new version available
* @param minVersion The minimum installed version to be able to update to newVersion
* @return true if we didn't know already
* @since 0.9.6
*/
public boolean notifyVersionAvailable(UpdateTask task, URI newsSource,
UpdateType type, String id,
Map<UpdateMethod, List<URI>> sourceMap,
String newVersion, String minVersion);
/**
* A new version is available but cannot be downloaded or installed due to some constraint.
* The manager should notify the user.
* Called by the Checker, either after check() was called, or it found out on its own.
*
* @param newsSource who told us
* @param id plugin name for plugins, ignored otherwise
* @param newVersion The new version available
* @param message A translated message to be displayed to the user, non-null
* @since 0.9.9
*/
public void notifyVersionConstraint(UpdateTask task, URI newsSource,
UpdateType type, String id,
String newVersion, String message);
/**
* Called by the Checker after check() was called and all notifyVersionAvailable() callbacks are finished
* @param newer notifyVersionAvailable was called
* @param success check succeeded (newer or not)
*/
public void notifyCheckComplete(UpdateTask task, boolean newer, boolean success);
public void notifyProgress(UpdateTask task, String status);
public void notifyProgress(UpdateTask task, String status, long downloaded, long totalSize);
/**
* Not necessarily the end if there are more URIs to try.
* @param t may be null
*/
public void notifyAttemptFailed(UpdateTask task, String reason, Throwable t);
/**
* The task has finished and failed.
* @param t may be null
*/
public void notifyTaskFailed(UpdateTask task, String reason, Throwable t);
/**
* An update has been downloaded but not verified.
* The manager will verify it.
* Caller should delete the file upon return, unless it will share it with others,
* e.g. on a torrent.
*
* @param actualVersion may be higher (or lower?) than the version requested
* @param file a valid format for the task's UpdateType
* @return true if valid, false if corrupt
*/
public boolean notifyComplete(UpdateTask task, String actualVersion, File file);
/**
* Is an update available?
* Blocking.
* An available update may still have a constraint or lack sources.
* @param type the UpdateType of this request
* @return new version or null if nothing newer is available
* @since 0.9.21
*/
public String checkAvailable(UpdateType type);
/**
* Is an update available?
* Blocking.
* An available update may still have a constraint or lack sources.
* @param type the UpdateType of this request
* @param maxWait max time to block
* @return new version or null if nothing newer is available
* @since 0.9.21
*/
public String checkAvailable(UpdateType type, long maxWait);
/**
* Is an update available?
* Blocking.
* An available update may still have a constraint or lack sources.
* @param type the UpdateType of this request
* @param maxWait max time to block
* @param id id of this request
* @return new version or null if nothing newer is available
* @since 0.9.21
*/
public String checkAvailable(UpdateType type, String id, long maxWait);
/**
* Is a router update being downloaded?
* @return true iff router update is being downloaded
* @since 0.9.21
*/
public boolean isUpdateInProgress();
/**
* Is a router update being downloaded?
* @param type the UpdateType of this request
* @return true iff router update is being downloaded
* @since 0.9.21
*/
public boolean isUpdateInProgress(UpdateType type);
/**
* Is a router update being downloaded?
* @param type the UpdateType of this request
* @param id of this request
* @return true iff router update is being downloaded
* @since 0.9.21
*/
public boolean isUpdateInProgress(UpdateType type, String id);
/**
* Non-blocking. Does not check.
* Fails if check or update already in progress.
* If returns true, then call isUpdateInProgress() in a loop
* @param type the UpdateType of this request
* @return true if task started
* @since 0.9.21
*/
public boolean update(UpdateType type);
/**
* Non-blocking. Does not check.
* Fails if check or update already in progress.
* If returns true, then call isUpdateInProgress() in a loop
* @param type the UpdateType of this request
* @param id id of this request
* @return true if task started
* @since 0.9.21
*/
public boolean update(UpdateType type, String id);
/**
* Non-blocking. Does not check.
* Fails if check or update already in progress.
* If returns true, then call isUpdateInProgress() in a loop
* @param type the UpdateType of this request
* @param maxTime not honored by all Updaters
* @return true if task started
* @since 0.9.21
*/
public boolean update(UpdateType type, long maxTime);
/**
* Non-blocking. Does not check.
* Fails if check or update already in progress.
* If returns true, then call isUpdateInProgress() in a loop
* @param type the UpdateType of this request
* @param maxTime not honored by all Updaters
* @param id id of this request
* @return true if task started
* @since 0.9.21
*/
public boolean update(UpdateType type, String id, long maxTime);
/**
* The status on any update current or last finished.
* @return status or ""
* @since 0.9.21
*/
public String getStatus();
/**
* For debugging
*/
public void renderStatusHTML(Writer out) throws IOException;
}