Пример #1
0
  private void update(final MessageSnapshot snapshot) {
    setStatus(snapshot.getStatus());
    this.isLargeFile = snapshot.isLargeFile();

    switch (snapshot.getStatus()) {
      case FileDownloadStatus.pending:
        this.soFarBytes = snapshot.getLargeSofarBytes();
        this.totalBytes = snapshot.getLargeTotalBytes();

        // notify
        getMessenger().notifyPending(snapshot);
        break;
      case FileDownloadStatus.started:
        // notify
        getMessenger().notifyStarted(snapshot);
        break;
      case FileDownloadStatus.connected:
        this.totalBytes = snapshot.getLargeTotalBytes();
        this.resuming = snapshot.isResuming();
        this.etag = snapshot.getEtag();

        markStartDownload();

        // notify
        getMessenger().notifyConnected(snapshot);
        break;
      case FileDownloadStatus.progress:
        this.soFarBytes = snapshot.getLargeSofarBytes();
        calcSpeed(snapshot.getLargeSofarBytes());

        // notify
        getMessenger().notifyProgress(snapshot);
        break;
        //            case FileDownloadStatus.blockComplete:
        /** Handled by {@link FileDownloadList#removeByCompleted(BaseDownloadTask)} */
        //                break;
      case FileDownloadStatus.retry:
        this.soFarBytes = snapshot.getLargeSofarBytes();
        this.ex = snapshot.getThrowable();
        _setRetryingTimes(snapshot.getRetryingTimes());

        resetSpeed();
        // notify
        getMessenger().notifyRetry(snapshot);
        break;
      case FileDownloadStatus.error:
        this.ex = snapshot.getThrowable();
        this.soFarBytes = snapshot.getLargeSofarBytes();

        calcAverageSpeed(this.soFarBytes);
        // to FileDownloadList
        FileDownloadList.getImpl().remove(this, snapshot);

        break;
      case FileDownloadStatus.paused:
        /** Handled by {@link #pause()} */
        break;
      case FileDownloadStatus.completed:
        this.isReusedOldFile = snapshot.isReusedDownloadedFile();
        if (snapshot.isReusedDownloadedFile()) {
          this.etag = snapshot.getEtag();
        }
        // only carry total data back
        this.soFarBytes = snapshot.getLargeTotalBytes();
        this.totalBytes = snapshot.getLargeTotalBytes();

        calcAverageSpeed(this.soFarBytes);
        // to FileDownloadList
        FileDownloadList.getImpl().remove(this, snapshot);

        break;
      case FileDownloadStatus.warn:
        resetSpeed();
        final int count = FileDownloadList.getImpl().count(getId());
        if (count <= 1) {
          // 1. this progress kill by sys and relive,
          // for add at least one listener
          // or 2. pre downloading task has already completed/error/paused
          // request status
          final int currentStatus = _getStatusFromServer(downloadId);
          FileDownloadLog.w(
              this,
              "warn, but no listener to receive progress, " + "switch to pending %d %d",
              getId(),
              currentStatus);

          //noinspection StatementWithEmptyBody
          if (FileDownloadStatus.isIng(currentStatus)) {
            // ing, has callbacks
            // keep and wait callback

            setStatus(FileDownloadStatus.pending);
            this.totalBytes = snapshot.getLargeTotalBytes();
            this.soFarBytes = snapshot.getLargeSofarBytes();

            markStartDownload();

            ((MessageSnapshot.IWarnMessageSnapshot) snapshot).turnToPending();
            getMessenger().notifyPending(snapshot);
            break;
          } else {
            // already over and no callback
          }
        }

        // to FileDownloadList
        FileDownloadList.getImpl().remove(this, snapshot);
        break;
    }
  }