1
0
This repository has been archived on 2025-07-27. You can view files and clone it, but cannot push or open issues or pull requests.
Files
siadrive/SiaDrive.Api/SiaFileTree.cpp
2017-02-13 21:48:02 -06:00

77 lines
1.8 KiB
C++

#include "StdAfx.h"
#include "SiaApi.h"
#include <regex>
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::QueryFiles(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);
}