Model::PutObjectOutcome S3UploadManager::UploadFiles()

in s3_common/src/s3_upload_manager.cpp [56:97]


Model::PutObjectOutcome S3UploadManager::UploadFiles(
    const std::vector<UploadDescription> & upload_descriptions,
    const std::string & bucket,
    const boost::function<void (const std::vector<UploadDescription>&)>& feedback_callback)
{
  {
    std::lock_guard<std::recursive_mutex> lock(mutex_);
    if (!IsAvailable()) {
      return Model::PutObjectOutcome(Aws::Client::AWSError<S3Errors>(S3Errors::INVALID_ACTION,
                     "INVALID_ACTION", "UploadFiles aborted. UploadFiles request already active.", false));
    }
    manager_status_ = S3UploadManagerState::UPLOADING;
  }
  std::vector<UploadDescription> completed_uploads;
  // If no files were provided then upload was successful.
  Model::PutObjectResult default_result;
  Model::PutObjectOutcome upload_outcome(default_result);
  std::vector<UploadDescription> uploaded_files;
  for (const auto& upload_description: upload_descriptions) {
    {
      std::lock_guard<std::recursive_mutex> lock(mutex_);
      if(manager_status_ == S3UploadManagerState::CANCELLING) {
        break;
      }
    }
    auto file_path = upload_description.file_path;
    auto object_key = upload_description.object_key;
    //bucket comes from config
    AWS_LOGSTREAM_INFO(__func__,"Uploading file " << file_path << " to " << object_key);
    upload_outcome = s3_facade_->PutObject(file_path, bucket, object_key);
    if (!upload_outcome.IsSuccess()) {
      break;
    }
    completed_uploads.push_back(upload_description);
    feedback_callback(completed_uploads);
  }
  {
    std::lock_guard<std::recursive_mutex> lock(mutex_);
    manager_status_ = S3UploadManagerState::AVAILABLE;
  }
  return upload_outcome;
}