Package freenet.pluginmanager

Source Code of freenet.pluginmanager.PluginDownLoaderFreenet

/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.pluginmanager;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

import freenet.client.FetchContext;
import freenet.client.FetchException;
import freenet.client.FetchException.FetchExceptionMode;
import freenet.client.FetchResult;
import freenet.client.FetchWaiter;
import freenet.client.HighLevelSimpleClient;
import freenet.client.async.ClientContext;
import freenet.client.async.ClientGetter;
import freenet.client.async.PersistenceDisabledException;
import freenet.client.events.ClientEvent;
import freenet.client.events.ClientEventListener;
import freenet.client.events.SplitfileProgressEvent;
import freenet.keys.FreenetURI;
import freenet.node.Node;
import freenet.pluginmanager.PluginManager.PluginProgress;
import freenet.support.Logger;

public class PluginDownLoaderFreenet extends PluginDownLoader<FreenetURI> {
  final HighLevelSimpleClient hlsc;
  final boolean desperate;
  final Node node;
  private boolean fatalFailure;
  private ClientGetter get;

  PluginDownLoaderFreenet(HighLevelSimpleClient hlsc, Node node, boolean desperate) {
    this.hlsc = hlsc.clone();
    this.node = node;
    this.desperate = desperate;
  }

  @Override
  public FreenetURI checkSource(String source) throws PluginNotFoundException {
    try {
      return new FreenetURI(source);
    } catch (MalformedURLException e) {
      Logger.error(this, "not a valid freenet key: " + source, e);
      throw new PluginNotFoundException("not a valid freenet key: " + source, e);
    }
  }

  @Override
  InputStream getInputStream(final PluginProgress progress) throws IOException, PluginNotFoundException {
    FreenetURI uri = getSource();
    System.out.println("Downloading plugin from Freenet: "+uri);
    while (true) {
      try {
        progress.setDownloading();
        hlsc.addEventHook(new ClientEventListener() {

          @Override
          public void receive(ClientEvent ce, ClientContext context) {
            if(ce instanceof SplitfileProgressEvent) {
              SplitfileProgressEvent split = (SplitfileProgressEvent) ce;
              if(split.finalizedTotal) {
                progress.setDownloadProgress(split.minSuccessfulBlocks, split.succeedBlocks, split.totalBlocks, split.failedBlocks, split.fatallyFailedBlocks, split.finalizedTotal);
              }
            }
          }
         
        });
        FetchContext context = hlsc.getFetchContext();
        if(desperate) {
          context.maxNonSplitfileRetries = -1;
          context.maxSplitfileBlockRetries = -1;
        }
        FetchWaiter fw = new FetchWaiter(node.nonPersistentClientBulk);

        get = new ClientGetter(fw, uri, context, PluginManager.PRIO, null, null, null);
        try {
          node.clientCore.clientContext.start(get);
        } catch (PersistenceDisabledException e) {
          // Impossible
        }
        FetchResult res = fw.waitForCompletion();
        return res.asBucket().getInputStream();
      } catch (FetchException e) {
        if ((e.getMode() == FetchExceptionMode.PERMANENT_REDIRECT) || (e.getMode() == FetchExceptionMode.TOO_MANY_PATH_COMPONENTS)) {
          uri = e.newURI;
          continue;
        }
        if(e.isFatal())
          fatalFailure = true;
        Logger.error(this, "error while fetching plugin: " + getSource(), e);
        throw new PluginNotFoundException("error while fetching plugin: " + e.getMessage() + " for key "  + getSource(), e);
      }
    }
  }

  @Override
  String getPluginName(String source) throws PluginNotFoundException {
    return source.substring(source.lastIndexOf('/') + 1);
  }

  @Override
  String getSHA1sum() throws PluginNotFoundException {
    return null;
  }
 
  @Override
  String getSHA256sum() throws PluginNotFoundException {
    return null;
  }

  public boolean fatalFailure() {
    return fatalFailure;
  }

  @Override
  void tryCancel() {
    if(get != null)
      get.cancel(node.clientCore.clientContext);
  }

}
TOP

Related Classes of freenet.pluginmanager.PluginDownLoaderFreenet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.