1
0
mirror of synced 2025-02-17 18:59:21 +01:00

fix: Saving projects to unicode paths not working correctly

This commit is contained in:
WerWolv 2022-12-28 10:46:02 +01:00
parent 5777a6d401
commit f7b988906e
3 changed files with 55 additions and 8 deletions

View File

@ -71,6 +71,7 @@ struct mtar_t {
const char *mtar_strerror(int err);
int mtar_open(mtar_t *tar, const char *filename, const char *mode);
int mtar_wopen(mtar_t *tar, const wchar_t *filename, const wchar_t *mode);
int mtar_close(mtar_t *tar);
int mtar_seek(mtar_t *tar, unsigned pos);

View File

@ -207,6 +207,41 @@ int mtar_open(mtar_t *tar, const char *filename, const char *mode) {
return MTAR_ESUCCESS;
}
#if defined (_WIN32)
int mtar_wopen(mtar_t *tar, const wchar_t *filename, const wchar_t *mode) {
int err;
mtar_header_t h;
/* Init tar struct and functions */
memset(tar, 0, sizeof(*tar));
tar->write = file_write;
tar->read = file_read;
tar->seek = file_seek;
tar->close = file_close;
/* Assure mode is always binary */
if ( filename[0] == L'r' ) mode = L"rb";
if ( filename[0] == L'w' ) mode = L"wb";
if ( filename[0] == L'a' ) mode = L"ab";
/* Open file */
tar->stream = _wfopen(filename, mode);
if (!tar->stream) {
return MTAR_EOPENFAIL;
}
/* Read first header to check it is valid if mode is `r` */
if (*mode == L'r') {
err = mtar_read_header(tar, &h);
if (err != MTAR_ESUCCESS) {
mtar_close(tar);
return err;
}
}
/* Return ok */
return MTAR_ESUCCESS;
}
#endif
int mtar_close(mtar_t *tar) {
return tar->close(tar);

View File

@ -9,14 +9,25 @@ namespace hex {
Tar::Tar(const std::fs::path &path, Mode mode) {
int error = MTAR_ESUCCESS;
if (mode == Tar::Mode::Read)
error = mtar_open(&this->m_ctx, path.string().c_str(), "r");
else if (mode == Tar::Mode::Write)
error = mtar_open(&this->m_ctx, path.string().c_str(), "a");
else if (mode == Tar::Mode::Create)
error = mtar_open(&this->m_ctx, path.string().c_str(), "w");
else
error = MTAR_EFAILURE;
#if defined (OS_WINDOWS)
if (mode == Tar::Mode::Read)
error = mtar_wopen(&this->m_ctx, path.c_str(), L"r");
else if (mode == Tar::Mode::Write)
error = mtar_wopen(&this->m_ctx, path.c_str(), L"a");
else if (mode == Tar::Mode::Create)
error = mtar_wopen(&this->m_ctx, path.c_str(), L"w");
else
error = MTAR_EFAILURE;
#else
if (mode == Tar::Mode::Read)
error = mtar_open(&this->m_ctx, path.c_str(), "r");
else if (mode == Tar::Mode::Write)
error = mtar_open(&this->m_ctx, path.c_str(), "a");
else if (mode == Tar::Mode::Create)
error = mtar_open(&this->m_ctx, path.c_str(), "w");
else
error = MTAR_EFAILURE;
#endif
this->m_valid = (error == MTAR_ESUCCESS);
}