sharemanagerimpl.java
来自「Azureus is a powerful, full-featured, cr」· Java 代码 · 共 811 行 · 第 1/2 页
JAVA
811 行
/*
* File : ShareManagerImpl.java
* Created : 30-Dec-2003
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.pluginsimpl.local.sharing;
/**
* @author parg
*
*/
import java.io.*;
import java.net.*;
import java.util.*;
import org.gudy.azureus2.plugins.torrent.*;
import org.gudy.azureus2.pluginsimpl.local.torrent.*;
import org.gudy.azureus2.plugins.sharing.*;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.core3.config.*;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.*;
import org.gudy.azureus2.core3.tracker.host.*;
public class
ShareManagerImpl
implements ShareManager, TOTorrentProgressListener, ParameterListener
{
public static final String TORRENT_STORE = "shares";
public static final String TORRENT_SUBSTORE = "cache";
public static final int MAX_FILES_PER_DIR = 1000;
public static final int MAX_DIRS = 1000;
protected static ShareManagerImpl singleton;
private static AEMonitor class_mon = new AEMonitor( "ShareManager:class" );
protected AEMonitor this_mon = new AEMonitor( "ShareManager" );
protected TOTorrentCreator to_creator;
public static ShareManagerImpl
getSingleton()
throws ShareException
{
try{
class_mon.enter();
if ( singleton == null ){
singleton = new ShareManagerImpl();
}
return( singleton );
}finally{
class_mon.exit();
}
}
protected boolean initialised;
protected File share_dir;
protected URL announce_url;
protected ShareConfigImpl config;
protected Map shares = new HashMap();
protected shareScanner current_scanner;
protected List listeners = new ArrayList();
protected
ShareManagerImpl()
throws ShareException
{
COConfigurationManager.addListener(
new COConfigurationListener()
{
public void
configurationSaved()
{
announce_url = null;
}
});
}
public void
initialise()
throws ShareException
{
try{
this_mon.enter();
if ( !initialised ){
initialised = true;
share_dir = FileUtil.getUserFile( TORRENT_STORE );
share_dir.mkdirs();
config = new ShareConfigImpl();
try{
config.suspendSaving();
config.loadConfig(this);
checkConsistency();
}finally{
Iterator it = shares.values().iterator();
while(it.hasNext()){
ShareResourceImpl resource = (ShareResourceImpl)it.next();
if ( resource.getType() == ShareResource.ST_DIR_CONTENTS ){
for (int i=0;i<listeners.size();i++){
try{
((ShareManagerListener)listeners.get(i)).resourceAdded( resource );
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}
}
config.resumeSaving();
}
readAZConfig();
}
}finally{
this_mon.exit();
}
}
protected void
readAZConfig()
{
COConfigurationManager.addParameterListener( "Sharing Rescan Enable", this );
readAZConfigSupport();
}
public void
parameterChanged(
String name )
{
readAZConfigSupport();
}
protected void
readAZConfigSupport()
{
try{
this_mon.enter();
boolean scan_enabled = COConfigurationManager.getBooleanParameter( "Sharing Rescan Enable" );
if ( !scan_enabled ){
current_scanner = null;
}else if ( current_scanner == null ){
current_scanner = new shareScanner();
}
}finally{
this_mon.exit();
}
}
protected ShareConfigImpl
getShareConfig()
{
return( config );
}
protected void
checkConsistency()
throws ShareException
{
// copy set for iteration as consistency check can delete resource
Iterator it = new HashSet(shares.values()).iterator();
while(it.hasNext()){
ShareResourceImpl resource = (ShareResourceImpl)it.next();
resource.checkConsistency();
}
}
protected void
deserialiseResource(
Map map )
{
try{
ShareResourceImpl new_resource = null;
int type = ((Long)map.get("type")).intValue();
if ( type == ShareResource.ST_FILE ||
type == ShareResource.ST_DIR ){
new_resource = ShareResourceFileOrDirImpl.deserialiseResource( this, map, type );
}else{
new_resource = ShareResourceDirContentsImpl.deserialiseResource( this, map );
}
if ( new_resource != null ){
ShareResourceImpl old_resource = (ShareResourceImpl)shares.get(new_resource.getName());
if ( old_resource != null ){
old_resource.delete(true);
}
shares.put( new_resource.getName(), new_resource );
// we delay the reporting of dir_contents until all recovery is complete so that
// the resource reported is initialised correctly
if ( type != ShareResource.ST_DIR_CONTENTS ){
for (int i=0;i<listeners.size();i++){
try{
((ShareManagerListener)listeners.get(i)).resourceAdded( new_resource );
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}
}
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
protected String
getNewTorrentLocation()
throws ShareException
{
Random rand = new Random(SystemTime.getCurrentTime());
for (int i=1;i<=MAX_DIRS;i++){
String cache_dir_str = share_dir + File.separator + TORRENT_SUBSTORE + i;
File cache_dir = new File(cache_dir_str);
if ( !cache_dir.exists()){
cache_dir.mkdirs();
}
if ( cache_dir.listFiles().length < MAX_FILES_PER_DIR ){
for (int j=0;j<MAX_FILES_PER_DIR;j++){
long file = Math.abs(rand.nextLong());
File file_name = new File(cache_dir_str + File.separator + file + ".torrent");
if ( !file_name.exists()){
// return path relative to cache_dir to save space
return( TORRENT_SUBSTORE + i + File.separator + file + ".torrent" );
}
}
}
}
throw( new ShareException( "ShareManager: failed to allocate cache file"));
}
protected void
writeTorrent(
ShareItemImpl item )
throws ShareException
{
try{
item.getTorrent().writeToFile( getTorrentFile(item ));
}catch( TorrentException e ){
throw( new ShareException( "ShareManager: torrent write fails", e ));
}
}
protected void
readTorrent(
ShareItemImpl item )
throws ShareException
{
try{
TOTorrent torrent = TOTorrentFactory.deserialiseFromBEncodedFile( getTorrentFile(item ));
item.setTorrent(new TorrentImpl(torrent));
}catch( TOTorrentException e ){
throw( new ShareException( "ShareManager: torrent read fails", e ));
}
}
protected void
deleteTorrent(
ShareItemImpl item )
{
File torrent_file = getTorrentFile(item);
System.out.println( "deleting torrent '".concat(torrent_file.toString()).concat("'"));
torrent_file.delete();
}
protected boolean
torrentExists(
ShareItemImpl item )
{
return( getTorrentFile(item).exists());
}
protected File
getTorrentFile(
ShareItemImpl item )
{
return( new File(share_dir+File.separator+item.getTorrentLocation()));
}
protected URL
getAnnounceURL()
throws ShareException
{
if ( announce_url == null ){
String tracker_ip = COConfigurationManager.getStringParameter("Tracker IP", "");
if ( tracker_ip.length() == 0 ){
throw( new ShareException( "ShareManager: tracker must be configured"));
}
boolean use_ssl = COConfigurationManager.getBooleanParameter( "Sharing Use SSL", false );
int port;
if ( use_ssl ){
port = COConfigurationManager.getIntParameter("Tracker Port SSL", TRHost.DEFAULT_PORT_SSL );
}else{
port = COConfigurationManager.getIntParameter("Tracker Port", TRHost.DEFAULT_PORT );
}
try{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?