in s3_file_uploader/include/s3_file_uploader/s3_file_uploader_action_server_handler.h [45:95]
static void UploadToS3(S3UploadManager& upload_manager, const std::string& bucket, T& goal_handle)
{
if (!upload_manager.IsAvailable()) {
goal_handle.setRejected();
return;
}
goal_handle.setAccepted();
auto goal = goal_handle.getGoal();
std::vector<UploadDescription> uploads(goal->files.size());
for (size_t i=0; i<goal->files.size(); i++) {
uploads.at(i) = {
goal->files[i],
GenerateObjectKey(goal->files[i], goal->upload_location)
};
}
std::vector<UploadDescription> completed_uploads;
auto feedback_callback = [&](const std::vector<UploadDescription>& uploaded_files) {
completed_uploads = uploaded_files;
file_uploader_msgs::UploadFilesFeedback feedback;
feedback.num_remaining = uploads.size() - uploaded_files.size();
feedback.num_uploaded = uploaded_files.size();
goal_handle.publishFeedback(feedback);
};
auto outcome = upload_manager.UploadFiles(
uploads, bucket, feedback_callback);
file_uploader_msgs::UploadFilesResult result;
if (outcome.IsSuccess()) {
result.result_code.success = static_cast<uint8_t>(true);
result.result_code.error_code = std::numeric_limits<int16_t>::lowest();
} else {
result.result_code.success = static_cast<uint8_t>(false);
result.result_code.error_code = static_cast<int16_t>(outcome.GetError().GetErrorType());
}
for (auto const& upload : completed_uploads) {
result.files_uploaded.push_back(upload.object_key);
}
if (actionlib_msgs::GoalStatus::PREEMPTING == goal_handle.getGoalStatus().status) {
// Goal cancel has been requested
goal_handle.setCanceled(result, "");
return;
}
if (!outcome.IsSuccess()) {
std::stringstream ss;
ss << "Goal was aborted due to error uploading files. Error Message: " << outcome.GetError().GetMessage();
goal_handle.setAborted(result, ss.str());
} else {
goal_handle.setSucceeded(result, "");
}
}