mirror of
https://github.com/Huntereb/Awoo-Installer
synced 2024-11-10 14:14:21 +00:00
cleanup xci installation
This commit is contained in:
parent
10976fb895
commit
cc368479df
6 changed files with 51 additions and 81 deletions
|
@ -24,28 +24,6 @@ SOFTWARE.
|
|||
|
||||
#include "install/xci.hpp"
|
||||
#include "util/network_util.hpp"
|
||||
/*
|
||||
Copyright (c) 2017-2018 Adubbz
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace tin::install::xci
|
||||
|
@ -57,7 +35,6 @@ namespace tin::install::xci
|
|||
|
||||
HTTPXCI(std::string url);
|
||||
|
||||
virtual bool CanStream() override;
|
||||
virtual void StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId placeholderId) override;
|
||||
virtual void BufferData(void* buf, off_t offset, size_t size) override;
|
||||
};
|
||||
|
|
|
@ -32,8 +32,7 @@ namespace tin::install::xci
|
|||
LocalXCI(std::string path);
|
||||
~LocalXCI();
|
||||
|
||||
virtual bool CanStream() override;
|
||||
virtual void StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId placeholderId) override;
|
||||
virtual void StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId ncaId) override;
|
||||
virtual void BufferData(void* buf, off_t offset, size_t size) override;
|
||||
private:
|
||||
FILE* m_xciFile;
|
||||
|
|
|
@ -41,7 +41,6 @@ namespace tin::install::xci
|
|||
XCI();
|
||||
|
||||
public:
|
||||
virtual bool CanStream() = 0;
|
||||
virtual void StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId placeholderId) = 0;
|
||||
virtual void BufferData(void* buf, off_t offset, size_t size) = 0;
|
||||
|
||||
|
|
|
@ -77,19 +77,15 @@ namespace tin::install::xci
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool HTTPXCI::CanStream() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void HTTPXCI::StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId placeholderId)
|
||||
void HTTPXCI::StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId ncaId)
|
||||
{
|
||||
const HFS0FileEntry* fileEntry = this->GetFileEntryByNcaId(placeholderId);
|
||||
const HFS0FileEntry* fileEntry = this->GetFileEntryByNcaId(ncaId);
|
||||
std::string ncaFileName = this->GetFileEntryName(fileEntry);
|
||||
|
||||
printf("Retrieving %s\n", ncaFileName.c_str());
|
||||
size_t ncaSize = fileEntry->fileSize;
|
||||
|
||||
tin::data::BufferedPlaceholderWriter bufferedPlaceholderWriter(contentStorage, placeholderId, ncaSize);
|
||||
tin::data::BufferedPlaceholderWriter bufferedPlaceholderWriter(contentStorage, ncaId, ncaSize);
|
||||
StreamFuncArgs args;
|
||||
args.download = &m_download;
|
||||
args.bufferedPlaceholderWriter = &bufferedPlaceholderWriter;
|
||||
|
|
|
@ -23,7 +23,6 @@ SOFTWARE.
|
|||
#include "install/install_xci.hpp"
|
||||
#include "util/file_util.hpp"
|
||||
#include "util/title_util.hpp"
|
||||
#include "nx/nca_writer.h"
|
||||
#include "util/debug.h"
|
||||
#include "util/error.hpp"
|
||||
#include "util/config.hpp"
|
||||
|
@ -115,47 +114,7 @@ namespace tin::install::xci
|
|||
}
|
||||
}
|
||||
|
||||
if (m_xci->CanStream()) {
|
||||
m_xci->StreamToPlaceholder(contentStorage, ncaId);
|
||||
} else {
|
||||
NcaWriter writer(ncaId, contentStorage);
|
||||
|
||||
float progress;
|
||||
|
||||
u64 fileStart = m_xci->GetDataOffset() + fileEntry->dataOffset;
|
||||
u64 fileOff = 0;
|
||||
size_t readSize = 0x400000; // 4MB buff
|
||||
auto readBuffer = std::make_unique<u8[]>(readSize);
|
||||
|
||||
try
|
||||
{
|
||||
inst::ui::setInstInfoText("Installing " + ncaFileName + "...");
|
||||
inst::ui::setInstBarPerc(0);
|
||||
while (fileOff < ncaSize)
|
||||
{
|
||||
progress = (float) fileOff / (float) ncaSize;
|
||||
|
||||
if (fileOff % (0x400000 * 3) == 0) {
|
||||
printf("> Progress: %lu/%lu MB (%d%s)\r", (fileOff / 1000000), (ncaSize / 1000000), (int)(progress * 100.0), "%");
|
||||
inst::ui::setInstBarPerc((double)(progress * 100.0));
|
||||
}
|
||||
|
||||
if (fileOff + readSize >= ncaSize) readSize = ncaSize - fileOff;
|
||||
|
||||
m_xci->BufferData(readBuffer.get(), fileOff + fileStart, readSize);
|
||||
writer.write(readBuffer.get(), readSize);
|
||||
|
||||
fileOff += readSize;
|
||||
}
|
||||
inst::ui::setInstBarPerc(100);
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
printf("something went wrong: %s\n", e.what());
|
||||
}
|
||||
|
||||
writer.close();
|
||||
}
|
||||
m_xci->StreamToPlaceholder(contentStorage, ncaId);
|
||||
|
||||
// Clean up the line for whatever comes next
|
||||
printf(" \r");
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include "install/local_xci.hpp"
|
||||
#include "error.hpp"
|
||||
#include "debug.h"
|
||||
#include "nx/nca_writer.h"
|
||||
#include "nspInstall.hpp"
|
||||
|
||||
namespace tin::install::xci
|
||||
{
|
||||
|
@ -16,13 +18,51 @@ namespace tin::install::xci
|
|||
fclose(m_xciFile);
|
||||
}
|
||||
|
||||
bool LocalXCI::CanStream() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void LocalXCI::StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId placeholderId)
|
||||
void LocalXCI::StreamToPlaceholder(std::shared_ptr<nx::ncm::ContentStorage>& contentStorage, NcmContentId ncaId)
|
||||
{
|
||||
THROW_FORMAT("not streamable\n");
|
||||
const HFS0FileEntry* fileEntry = this->GetFileEntryByNcaId(ncaId);
|
||||
std::string ncaFileName = this->GetFileEntryName(fileEntry);
|
||||
|
||||
printf("Retrieving %s\n", ncaFileName.c_str());
|
||||
size_t ncaSize = fileEntry->fileSize;
|
||||
|
||||
NcaWriter writer(ncaId, contentStorage);
|
||||
|
||||
float progress;
|
||||
|
||||
u64 fileStart = GetDataOffset() + fileEntry->dataOffset;
|
||||
u64 fileOff = 0;
|
||||
size_t readSize = 0x400000; // 4MB buff
|
||||
auto readBuffer = std::make_unique<u8[]>(readSize);
|
||||
|
||||
try
|
||||
{
|
||||
inst::ui::setInstInfoText("Installing " + ncaFileName + "...");
|
||||
inst::ui::setInstBarPerc(0);
|
||||
while (fileOff < ncaSize)
|
||||
{
|
||||
progress = (float) fileOff / (float) ncaSize;
|
||||
|
||||
if (fileOff % (0x400000 * 3) == 0) {
|
||||
printf("> Progress: %lu/%lu MB (%d%s)\r", (fileOff / 1000000), (ncaSize / 1000000), (int)(progress * 100.0), "%");
|
||||
inst::ui::setInstBarPerc((double)(progress * 100.0));
|
||||
}
|
||||
|
||||
if (fileOff + readSize >= ncaSize) readSize = ncaSize - fileOff;
|
||||
|
||||
this->BufferData(readBuffer.get(), fileOff + fileStart, readSize);
|
||||
writer.write(readBuffer.get(), readSize);
|
||||
|
||||
fileOff += readSize;
|
||||
}
|
||||
inst::ui::setInstBarPerc(100);
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
printf("something went wrong: %s\n", e.what());
|
||||
}
|
||||
|
||||
writer.close();
|
||||
}
|
||||
|
||||
void LocalXCI::BufferData(void* buf, off_t offset, size_t size)
|
||||
|
|
Loading…
Reference in a new issue