/*
* File : TOTorrentFileImpl.java
* Created : 5 Oct. 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.core3.torrent;
import java.io.*;
import java.util.*;
//import org.gudy.azureus2.core3.internat.*;
import org.gudy.azureus2.core3.torrent.*;
import org.gudy.azureus2.core3.util.*;
public class
TOTorrentFileImpl
// implements TOTorrentFile
{
private final TOTorrent torrent;
private final long file_length;
private final byte[][] path_components;
private final byte[][] path_components_utf8;
private final int first_piece_number;
private final int last_piece_number;
private final Map additional_properties = new LightHashMap(1);
private final boolean is_utf8;
protected
TOTorrentFileImpl(
TOTorrent _torrent,
long _torrent_offset,
long _len,
String _path )
throws TOTorrentException
{
torrent = _torrent;
file_length = _len;
first_piece_number = (int)( _torrent_offset / torrent.getPieceLength());
last_piece_number = (int)(( _torrent_offset + file_length - 1 ) / torrent.getPieceLength());
is_utf8 = true;
try{
Vector temp = new Vector();
int pos = 0;
while(true){
int p1 = _path.indexOf( File.separator, pos );
if ( p1 == -1 ){
temp.add( _path.substring( pos ).getBytes( Constants.DEFAULT_ENCODING ));
break;
}
temp.add( _path.substring( pos, p1 ).getBytes( Constants.DEFAULT_ENCODING ));
pos = p1+1;
}
path_components = new byte[temp.size()][];
temp.copyInto( path_components );
path_components_utf8 = new byte[temp.size()][];
temp.copyInto( path_components_utf8 );
checkComponents();
}catch( UnsupportedEncodingException e ){
throw( new TOTorrentException( "Unsupported encoding for '" + _path + "'",
TOTorrentException.RT_UNSUPPORTED_ENCODING));
}
}
protected
TOTorrentFileImpl(
TOTorrent _torrent,
long _torrent_offset,
long _len,
byte[][] _path_components )
throws TOTorrentException
{
torrent = _torrent;
file_length = _len;
path_components = _path_components;
path_components_utf8 = null;
first_piece_number = (int)( _torrent_offset / torrent.getPieceLength());
last_piece_number = (int)(( _torrent_offset + file_length - 1 ) / torrent.getPieceLength());
is_utf8 = false;
checkComponents();
}
protected
TOTorrentFileImpl(
TOTorrent _torrent,
long _torrent_offset,
long _len,
byte[][] _path_components,
byte[][] _path_components_utf8 )
throws TOTorrentException
{
torrent = _torrent;
file_length = _len;
path_components = _path_components;
path_components_utf8 = _path_components_utf8;
first_piece_number = (int)( _torrent_offset / torrent.getPieceLength());
last_piece_number = (int)(( _torrent_offset + file_length - 1 ) / torrent.getPieceLength());
is_utf8 = false;
checkComponents();
}
protected void
checkComponents()
throws TOTorrentException
{
for (int i=0;i<path_components.length;i++){
byte[] comp = path_components[i];
if (comp.length == 2 && comp[0] == (byte) '.' && comp[1] == (byte) '.')
throw (new TOTorrentException("Torrent file contains illegal '..' component", TOTorrentException.RT_DECODE_FAILS));
// intern directories as they're likely to repeat
// if(i < (path_components.length - 1))
// path_components[i] = StringInterner.internBytes(path_components[i]);
}
}
public TOTorrent
getTorrent()
{
return( torrent );
}
public long
getLength()
{
return( file_length );
}
public byte[][]
getPathComponentsBasic()
{
return( path_components );
}
public byte[][]
getPathComponents()
{
return path_components_utf8 == null ? path_components : path_components_utf8;
}
public byte[][]
getPathComponentsUTF8()
{
return( path_components_utf8 );
}
protected boolean
isUTF8()
{
return( is_utf8 );
}
protected void
setAdditionalProperty(
String name,
Object value )
{
additional_properties.put( name, value );
}
protected Map
getAdditionalProperties()
{
return( additional_properties );
}
public int
getFirstPieceNumber()
{
return( first_piece_number );
}
public int
getLastPieceNumber()
{
return( last_piece_number );
}
public int
getNumberOfPieces()
{
return( getLastPieceNumber() - getFirstPieceNumber() + 1 );
}
public String getRelativePath() {
if (torrent == null)
return "";
String sRelativePath = "";
// LocaleUtilDecoder decoder = null;
// try {
// decoder = LocaleTorrentUtil.getTorrentEncodingIfAvailable(torrent);
// if (decoder == null) {
// LocaleUtil localeUtil = LocaleUtil.getSingleton();
// decoder = localeUtil.getSystemDecoder();
// }
// } catch (Exception e) {
// // Do Nothing
// }
//
// if (decoder != null) {
// byte[][]components = getPathComponents();
// for (int j = 0; j < components.length; j++) {
//
// try {
// String comp;
// try {
// comp = decoder.decodeString(components[j]);
// } catch (UnsupportedEncodingException e) {
// System.out.println("file - unsupported encoding!!!!");
// try {
// comp = new String(components[j]);
// } catch (Exception e2) {
// comp = "UnsupportedEncoding";
// }
// }
//
// comp = FileUtil.convertOSSpecificChars(comp, j != components.length-1 );
//
// sRelativePath += (j == 0 ? "" : File.separator) + comp;
// } catch (Exception ex) {
//// Debug.out(ex);
// }
//
// }
//
// }
return sRelativePath;
}
/**
* @return
*
* @since 4.1.0.5
*/
public Map serializeToMap() {
Map file_map = new HashMap();
// file_map.put( TOTorrentImpl.TK_LENGTH, new Long( getLength()));
List path = new ArrayList();
// file_map.put( TOTorrentImpl.TK_PATH, path );
byte[][] path_comps = getPathComponentsBasic();
for (int j=0;j<path_comps.length;j++){
path.add( path_comps[j]);
}
if ( isUTF8()){
List utf8_path = new ArrayList();
// file_map.put( TOTorrentImpl.TK_PATH_UTF8, utf8_path );
for (int j=0;j<path_comps.length;j++){
utf8_path.add( path_comps[j]);
}
} else {
byte[][] utf8_path_comps = getPathComponentsUTF8();
if (utf8_path_comps != null) {
List utf8_path = new ArrayList();
// file_map.put( TOTorrentImpl.TK_PATH_UTF8, utf8_path );
for (int j=0;j<utf8_path_comps.length;j++){
utf8_path.add( utf8_path_comps[j]);
}
}
}
Map file_additional_properties = getAdditionalProperties();
Iterator prop_it = file_additional_properties.keySet().iterator();
while( prop_it.hasNext()){
String key = (String)prop_it.next();
file_map.put( key, file_additional_properties.get( key ));
}
return file_map;
}
}