110 lines
2.7 KiB
C++
110 lines
2.7 KiB
C++
#include "StdAfx.h"
|
|
#include "SiaApi.h"
|
|
#include <regex>
|
|
|
|
using namespace Sia::Api;
|
|
|
|
CSiaApi::_CSiaFileTree::_CSiaFileTree(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) :
|
|
CSiaBase(siaCurl, siaDriveConfig)
|
|
{
|
|
|
|
}
|
|
|
|
CSiaApi::_CSiaFileTree::~_CSiaFileTree()
|
|
{
|
|
|
|
}
|
|
|
|
void CSiaApi::_CSiaFileTree::BuildTree(const json& result)
|
|
{
|
|
_fileList.clear();
|
|
for (const auto& file : result["files"])
|
|
{
|
|
_fileList.push_back(CSiaFilePtr(new CSiaFile(GetSiaCurl(), &GetSiaDriveConfig(), 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);
|
|
}
|
|
|
|
std::vector<String> CSiaApi::_CSiaFileTree::QueryDirectories(String rootFolder) const
|
|
{
|
|
CSiaFileCollection col;
|
|
ReplaceStringInPlace(rootFolder, L"/", L"\\");
|
|
if (rootFolder[0] == '\\')
|
|
{
|
|
rootFolder = rootFolder.substr(1);
|
|
}
|
|
|
|
std::vector<String> ret;
|
|
std::for_each(_fileList.begin(), _fileList.end(), [&](const CSiaFilePtr& v)
|
|
{
|
|
String dir = v->GetSiaPath();
|
|
ReplaceStringInPlace(dir, L"/", L"\\");
|
|
::PathRemoveFileSpec(&dir[0]);
|
|
::PathRemoveBackslash(&dir[0]);
|
|
::PathRemoveBackslash(&rootFolder[0]);
|
|
dir = dir.c_str();
|
|
rootFolder = rootFolder.c_str();
|
|
if ((dir.length() > rootFolder.length()) && (dir.substr(0, rootFolder.length()) == rootFolder))
|
|
{
|
|
String subFolder = dir.substr(rootFolder.length());
|
|
int idx = subFolder.find_first_of('\\');
|
|
if (idx == 0)
|
|
{
|
|
subFolder = subFolder.substr(1);
|
|
idx = subFolder.find_first_of('\\');
|
|
}
|
|
|
|
if (idx > 0)
|
|
{
|
|
subFolder = subFolder.substr(0, idx);
|
|
}
|
|
|
|
auto it = std::find(ret.begin(), ret.end(), subFolder);
|
|
if (it == ret.end())
|
|
{
|
|
ret.push_back(subFolder);
|
|
}
|
|
}
|
|
});
|
|
|
|
return std::move(ret);
|
|
} |