/**
* Copyright (C) 2008 Aelitis, All Rights Reserved.
*
* 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, or (at your option) any later version.
* 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.
* 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.
*
* AELITIS, SAS au capital de 63.529,40 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.core3.disk.impl;
import java.util.Arrays;
import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.disk.DiskManagerFileInfoSet;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.util.Debug;
/**
* @author Aaron Grunthal
* @create 10.05.2008
*/
public class DiskManagerFileInfoSetImpl implements DiskManagerFileInfoSet {
final DiskManagerFileInfoImpl[] files;
final DiskManagerHelper diskManager;
public DiskManagerFileInfoSetImpl(DiskManagerFileInfoImpl[] files, DiskManagerHelper dm) {
this.files = files;
this.diskManager = dm;
}
public DiskManagerFileInfo[] getFiles() {
return files;
}
public int nbFiles() {
return files.length;
}
public void setPriority(int[] toChange) {
if(toChange.length != files.length)
throw new IllegalArgumentException("array length mismatches the number of files");
DownloadManagerState dmState = diskManager.getDownloadState();
try {
dmState.suppressStateSave(true);
for(int i=0;i<files.length;i++)
if(toChange[i] != 0){
files[i].setPriority(toChange[i]);
}
} finally {
dmState.suppressStateSave(false);
}
}
public void setSkipped(boolean[] toChange, boolean setSkipped) {
if(toChange.length != files.length)
throw new IllegalArgumentException("array length mismatches the number of files");
DownloadManagerState dmState = diskManager.getDownloadState();
try {
dmState.suppressStateSave(true);
if (!setSkipped ){
String[] types = diskManager.getStorageTypes();
boolean[] toLinear = new boolean[toChange.length];
boolean[] toReorder = new boolean[toChange.length];
int num_linear = 0;
int num_reorder = 0;
for ( int i=0;i<toChange.length;i++){
if ( toChange[i] ){
int old_type = DiskManagerUtil.convertDMStorageTypeFromString( types[i] );
if ( old_type == DiskManagerFileInfo.ST_COMPACT ){
toLinear[i] = true;
num_linear++;
}else if ( old_type == DiskManagerFileInfo.ST_REORDER_COMPACT ){
toReorder[i] = true;
num_reorder++;
}
}
}
if ( num_linear > 0 ){
if (!Arrays.equals(toLinear, setStorageTypes(toLinear, DiskManagerFileInfo.ST_LINEAR))){
return;
}
}
if ( num_reorder > 0 ){
if (!Arrays.equals(toReorder, setStorageTypes(toReorder, DiskManagerFileInfo.ST_REORDER ))){
return;
}
}
}
for (int i = 0; i < files.length; i++)
if (toChange[i])
{
files[i].setSkippedInternal( setSkipped );
diskManager.skippedFileSetChanged(files[i]);
}
if(!setSkipped)
DiskManagerUtil.doFileExistenceChecks(this, toChange, diskManager.getDownloadState().getDownloadManager(), true);
} finally {
dmState.suppressStateSave(false);
}
}
public boolean[] setStorageTypes(boolean[] toChange, int newStroageType) {
if(toChange.length != files.length)
throw new IllegalArgumentException("array length mismatches the number of files");
if(files.length == 0)
return new boolean[0];
String[] types = diskManager.getStorageTypes();
boolean[] modified = new boolean[files.length];
DownloadManagerState dm_state = diskManager.getDownloadState();
if (newStroageType == DiskManagerFileInfo.ST_COMPACT || newStroageType == DiskManagerFileInfo.ST_REORDER_COMPACT)
{
Debug.out("Download must be stopped for linear -> compact conversion");
return modified;
}
try {
dm_state.suppressStateSave(true);
for (int i = 0; i < files.length; i++)
{
if(!toChange[i])
continue;
int old_type = DiskManagerUtil.convertDMStorageTypeFromString( types[i] );
if (newStroageType == old_type)
{
modified[i] = true;
continue;
}
DiskManagerFileInfoImpl file = files[i];
try {
file.getCacheFile().setStorageType( DiskManagerUtil.convertDMStorageTypeToCache( newStroageType ));
modified[i] = true;
} catch (Throwable e) {
Debug.printStackTrace(e);
diskManager.setFailed(file, "Failed to change storage type for '" + file.getFile(true) + "': " + Debug.getNestedExceptionMessage(e));
break;
} finally {
types[i] = DiskManagerUtil.convertCacheStorageTypeToString( file.getCacheFile().getStorageType());
}
}
dm_state.setListAttribute(DownloadManagerState.AT_FILE_STORE_TYPES, types);
DiskManagerUtil.doFileExistenceChecks(this, toChange, dm_state.getDownloadManager(), true);
} finally {
dm_state.suppressStateSave(false);
dm_state.save();
}
return modified;
}
}