From a91cb43d659cfc347f5210188a4535cb34e68f0b Mon Sep 17 00:00:00 2001 From: Anton Fedchin Date: Fri, 18 Jan 2019 18:03:13 +0300 Subject: [PATCH] [win10] filesystem: catch an exception while reading or writing a file. --- .../win10/filesystem/WinLibraryFile.cpp | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/xbmc/platform/win10/filesystem/WinLibraryFile.cpp b/xbmc/platform/win10/filesystem/WinLibraryFile.cpp index 2bfc6e94f68a4..3a194b309900e 100644 --- a/xbmc/platform/win10/filesystem/WinLibraryFile.cpp +++ b/xbmc/platform/win10/filesystem/WinLibraryFile.cpp @@ -85,8 +85,7 @@ void CWinLibraryFile::Close() { if (m_fileStream != nullptr) { - // see https://docs.microsoft.com/en-us/uwp/api/windows.storage.streams.irandomaccessstream - // m_fileStream->Close(); // where it is? + m_fileStream.Close(); m_fileStream = nullptr; } if (m_sFile) @@ -99,9 +98,17 @@ ssize_t CWinLibraryFile::Read(void* lpBuf, size_t uiBufSize) return -1; IBuffer buf = winrt::make(lpBuf, static_cast(uiBufSize)); - Wait(m_fileStream.ReadAsync(buf, buf.Capacity(), InputStreamOptions::None)); - - return static_cast(buf.Length()); + try + { + Wait(m_fileStream.ReadAsync(buf, buf.Capacity(), InputStreamOptions::None)); + return static_cast(buf.Length()); + } + catch (const winrt::hresult_error& ex) + { + using KODI::PLATFORM::WINDOWS::FromW; + CLog::LogF(LOGERROR, "unable to read file ({})", FromW(ex.message().c_str())); + return -1; + } } ssize_t CWinLibraryFile::Write(const void* lpBuf, size_t uiBufSize) @@ -110,10 +117,19 @@ ssize_t CWinLibraryFile::Write(const void* lpBuf, size_t uiBufSize) return -1; uint8_t* buff = (uint8_t*)lpBuf; - auto winrt_buffer = CryptographicBuffer::CreateFromByteArray({ buff, buff + uiBufSize }); + const auto winrt_buffer = CryptographicBuffer::CreateFromByteArray({ buff, buff + uiBufSize }); - uint32_t result = Wait(m_fileStream.WriteAsync(winrt_buffer)); - return static_cast(result); + try + { + const uint32_t result = Wait(m_fileStream.WriteAsync(winrt_buffer)); + return static_cast(result); + } + catch (const winrt::hresult_error& ex) + { + using KODI::PLATFORM::WINDOWS::FromW; + CLog::LogF(LOGERROR, "unable write to file ({})", FromW(ex.message().c_str())); + return -1; + } } int64_t CWinLibraryFile::Seek(int64_t iFilePosition, int iWhence)