#include "StdAfx.h" #include "SiaApi.h" #include using namespace Sia::Api; static String& ReplaceStringInPlace(String& subject, const String& search, const String& replace) { size_t pos = 0; while ((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); pos += replace.length(); } return subject; } CSiaApi::_CSiaFileTree::_CSiaFileTree(CSiaCurl& siaCurl) : _siaCurl(siaCurl) { } 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 { auto result = std::find_if(_fileList.begin(), _fileList.end(), [&](const CSiaFilePtr& item)->bool { return (item->GetSiaPath().compare(siaPath) == 0); }); 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 { return (item->GetSiaPath().compare(siaPath) == 0); }); return ((result != _fileList.end()) ? *result : nullptr); } CSiaFileCollection CSiaApi::_CSiaFileTree::Query(String query) const { query = CSiaApi::FormatToSiaPath(query); ReplaceStringInPlace(ReplaceStringInPlace(ReplaceStringInPlace(query, L".", L"\\."), L"*", L".+"), L"?", L".?"); std::wregex r(query); CSiaFileCollection ret; std::copy_if(_fileList.begin(), _fileList.end(), std::back_inserter(ret), [&](const CSiaFilePtr& v) -> bool { return std::regex_match(v->GetSiaPath(), r); }); return std::move(ret); }