From 9522c2d17cfe2c116b5c75246d791596fc364052 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 11 Mar 2016 11:04:34 -0800 Subject: [PATCH] add file open and write error handling --- .../src/assets/UploadAssetTask.cpp | 21 ++++++++++++++----- libraries/networking/src/AssetUpload.cpp | 5 +++++ libraries/networking/src/AssetUpload.h | 3 ++- libraries/networking/src/AssetUtils.h | 3 ++- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/assets/UploadAssetTask.cpp b/assignment-client/src/assets/UploadAssetTask.cpp index 0856a29e1f..e850f29991 100644 --- a/assignment-client/src/assets/UploadAssetTask.cpp +++ b/assignment-client/src/assets/UploadAssetTask.cpp @@ -61,13 +61,24 @@ void UploadAssetTask::run() { if (file.exists()) { qDebug() << "[WARNING] This file already exists: " << hexHash; - } else { - file.open(QIODevice::WriteOnly); - file.write(fileData); + + replyPacket->writePrimitive(AssetServerError::NoError); + replyPacket->write(hash); + } else if (file.open(QIODevice::WriteOnly) && file.write(fileData) == qint64(fileSize)) { file.close(); + + replyPacket->writePrimitive(AssetServerError::NoError); + replyPacket->write(hash); + } else { + // upload has failed - remove the file and return an error + auto removed = file.remove(); + + if (!removed) { + qWarning() << "Removal of failed upload file" << hash << "failed."; + } + + replyPacket->writePrimitive(AssetServerError::FileOperationFailed); } - replyPacket->writePrimitive(AssetServerError::NoError); - replyPacket->write(hash); } auto nodeList = DependencyManager::get(); diff --git a/libraries/networking/src/AssetUpload.cpp b/libraries/networking/src/AssetUpload.cpp index 2840f6777c..44b7e9b681 100644 --- a/libraries/networking/src/AssetUpload.cpp +++ b/libraries/networking/src/AssetUpload.cpp @@ -42,6 +42,8 @@ QString AssetUpload::getErrorString() const { return "The file could not be opened. Please check your permissions and try again."; case AssetUpload::NetworkError: return "There was a problem reaching your Asset Server. Please check your network connectivity."; + case AssetUpload::ServerFileError: + return "The Asset Server failed to store the asset. Please try again."; default: // not handled, do not show a message box return QString(); @@ -90,6 +92,9 @@ void AssetUpload::start() { case AssetServerError::PermissionDenied: _error = PermissionDenied; break; + case AssetServerError::FileOperationFailed: + _error = ServerFileError; + break; default: _error = FileOpenError; break; diff --git a/libraries/networking/src/AssetUpload.h b/libraries/networking/src/AssetUpload.h index 656c1a281e..82328ef2eb 100644 --- a/libraries/networking/src/AssetUpload.h +++ b/libraries/networking/src/AssetUpload.h @@ -32,7 +32,8 @@ public: Timeout, TooLarge, PermissionDenied, - FileOpenError + FileOpenError, + ServerFileError }; static const QString PERMISSION_DENIED_ERROR; diff --git a/libraries/networking/src/AssetUtils.h b/libraries/networking/src/AssetUtils.h index ac3d819ae2..3a663af420 100644 --- a/libraries/networking/src/AssetUtils.h +++ b/libraries/networking/src/AssetUtils.h @@ -40,7 +40,8 @@ enum AssetServerError : uint8_t { InvalidByteRange, AssetTooLarge, PermissionDenied, - MappingOperationFailed + MappingOperationFailed, + FileOperationFailed }; enum AssetMappingOperationType : uint8_t {