Package org.gudy.azureus2.core3.disk

Examples of org.gudy.azureus2.core3.disk.DiskManagerFileInfo


    try {
      state.suppressStateSave(true);

      for (int i = 0; i < fileInfos.length; i++) {

        DiskManagerFileInfo fileInfo = fileInfos[i];

        File base_file = fileInfo.getFile(false);

        File existing_link = state.getFileLink(base_file);

        if (existing_link == null && !base_file.exists()) {

          String name = base_file.getName();
          String ext = FileUtil.getExtension(name);
          int extLength = ext.length();
          name = name.substring(0, name.length() - extLength);

          // Java appears to be pretending
          // each unicode character is 3 bytes long.  If the limit
          // on a name is 256 two byte characters, then in theory,
          // the limit is 170 unicode characters.  Instead of assuming
          // that's the case, let's just walk back until the name
          // is accepted.
          // Bail at 50 just for the fun of it (plus most filenames
          // are short, so we can skip the Canonical call)
          int origLength = name.length();
          if (origLength > 50) {
            File parentFile = base_file.getParentFile();

            // We don't get "File name too long" on getCanonicalPath
            // unless the dir is there
            // I Wonder if we should remove the dirs after using them
            // FMFileImpl will create dirs again
            parentFile.mkdirs();

            File newFile = null;
            boolean first = true;
            while (name.length() > 50) {
              try {
                newFile = new File(parentFile, name + ext);
                newFile.getCanonicalPath();

                if (first) {
                  break;
                }

                // it worked, but the new name might already exist
                int fixNameID = 0xFF; // always 3 digits :)
                boolean redo;
                do {
                  redo = false;
                  for (int j = 0; j < i; j++) {
                    DiskManagerFileInfo convertedFileInfo = fileInfos[j];
                    if (newFile.equals(convertedFileInfo.getFile(true))) {
                      do {
                        fixNameID++;
                        if (fixNameID >= 0xFFF) {
                          // exit, will fail later :(
                          break;
                        }
                        name = name.substring(0, name.length() - 3)
                            + Integer.toHexString(fixNameID);
                        newFile = new File(parentFile, name + ext);
                      } while (newFile.equals(convertedFileInfo.getFile(true)));
                      redo = fixNameID <= 0xFFF;
                      break;
                    }
                  }
                } while (redo);
View Full Code Here


    }
   
      // no underlying download, lash something up
   
    return(
      new DiskManagerFileInfo()
      {
        public void
        setPriority(
          int b )
        {
View Full Code Here

        if (datasource instanceof Peer) {
          return datasource;
        }
       
        if (datasource instanceof org.gudy.azureus2.core3.disk.DiskManagerFileInfo) {
          DiskManagerFileInfo fileInfo = (org.gudy.azureus2.core3.disk.DiskManagerFileInfo) datasource;
          if (fileInfo != null) {
            try {
              return new org.gudy.azureus2.pluginsimpl.local.disk.DiskManagerFileInfoImpl(
                  DownloadManagerImpl.getDownloadStatic(fileInfo.getDownloadManager()),
                  fileInfo);
            } catch (DownloadException e) { /* Ignore */
            }
          }
        }
 
View Full Code Here

    int  last_pos   = 0;
    int  line_num  = 0;
   
    String        target_str  = null;
   
    DiskManagerFileInfo  target_file = null;
   
    long  file_offset  = 0;
   
    List<long[]>  ranges = new ArrayList<long[]>();
   
    boolean  keep_alive  = false;
   
    for (int i=1;i<chars.length;i++){
     
      if ( chars[i-1] == '\r' && chars[i] == '\n' ){
       
        String  line = new String( chars, last_pos, i - last_pos ).trim();
       
        last_pos = i;
       
        line_num++;
       
        // System.out.println( "line " + line_num + " -> " + line );
       
        if ( line_num == 1 ){
         
          line = line.substring( line.indexOf( "files/" ) + 6 );
         
          int  hash_end = line.indexOf( "/" );
         
          final byte[] old_hash = control.getHash();

          final byte[] new_hash = URLDecoder.decode(line.substring(0, hash_end), "ISO-8859-1").getBytes( "ISO-8859-1" );
         
          if ( !Arrays.equals( new_hash, old_hash )){
           
            switching    = true;
           
            decoder.pauseInternally();
             
            flushRequests(
              new flushListener()
              {
                private boolean triggered;
               
                public void
                flushed()
                {
                  synchronized( this ){
                   
                    if ( triggered ){
                     
                      return;
                    }
                   
                    triggered = true;
                  }
                 
                  getManager().reRoute(
                      HTTPNetworkConnectionFile.this,
                      old_hash, new_hash, header );
                }
              });
             
            return;
          }
         
         
          line = line.substring( hash_end + 1 );
         
          line = line.substring( 0, line.lastIndexOf( ' ' ));
         
          String  file = line;

          if ( to_torrent.isSimpleTorrent()){
           
              // optimise for simple torrents. also support the case where
              // client has the hash but doesn't know the file name
           
            target_file = dm.getFiles()[0];
           
          }else{
           
            target_str  = file;
           
            StringTokenizer  tok = new StringTokenizer( file, "/" );
           
            List<byte[]>  bits = new ArrayList<byte[]>();
           
            while( tok.hasMoreTokens()){
             
              bits.add( URLDecoder.decode(tok.nextToken(), "ISO-8859-1").getBytes( "ISO-8859-1" ));
            }
           
              // latest spec has torrent file name encoded first for non-simple torrents
              // remove it if we find it so we have some backward compat
           
            if ( !to_torrent.isSimpleTorrent() && bits.size() > 1 ){
           
              if ( Arrays.equals( to_torrent.getName(), (byte[])bits.get(0))){
               
                bits.remove(0);
              }
            }
           
            DiskManagerFileInfo[]  files = dm.getFiles();
           
            file_offset  = 0;
           
            for (int j=0;j<files.length;j++){
             
              TOTorrentFile  torrent_file = files[j].getTorrentFile();
             
              byte[][]  comps = torrent_file.getPathComponents();
             
              if ( comps.length == bits.size()){
               
                boolean  match = true;
               
                for (int k=0;k<comps.length;k++){
                                                 
                  if ( !Arrays.equals( comps[k], (byte[])bits.get(k))){
                   
                    match  = false;
                   
                    break;
                  }
                }
               
                if ( match ){
                 
                  target_file   = files[j];
                                 
                  break;
                }
              }
             
              file_offset += torrent_file.getLength();
            }
          }
        }else{
         
          line = line.toLowerCase( MessageText.LOCALE_ENGLISH );
         
          if ( line.startsWith( "range" ) && target_file != null ){
           
            line = line.substring(5).trim();
           
            if ( line.startsWith(":" )){
                 
              String  range_str = line.substring(1).trim();
             
              if ( range_str.startsWith( "bytes=" )){
               
                long  file_length = target_file.getLength();
               
                StringTokenizer tok2 = new StringTokenizer( range_str.substring( 6 ), "," );
               
                while( tok2.hasMoreTokens()){
                 
                  String  range = tok2.nextToken();
                 
                  try{
                    int  pos = range.indexOf('-');
                   
                    if ( pos != -1 ){
                     
                      String  lhs = range.substring( 0,pos);
                      String  rhs = range.substring(pos+1);
                     
                      long  start;
                      long  end;
                     
                      if ( lhs.length() == 0 ){
                       
                          // -222 is last 222 bytes of file
                       
                        end   = file_length - 1;
                        start   = file_length - Long.parseLong( rhs );
                       
                      }else if ( rhs.length() == 0 ){
                       
                        end   = file_length - 1;
                        start   = Long.parseLong( lhs );
                       
                      }else{
                       
                        start   = Long.parseLong( lhs );
                        end   = Long.parseLong( rhs );
                     
                     
                      ranges.add( new long[]{ start, end });
                    }
                  }catch( Throwable e ){
                  }
                }
              }
             
              if ( ranges.size() == 0 ){
             
                  log( "Invalid range specification: '" + line + "'" );         

                sendAndClose( getManager().getRangeNotSatisfiable());
               
                return;
              }
            }
          }else if ( line.indexOf( "keep-alive" ) != -1 ){
           
            keep_alive  = true;           
          }
        }
      }
    }

    if ( target_file == null ){
     
      log( "Failed to find file '" + target_str + "'" );

      sendAndClose( getManager().getNotFound());
     
      return;
    }
   
    try{
      String  name = target_file.getFile( true ).getName();
   
      int  pos = name.lastIndexOf( "." );
     
      if ( pos != -1 ){
       
        setContentType( HTTPUtils.guessContentTypeFromFileType( name.substring( pos+1 )));
      }
    }catch( Throwable e ){
    }
   
    long  file_length = target_file.getLength();
   
    boolean  partial_content =  ranges.size() > 0;
   
    if ( !partial_content ){
     
View Full Code Here

         
    long  offset = 0;
   
    for (int i=0;i<files.length;i++){
     
      DiskManagerFileInfo f = files[i];
             
      enhanced_files[i] = new EnhancedDownloadManagerFile( f, offset );
     
      offset += f.getLength();
    }
   
   
    int primary_index = PlayUtils.getPrimaryFileIndex( download_manager );
   
View Full Code Here

      return( -1 );
    }

    EnhancedDownloadManagerFile  efile = enhanced_files[ file_index ];
   
    DiskManagerFileInfo file = efile.getFile();
   
    DiskManager dm = download_manager.getDiskManager();
   
    if ( dm == null ){
     
      if ( file.getDownloaded() == file.getLength()){
       
        return( file.getLength() - file_start_offset );
      }
     
      return( -1 );
    }
   
    int  piece_size = dm.getPieceLength();
   
    DiskManagerFileInfo[]   files = dm.getFiles();
   
    long  start_index = efile.getByteOffestInTorrent() + file_start_offset;
 
   
    int  first_piece_index   = (int)( start_index / piece_size );
    int  first_piece_offset  = (int)( start_index % piece_size );
    int  last_piece_index  = file.getLastPieceNumber();
   
    DiskManagerPiece[]  pieces = dm.getPieces();
   
    DiskManagerPiece  first_piece = pieces[first_piece_index];
       
    long  available = 0;
   
    if ( !first_piece.isDone()){
     
      boolean[] blocks = first_piece.getWritten();
           
      if ( blocks == null ){
       
        if ( first_piece.isDone()){
         
          available = first_piece.getLength() - first_piece_offset;
        }
      }else{
       
        int  piece_offset = 0;
       
        for (int j=0;j<blocks.length;j++){
       
          if ( blocks[j] ){
         
            int  block_size = first_piece.getBlockSize( j );
           
            piece_offset = piece_offset + block_size;
           
            if ( available == 0 ){
           
              if ( piece_offset > first_piece_offset ){
               
                available = piece_offset - first_piece_offset;
              }
            }else{
             
              available += block_size;
            }           
          }else{
           
            break;
          }
        }
      } 
    }else{
   
      available = first_piece.getLength() - first_piece_offset;
   
      for (int i=first_piece_index+1;i<=last_piece_index;i++){
       
        if ( stop_counting_after > 0 && available >= stop_counting_after ){
         
          break;
        }
       
        DiskManagerPiece piece = pieces[i];
       
        if ( piece.isDone()){
         
          available += piece.getLength();
         
        }else{
       
          boolean[] blocks = piece.getWritten();
             
          if ( blocks == null ){
           
            if ( piece.isDone()){
         
              available += piece.getLength();
             
            }else{
             
              break;
            }
          }else{
           
            for (int j=0;j<blocks.length;j++){
           
              if ( blocks[j] ){
             
                available += piece.getBlockSize( j );
               
              }else{
               
                break;
              }
            }
          }
         
          break;
        }
      }
    }
   
    long  max_available = file.getLength() - file_start_offset;
   
    if ( available > max_available ){
   
      available = max_available;
    }
View Full Code Here

    }
           
    protected long
    getETA()
    {
      DiskManagerFileInfo file = primary_file.getFile();
     
      if ( file.getLength() == file.getDownloaded()){
       
        return( 0 );
      }
     
      long download_rate = getDownloadBytesPerSecond();
     
      if ( download_rate <= 0 ){
       
        return( Long.MAX_VALUE );
      }
     
      long  buffer_bytes  = getBufferBytes();
     
      long  buffer_done    = getContiguousAvailableBytes( file.getIndex(), getCurrentProviderPosition( false ), buffer_bytes );
     
      long   rem_buffer = buffer_bytes - buffer_done;  // ok as initial dl is forced in order byte buffer-rta
     
      long   rem_secs = (rem_buffer<=0)?0:(rem_buffer / download_rate);
     
View Full Code Here

        pluginDataSource = null;
      }
    }

    if (coreDataSource instanceof DiskManagerFileInfo) {
      DiskManagerFileInfo fileInfo = (DiskManagerFileInfo) coreDataSource;
      if (fileInfo != null) {
        try {
          pluginDataSource = new DiskManagerFileInfoImpl(
              DownloadManagerImpl.getDownloadStatic(fileInfo.getDownloadManager()),
              fileInfo);
        } catch (DownloadException e) { /* Ignore */
        }
      }
    }
 
View Full Code Here

  }

  public static void playOrStreamDataSource(Object ds, String referal,
      boolean launch_already_checked, boolean complete_only) {

    DiskManagerFileInfo fileInfo = DataSourceUtils.getFileInfo(ds);
    if (fileInfo != null) {
      playOrStream(fileInfo.getDownloadManager(), fileInfo.getIndex(),
          complete_only, launch_already_checked, referal);
    }else{
   
      DownloadManager dm = DataSourceUtils.getDM(ds);
      if (dm == null) {
View Full Code Here

        sortValue = Long.MAX_VALUE - 10000 + percentDone;
      } else {
        sortValue = completedTime;
      }
    } else if (ds instanceof DiskManagerFileInfo) {
      DiskManagerFileInfo fileInfo = (DiskManagerFileInfo) ds;
      int st = fileInfo.getStorageType();
      if ((st == DiskManagerFileInfo.ST_COMPACT || st == DiskManagerFileInfo.ST_REORDER_COMPACT)
          && fileInfo.isSkipped()) {
        sortValue = 1;
      } else if (fileInfo.isSkipped()) {
        sortValue = 2;
      } else if (fileInfo.getPriority() > 0) {

        int pri = fileInfo.getPriority();
        sortValue = 4;

        if (pri > 1) {
          sortValue += pri;
        }
      } else {
        sortValue = 3;
      }
      sortValue = (fileInfo.getDownloadManager().getState() * 10000)
        + percentDone + sortValue;
    }

    long eta = getETA(cell);
    long speed = getSpeed(ds);
View Full Code Here

TOP

Related Classes of org.gudy.azureus2.core3.disk.DiskManagerFileInfo

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.