CryFile.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. // Description : File wrapper.
  9. #pragma once
  10. #include <AzCore/Console/IConsole.h>
  11. #include <AzCore/Interface/Interface.h>
  12. #include <AzCore/IO/FileIO.h>
  13. #include <AzCore/IO/Path/Path.h>
  14. #include <AzFramework/Archive/IArchive.h>
  15. //////////////////////////////////////////////////////////////////////////
  16. #define CRYFILE_MAX_PATH 260
  17. //////////////////////////////////////////////////////////////////////////
  18. // Summary:
  19. // Wrapper on file system.
  20. class CCryFile
  21. {
  22. public:
  23. CCryFile();
  24. CCryFile(const char* filename, const char* mode);
  25. ~CCryFile();
  26. bool Open(const char* filename, const char* mode);
  27. void Close();
  28. // Summary:
  29. // Writes data in a file to the current file position.
  30. size_t Write(const void* lpBuf, size_t nSize);
  31. // Summary:
  32. // Reads data from a file at the current file position.
  33. size_t ReadRaw(void* lpBuf, size_t nSize);
  34. // Summary:
  35. // Automatic endian-swapping version.
  36. template<class T>
  37. inline size_t ReadType(T* pDest, size_t nCount = 1)
  38. {
  39. size_t nRead = ReadRaw(pDest, sizeof(T) * nCount);
  40. SwapEndian(pDest, nCount);
  41. return nRead;
  42. }
  43. // Summary:
  44. // Retrieves the length of the file.
  45. size_t GetLength();
  46. // Summary:
  47. // Moves the current file pointer to the specified position.
  48. size_t Seek(size_t seek, int mode);
  49. // Description:
  50. // Retrieves the filename of the selected file.
  51. const char* GetFilename() const { return m_filename.c_str(); };
  52. // Summary:
  53. // Checks if file is opened from Archive file.
  54. bool IsInPak() const;
  55. // Summary:
  56. // Gets path of archive this file is in.
  57. AZ::IO::PathView GetPakPath() const;
  58. private:
  59. AZ::IO::FixedMaxPath m_filename;
  60. AZ::IO::HandleType m_fileHandle;
  61. };
  62. // Summary:
  63. // CCryFile implementation.
  64. inline CCryFile::CCryFile()
  65. {
  66. m_fileHandle = AZ::IO::InvalidHandle;
  67. }
  68. //////////////////////////////////////////////////////////////////////////
  69. inline CCryFile::CCryFile(const char* filename, const char* mode)
  70. {
  71. m_fileHandle = AZ::IO::InvalidHandle;
  72. Open(filename, mode);
  73. }
  74. //////////////////////////////////////////////////////////////////////////
  75. inline CCryFile::~CCryFile()
  76. {
  77. Close();
  78. }
  79. //////////////////////////////////////////////////////////////////////////
  80. // Notes:
  81. // For nOpenFlagsEx see IArchive::EFOpenFlags
  82. // See also:
  83. // IArchive::EFOpenFlags
  84. inline bool CCryFile::Open(const char* filename, const char* mode)
  85. {
  86. m_filename = filename;
  87. #if !defined (_RELEASE)
  88. if (auto console = AZ::Interface<AZ::IConsole>::Get(); console != nullptr)
  89. {
  90. if (bool lowercasePaths{}; console->GetCvarValue("ed_lowercasepaths", lowercasePaths) == AZ::GetValueResult::Success)
  91. {
  92. if (lowercasePaths)
  93. {
  94. AZStd::to_lower(m_filename.Native().begin(), m_filename.Native().end());
  95. }
  96. }
  97. }
  98. #endif
  99. if (m_fileHandle != AZ::IO::InvalidHandle)
  100. {
  101. Close();
  102. }
  103. AZ::IO::FileIOBase::GetInstance()->Open(m_filename.c_str(), AZ::IO::GetOpenModeFromStringMode(mode), m_fileHandle);
  104. return m_fileHandle != AZ::IO::InvalidHandle;
  105. }
  106. //////////////////////////////////////////////////////////////////////////
  107. inline void CCryFile::Close()
  108. {
  109. if (m_fileHandle != AZ::IO::InvalidHandle)
  110. {
  111. AZ::IO::FileIOBase::GetInstance()->Close(m_fileHandle);
  112. m_fileHandle = AZ::IO::InvalidHandle;
  113. m_filename.clear();
  114. }
  115. }
  116. //////////////////////////////////////////////////////////////////////////
  117. inline size_t CCryFile::Write(const void* lpBuf, size_t nSize)
  118. {
  119. AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot Write");
  120. if (AZ::IO::FileIOBase::GetInstance()->Write(m_fileHandle, lpBuf, nSize))
  121. {
  122. return nSize;
  123. }
  124. return 0;
  125. }
  126. //////////////////////////////////////////////////////////////////////////
  127. inline size_t CCryFile::ReadRaw(void* lpBuf, size_t nSize)
  128. {
  129. AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot Read");
  130. AZ::u64 bytesRead = 0;
  131. AZ::IO::FileIOBase::GetInstance()->Read(m_fileHandle, lpBuf, nSize, false, &bytesRead);
  132. return static_cast<size_t>(bytesRead);
  133. }
  134. //////////////////////////////////////////////////////////////////////////
  135. inline size_t CCryFile::GetLength()
  136. {
  137. AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot query file length");
  138. //long curr = ftell(m_file);
  139. AZ::u64 size = 0;
  140. AZ::IO::FileIOBase::GetInstance()->Size(m_fileHandle, size);
  141. return static_cast<size_t>(size);
  142. }
  143. //////////////////////////////////////////////////////////////////////////
  144. inline size_t CCryFile::Seek(size_t seek, int mode)
  145. {
  146. AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot seek in unopen file");
  147. if (AZ::IO::FileIOBase::GetInstance()->Seek(m_fileHandle, seek, AZ::IO::GetSeekTypeFromFSeekMode(mode)))
  148. {
  149. return 0;
  150. }
  151. return 1;
  152. }
  153. //////////////////////////////////////////////////////////////////////////
  154. inline bool CCryFile::IsInPak() const
  155. {
  156. if (auto archive = AZ::Interface<AZ::IO::IArchive>::Get();
  157. m_fileHandle != AZ::IO::InvalidHandle && archive != nullptr)
  158. {
  159. return !archive->GetFileArchivePath(m_fileHandle).empty();
  160. }
  161. return false;
  162. }
  163. //////////////////////////////////////////////////////////////////////////
  164. inline AZ::IO::PathView CCryFile::GetPakPath() const
  165. {
  166. if (auto archive = AZ::Interface<AZ::IO::IArchive>::Get();
  167. m_fileHandle != AZ::IO::InvalidHandle && archive != nullptr)
  168. {
  169. if (AZ::IO::PathView sPath(archive->GetFileArchivePath(m_fileHandle)); sPath.empty())
  170. {
  171. return sPath;
  172. }
  173. }
  174. return {};
  175. }