## net.i2p.router.web
Class NewsFetcher

    java.lang.Object
      net.i2p.router.web.NewsFetcher

All Implemented Interfaces:
  Runnable, EepGet.StatusListener

    public class NewsFetcher

extends Object
implements Runnable, EepGet.StatusListener

Task to periodically look for updates to the news.xml, and to keep track of whether that has an announcement for a new version.

Method Summary
`void` `attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause)`
`void` `attempting(String url)`
`void` `bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url)` alreadyTransferred - total of all attempts, not including currentWrite If nonzero on the first call, a partial file of that length was found, _and_ the server supports resume.
`(package private) boolean` `dontInstall()`
`void` `fetchNews()`
`void` `fetchUnsigned()`
`void` `fetchUnsignedHead()` HEAD the update url, and if the last-mod time is newer than the last update we downloaded, as stored in the properties, then we download it using eepget.
`static NewsFetcher` `getInstance(I2PAppContext ctx)`
`void` `headerReceived(String url, int attemptNum, String key, String val)`
`(package private) void` `invalidateNews()` Call this when changing news URLs to force an update next time the timer fires.
`void` `run()`
`boolean` `shouldFetchUnsigned()`
`String` `status()`
`void` `transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified)`
`void` `transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt)`
`boolean` `unsignedUpdateAvailable()`
`String` `unsignedUpdateVersion()`
`boolean` `updateAvailable()`
`String` `updateVersion()`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Method Detail

### getInstance

    public static final NewsFetcher getInstance(I2PAppContext ctx)

### updateAvailable

    public boolean updateAvailable()

### updateVersion

    public String updateVersion()

### unsignedUpdateAvailable

    public boolean unsignedUpdateAvailable()

### unsignedUpdateVersion

    public String unsignedUpdateVersion()

### status

    public String status()

### run

    public void run()

  Specified by:
    `run` in interface `Runnable`

### dontInstall

    boolean dontInstall()

### invalidateNews

    void invalidateNews()

  Call this when changing news URLs to force an update next time the timer fires.

  Since:
    0.8.7

### fetchNews

    public void fetchNews()

### shouldFetchUnsigned

    public boolean shouldFetchUnsigned()

### fetchUnsignedHead

    public void fetchUnsignedHead()

  HEAD the update url, and if the last-mod time is newer than the last update we downloaded, as stored in the properties, then we download it using eepget.

### fetchUnsigned

    public void fetchUnsigned()

### attemptFailed

    public void attemptFailed(String url,
                              long bytesTransferred,
                              long bytesRemaining,
                              int currentAttempt,
                              int numRetries,
                              Exception cause)

  Specified by:
    `attemptFailed` in interface `EepGet.StatusListener`

### bytesTransferred

    public void bytesTransferred(long alreadyTransferred,
                                 int currentWrite,
                                 long bytesTransferred,
                                 long bytesRemaining,
                                 String url)

  Description copied from interface: `EepGet.StatusListener`
  alreadyTransferred - total of all attempts, not including currentWrite If nonzero on the first call, a partial file of that length was found, _and_ the server supports resume. If zero on a subsequent call after some bytes are transferred (and presumably after an attemptFailed), the server does _not_ support resume and we had to start over. To track _actual_ transfer if the output file could already exist, the listener should keep its own counter, or subtract the initial alreadyTransferred value. And watch out for alreadyTransferred resetting if a resume failed... currentWrite - since last call to the listener bytesTransferred - includes headers, retries, redirects, discarded partial downloads, ... bytesRemaining - on this attempt only, currentWrite already subtracted - or -1 if chunked encoding or server does not return a length Total length should be == alreadyTransferred + currentWrite + bytesRemaining for all calls

  Specified by:
    `bytesTransferred` in interface `EepGet.StatusListener`

### transferComplete

    public void transferComplete(long alreadyTransferred,
                                 long bytesTransferred,
                                 long bytesRemaining,
                                 String url,
                                 String outputFile,
                                 boolean notModified)

  Specified by:
    `transferComplete` in interface `EepGet.StatusListener`

### transferFailed

    public void transferFailed(String url,
                               long bytesTransferred,
                               long bytesRemaining,
                               int currentAttempt)

  Specified by:
    `transferFailed` in interface `EepGet.StatusListener`

### headerReceived

    public void headerReceived(String url,
                               int attemptNum,
                               String key,
                               String val)

  Specified by:
    `headerReceived` in interface `EepGet.StatusListener`

### attempting

    public void attempting(String url)

  Specified by:
    `attempting` in interface `EepGet.StatusListener`