(String) Remade GetXBuffer, now called GetXString
And returns a standard string Former-commit-id: 516735324a62cb6296e19d3be1960322073e5f3a
This commit is contained in:
@@ -1776,96 +1776,63 @@ unsigned int NzString::GetSize() const
|
||||
return m_sharedString->size;
|
||||
}
|
||||
|
||||
char* NzString::GetUtf8Buffer(unsigned int* size) const
|
||||
std::string NzString::GetUtf8String() const
|
||||
{
|
||||
if (m_sharedString->size == 0)
|
||||
return nullptr;
|
||||
|
||||
char* buffer = new char[m_sharedString->size+1];
|
||||
std::memcpy(buffer, m_sharedString->string, m_sharedString->size+1);
|
||||
|
||||
if (size)
|
||||
*size = m_sharedString->size;
|
||||
|
||||
return buffer;
|
||||
return std::string(m_sharedString->string, m_sharedString->size);
|
||||
}
|
||||
|
||||
char16_t* NzString::GetUtf16Buffer(unsigned int* size) const
|
||||
std::u16string NzString::GetUtf16String() const
|
||||
{
|
||||
if (m_sharedString->size == 0)
|
||||
return nullptr;
|
||||
return std::u16string();
|
||||
|
||||
std::vector<char16_t> utf16;
|
||||
utf16.reserve(m_sharedString->size);
|
||||
std::u16string str;
|
||||
str.reserve(m_sharedString->size);
|
||||
|
||||
utf8::utf8to16(m_sharedString->string, &m_sharedString->string[m_sharedString->size], std::back_inserter(utf16));
|
||||
utf8::utf8to16(begin(), end(), std::back_inserter(str));
|
||||
|
||||
unsigned int bufferSize = utf16.size();
|
||||
if (bufferSize == 0)
|
||||
return nullptr;
|
||||
|
||||
char16_t* buffer = new char16_t[bufferSize+1];
|
||||
std::memcpy(buffer, &utf16[0], bufferSize*sizeof(char16_t));
|
||||
buffer[bufferSize] ='\0';
|
||||
|
||||
if (size)
|
||||
*size = bufferSize;
|
||||
|
||||
return buffer;
|
||||
return str;
|
||||
}
|
||||
|
||||
char32_t* NzString::GetUtf32Buffer(unsigned int* size) const
|
||||
std::u32string NzString::GetUtf32String() const
|
||||
{
|
||||
if (m_sharedString->size == 0)
|
||||
return nullptr;
|
||||
return std::u32string();
|
||||
|
||||
unsigned int bufferSize = utf8::distance(m_sharedString->string, &m_sharedString->string[m_sharedString->size]);
|
||||
if (bufferSize == 0)
|
||||
return nullptr;
|
||||
std::u32string str;
|
||||
str.reserve(m_sharedString->size);
|
||||
|
||||
char32_t* buffer = new char32_t[bufferSize+1];
|
||||
utf8::utf8to32(m_sharedString->string, &m_sharedString->string[m_sharedString->size], buffer);
|
||||
buffer[bufferSize] ='\0';
|
||||
utf8::utf8to32(begin(), end(), std::back_inserter(str));
|
||||
|
||||
if (size)
|
||||
*size = bufferSize;
|
||||
|
||||
return buffer;
|
||||
return str;
|
||||
}
|
||||
|
||||
wchar_t* NzString::GetWideBuffer(unsigned int* size) const
|
||||
std::wstring NzString::GetWideString() const
|
||||
{
|
||||
static_assert(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4, "wchar_t size is not supported");
|
||||
if (m_sharedString->size == 0)
|
||||
return nullptr;
|
||||
return std::wstring();
|
||||
|
||||
unsigned int bufferSize = utf8::distance(m_sharedString->string, &m_sharedString->string[m_sharedString->size]);
|
||||
if (bufferSize == 0)
|
||||
return nullptr;
|
||||
std::wstring str;
|
||||
str.reserve(m_sharedString->size);
|
||||
|
||||
wchar_t* buffer = new wchar_t[bufferSize+1];
|
||||
if (sizeof(wchar_t) == 4) // Je veux du static_if :(
|
||||
utf8::utf8to32(m_sharedString->string, &m_sharedString->string[m_sharedString->size], buffer);
|
||||
utf8::utf8to32(begin(), end(), std::back_inserter(str));
|
||||
else
|
||||
{
|
||||
wchar_t* ptr = buffer;
|
||||
|
||||
utf8::unchecked::iterator<const char*> it(m_sharedString->string);
|
||||
do
|
||||
{
|
||||
char32_t cp = *it;
|
||||
if (cp <= 0xFFFF && (cp < 0xD800 || cp > 0xDFFF)) // @Laurent Gomila
|
||||
*ptr++ = static_cast<wchar_t>(cp);
|
||||
str.push_back(static_cast<wchar_t>(cp));
|
||||
else
|
||||
*ptr++ = L'?';
|
||||
str.push_back(L'?');
|
||||
}
|
||||
while (*it++);
|
||||
}
|
||||
|
||||
if (size)
|
||||
*size = bufferSize;
|
||||
|
||||
return buffer;
|
||||
return str;
|
||||
}
|
||||
|
||||
NzString NzString::GetWord(unsigned int index, nzUInt32 flags) const
|
||||
|
||||
@@ -62,9 +62,7 @@ bool NzDirectoryImpl::Open(const NzString& dirPath)
|
||||
{
|
||||
NzString searchPath = dirPath + "\\*";
|
||||
|
||||
std::unique_ptr<wchar_t[]> wPath(searchPath.GetWideBuffer());
|
||||
m_handle = FindFirstFileW(wPath.get(), &m_result);
|
||||
|
||||
m_handle = FindFirstFileW(searchPath.GetWideString().data(), &m_result);
|
||||
if (m_handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
NazaraError("Unable to open directory: " + NzError::GetLastSystemError());
|
||||
@@ -78,16 +76,12 @@ bool NzDirectoryImpl::Open(const NzString& dirPath)
|
||||
|
||||
bool NzDirectoryImpl::Create(const NzString& dirPath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> wPath(dirPath.GetWideBuffer());
|
||||
|
||||
return (CreateDirectoryW(wPath.get(), nullptr) != 0) || GetLastError() == ERROR_ALREADY_EXISTS;
|
||||
return (CreateDirectoryW(dirPath.GetWideString().data(), nullptr) != 0) || GetLastError() == ERROR_ALREADY_EXISTS;
|
||||
}
|
||||
|
||||
bool NzDirectoryImpl::Exists(const NzString& dirPath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> wPath(dirPath.GetWideBuffer());
|
||||
DWORD attributes = GetFileAttributesW(wPath.get());
|
||||
|
||||
DWORD attributes = GetFileAttributesW(dirPath.GetWideString().data());
|
||||
if (attributes != INVALID_FILE_ATTRIBUTES)
|
||||
return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
|
||||
else
|
||||
@@ -118,8 +112,7 @@ NzString NzDirectoryImpl::GetCurrent()
|
||||
|
||||
bool NzDirectoryImpl::Remove(const NzString& dirPath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(dirPath.GetWideBuffer());
|
||||
bool success = RemoveDirectoryW(path.get()) != 0;
|
||||
bool success = RemoveDirectoryW(dirPath.GetWideString().data()) != 0;
|
||||
|
||||
DWORD error = GetLastError();
|
||||
return success || error == ERROR_FILE_NOT_FOUND || error == ERROR_PATH_NOT_FOUND;
|
||||
|
||||
@@ -30,9 +30,7 @@ bool NzDynLibImpl::Load(const NzString& libraryPath, NzString* errorMessage)
|
||||
if (!path.EndsWith(".dll"))
|
||||
path += ".dll";
|
||||
|
||||
std::unique_ptr<wchar_t[]> wPath(path.GetWideBuffer());
|
||||
m_handle = LoadLibraryExW(wPath.get(), nullptr, (NzFile::IsAbsolute(path)) ? LOAD_WITH_ALTERED_SEARCH_PATH : 0);
|
||||
|
||||
m_handle = LoadLibraryExW(path.GetWideString().data(), nullptr, (NzFile::IsAbsolute(path)) ? LOAD_WITH_ALTERED_SEARCH_PATH : 0);
|
||||
if (m_handle)
|
||||
return true;
|
||||
else
|
||||
|
||||
@@ -92,9 +92,7 @@ bool NzFileImpl::Open(const NzString& filePath, unsigned int mode)
|
||||
if ((mode & NzFile::Lock) == 0)
|
||||
shareMode |= FILE_SHARE_WRITE;
|
||||
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
m_handle = CreateFileW(path.get(), access, shareMode, nullptr, openMode, 0, nullptr);
|
||||
|
||||
m_handle = CreateFileW(filePath.GetWideString().data(), access, shareMode, nullptr, openMode, 0, nullptr);
|
||||
return m_handle != INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
@@ -184,117 +182,96 @@ std::size_t NzFileImpl::Write(const void* buffer, std::size_t size)
|
||||
|
||||
bool NzFileImpl::Copy(const NzString& sourcePath, const NzString& targetPath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> srcPath(sourcePath.GetWideBuffer());
|
||||
std::unique_ptr<wchar_t[]> dstPath(targetPath.GetWideBuffer());
|
||||
|
||||
if (CopyFileW(srcPath.get(), dstPath.get(), false))
|
||||
if (CopyFileW(sourcePath.GetWideString().data(), targetPath.GetWideString().data(), false))
|
||||
return true;
|
||||
else
|
||||
{
|
||||
NazaraError("Failed to copy file: " + NzError::GetLastSystemError());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool NzFileImpl::Delete(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
|
||||
if (DeleteFileW(path.get()))
|
||||
if (DeleteFileW(filePath.GetWideString().data()))
|
||||
return true;
|
||||
else
|
||||
{
|
||||
NazaraError("Failed to delete file (" + filePath + "): " + NzError::GetLastSystemError());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool NzFileImpl::Exists(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
HANDLE handle = CreateFileW(path.get(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
|
||||
HANDLE handle = CreateFileW(filePath.GetWideString().data(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return false;
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
time_t NzFileImpl::GetCreationTime(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
HANDLE handle = CreateFileW(path.get(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
|
||||
HANDLE handle = CreateFileW(filePath.GetWideString().data(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
FILETIME creationTime;
|
||||
if (!GetFileTime(handle, &creationTime, nullptr, nullptr))
|
||||
{
|
||||
NazaraError("Unable to get creation time: " + NzError::GetLastSystemError());
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
NazaraError("Unable to get creation time: " + NzError::GetLastSystemError());
|
||||
return 0;
|
||||
}
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
return NzFileTimeToTime(&creationTime);
|
||||
}
|
||||
|
||||
time_t NzFileImpl::GetLastAccessTime(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
HANDLE handle = CreateFileW(path.get(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
|
||||
HANDLE handle = CreateFileW(filePath.GetWideString().data(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
FILETIME accessTime;
|
||||
if (!GetFileTime(handle, nullptr, &accessTime, nullptr))
|
||||
{
|
||||
NazaraError("Unable to get last access time: " + NzError::GetLastSystemError());
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
NazaraError("Unable to get last access time: " + NzError::GetLastSystemError());
|
||||
return 0;
|
||||
}
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
return NzFileTimeToTime(&accessTime);
|
||||
}
|
||||
|
||||
time_t NzFileImpl::GetLastWriteTime(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
HANDLE handle = CreateFileW(path.get(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
|
||||
HANDLE handle = CreateFileW(filePath.GetWideString().data(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
FILETIME writeTime;
|
||||
if (!GetFileTime(handle, nullptr, nullptr, &writeTime))
|
||||
{
|
||||
NazaraError("Unable to get last write time: " + NzError::GetLastSystemError());
|
||||
CloseHandle(handle);
|
||||
|
||||
NazaraError("Unable to get last write time: " + NzError::GetLastSystemError());
|
||||
return 0;
|
||||
}
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
return NzFileTimeToTime(&writeTime);
|
||||
}
|
||||
|
||||
nzUInt64 NzFileImpl::GetSize(const NzString& filePath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> path(filePath.GetWideBuffer());
|
||||
HANDLE handle = CreateFileW(path.get(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
|
||||
HANDLE handle = CreateFileW(filePath.GetWideString().data(), 0, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
@@ -303,16 +280,12 @@ nzUInt64 NzFileImpl::GetSize(const NzString& filePath)
|
||||
fileSize.QuadPart = 0;
|
||||
|
||||
CloseHandle(handle);
|
||||
|
||||
return fileSize.QuadPart;
|
||||
}
|
||||
|
||||
bool NzFileImpl::Rename(const NzString& sourcePath, const NzString& targetPath)
|
||||
{
|
||||
std::unique_ptr<wchar_t[]> srcPath(sourcePath.GetWideBuffer());
|
||||
std::unique_ptr<wchar_t[]> dstPath(targetPath.GetWideBuffer());
|
||||
|
||||
if (MoveFileExW(srcPath.get(), dstPath.get(), MOVEFILE_COPY_ALLOWED))
|
||||
if (MoveFileExW(sourcePath.GetWideString().data(), targetPath.GetWideString().data(), MOVEFILE_COPY_ALLOWED))
|
||||
return true;
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user