#pragma once #include "AutoThread.h" #include "SQLiteCpp/Database.h" #include #include NS_BEGIN(Sia) NS_BEGIN(Api) class AFX_EXT_CLASS CUploadManager : public CAutoThread { public: enum class _UploadStatus : unsigned { NotFound, Copying, Queued, Modified, Uploading, Remove, Complete, Error }; enum class _UploadError { Success, SourceFileNotFound, DatabaseError }; private: typedef struct { std::uint64_t Id; String SiaPath; String FilePath; String TempPath; _UploadStatus Status; } UploadData; public: CUploadManager(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); public: virtual ~CUploadManager(); private: SQLite::Database _uploadDatabase; std::mutex _uploadMutex; CAutoThread _fileThread; std::mutex _fileQueueMutex; std::mutex _fileActionMutex; String _activeSiaPath; std::deque> _fileQueue; private: void FileAction(const CSiaCurl& siaCurl, const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath, const bool& remove); protected: virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override; void FileThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); public: static String UploadStatusToString(const _UploadStatus& uploadStatus); public: _UploadStatus GetUploadStatus(const String& siaPath); _UploadError AddOrUpdate(const String& siaPath, String filePath); _UploadError Remove(const String& siaPath); void PurgeCompleteStatus(); void PurgeErrorStatus(); }; typedef Sia::Api::CUploadManager::_UploadStatus UploadStatus; typedef Sia::Api::CUploadManager::_UploadError UploadError; // Event Notifications class CreatingTemporarySiaDriveFile : public CEvent { public: CreatingTemporarySiaDriveFile(const String& siaPath, const String& filePath, const String& tempSourcePath) : _siaPath(siaPath), _filePath(filePath), _tempSourcePath(tempSourcePath) { } public: virtual ~CreatingTemporarySiaDriveFile() { } private: const String _siaPath; const String _filePath; const String _tempSourcePath; public: virtual String GetSingleLineMessage() const override { return L"CreatingTemporarySiaDriveFile|SP|" + _siaPath + L"|FP|" + _filePath + L"|TSP|" + _tempSourcePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new CreatingTemporarySiaDriveFile(_siaPath, _filePath, _tempSourcePath)); } }; class UploadAddedToQueue : public CEvent { public: UploadAddedToQueue(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~UploadAddedToQueue() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"UploadAddedToQueue|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new UploadAddedToQueue(_siaPath, _filePath)); } }; class ModifiedUploadQueued : public CEvent { public: ModifiedUploadQueued(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~ModifiedUploadQueued() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"ModifiedUploadQueued|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new ModifiedUploadQueued(_siaPath, _filePath)); } }; class UploadToSiaStarted : public CEvent { public: UploadToSiaStarted(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~UploadToSiaStarted() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"UploadToSiaStarted|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new UploadToSiaStarted(_siaPath, _filePath)); } }; class UploadComplete : public CEvent { public: UploadComplete(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~UploadComplete() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"UploadComplete|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new UploadComplete(_siaPath, _filePath)); } }; class FileRemoved : public CEvent { public: FileRemoved(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~FileRemoved() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"FileRemoved|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new FileRemoved(_siaPath, _filePath)); } }; class UploadStatusSetToModified : public CEvent { public: UploadStatusSetToModified(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~UploadStatusSetToModified() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"UploadStatusSetToModified|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new UploadStatusSetToModified(_siaPath, _filePath)); } }; class UploadStatusSetToRemoved : public CEvent { public: UploadStatusSetToRemoved(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~UploadStatusSetToRemoved() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"UploadStatusSetToRemoved|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new UploadStatusSetToRemoved(_siaPath, _filePath)); } }; class FailedToDeleteFromSia : public CEvent { public: FailedToDeleteFromSia(const String& siaPath, const String& filePath, const SiaCurlError& curlError) : _siaPath(siaPath), _filePath(filePath), _curlError(curlError) { } public: virtual ~FailedToDeleteFromSia() { } private: const String _siaPath; const String _filePath; const SiaCurlError _curlError = SiaCurlError::Success; public: virtual String GetSingleLineMessage() const override { return L"FailedToDeleteFromSia|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new FailedToDeleteFromSia(_siaPath, _filePath, _curlError)); } }; class ModifyUploadStatusFailed : public CEvent { public: ModifyUploadStatusFailed(const String& siaPath, const String& filePath, const UploadStatus& uploadStatus, const String& errorMsg) : _siaPath(siaPath), _filePath(filePath), _uploadStatus(uploadStatus), _errorMsg(errorMsg) { } public: virtual ~ModifyUploadStatusFailed() { } private: const String _siaPath; const String _filePath; const UploadStatus _uploadStatus; const String _errorMsg; public: virtual String GetSingleLineMessage() const override { return L"ModifyUploadStatusFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|ST|" + CUploadManager::UploadStatusToString(_uploadStatus) + L"|MSG|" + _errorMsg; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new ModifyUploadStatusFailed(_siaPath, _filePath, _uploadStatus, _errorMsg)); } }; class CreatingTemporarySiaDriveFileFailed : public CEvent { public: CreatingTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath) : _siaPath(siaPath), _filePath(filePath), _tempSourcePath(tempSourcePath) { } public: virtual ~CreatingTemporarySiaDriveFileFailed() { } private: const String _siaPath; const String _filePath; const String _tempSourcePath; public: virtual String GetSingleLineMessage() const override { return L"CreatingTemporarySiaDriveFileFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|TSP|" + _tempSourcePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new CreatingTemporarySiaDriveFileFailed(_siaPath, _filePath, _tempSourcePath)); } }; class DeleteSiaDriveFileFailed : public CEvent { public: DeleteSiaDriveFileFailed(const String& siaPath, const String& filePath, const String& siaDriveFilePath) : _siaPath(siaPath), _filePath(filePath), _siaDriveFilePath(siaDriveFilePath) { } public: virtual ~DeleteSiaDriveFileFailed() { } private: const String _siaPath; const String _filePath; const String _siaDriveFilePath; public: virtual String GetSingleLineMessage() const override { return L"DeleteSiaDriveFileFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|SDP|" + _siaDriveFilePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new DeleteSiaDriveFileFailed(_siaPath, _filePath, _siaDriveFilePath)); } }; class DeleteTemporarySiaDriveFileFailed : public CEvent { public: DeleteTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath) : _siaPath(siaPath), _filePath(filePath), _tempSourcePath(tempSourcePath) { } public: virtual ~DeleteTemporarySiaDriveFileFailed() { } private: const String _siaPath; const String _filePath; const String _tempSourcePath; public: virtual String GetSingleLineMessage() const override { return L"DeleteTemporarySiaDriveFileFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|TSP|" + _tempSourcePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new DeleteTemporarySiaDriveFileFailed(_siaPath, _filePath, _tempSourcePath)); } }; class RenamingTemporarySiaDriveFile : public CEvent { public: RenamingTemporarySiaDriveFile(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath) : _siaPath(siaPath), _filePath(filePath), _tempSourcePath(tempSourcePath), _siaDriveFilePath(siaDriveFilePath) { } public: virtual ~RenamingTemporarySiaDriveFile() { } private: const String _siaPath; const String _filePath; const String _tempSourcePath; const String _siaDriveFilePath; public: virtual String GetSingleLineMessage() const override { return L"RenamingTemporarySiaDriveFile|SP|" + _siaPath + L"|FP|" + _filePath + L"|TSP|" + _tempSourcePath + L"|SDP|" + _siaDriveFilePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new RenamingTemporarySiaDriveFile(_siaPath, _filePath, _tempSourcePath, _siaDriveFilePath)); } }; class RenamingTemporarySiaDriveFileFailed : public CEvent { public: RenamingTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath) : _siaPath(siaPath), _filePath(filePath), _tempSourcePath(tempSourcePath), _siaDriveFilePath(siaDriveFilePath) { } public: virtual ~RenamingTemporarySiaDriveFileFailed() { } private: const String _siaPath; const String _filePath; const String _tempSourcePath; const String _siaDriveFilePath; public: virtual String GetSingleLineMessage() const override { return L"RenamingTemporarySiaDriveFileFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|TSP|" + _tempSourcePath + L"|SDP|" + _siaDriveFilePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new RenamingTemporarySiaDriveFileFailed(_siaPath, _filePath, _tempSourcePath, _siaDriveFilePath)); } }; class DatabaseInsertFailed : public CEvent { public: DatabaseInsertFailed(const String& siaPath, const String& filePath, const String& errorMessage) : _siaPath(siaPath), _filePath(filePath), _errorMessage(errorMessage) { } public: virtual ~DatabaseInsertFailed() { } private: const String _siaPath; const String _filePath; const String _errorMessage; public: virtual String GetSingleLineMessage() const override { return L"DatabaseInsertFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|MSG|" + _errorMessage; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new DatabaseInsertFailed(_siaPath, _filePath, _errorMessage)); } }; class DatabaseDeleteFailed : public CEvent { public: DatabaseDeleteFailed(const String& siaPath, const String& filePath, const String& errorMessage) : _siaPath(siaPath), _filePath(filePath), _errorMessage(errorMessage) { } public: virtual ~DatabaseDeleteFailed() { } private: const String _siaPath; const String _filePath; const String _errorMessage; public: virtual String GetSingleLineMessage() const override { return L"DatabaseDeleteFailed|SP|" + _siaPath + L"|FP|" + _filePath + L"|MSG|" + _errorMessage; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new DatabaseDeleteFailed(_siaPath, _filePath, _errorMessage)); } }; class RemoveFileFailed : public CEvent { public: RemoveFileFailed(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~RemoveFileFailed() { } private: const String _siaPath; const String _filePath; public: virtual String GetSingleLineMessage() const override { return L"RemoveFileFailed|SP|" + _siaPath + L"|FP|" + _filePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new RemoveFileFailed(_siaPath, _filePath)); } }; class ExistingUploadFound : public CEvent { public: ExistingUploadFound(const String& siaPath, const String& filePath, const UploadStatus& uploadStatus) : _siaPath(siaPath), _filePath(filePath), _uploadStatus(uploadStatus) { } public: virtual ~ExistingUploadFound() { } private: const String _siaPath; const String _filePath; const UploadStatus _uploadStatus; public: virtual String GetSingleLineMessage() const override { return L"ExistingUploadFound|SP|" + _siaPath + L"|FP|" + _filePath + L"|ST|" + CUploadManager::UploadStatusToString(_uploadStatus); } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new ExistingUploadFound(_siaPath, _filePath, _uploadStatus)); } }; class NewFileAdded : public CEvent { public: NewFileAdded(const String& siaPath, const String& filePath, const String& siaDriveFilePath) : _siaPath(siaPath), _filePath(filePath), _siaDriveFilePath(siaDriveFilePath) { } public: virtual ~NewFileAdded() { } private: const String _siaPath; const String _filePath; const String _siaDriveFilePath; public: virtual String GetSingleLineMessage() const override { return L"NewFileAdded|SP|" + _siaPath + L"|FP|" + _filePath + L"|SDP|" + _siaDriveFilePath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new NewFileAdded(_siaPath, _filePath, _siaDriveFilePath)); } }; class FileRemoveAdded : public CEvent { public: FileRemoveAdded(const String& siaPath) : _siaPath(siaPath) { } public: virtual ~FileRemoveAdded() { } private: const String _siaPath; public: virtual String GetSingleLineMessage() const override { return L"FileRemoveAdded|SP|" + _siaPath; } virtual std::shared_ptr Clone() const override { return std::shared_ptr(new FileRemoveAdded(_siaPath)); } }; class SourceFileNotFound : public CEvent { public: SourceFileNotFound(const String& siaPath, const String& filePath) : _siaPath(siaPath), _filePath(filePath) { } public: virtual ~SourceFileNotFound() { } private: const String _siaPath; const String _filePath; public: virtual std::shared_ptr Clone() const override { return std::shared_ptr(new SourceFileNotFound(_siaPath, _filePath)); } virtual String GetSingleLineMessage() const override { return L"SourceFileNotFound|SP|" + _siaPath + L"|FP|" + _filePath; } }; class DatabaseExceptionOccurred : public CEvent { public: DatabaseExceptionOccurred(const SQLite::Exception& exception) : _exception(exception) { } public: virtual ~DatabaseExceptionOccurred() { } private: const SQLite::Exception _exception; public: virtual std::shared_ptr Clone() const override { return std::shared_ptr(new DatabaseExceptionOccurred(_exception)); } virtual String GetSingleLineMessage() const override { return L"DatabaseExceptionOccurred|MSG|" + String(CA2W(_exception.getErrorStr()).m_psz); } }; NS_END(2)