📄 diskmanagerimpl.java
字号:
TOTorrentFile files[] = torrent.getFiles();
for (int i = 0; i < files.length; i++)
{
byte path_comps[][] = files[i].getPathComponents();
String path_str = (new StringBuilder()).append(torrent_save_dir).append(File.separator).append(torrent_save_file).append(File.separator).toString();
for (int j = 0; j < path_comps.length; j++)
{
String comp = locale_decoder.decodeString(path_comps[j]);
comp = FileUtil.convertOSSpecificChars(comp, j != path_comps.length - 1);
path_str = (new StringBuilder()).append(path_str).append(j != 0 ? File.separator : "").append(comp).toString();
}
File file = (new File(path_str)).getCanonicalFile();
File linked_file = FMFileManagerFactory.getSingleton().getFileLink(torrent, file);
boolean skip = false;
if (linked_file != file && !linked_file.getCanonicalPath().startsWith((new File(torrent_save_dir)).getCanonicalPath()))
skip = true;
if (!skip && file.exists() && !file.isDirectory())
res++;
}
return res;
Throwable e;
e;
Debug.printStackTrace(e);
return -1;
}
private static void deleteDataFileContents(TOTorrent torrent, String torrent_save_dir, String torrent_save_file)
throws TOTorrentException, UnsupportedEncodingException, LocaleUtilEncodingException
{
LocaleUtilDecoder locale_decoder = LocaleTorrentUtil.getTorrentEncoding(torrent);
TOTorrentFile files[] = torrent.getFiles();
String root_path = (new StringBuilder()).append(torrent_save_dir).append(File.separator).append(torrent_save_file).append(File.separator).toString();
boolean delete_if_not_in_dir = COConfigurationManager.getBooleanParameter("File.delete.include_files_outside_save_dir");
for (int i = 0; i < files.length; i++)
{
byte path_comps[][] = files[i].getPathComponents();
String path_str = root_path;
for (int j = 0; j < path_comps.length; j++)
try
{
String comp = locale_decoder.decodeString(path_comps[j]);
comp = FileUtil.convertOSSpecificChars(comp, j != path_comps.length - 1);
path_str = (new StringBuilder()).append(path_str).append(j != 0 ? File.separator : "").append(comp).toString();
}
catch (UnsupportedEncodingException e)
{
Debug.out("file - unsupported encoding!!!!");
}
File file = new File(path_str);
File linked_file = FMFileManagerFactory.getSingleton().getFileLink(torrent, file);
boolean delete;
if (linked_file == file)
delete = true;
else
try
{
if (delete_if_not_in_dir || linked_file.getCanonicalPath().startsWith((new File(root_path)).getCanonicalPath()))
{
file = linked_file;
delete = true;
} else
{
delete = false;
}
}
catch (Throwable e)
{
Debug.printStackTrace(e);
delete = false;
}
if (!delete || !file.exists() || file.isDirectory())
continue;
try
{
FileUtil.deleteWithRecycle(file);
}
catch (Exception e)
{
Debug.out(e.toString());
}
}
TorrentUtils.recursiveEmptyDirDelete(new File(torrent_save_dir, torrent_save_file));
}
public void skippedFileSetChanged(DiskManagerFileInfo file)
{
skipped_file_set_changed = true;
listeners.dispatch(2, file);
}
public void priorityChanged(DiskManagerFileInfo file)
{
listeners.dispatch(2, file);
}
private void loadFilePriorities()
{
loadFilePriorities(download_manager, fileset);
}
private static void loadFilePriorities(DownloadManager download_manager, DiskManagerFileInfoSet fileSet)
{
DiskManagerFileInfo files[];
files = fileSet.getFiles();
if (files == null)
return;
List file_priorities;
file_priorities = (List)download_manager.getData("file_priorities");
if (file_priorities == null)
return;
boolean toSkip[];
boolean prio[];
int i;
toSkip = new boolean[files.length];
prio = new boolean[files.length];
i = 0;
_L2:
if (i >= files.length)
break MISSING_BLOCK_LABEL_112;
DiskManagerFileInfo file = files[i];
if (file == null)
return;
int priority = ((Long)file_priorities.get(i)).intValue();
if (priority == 0)
toSkip[i] = true;
else
if (priority == 1)
prio[i] = true;
i++;
if (true) goto _L2; else goto _L1
_L1:
fileSet.setPriority(prio, true);
fileSet.setSkipped(toSkip, true);
break MISSING_BLOCK_LABEL_138;
Throwable t;
t;
Debug.printStackTrace(t);
}
protected void storeFilePriorities()
{
storeFilePriorities(download_manager, ((DiskManagerFileInfo []) (files)));
}
protected static void storeFilePriorities(DownloadManager download_manager, DiskManagerFileInfo files[])
{
if (files == null)
return;
List file_priorities = new ArrayList(files.length);
for (int i = 0; i < files.length; i++)
{
DiskManagerFileInfo file = files[i];
if (file == null)
return;
boolean skipped = file.isSkipped();
boolean priority = file.isPriority();
int value = -1;
if (skipped)
value = 0;
else
if (priority)
value = 1;
file_priorities.add(i, new Long(value));
}
download_manager.setData("file_priorities", file_priorities);
}
protected static void storeFileDownloaded(DownloadManager download_manager, DiskManagerFileInfo files[], boolean persist)
{
DownloadManagerState state = download_manager.getDownloadState();
Map details = new HashMap();
List downloaded = new ArrayList();
details.put("downloaded", downloaded);
for (int i = 0; i < files.length; i++)
downloaded.add(new Long(files[i].getDownloaded()));
state.setMapAttribute("filedownloaded", details);
if (persist)
state.save();
}
protected static void loadFileDownloaded(DownloadManager download_manager, DiskManagerFileInfoHelper files[])
{
DownloadManagerState state = download_manager.getDownloadState();
Map details = state.getMapAttribute("filedownloaded");
if (details == null)
return;
List downloaded = (List)details.get("downloaded");
if (downloaded == null)
return;
try
{
for (int i = 0; i < files.length; i++)
files[i].setDownloaded(((Long)downloaded.get(i)).longValue());
}
catch (Throwable e)
{
Debug.printStackTrace(e);
}
}
public void saveState()
{
saveState(true);
}
protected void saveState(boolean persist)
{
if (files != null)
{
storeFileDownloaded(download_manager, files, persist);
storeFilePriorities();
}
checkFreePieceList(false);
}
public DownloadManager getDownloadManager()
{
return download_manager;
}
public String getInternalName()
{
return download_manager.getInternalName();
}
public DownloadManagerState getDownloadState()
{
return download_manager.getDownloadState();
}
public File getSaveLocation()
{
return download_manager.getSaveLocation();
}
public String[] getStorageTypes()
{
return getStorageTypes(download_manager);
}
public String getStorageType(int fileIndex)
{
return getStorageType(download_manager, fileIndex);
}
public static String[] getStorageTypes(DownloadManager download_manager)
{
DownloadManagerState state = download_manager.getDownloadState();
String types[] = state.getListAttribute("storetypes");
if (types.length == 0)
{
types = new String[download_manager.getTorrent().getFiles().length];
for (int i = 0; i < types.length; i++)
types[i] = "L";
}
return types;
}
public static String getStorageType(DownloadManager download_manager, int fileIndex)
{
DownloadManagerState state = download_manager.getDownloadState();
String type = state.getListAttribute("storetypes", fileIndex);
return type == null ? "L" : type;
}
private static boolean setFileLink(DownloadManager download_manager, DiskManagerFileInfo info[], DiskManagerFileInfo file_info, File from_file, File to_link)
{
File existing_link = FMFileManagerFactory.getSingleton().getFileLink(download_manager.getTorrent(), to_link);
if (!existing_link.equals(to_link) && !from_file.equals(to_link))
{
Logger.log(new LogAlert(download_manager, true, 3, (new StringBuilder()).append("Attempt to link to existing link '").append(existing_link.toString()).append("'").toString()));
return false;
}
File existing_file = file_info.getFile(true);
if (to_link.equals(existing_file))
return true;
for (int i = 0; i < info.length; i++)
if (to_link.equals(info[i].getFile(true)))
{
Logger.log(new LogAlert(download_manager, true, 3, (new StringBuilder()).append("Attempt to link to existing file '").append(info[i].getFile(true)).append("'").toString()));
return false;
}
if (to_link.exists())
{
if (!existing_file.exists())
download_manager.recheckFile(file_info);
else
if (FileUtil.deleteWithRecycle(existing_file))
{
download_manager.recheckFile(file_info);
} else
{
Logger.log(new LogAlert(download_manager, true, 3, (new StringBuilder()).append("Failed to delete '").append(existing_file.toString()).append("'").toString()));
return false;
}
} else
if (existing_file.exists() && !FileUtil.renameFile(existing_file, to_link))
{
Logger.log(new LogAlert(download_manager, true, 3, (new StringBuilder()).append("Failed to rename '").append(existing_file.toString()).append("'").toString()));
return false;
}
DownloadManagerState state = download_manager.getDownloadState();
state.setFileLink(from_file, to_link);
state.save();
return true;
}
public static DiskManagerFileInfoSet getFileInfoSkeleton(DownloadManager download_manager, DiskManagerListener listener)
{
TOTorrent torrent;
String root_dir;
torrent = download_manager.getTorrent();
if (torrent == null)
return new DiskManagerFileInfoSetImpl(new DiskManagerFileInfoImpl[0], null);
String tempRootDir = download_manager.getAbsoluteSaveLocation().getParent();
if (tempRootDir == null)
tempRootDir = download_manager.getAbsoluteSaveLocation().getPath();
if (!torrent.isSimpleTorrent())
tempRootDir = (new StringBuilder()).append(tempRootDir).append(File.separator).append(download_manager.getAbsoluteSaveLocation().getName()).toString();
tempRootDir = (new StringBuilder()).append(tempRootDir).append(File.separator).toString();
root_dir = tempRootDir;
DiskManagerFileInfoSet fileSetSkeleton;
LocaleUtilDecoder locale_decoder = LocaleTorrentUtil.getTorrentEncoding(torrent);
TOTorrentFile torrent_files[] = torrent.getFiles();
FileSkeleton res[] = new FileSkeleton[torrent_files.length];
fileSetSkeleton = new DiskManagerFileInfoSet(res, download_manager, listener) {
final FileSkeleton val$res[];
final DownloadManager val$download_manager;
final DiskManagerListener val$listener;
public DiskManagerFileInfo[] getFiles()
{
return res;
}
public int nbFiles()
{
return res.length;
}
public void setPriority(boolean toChange[], boolean setPriority)
{
if (toChange.length != res.length)
throw new IllegalArgumentException("array length mismatches the number of files");
for (int i = 0; i < res.length; i++)
if (toChange[i])
res[i].priority = setPriority;
DiskManagerImpl.storeFilePriorities(download_manager, res);
for (int i = 0; i < res.length; i++)
if (toChange[i])
listener.filePriorityChanged(res[i]);
}
public void setSkipped(boolean toChange[], boolean setSkipped)
{
if (toChange.length != res.length)
throw new IllegalArgumentException("array length mismatches the number of files");
if (!setSkipped && !Arrays.equals(toChange, setStorageTypes(toChange, 1)))
return;
for (int i = 0; i < res.length; i++)
if (toChange[i])
res[i].skipped = setSkipped;
if (!setSkipped)
DiskManagerUtil.doFileExistenceChecks(this, toChange, download_manager, true);
DiskManagerImpl.storeFilePriorities(download_manager, res);
for (int i = 0; i < res.length; i++)
if (toChange[i])
listener.filePriorityChanged(res[i]);
}
public boolean[] setStorageTypes(boolean toChange[], int newStroageType)
{
String types[];
boolean modified[];
boolean toSkip[];
int toSkipCount;
DownloadManagerState dmState;
if (toChange.length != res.length)
throw new IllegalArgumentException("array length mismatches the number of files");
types = DiskManagerImpl.getStorageTypes(download_manager);
modified = new boolean[res.length];
toSkip = new boolean[res.length];
toSkipCount = 0;
dmState = download_manager.getDownloadState();
dmState.suppressStateSave(true);
for (int i = 0; i < res.length; i++)
{
if (!toChange[i])
continue;
final int idx = i;
int old_type = types[i].equals("L") ? 1 : 2;
if (newStroageType == old_type)
{
modified[i] = true;
continue;
}
try
{
File target_file = res[i].getFile(true);
if (target_file.exists())
{
CacheFile cache_file = CacheFileManagerFactory.getSingleton().createFile(new CacheFileOwner() {
final int val$idx;
final 6 this$0;
public String getCacheFileOwnerName()
{
return download_manager.getInternalName(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -