#include "pch.h"
#include "StorageAsync.h"
#include "StorageAccess.h"
#include "UWPUtil.h"
#include "Common/File/Path.h"
using namespace winrt;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Windows::Storage::AccessCache;
using namespace winrt::Windows::Storage;
using namespace winrt::Windows::ApplicationModel;
std::list<std::string> alist;
void AppendToAccessList(winrt::hstring path)
{
Path p(FromHString(path));
alist.push_back(p.ToString());
}
winrt::hstring GetDataFromLocalSettings(winrt::hstring key) {
ApplicationDataContainer localSettings = ApplicationData::Current().LocalSettings();
IPropertySet values = localSettings.Values();
if (!key.empty()) {
auto tokenRetrive = values.TryLookup(key);
if (tokenRetrive) {
winrt::hstring ConvertedToken = winrt::unbox_value<winrt::hstring>(tokenRetrive);
return ConvertedToken;
}
}
return L"";
}
std::string GetDataFromLocalSettings(std::string key) {
return FromHString(GetDataFromLocalSettings(ToHString(key)));
}
bool AddDataToLocalSettings(winrt::hstring key, winrt::hstring data, bool replace) {
ApplicationDataContainer localSettings = ApplicationData::Current().LocalSettings();
IPropertySet values = localSettings.Values();
winrt::hstring testResult = GetDataFromLocalSettings(key);
if (testResult.empty()) {
values.Insert(key, winrt::box_value(data));
return true;
}
else if (replace) {
values.Remove(key);
values.Insert(key, winrt::box_value(data));
return true;
}
return false;
}
bool AddDataToLocalSettings(std::string key, std::string data, bool replace) {
return AddDataToLocalSettings(ToHString(key), ToHString(data), replace);
}
void AddItemToFutureList(const winrt::Windows::Storage::IStorageItem& item) {
try {
if (item != nullptr) {
winrt::hstring folderToken = StorageApplicationPermissions::FutureAccessList().Add(item);
AppendToAccessList(item.Path());
}
}
catch (const winrt::hresult_error&) {
}
}
winrt::Windows::Storage::IStorageItem GetItemByKey(winrt::hstring key) {
winrt::Windows::Storage::IStorageItem item = nullptr;
winrt::hstring itemToken = GetDataFromLocalSettings(key);
if (!itemToken.empty() && StorageApplicationPermissions::FutureAccessList().ContainsItem(itemToken)) {
ExecuteTask(item, StorageApplicationPermissions::FutureAccessList().GetItemAsync(itemToken));
}
return item;
}
std::list<std::string> GetFutureAccessList() {
if (alist.empty()) {
auto AccessList = StorageApplicationPermissions::FutureAccessList().Entries();
for (uint32_t it = 0; it != AccessList.Size(); ++it){
auto item = AccessList.GetAt(it);
try {
auto token = item.Token;
if (!token.empty() && StorageApplicationPermissions::FutureAccessList().ContainsItem(token)) {
winrt::Windows::Storage::IStorageItem storageItem = nullptr;
ExecuteTask(storageItem, StorageApplicationPermissions::FutureAccessList().GetItemAsync(token));
if (storageItem != nullptr) {
AppendToAccessList(storageItem.Path());
}
else {
StorageApplicationPermissions::FutureAccessList().Remove(token);
}
}
}
catch (const winrt::hresult_error&) {
}
}
AppendToAccessList(ApplicationData::Current().LocalFolder().Path());
AppendToAccessList(ApplicationData::Current().TemporaryFolder().Path());
}
return alist;
}