package com.limegroup.gnutella;
import java.io.File;
import java.io.FileFilter;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.core.settings.SharingSettings;
import org.limewire.i18n.I18nMarker;
import org.limewire.inject.EagerSingleton;
import org.limewire.lifecycle.Service;
import org.limewire.lifecycle.ServiceRegistry;
import org.limewire.lifecycle.ServiceStage;
import org.limewire.util.FileUtils;
import com.google.inject.Inject;
import com.limegroup.gnutella.altlocs.AltLocManager;
import com.limegroup.gnutella.altlocs.DownloaderGuidAlternateLocationFinder;
import com.limegroup.gnutella.dht.DHTManager;
import com.limegroup.gnutella.dht.db.PushProxiesPublisher;
import com.limegroup.gnutella.downloader.IncompleteFileManager;
import com.limegroup.gnutella.library.Library;
import com.limegroup.gnutella.library.LibraryUtils;
import com.limegroup.gnutella.licenses.LicenseFactory;
import com.limegroup.gnutella.simpp.SimppListener;
import com.limegroup.gnutella.simpp.SimppManager;
import com.limegroup.gnutella.tigertree.HashTreeCache;
import com.limegroup.gnutella.xml.SchemaReplyCollectionMapper;
/** Some glue that installs listeners & things. TODO: Figure out a better way to do this. */
@EagerSingleton
class CoreRandomGlue {
private final Library library;
private final ConnectionManager connectionManager;
private final DHTManager dhtManager;
private final PushProxiesPublisher pushProxiesPublisher;
private final ConnectionServices connectionServices;
private final DownloadManager downloadManager;
private final DownloaderGuidAlternateLocationFinder downloaderGuidAlternateLocationFinder;
private final SpamServices spamServices;
private final SimppManager simppManager;
private final HashTreeCache hashTreeCache;
private final LicenseFactory licenseFactory;
private final AltLocManager altLocManager;
@Inject
CoreRandomGlue(Library library,
ConnectionManager connectionManager, DHTManager dhtManager,
PushProxiesPublisher pushProxiesPublisher,
ConnectionServices connectionServices,
DownloadManager downloadManager,
DownloaderGuidAlternateLocationFinder downloaderGuidAlternateLocationFinder,
SpamServices spamServices,
SimppManager simppManager,
LicenseFactory licenseFactory,
HashTreeCache hashTreeCache,
SchemaReplyCollectionMapper schemaMapper,
AltLocManager altLocManager) {
this.library = library;
this.connectionManager = connectionManager;
this.dhtManager = dhtManager;
this.pushProxiesPublisher = pushProxiesPublisher;
this.connectionServices = connectionServices;
this.downloadManager = downloadManager;
this.downloaderGuidAlternateLocationFinder = downloaderGuidAlternateLocationFinder;
this.spamServices = spamServices;
this.simppManager = simppManager;
this.hashTreeCache = hashTreeCache;
this.licenseFactory = licenseFactory;
this.altLocManager = altLocManager;
}
@SuppressWarnings({"unused", "UnusedDeclaration"})
@Inject private void register(ServiceRegistry registry) {
registry.register(new Service() {
public void initialize() {
//TODO: find a better way to do this
library.addListener(altLocManager);
connectionManager.addEventListener(dhtManager);
dhtManager.addEventListener(pushProxiesPublisher);
downloadManager.addListener(downloaderGuidAlternateLocationFinder);
}
public void start() {
spamServices.reloadSpamFilters();
simppManager.addListener(new SimppListener() {
public void simppUpdated(int newVersion) {
spamServices.reloadSpamFilters();
}
});
}
public void stop() {
downloadManager.removeListener(downloaderGuidAlternateLocationFinder);
}
public String getServiceName() {
return I18nMarker.marktr("Various Core Services");
}
}).in("EarlyBackground");
registry.register(new Service() {
public String getServiceName() {
return org.limewire.i18n.I18nMarker.marktr("Gnutella Connections");
}
public void initialize() {
}
public void start() {
if(ConnectionSettings.CONNECT_ON_STARTUP.getValue()) {
// Make sure connections come up ultra-fast (beyond default keepAlive)
int outgoing = ConnectionSettings.NUM_CONNECTIONS.getValue();
if ( outgoing > 0 ) {
connectionServices.connect();
}
}
}
public void stop() {
hashTreeCache.persistCache(library, downloadManager);
licenseFactory.persistCache();
cleanupPreviewFiles();
cleanupTorrentMetadataFiles();
}
}).in(ServiceStage.LATE);
}
private void cleanupTorrentMetadataFiles() {
if(!library.isLoadFinished()) {
return;
}
FileFilter filter = new FileFilter() {
public boolean accept(File f) {
return "torrent".equals(FileUtils.getFileExtension(f));
}
};
File[] file_list = LibraryUtils.APPLICATION_SPECIAL_SHARE.listFiles(filter);
if(file_list == null) {
return;
}
long purgeLimit = System.currentTimeMillis()
- SharingSettings.TORRENT_METADATA_PURGE_TIME.getValue()*24L*60L*60L*1000L;
File tFile;
for(int i = 0; i < file_list.length; i++) {
tFile = file_list[i];
if(library.getFileDesc(tFile) != null &&
tFile.lastModified() < purgeLimit) {
tFile.delete();
}
}
}
/** Deletes all preview files. */
private void cleanupPreviewFiles() {
//Cleanup any preview files. Note that these will not be deleted if
//your previewer is still open.
File incompleteDir = SharingSettings.INCOMPLETE_DIRECTORY.get();
if (incompleteDir == null)
return; // if we could not get the incomplete directory, simply return.
File[] files = incompleteDir.listFiles();
if(files == null)
return;
for (int i=0; i<files.length; i++) {
String name = files[i].getName();
if (name.startsWith(IncompleteFileManager.PREVIEW_PREFIX))
files[i].delete(); //May or may not work; ignore return code.
}
}
}