/************************************************************************** | |
* Copyright (C) 2016 by Savoir-faire Linux * | |
* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com> * | |
* * | |
* This program is free software; you can redistribute it and/or modify * | |
* it under the terms of the GNU General Public License as published by * | |
* the Free Software Foundation; either version 3 of the License, or * | |
* (at your option) any later version. * | |
* * | |
* This program is distributed in the hope that it will be useful, * | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
* GNU General Public License for more details. * | |
* * | |
* You should have received a copy of the GNU General Public License * | |
* along with this program. If not, see <http://www.gnu.org/licenses/>. * | |
**************************************************************************/ | |
#pragma once | |
#include <pch.h> | |
#include "ResourceManager.h" | |
using namespace RingClientUWP; | |
using namespace Windows::UI::Core; | |
using namespace Windows::ApplicationModel::Resources; | |
String^ | |
getFriendlyResourceName(String^ path) | |
{ | |
return Utils::toPlatformString(Utils::fileNameOnly(Utils::toString(path))); | |
} | |
ResourceMananger::ResourceMananger() | |
{ | |
stringLoader = ref new ResourceLoader(); | |
} | |
void | |
ResourceMananger::preloadImage(String^ path) | |
{ | |
IOMSG_("attempting to preload image: " + path); | |
auto friendlyName = getFriendlyResourceName(path); | |
if (!preload.HasKey(friendlyName)) { | |
preload.Insert(friendlyName, nullptr); | |
IAsyncOperation<StorageFile^>^ getFileTask; | |
if (Utils::toString(path).find("ms-appx") == std::string::npos) { | |
getFileTask = StorageFile::GetFileFromPathAsync(path); | |
} | |
else { | |
auto uri = ref new Uri(path); | |
getFileTask = StorageFile::GetFileFromApplicationUriAsync(uri); | |
} | |
create_task(getFileTask) | |
.then([=](task<StorageFile^> t) | |
{ | |
StorageFile^ storageFile; | |
try { | |
storageFile = t.get(); | |
create_task(storageFile->OpenAsync(FileAccessMode::Read)) | |
.then([=](task<IRandomAccessStream^> fileStreamTask) | |
{ | |
try { | |
auto fileStream = fileStreamTask.get(); | |
auto bmp = ref new BitmapImage(); | |
bmp->SetSource(fileStream); | |
IOMSG_("preloading image: " + friendlyName); | |
preload.Insert(friendlyName, bmp); | |
} | |
catch (Platform::Exception^ e) { | |
EXC_(e); | |
} | |
}); | |
} | |
catch (Platform::Exception^ e) { | |
EXC_(e); | |
} | |
}); | |
} | |
} | |
BitmapImage^ | |
ResourceMananger::imageFromRelativePath(String^ path) | |
{ | |
auto friendlyName = getFriendlyResourceName(path); | |
if (preload.HasKey(friendlyName)) { | |
IOMSG_("loading preloaded image: " + friendlyName); | |
return preload.Lookup(friendlyName); | |
} | |
else { | |
preloadImage(path); | |
} | |
auto uri = ref new Uri(path); | |
auto bmp = ref new BitmapImage(); | |
bmp->UriSource = uri; | |
IOMSG_("loading image from disk: " + friendlyName); | |
return bmp; | |
} | |
String^ | |
ResourceMananger::getStringResource(String^ key) | |
{ | |
return stringLoader->GetString(key); | |
} |