diff --git a/SiaDrive.Api/SiaApi.h b/SiaDrive.Api/SiaApi.h index 52b6de3..90aa807 100644 --- a/SiaDrive.Api/SiaApi.h +++ b/SiaDrive.Api/SiaApi.h @@ -26,11 +26,14 @@ public: Japanese }; + class _CSiaFileTree; class AFX_EXT_CLASS _CSiaFile { friend CSiaApi; + friend _CSiaFileTree; + private: - _CSiaFile(CSiaCurl& siaCurl); + _CSiaFile(CSiaCurl& siaCurl, const json& fileJson); public: ~_CSiaFile(); @@ -40,12 +43,18 @@ public: // Properties Property(String, SiaPath, public, private) + Property(std::uint64_t, FileSize, public, private) + Property(bool, Available, public, private) + Property(bool, Renewing, public, private) + Property(std::uint32_t, Redundancy, public, private) + Property(std::uint32_t, UploadProgress, public, private) + Property(std::uint32_t, Expiration, public, private) }; class AFX_EXT_CLASS _CSiaFileTree { friend CSiaApi; - private: + public: _CSiaFileTree(CSiaCurl& siaCurl); public: @@ -60,6 +69,8 @@ public: public: void BuildTree(const json& result); + std::vector> GetFileList() const; + std::vector> QueryFiles(String query) const; std::shared_ptr<_CSiaFile> GetFile(const String& siaPath) const; diff --git a/SiaDrive.Api/SiaFile.cpp b/SiaDrive.Api/SiaFile.cpp index bd72308..a7295ca 100644 --- a/SiaDrive.Api/SiaFile.cpp +++ b/SiaDrive.Api/SiaFile.cpp @@ -3,8 +3,15 @@ using namespace Sia::Api; -CSiaApi::_CSiaFile::_CSiaFile(CSiaCurl& siaCurl) : - _siaCurl(siaCurl) +CSiaApi::_CSiaFile::_CSiaFile(CSiaCurl& siaCurl, const json& fileJson) : + _siaCurl(siaCurl), + _SiaPath(CA2W(fileJson["siapath"].get().c_str())), + _FileSize(fileJson["filesize"].get()), + _Available(fileJson["available"].get()), + _Renewing(fileJson["renewing"].get()), + _Redundancy(fileJson["redundancy"].get()), + _UploadProgress(fileJson["uploadprogress"].get()), + _Expiration(fileJson["expiration"].get()) { } diff --git a/SiaDrive.Api/SiaFileTree.cpp b/SiaDrive.Api/SiaFileTree.cpp index f40709c..abdab93 100644 --- a/SiaDrive.Api/SiaFileTree.cpp +++ b/SiaDrive.Api/SiaFileTree.cpp @@ -29,6 +29,11 @@ CSiaApi::_CSiaFileTree::~_CSiaFileTree() void CSiaApi::_CSiaFileTree::BuildTree(const json& result) { + _fileList.clear(); + for (const auto& file : result["files"]) + { + _fileList.push_back(CSiaFilePtr(new CSiaFile(_siaCurl, file))); + } } bool CSiaApi::_CSiaFileTree::FileExists(const String& siaPath) const @@ -41,6 +46,11 @@ bool CSiaApi::_CSiaFileTree::FileExists(const String& siaPath) const return (result != _fileList.end()); } +CSiaFileCollection CSiaApi::_CSiaFileTree::GetFileList() const +{ + return _fileList; +} + CSiaFilePtr CSiaApi::_CSiaFileTree::GetFile(const String& siaPath) const { auto result = std::find_if(_fileList.begin(), _fileList.end(), [&](const CSiaFilePtr& item)->bool diff --git a/UnitTests/SiaApiFileTreeTests.cpp b/UnitTests/SiaApiFileTreeTests.cpp new file mode 100644 index 0000000..1b2f7fc --- /dev/null +++ b/UnitTests/SiaApiFileTreeTests.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" +#include "CppUnitTest.h" +#include +#include "UnitTestConfig.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace UnitTests +{ + TEST_CLASS(SiaApiFileTree) + { + DAEMON_TEST() + + private: + const SiaHostConfig _hostConfig = { TEST_SERVER_AND_PORT, TEST_SERVER_VERSION }; + + public: + TEST_METHOD(BuildFileTree) + { + CSiaCurl siaCurl; + siaCurl.SetHostConfig(_hostConfig); + + json j = + { + {"files", + { + { { "siapath", "root/sub1/file1.txt" },{ "filesize", 1 },{ "available", true },{ "renewing", true },{ "redundancy", 5 },{ "uploadprogress", 100 },{ "expiration", 60000 } }, + { { "siapath", "root/sub1/file2.txt" },{ "filesize", 2 },{ "available", true },{ "renewing", true },{ "redundancy", 5 },{ "uploadprogress", 100 },{ "expiration", 60000 } }, + { { "siapath", "root/sub1/file3.txt" },{ "filesize", 3 },{ "available", true },{ "renewing", true },{ "redundancy", 5 },{ "uploadprogress", 100 },{ "expiration", 60000 } } + }} + }; + + CSiaFileTree ft(siaCurl); + ft.BuildTree(j); + auto fileList = ft.GetFileList(); + Assert::AreEqual(static_cast(3), fileList.size()); + + Assert::AreEqual(L"root/sub1/file1.txt", fileList[0]->GetSiaPath().c_str()); + Assert::AreEqual(L"root/sub1/file2.txt", fileList[1]->GetSiaPath().c_str()); + Assert::AreEqual(L"root/sub1/file3.txt", fileList[2]->GetSiaPath().c_str()); + + Assert::AreEqual(static_cast(1), fileList[0]->GetFileSize()); + Assert::AreEqual(static_cast(2), fileList[1]->GetFileSize()); + Assert::AreEqual(static_cast(3), fileList[2]->GetFileSize()); + } + }; + + DEFINE_DAEMON(SiaApiFileTree); +} \ No newline at end of file diff --git a/UnitTests/UnitTests.vcxproj b/UnitTests/UnitTests.vcxproj index 865a71f..c8db1be 100644 --- a/UnitTests/UnitTests.vcxproj +++ b/UnitTests/UnitTests.vcxproj @@ -159,6 +159,10 @@ + + + + diff --git a/UnitTests/UnitTests.vcxproj.filters b/UnitTests/UnitTests.vcxproj.filters index 360ed5a..608a1a4 100644 --- a/UnitTests/UnitTests.vcxproj.filters +++ b/UnitTests/UnitTests.vcxproj.filters @@ -41,5 +41,8 @@ Source Files + + Source Files + \ No newline at end of file