Event system and debug consumer added
This commit is contained in:
18
SiaDrive.Api/DebugConsumer.cpp
Normal file
18
SiaDrive.Api/DebugConsumer.cpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "DebugConsumer.h"
|
||||||
|
|
||||||
|
using namespace Sia::Api;
|
||||||
|
|
||||||
|
CDebugConsumer::CDebugConsumer()
|
||||||
|
{
|
||||||
|
CEventSystem::EventSystem.AddEventConsumer([this](const CEvent& event) { this->ProcessEvent(event); });
|
||||||
|
}
|
||||||
|
|
||||||
|
CDebugConsumer::~CDebugConsumer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebugConsumer::ProcessEvent(const CEvent& eventData)
|
||||||
|
{
|
||||||
|
OutputDebugString(eventData.GetSingleLineMessage().c_str());
|
||||||
|
}
|
20
SiaDrive.Api/DebugConsumer.h
Normal file
20
SiaDrive.Api/DebugConsumer.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <SiaCommon.h>
|
||||||
|
#include <EventSystem.h>
|
||||||
|
|
||||||
|
NS_BEGIN(Sia)
|
||||||
|
NS_BEGIN(Api)
|
||||||
|
|
||||||
|
class AFX_EXT_CLASS CDebugConsumer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CDebugConsumer();
|
||||||
|
|
||||||
|
public:
|
||||||
|
~CDebugConsumer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ProcessEvent(const CEvent& eventData);
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_END(2);
|
@@ -5,15 +5,77 @@ using namespace Sia::Api;
|
|||||||
|
|
||||||
CEventSystem CEventSystem::EventSystem;
|
CEventSystem CEventSystem::EventSystem;
|
||||||
|
|
||||||
CEventSystem::CEventSystem()
|
CEventSystem::CEventSystem() :
|
||||||
|
_stopEvent(INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CEventSystem::~CEventSystem()
|
CEventSystem::~CEventSystem()
|
||||||
{
|
{
|
||||||
|
Stop();
|
||||||
|
::CloseHandle(_stopEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEventSystem::NotifyEvent(const CEvent& eventData)
|
void CEventSystem::ProcessEvents()
|
||||||
{
|
{
|
||||||
|
while (::WaitForSingleObject(_stopEvent, 10) == WAIT_TIMEOUT)
|
||||||
|
{
|
||||||
|
CEventPtr eventData;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> l(_eventMutex);
|
||||||
|
if (_eventQueue.size())
|
||||||
|
{
|
||||||
|
eventData = _eventQueue.front();
|
||||||
|
_eventQueue.pop_front();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eventData.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventData)
|
||||||
|
{
|
||||||
|
for (auto& v : _eventConsumers)
|
||||||
|
{
|
||||||
|
v(*eventData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (eventData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CEventSystem::NotifyEvent(CEventPtr eventData)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> l(_eventMutex);
|
||||||
|
_eventQueue.push_back(eventData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEventSystem::AddEventConsumer(std::function<void(const CEvent&)> consumer)
|
||||||
|
{
|
||||||
|
if (!_processThread)
|
||||||
|
{
|
||||||
|
_eventConsumers.push_back(consumer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEventSystem::Start()
|
||||||
|
{
|
||||||
|
if (!_processThread)
|
||||||
|
{
|
||||||
|
_stopEvent = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
||||||
|
_processThread.reset(new std::thread([this]() {ProcessEvents(); }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEventSystem::Stop()
|
||||||
|
{
|
||||||
|
if (_processThread)
|
||||||
|
{
|
||||||
|
::SetEvent(_stopEvent);
|
||||||
|
_processThread->join();
|
||||||
|
_processThread.reset();
|
||||||
|
}
|
||||||
|
}
|
@@ -6,9 +6,18 @@ NS_BEGIN(Api)
|
|||||||
|
|
||||||
class AFX_EXT_CLASS CEvent
|
class AFX_EXT_CLASS CEvent
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
virtual ~CEvent() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual String GetSingleLineMessage() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::shared_ptr<CEvent> CEventPtr;
|
||||||
|
|
||||||
|
#define CreateSystemEvent(E) CEventPtr(new E)
|
||||||
|
#define CreateSystemEventConsumer(E) [=](const CEvent&) -> void { E(e); }
|
||||||
|
|
||||||
// Singleton
|
// Singleton
|
||||||
class AFX_EXT_CLASS CEventSystem
|
class AFX_EXT_CLASS CEventSystem
|
||||||
{
|
{
|
||||||
@@ -25,10 +34,23 @@ public:
|
|||||||
CEventSystem& operator=(CEventSystem&&) = delete;
|
CEventSystem& operator=(CEventSystem&&) = delete;
|
||||||
CEventSystem& operator=(const CEventSystem&) = delete;
|
CEventSystem& operator=(const CEventSystem&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE _stopEvent;
|
||||||
|
std::deque<CEventPtr> _eventQueue;
|
||||||
|
std::deque<std::function<void(const CEvent&)>> _eventConsumers;
|
||||||
|
std::mutex _eventMutex;
|
||||||
|
std::unique_ptr<std::thread> _processThread;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static CEventSystem EventSystem;
|
static CEventSystem EventSystem;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ProcessEvents();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void NotifyEvent(const CEvent& eventData);
|
void AddEventConsumer(std::function<void(const CEvent&)> consumer);
|
||||||
|
void NotifyEvent(CEventPtr eventData);
|
||||||
|
void Start();
|
||||||
|
void Stop();
|
||||||
};
|
};
|
||||||
NS_END(2)
|
NS_END(2)
|
||||||
|
@@ -190,6 +190,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="AutoThread.cpp" />
|
<ClCompile Include="AutoThread.cpp" />
|
||||||
|
<ClCompile Include="DebugConsumer.cpp" />
|
||||||
<ClCompile Include="dllmain.cpp">
|
<ClCompile Include="dllmain.cpp">
|
||||||
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
|
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
@@ -229,6 +230,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="AutoThread.h" />
|
<ClInclude Include="AutoThread.h" />
|
||||||
|
<ClInclude Include="DebugConsumer.h" />
|
||||||
<ClInclude Include="EventSystem.h" />
|
<ClInclude Include="EventSystem.h" />
|
||||||
<ClInclude Include="json.hpp" />
|
<ClInclude Include="json.hpp" />
|
||||||
<ClInclude Include="Resource.h" />
|
<ClInclude Include="Resource.h" />
|
||||||
|
@@ -63,6 +63,9 @@
|
|||||||
<ClCompile Include="EventSystem.cpp">
|
<ClCompile Include="EventSystem.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="DebugConsumer.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="SiaDrive.Api.def">
|
<None Include="SiaDrive.Api.def">
|
||||||
@@ -106,6 +109,9 @@
|
|||||||
<ClInclude Include="EventSystem.h">
|
<ClInclude Include="EventSystem.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="DebugConsumer.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="SiaDrive.Api.rc">
|
<ResourceCompile Include="SiaDrive.Api.rc">
|
||||||
|
@@ -31,6 +31,36 @@ static void CreateTableIfNotFound(SQLite::Database* database, const String& tabl
|
|||||||
database->exec(CW2A(sqlCreate.c_str()));
|
database->exec(CW2A(sqlCreate.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String CUploadManager::UploadStatusToString(const UploadStatus& uploadStatus)
|
||||||
|
{
|
||||||
|
switch (uploadStatus)
|
||||||
|
{
|
||||||
|
case UploadStatus::Complete:
|
||||||
|
return L"Complete";
|
||||||
|
|
||||||
|
case UploadStatus::Copying:
|
||||||
|
return L"Copying";
|
||||||
|
|
||||||
|
case UploadStatus::Error:
|
||||||
|
return L"Error";
|
||||||
|
|
||||||
|
case UploadStatus::Modified:
|
||||||
|
return L"Modified";
|
||||||
|
|
||||||
|
case UploadStatus::NotFound:
|
||||||
|
return L"Not Found";
|
||||||
|
|
||||||
|
case UploadStatus::Queued:
|
||||||
|
return L"Queued";
|
||||||
|
|
||||||
|
case UploadStatus::Uploading:
|
||||||
|
return L"Uploading";
|
||||||
|
|
||||||
|
default:
|
||||||
|
return L"!!Not Defined!!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CUploadManager::CUploadManager(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) :
|
CUploadManager::CUploadManager(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) :
|
||||||
CAutoThread(siaCurl, siaDriveConfig),
|
CAutoThread(siaCurl, siaDriveConfig),
|
||||||
_uploadDatabase(siaDriveConfig->GetRenter_UploadDbFilePath(), SQLite::OPEN_CREATE | SQLite::OPEN_READWRITE),
|
_uploadDatabase(siaDriveConfig->GetRenter_UploadDbFilePath(), SQLite::OPEN_CREATE | SQLite::OPEN_READWRITE),
|
||||||
@@ -50,33 +80,33 @@ CUploadManager::~CUploadManager()
|
|||||||
|
|
||||||
void CUploadManager::FileUploadAction(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath)
|
void CUploadManager::FileUploadAction(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath)
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(CreatingTemporarySiaDriveFile(siaPath, filePath, tempSourcePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(CreatingTemporarySiaDriveFile(siaPath, filePath, tempSourcePath)));
|
||||||
if (RetryableAction(::CopyFile(filePath.c_str(), tempSourcePath.c_str(), FALSE), DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY_MS))
|
if (RetryableAction(::CopyFile(filePath.c_str(), tempSourcePath.c_str(), FALSE), DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY_MS))
|
||||||
{
|
{
|
||||||
// Delete existing '.siadrive' file, if found
|
// Delete existing '.siadrive' file, if found
|
||||||
// !!Should never come here. If so, there was a problem with startup clean-up
|
// !!Should never come here. If so, there was a problem with startup clean-up
|
||||||
if (!RetryDeleteFileIfExists(siaDriveFilePath))
|
if (!RetryDeleteFileIfExists(siaDriveFilePath))
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(DeleteSiaDriveFileFailed(siaPath, filePath, siaDriveFilePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(DeleteSiaDriveFileFailed(siaPath, filePath, siaDriveFilePath)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rename '.siadrive.temp' to '.siadrive'
|
// Rename '.siadrive.temp' to '.siadrive'
|
||||||
CEventSystem::EventSystem.NotifyEvent(RenamingTemporarySiaDriveFile(siaPath, filePath, tempSourcePath, siaDriveFilePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(RenamingTemporarySiaDriveFile(siaPath, filePath, tempSourcePath, siaDriveFilePath)));
|
||||||
if (RetryableAction(::MoveFile(tempSourcePath.c_str(), siaDriveFilePath.c_str()), DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY_MS))
|
if (RetryableAction(::MoveFile(tempSourcePath.c_str(), siaDriveFilePath.c_str()), DEFAULT_RETRY_COUNT, DEFAULT_RETRY_DELAY_MS))
|
||||||
{
|
{
|
||||||
// TODO Change status to 'Queued'
|
// TODO Change status to 'Queued'
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(RenamingTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath, siaDriveFilePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(RenamingTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath, siaDriveFilePath)));
|
||||||
if (!RetryDeleteFileIfExists(tempSourcePath))
|
if (!RetryDeleteFileIfExists(tempSourcePath))
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(DeleteTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(DeleteTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RetryDeleteFileIfExists(siaDriveFilePath))
|
if (!RetryDeleteFileIfExists(siaDriveFilePath))
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(DeleteSiaDriveFileFailed(siaPath, filePath, siaDriveFilePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(DeleteSiaDriveFileFailed(siaPath, filePath, siaDriveFilePath)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requeue
|
// Requeue
|
||||||
@@ -85,13 +115,13 @@ void CUploadManager::FileUploadAction(const String& siaPath, const String& fileP
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(CreatingTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(CreatingTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath)));
|
||||||
|
|
||||||
// If temp copy fails, try to delete
|
// If temp copy fails, try to delete
|
||||||
// If partial copy and file is unable to be deleted, log warning
|
// If partial copy and file is unable to be deleted, log warning
|
||||||
if (!RetryDeleteFileIfExists(tempSourcePath))
|
if (!RetryDeleteFileIfExists(tempSourcePath))
|
||||||
{
|
{
|
||||||
CEventSystem::EventSystem.NotifyEvent(DeleteTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath));
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(DeleteTemporarySiaDriveFileFailed(siaPath, filePath, tempSourcePath)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requeue
|
// Requeue
|
||||||
@@ -247,6 +277,7 @@ UploadStatus CUploadManager::GetUploadStatus(const String& siaPath)
|
|||||||
UploadError CUploadManager::AddOrUpdate(const String& siaPath, String filePath)
|
UploadError CUploadManager::AddOrUpdate(const String& siaPath, String filePath)
|
||||||
{
|
{
|
||||||
UploadError ret = UploadError::Success;
|
UploadError ret = UploadError::Success;
|
||||||
|
|
||||||
// Relative to absolute and grab parent folder of source
|
// Relative to absolute and grab parent folder of source
|
||||||
String rootPath;
|
String rootPath;
|
||||||
{
|
{
|
||||||
@@ -262,50 +293,57 @@ UploadError CUploadManager::AddOrUpdate(const String& siaPath, String filePath)
|
|||||||
rootPath = temp;
|
rootPath = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lock here - if file is modified again before a prior upload is complete, delete it and
|
if (::PathFileExists(filePath.c_str()))
|
||||||
// start again later
|
|
||||||
std::lock_guard<std::mutex> l(_uploadMutex);
|
|
||||||
|
|
||||||
SQLite::Statement query(_uploadDatabase, QUERY_UPLOADS_BY_SIA_PATH_AND_2_STATUS);
|
|
||||||
query.bind("@sia_path", CW2A(siaPath.c_str()).m_psz);
|
|
||||||
query.bind("@status1", static_cast<unsigned>(UploadStatus::Uploading));
|
|
||||||
query.bind("@status2", static_cast<unsigned>(UploadStatus::Modified));
|
|
||||||
// Check copying
|
|
||||||
if (query.executeStep())
|
|
||||||
{
|
{
|
||||||
UploadStatus uploadStatus = static_cast<UploadStatus>(static_cast<unsigned>(query.getColumn(2)));
|
// Lock here - if file is modified again before a prior upload is complete, delete it and
|
||||||
CEventSystem::EventSystem.NotifyEvent(ExistingUploadFound(siaPath, filePath, uploadStatus));
|
// start again later
|
||||||
if (uploadStatus == UploadStatus::Uploading)
|
std::lock_guard<std::mutex> l(_uploadMutex);
|
||||||
|
|
||||||
|
SQLite::Statement query(_uploadDatabase, QUERY_UPLOADS_BY_SIA_PATH_AND_2_STATUS);
|
||||||
|
query.bind("@sia_path", CW2A(siaPath.c_str()).m_psz);
|
||||||
|
query.bind("@status1", static_cast<unsigned>(UploadStatus::Uploading));
|
||||||
|
query.bind("@status2", static_cast<unsigned>(UploadStatus::Modified));
|
||||||
|
// Check copying
|
||||||
|
if (query.executeStep())
|
||||||
{
|
{
|
||||||
// set to modified
|
UploadStatus uploadStatus = static_cast<UploadStatus>(static_cast<unsigned>(query.getColumn(2)));
|
||||||
// update file path
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(ExistingUploadFound(siaPath, filePath, uploadStatus)));
|
||||||
|
if (uploadStatus == UploadStatus::Uploading)
|
||||||
|
{
|
||||||
|
// set to modified
|
||||||
|
// update file path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Strip drive specification (i.e. C:\)
|
||||||
|
// TODO If mount to drive is ever enabled, this will need to change
|
||||||
|
String siaDriveFileName = GenerateSha256(&filePath[3]) + L".siadrive";
|
||||||
|
|
||||||
|
String siaDriveFilePath;
|
||||||
|
siaDriveFilePath.resize(MAX_PATH + 1);
|
||||||
|
PathCombine(&siaDriveFilePath[0], rootPath.c_str(), siaDriveFileName.c_str());
|
||||||
|
|
||||||
|
String tempSourcePath;
|
||||||
|
tempSourcePath.resize(MAX_PATH + 1);
|
||||||
|
PathCombine(&tempSourcePath[0], rootPath.c_str(), (siaDriveFileName + L".temp").c_str());
|
||||||
|
|
||||||
|
// Add to db
|
||||||
|
/*SQLite::Statement addOrUpdate(_uploadDatabase, ADD_UPDATE_UPLOAD);
|
||||||
|
addOrUpdate.bind("@sia_path", CW2A(siaPath.c_str()).m_psz);
|
||||||
|
addOrUpdate.bind("@file_path", CW2A(filePath.c_str()).m_psz);
|
||||||
|
addOrUpdate.bind("@siadrive_path", CW2A(siaDriveFilePath.c_str()).m_psz);
|
||||||
|
addOrUpdate.bind("@status", static_cast<unsigned>(UploadStatus::Copying));*/
|
||||||
|
|
||||||
|
// Queue file upload operation
|
||||||
|
std::lock_guard<std::mutex> l2(_fileQueueMutex);
|
||||||
|
_fileQueue.push_back([=]() { this->FileUploadAction(siaPath, filePath, tempSourcePath, siaDriveFilePath); });
|
||||||
|
CEventSystem::EventSystem.NotifyEvent(CreateSystemEvent(NewUploadAdded(siaPath, filePath, siaDriveFilePath)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Strip drive specification (i.e. C:\)
|
ret = UploadError::SourceFileNotFound;
|
||||||
// TODO If mount to drive is ever enabled, this will need to change
|
|
||||||
String siaDriveFileName = GenerateSha256(&filePath[3]) + L".siadrive";
|
|
||||||
|
|
||||||
String siaDriveFilePath;
|
|
||||||
siaDriveFilePath.resize(MAX_PATH + 1);
|
|
||||||
PathCombine(&siaDriveFilePath[0], rootPath.c_str(), siaDriveFileName.c_str());
|
|
||||||
|
|
||||||
String tempSourcePath;
|
|
||||||
tempSourcePath.resize(MAX_PATH + 1);
|
|
||||||
PathCombine(&tempSourcePath[0], rootPath.c_str(), (siaDriveFileName + L".temp").c_str());
|
|
||||||
|
|
||||||
// Add to db
|
|
||||||
/*SQLite::Statement addOrUpdate(_uploadDatabase, ADD_UPDATE_UPLOAD);
|
|
||||||
addOrUpdate.bind("@sia_path", CW2A(siaPath.c_str()).m_psz);
|
|
||||||
addOrUpdate.bind("@file_path", CW2A(filePath.c_str()).m_psz);
|
|
||||||
addOrUpdate.bind("@siadrive_path", CW2A(siaDriveFilePath.c_str()).m_psz);
|
|
||||||
addOrUpdate.bind("@status", static_cast<unsigned>(UploadStatus::Copying));*/
|
|
||||||
|
|
||||||
// Queue file upload operation
|
|
||||||
std::lock_guard<std::mutex> l2(_fileQueueMutex);
|
|
||||||
_fileQueue.push_back([=]() { this->FileUploadAction(siaPath, filePath, tempSourcePath, siaDriveFilePath); });
|
|
||||||
CEventSystem::EventSystem.NotifyEvent(NewUploadAdded(siaPath, filePath, siaDriveFilePath));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -24,7 +24,8 @@ public:
|
|||||||
|
|
||||||
enum class _UploadError
|
enum class _UploadError
|
||||||
{
|
{
|
||||||
Success
|
Success,
|
||||||
|
SourceFileNotFound
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -58,6 +59,9 @@ protected:
|
|||||||
virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override;
|
virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override;
|
||||||
void FileThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig);
|
void FileThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static String UploadStatusToString(const _UploadStatus& uploadStatus);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
_UploadStatus GetUploadStatus(const String& siaPath);
|
_UploadStatus GetUploadStatus(const String& siaPath);
|
||||||
_UploadError AddOrUpdate(const String& siaPath, String filePath);
|
_UploadError AddOrUpdate(const String& siaPath, String filePath);
|
||||||
@@ -74,8 +78,28 @@ class CreatingTemporarySiaDriveFile :
|
|||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CreatingTemporarySiaDriveFile(const String& siaPath, const String& filePath, const String& tempSourcePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tTSP|" + _tempSourcePath;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -83,70 +107,207 @@ class CreatingTemporarySiaDriveFileFailed :
|
|||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CreatingTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tTSP|" + _tempSourcePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class DeleteSiaDriveFileFailed :
|
class DeleteSiaDriveFileFailed :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DeleteSiaDriveFileFailed(const String& siaPath, const String& filePath, const String& siaDriveFilePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tSDP|" + _siaDriveFilePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class DeleteTemporarySiaDriveFileFailed :
|
class DeleteTemporarySiaDriveFileFailed :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DeleteTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tTSP|" + _tempSourcePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenamingTemporarySiaDriveFile :
|
class RenamingTemporarySiaDriveFile :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenamingTemporarySiaDriveFile(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tTSP|" + _tempSourcePath + L"\n\tSDP|" + _siaDriveFilePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenamingTemporarySiaDriveFileFailed :
|
class RenamingTemporarySiaDriveFileFailed :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenamingTemporarySiaDriveFileFailed(const String& siaPath, const String& filePath, const String& tempSourcePath, const String& siaDriveFilePath)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tTSP|" + _tempSourcePath + L"\n\tSDP|" + _siaDriveFilePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ExistingUploadFound :
|
class ExistingUploadFound :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ExistingUploadFound(const String& siaPath, const String& filePath, const UploadStatus& uploadStatus)
|
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\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tST|" + CUploadManager::UploadStatusToString(_uploadStatus);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class NewUploadAdded :
|
class NewUploadAdded :
|
||||||
public CEvent
|
public CEvent
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NewUploadAdded(const String& siaPath, const String& filePath, const String& siaDriveFilePath)
|
NewUploadAdded(const String& siaPath, const String& filePath, const String& siaDriveFilePath) :
|
||||||
|
_siaPath(siaPath),
|
||||||
|
_filePath(filePath),
|
||||||
|
_siaDriveFilePath(siaDriveFilePath)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~NewUploadAdded()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const String _siaPath;
|
||||||
|
const String _filePath;
|
||||||
|
const String _siaDriveFilePath;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual String GetSingleLineMessage() const override
|
||||||
|
{
|
||||||
|
return L"NewUploadAdded\n\tSP|" + _siaPath + L"\n\tFP|" + _filePath + L"\n\tSDP|" + _siaDriveFilePath;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_END(2)
|
NS_END(2)
|
@@ -38,4 +38,6 @@
|
|||||||
|
|
||||||
#include <afxsock.h> // MFC socket extensions
|
#include <afxsock.h> // MFC socket extensions
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <deque>
|
||||||
|
#include <mutex>
|
@@ -734,8 +734,7 @@ Global
|
|||||||
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x64.Build.0 = Release|x64
|
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x64.Build.0 = Release|x64
|
||||||
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
|
||||||
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
{B3DF927F-A1CE-4F50-A621-A4C3A06E4F8A}.RelWithDebInfo|x86.Build.0 = Release|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x64.ActiveCfg = Debug|x64
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x86.ActiveCfg = Debug|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x86.Build.0 = Debug|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = Release|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = Release|Win32
|
||||||
@@ -859,8 +858,7 @@ Global
|
|||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Win32
|
||||||
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Win32
|
{BE7EE71D-6608-36DD-9687-D84AAE20C0A3}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Win32
|
||||||
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x64.ActiveCfg = Debug|x64
|
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x86.ActiveCfg = Debug|Win32
|
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x86.Build.0 = Debug|Win32
|
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.Debug|x86.Build.0 = Debug|Win32
|
||||||
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = Release|Win32
|
{92EF9CAE-3F0C-31D5-9556-62586CC5072D}.DLL Debug - DLL OpenSSL - DLL LibSSH2|x64.ActiveCfg = Release|Win32
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
#include "MockSiad.h"
|
#include "MockSiad.h"
|
||||||
#include "SiaDriveConfig.h"
|
#include "SiaDriveConfig.h"
|
||||||
#include "UnitTestConfig.h"
|
#include "UnitTestConfig.h"
|
||||||
|
#include <DebugConsumer.h>
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||||
using namespace Sia::Api;
|
using namespace Sia::Api;
|
||||||
@@ -16,8 +17,14 @@ namespace UnitTests
|
|||||||
private:
|
private:
|
||||||
const SiaHostConfig hostConfig = { TEST_SERVER_AND_PORT, TEST_SERVER_VERSION };
|
const SiaHostConfig hostConfig = { TEST_SERVER_AND_PORT, TEST_SERVER_VERSION };
|
||||||
static std::unique_ptr<CMockSiad> siad;
|
static std::unique_ptr<CMockSiad> siad;
|
||||||
|
static CDebugConsumer _debugConsumer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
TEST_CLASS_INITIALIZE(ClassInit)
|
||||||
|
{
|
||||||
|
CEventSystem::EventSystem.Start();
|
||||||
|
}
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Initialize)
|
TEST_METHOD_INITIALIZE(Initialize)
|
||||||
{
|
{
|
||||||
// Always delete DB before next test
|
// Always delete DB before next test
|
||||||
@@ -62,4 +69,5 @@ namespace UnitTests
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<CMockSiad> UnitTests::siad;
|
std::unique_ptr<CMockSiad> UnitTests::siad;
|
||||||
|
CDebugConsumer UnitTests::_debugConsumer;
|
||||||
}
|
}
|
Reference in New Issue
Block a user