LibraryLink Utilities  3.0.1
Modern C++ wrapper over LibraryLink and WSTP
FileUtilities.h
Go to the documentation of this file.
1 
6 #ifndef LLU_FILEUTILITIES_H
7 #define LLU_FILEUTILITIES_H
8 
9 #include <codecvt>
10 #include <cstdio>
11 #include <fstream>
12 #include <ios>
13 #include <locale>
14 #include <memory>
15 #include <string>
16 
17 namespace LLU {
19  using FilePtr = std::unique_ptr<std::FILE, int (*)(std::FILE*)>;
20 
27  FilePtr claimFile(std::FILE* f);
28 
34  void validatePath(const std::string& fileName, std::ios::openmode mode);
35 
43  template<typename T>
44  std::basic_string<T> fromUTF8toUTF16(const std::string& source) {
45 #ifdef _WIN32
46  // On Windows with VS2017 only conversion to wchar_t is supported, so we have no choice here
47  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convertor;
48  if constexpr (!std::is_same_v<T, wchar_t>) {
49  std::wstring tmp = convertor.from_bytes(source);
50  return std::basic_string<T> { std::begin(tmp), std::end(tmp) };
51  } else {
52  return convertor.from_bytes(source);
53  }
54 #else
55  std::wstring_convert<std::codecvt_utf8_utf16<T>, T> convertor;
56  return convertor.from_bytes(source);
57 #endif
58  }
59 
67  template<typename T>
68  std::string fromUTF16toUTF8(const std::basic_string<T>& source) {
69 #ifdef _WIN32
70  // On Windows with VS2017 only conversion from wchar_t is supported, so we have no choice here
71  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convertor;
72  if constexpr (!std::is_same_v<T, wchar_t>) {
73  return convertor.to_bytes(std::wstring { std::begin(source), std::end(source) });
74  } else {
75  return convertor.to_bytes(source);
76  }
77 #else
78  std::wstring_convert<std::codecvt_utf8_utf16<T>, T> convertor;
79  return convertor.to_bytes(source);
80 #endif
81  }
82 
89  template<typename T>
90  std::basic_string<T> fromUTF8toUTF32(const std::string& source) {
91 #ifdef _WIN32
92  // On Windows with VS2017 we always convert to uint32_t
93  std::wstring_convert<std::codecvt_utf8<uint32_t>, uint32_t> convertor;
94  if constexpr (!std::is_same_v<T, uint32_t>) {
95  std::basic_string<uint32_t> tmp = convertor.from_bytes(source);
96  return std::basic_string<T> { std::begin(tmp), std::end(tmp) };
97  } else {
98  return convertor.from_bytes(source);
99  }
100 #else
101  std::wstring_convert<std::codecvt_utf8<T>, T> convertor;
102  return convertor.from_bytes(source);
103 #endif
104  }
105 
112  template<typename T>
113  std::string fromUTF32toUTF8(const std::basic_string<T>& source) {
114 #ifdef _WIN32
115  // On Windows with VS2017 we always convert from uint32_t
116  std::wstring_convert<std::codecvt_utf8<uint32_t>, uint32_t> convertor;
117  if constexpr (!std::is_same_v<T, uint32_t>) {
118  return convertor.to_bytes(std::basic_string<uint32_t> { std::begin(source), std::end(source) });
119  } else {
120  return convertor.to_bytes(source);
121  }
122 #else
123  std::wstring_convert<std::codecvt_utf8<T>, T> convertor;
124  return convertor.to_bytes(source.data());
125 #endif
126  }
127 
133  struct SharePolicy {
134  virtual ~SharePolicy() = default;
135 
140  virtual int flag(std::ios::openmode /*mode*/) const;
141  };
142 
148  int flag(std::ios::openmode m) const override;
149  };
150 
161  FilePtr openFile(const std::string& fileName, std::ios::openmode mode, const SharePolicy& shp = AlwaysReadExclusiveWrite {});
162 
173  std::fstream openFileStream(const std::string& fileName, std::ios::openmode mode, const SharePolicy& shp = AlwaysReadExclusiveWrite {});
174 } // namespace LLU
175 
176 #endif // LLU_FILEUTILITIES_H
LLU::FilePtr
std::unique_ptr< std::FILE, int(*)(std::FILE *)> FilePtr
Smart pointer type around std::FILE.
Definition: FileUtilities.h:19
LLU::fromUTF32toUTF8
std::string fromUTF32toUTF8(const std::basic_string< T > &source)
Convert string from UTF32 to UTF8.
Definition: FileUtilities.h:113
LLU::SharePolicy::flag
virtual int flag(std::ios::openmode) const
Base share policy - shared read access when file opened readonly, exclusive access otherwise.
Definition: FileUtilities.cpp:74
LLU::fromUTF8toUTF16
std::basic_string< T > fromUTF8toUTF16(const std::string &source)
Convert string from UTF8 to UTF16.
Definition: FileUtilities.h:44
LLU
Main namespace of LibraryLink Utilities.
Definition: Queue.h:13
LLU::fromUTF8toUTF32
std::basic_string< T > fromUTF8toUTF32(const std::string &source)
Convert string from UTF8 to UTF32.
Definition: FileUtilities.h:90
LLU::claimFile
FilePtr claimFile(std::FILE *f)
Create a unique owning pointer of a FILE.
Definition: FileUtilities.cpp:62
LLU::AlwaysReadExclusiveWrite
Default policy for Import/Export paclets - always allow reading, deny writing when we write.
Definition: FileUtilities.h:147
LLU::openFileStream
std::fstream openFileStream(const std::string &fileName, std::ios::openmode mode, const SharePolicy &shp=AlwaysReadExclusiveWrite {})
Open a file stream with specified mode (read, write, append, etc.).
Definition: FileUtilities.cpp:111
LLU::openFile
FilePtr openFile(const std::string &fileName, std::ios::openmode mode, const SharePolicy &shp=AlwaysReadExclusiveWrite {})
Open given file with specified mode (read, write, append, etc.).
Definition: FileUtilities.cpp:91
LLU::fromUTF16toUTF8
std::string fromUTF16toUTF8(const std::basic_string< T > &source)
Convert string from UTF16 to UTF8.
Definition: FileUtilities.h:68
LLU::SharePolicy
Base class for shared access policies on Windows.
Definition: FileUtilities.h:133
LLU::validatePath
void validatePath(const std::string &fileName, std::ios::openmode mode)
Check if the file fileName under open mode mode is accessible in the current sandbox setting.
Definition: FileUtilities.cpp:66
LLU::AlwaysReadExclusiveWrite::flag
int flag(std::ios::openmode m) const override
Base share policy - shared read access when file opened readonly, exclusive access otherwise.
Definition: FileUtilities.cpp:82