private void resetAndValidateRequest(DownloadRequest request) {
    // Reset download request
    request.setLength(0);
    request.setAvailableLength(0);
    request.setDownloadStatus(DownloadStatus.None);

    // Validate download request
    if (request.getDownloadPriority() == DownloadPriority.None) {
      throw new IllegalArgumentException("request.DownloadPriority");
    }
    if (request.getLocale() == null || request.getLocale().length() == 0) {
      throw new IllegalArgumentException("request.Locale");
    }
    if (request.getName() == null || request.getName().length() == 0) {
      throw new IllegalArgumentException("request.Name");
    }
    if (request.getOverridePermittedNetworkTypes() != null
        && request.getOverridePermittedNetworkTypes().contains(NetworkTypes.None)) {
      throw new IllegalArgumentException("request.OverridePermittedNetworkTypes");
    }
    if (request.getUrl() == null || request.getUrl().length() == 0) {
      throw new IllegalArgumentException("request.Url");
    }
    if (request.getFileName() == null || request.getFileName().length() == 0) {
      throw new IllegalArgumentException("request.FileName");
    }
    if (_downloadQueue.getDownloadRequest(request.getUrl()) != null) {
      throw new IllegalArgumentException(
          "A download request already exists with the specified request's URL.");
    }
  }
  /// <summary>
  /// Restarts download of the in-progress or completed item with the specified URL, beginning at
  // the specified byte offset.
  /// </summary>
  /// <param name="url"></param>
  /// <param name="byteOffset"></param>
  public void restart(String url, long byteOffset) {
    // Locals
    DownloadRequest downloadRequest;
    DownloadInformation downloadInformation;

    // Get download information
    downloadRequest = _downloadQueue.getDownloadRequest(url);
    if (downloadRequest == null) {
      downloadInformation = _completedDownloadCatalog.getDownloadInformation(url);
      if (downloadInformation == null) {
        return;
      }

      downloadRequest = new DownloadRequest();
      downloadRequest.setUrl(downloadInformation.getUrl());
      downloadRequest.setName(downloadInformation.getName());
      downloadRequest.setLocale(downloadInformation.getLocale());
      downloadRequest.setOverrideStorageLocation(downloadInformation.getStorageLocation());
      downloadRequest.setDownloadPriority(downloadInformation.getDownloadPriority());
      downloadRequest.setOverridePermittedNetworkTypes(
          downloadInformation.getPermittedNetworkTypes());

      if (byteOffset == OFFSET_ZERO) {
        delete(downloadInformation.getUrl());
      } else {
        downloadRequest.setAvailableLength(byteOffset);
      }
    } else {
      downloadRequest = new DownloadRequest();
      downloadRequest.setUrl(downloadRequest.getUrl());
      downloadRequest.setName(downloadRequest.getName());
      downloadRequest.setLocale(downloadRequest.getLocale());
      downloadRequest.setOverrideStorageLocation(downloadRequest.getOverrideStorageLocation());
      downloadRequest.setDownloadPriority(downloadRequest.getDownloadPriority());
      downloadRequest.setOverridePermittedNetworkTypes(
          downloadRequest.getOverridePermittedNetworkTypes());
    }

    // Restart download information
    _downloadQueue.add(downloadRequest, _defaultStorageLocation, _permittedNetworkTypes);
  }