1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: fs_FileSystemBase.h
4
5 Copyright (C)2009-2012 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 46347 $
14 *---------------------------------------------------------------------------*/
15
16 #ifndef NN_FS_FS_FILESYSTEMBASE_H_
17 #define NN_FS_FS_FILESYSTEMBASE_H_
18
19 #include <cstdlib>
20 #include <cstring>
21 #include <cwchar>
22 #include <nn/err.h>
23 #include <nn/fs/fs_Parameters.h>
24 #include <nn/util/util_Result.h>
25
26 #ifdef NN_PLATFORM_CTR
27 #include <nn/fs/CTR/fs_FileSystemBase.h>
28 #endif
29
30 namespace nn { namespace fs { namespace detail {
31
32 class FileSystemBase
33 {
34 public:
FileSystemBase()35 FileSystemBase() : m_pImpl(NULL) {};
~FileSystemBase()36 ~FileSystemBase() {};
37
38 void Initialize(FileSystemBaseImpl& impl);
39 void Finalize();
40
41 void DeleteFile( const wchar_t* pathName );
42 void DeleteFile( const char* pathName );
43 Result TryDeleteFile( const wchar_t* pathName );
44 Result TryDeleteFile( const char* pathName );
45 void RenameFile( const wchar_t* currentPath, const wchar_t* newPath);
46 void RenameFile( const char* currentPath, const char* newPath);
47 Result TryRenameFile( const wchar_t* currentPath, const wchar_t* newPath);
48 Result TryRenameFile( const char* currentPath, const char* newPath);
49 void DeleteDirectory( const wchar_t* pathName );
50 void DeleteDirectory( const char* pathName );
51 Result TryDeleteDirectory( const wchar_t* pathName );
52 Result TryDeleteDirectory( const char* pathName );
53 void DeleteDirectoryRecursively( const wchar_t* pathName );
54 void DeleteDirectoryRecursively( const char* pathName );
55 Result TryDeleteDirectoryRecursively( const wchar_t* pathName );
56 Result TryDeleteDirectoryRecursively( const char* pathName );
57 void CreateFile( const wchar_t* pathName, s64 size );
58 void CreateFile( const char* pathName, s64 size );
59 Result TryCreateFile( const wchar_t* pathName, s64 size );
60 Result TryCreateFile( const char* pathName, s64 size );
61 void CreateDirectory( const wchar_t* pathName );
62 void CreateDirectory( const char* pathName );
63 Result TryCreateDirectory( const wchar_t* pathName );
64 Result TryCreateDirectory( const char* pathName );
65 void RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
66 void RenameDirectory( const char* currentPath, const char* newPath);
67 Result TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
68 Result TryRenameDirectory( const char* currentPath, const char* newPath);
69
70 private:
71 FileSystemBaseImpl* m_pImpl;
72 };
73
ConvertMbsToWcs(wchar_t * dst0,size_t dstLength,const char * src0)74 inline void ConvertMbsToWcs(wchar_t* dst0, size_t dstLength, const char* src0)
75 {
76 NN_UNUSED_VAR(dstLength);
77 std::mbstate_t mbstate;
78 std::memset(&mbstate, 0, sizeof(mbstate));
79 std::mbsinit(&mbstate);
80 const char* src = src0;
81 wchar_t* dst = dst0;
82 while (true)
83 {
84 size_t cLen = std::mbrlen(src, MAX_FILE_PATH_LENGTH, &mbstate);
85 if (cLen == 0)
86 {
87 *dst = L'\0';
88 break;
89 }
90 NN_TASSERTMSG_(static_cast<int>(cLen) > 0, "invalid multibyte character");
91 int c = std::mbrtowc(dst, src, cLen, &mbstate);
92 if (c == 0)
93 {
94 *dst = L'\0';
95 break;
96 }
97 NN_TASSERT_(c > 0);
98 NN_TASSERT_(dst - dst0 <= dstLength);
99 dst++;
100 src += cLen;
101 }
102 }
103
104 class WPathBuffer
105 {
106 public:
WPathBuffer(const char * pathName)107 explicit WPathBuffer(const char* pathName)
108 {
109 ConvertMbsToWcs(m_pBuffer, sizeof(m_pBuffer)/sizeof(m_pBuffer[0])-1, pathName);
110 }
~WPathBuffer()111 ~WPathBuffer() {}
112
GetBuffer()113 const wchar_t* GetBuffer() const { return m_pBuffer; }
114
115 private:
116 wchar_t m_pBuffer[MAX_FILE_PATH_LENGTH + 1 + 8];
117 };
118
Initialize(FileSystemBaseImpl & impl)119 inline void FileSystemBase::Initialize(FileSystemBaseImpl& impl)
120 {
121 NN_TASSERT_(!m_pImpl);
122
123 m_pImpl = &impl;
124 }
125
Finalize()126 inline void FileSystemBase::Finalize()
127 {
128 m_pImpl->Finalize();
129 m_pImpl = NULL;
130 }
131
DeleteFile(const wchar_t * pathName)132 inline void FileSystemBase::DeleteFile(const wchar_t* pathName)
133 {
134 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteFile(pathName));
135 }
136
DeleteFile(const char * pathName)137 inline void FileSystemBase::DeleteFile(const char* pathName)
138 {
139 WPathBuffer wpath(pathName);
140 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteFile(wpath.GetBuffer()));
141 }
142
TryDeleteFile(const wchar_t * pathName)143 inline Result FileSystemBase::TryDeleteFile(const wchar_t* pathName)
144 {
145 return m_pImpl->TryDeleteFile(pathName);
146 }
147
TryDeleteFile(const char * pathName)148 inline Result FileSystemBase::TryDeleteFile(const char* pathName)
149 {
150 WPathBuffer wpath(pathName);
151 return m_pImpl->TryDeleteFile(wpath.GetBuffer());
152 }
153
RenameFile(const wchar_t * currentPath,const wchar_t * newPath)154 inline void FileSystemBase::RenameFile( const wchar_t* currentPath, const wchar_t* newPath)
155 {
156 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameFile(currentPath, newPath));
157 }
158
RenameFile(const char * currentPath,const char * newPath)159 inline void FileSystemBase::RenameFile( const char* currentPath, const char* newPath)
160 {
161 WPathBuffer wcurStr(currentPath);
162 WPathBuffer wnewStr(newPath);
163 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
164 }
165
TryRenameFile(const wchar_t * currentPath,const wchar_t * newPath)166 inline Result FileSystemBase::TryRenameFile( const wchar_t* currentPath, const wchar_t* newPath)
167 {
168 return m_pImpl->TryRenameFile(currentPath, newPath);
169 }
170
TryRenameFile(const char * currentPath,const char * newPath)171 inline Result FileSystemBase::TryRenameFile( const char* currentPath, const char* newPath)
172 {
173 WPathBuffer wcurStr(currentPath);
174 WPathBuffer wnewStr(newPath);
175 return m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer());
176 }
177
DeleteDirectory(const wchar_t * pathName)178 inline void FileSystemBase::DeleteDirectory(const wchar_t* pathName)
179 {
180 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectory(pathName));
181 }
182
DeleteDirectory(const char * pathName)183 inline void FileSystemBase::DeleteDirectory(const char* pathName)
184 {
185 WPathBuffer wpath(pathName);
186 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectory(wpath.GetBuffer()));
187 }
188
DeleteDirectoryRecursively(const wchar_t * pathName)189 inline void FileSystemBase::DeleteDirectoryRecursively(const wchar_t* pathName)
190 {
191 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectoryRecursively(pathName));
192 }
193
DeleteDirectoryRecursively(const char * pathName)194 inline void FileSystemBase::DeleteDirectoryRecursively(const char* pathName)
195 {
196 WPathBuffer wpath(pathName);
197 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer()));
198 }
199
TryDeleteDirectory(const wchar_t * pathName)200 inline Result FileSystemBase::TryDeleteDirectory(const wchar_t* pathName)
201 {
202 return m_pImpl->TryDeleteDirectory(pathName);
203 }
204
TryDeleteDirectory(const char * pathName)205 inline Result FileSystemBase::TryDeleteDirectory(const char* pathName)
206 {
207 WPathBuffer wpath(pathName);
208 return m_pImpl->TryDeleteDirectory(wpath.GetBuffer());
209 }
210
TryDeleteDirectoryRecursively(const wchar_t * pathName)211 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const wchar_t* pathName)
212 {
213 return m_pImpl->TryDeleteDirectoryRecursively(pathName);
214 }
215
TryDeleteDirectoryRecursively(const char * pathName)216 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const char* pathName)
217 {
218 WPathBuffer wpath(pathName);
219 return m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer());
220 }
221
CreateFile(const wchar_t * pathName,s64 size)222 inline void FileSystemBase::CreateFile(const wchar_t* pathName, s64 size)
223 {
224 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateFile(pathName, size));
225 }
226
CreateFile(const char * pathName,s64 size)227 inline void FileSystemBase::CreateFile(const char* pathName, s64 size)
228 {
229 WPathBuffer wpath(pathName);
230 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateFile(wpath.GetBuffer(), size));
231 }
232
TryCreateFile(const wchar_t * pathName,s64 size)233 inline Result FileSystemBase::TryCreateFile(const wchar_t* pathName, s64 size)
234 {
235 return m_pImpl->TryCreateFile(pathName, size);
236 }
237
TryCreateFile(const char * pathName,s64 size)238 inline Result FileSystemBase::TryCreateFile(const char* pathName, s64 size)
239 {
240 WPathBuffer wpath(pathName);
241 return m_pImpl->TryCreateFile(wpath.GetBuffer(), size);
242 }
243
CreateDirectory(const wchar_t * pathName)244 inline void FileSystemBase::CreateDirectory(const wchar_t* pathName)
245 {
246 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateDirectory(pathName));
247 }
248
CreateDirectory(const char * pathName)249 inline void FileSystemBase::CreateDirectory(const char* pathName)
250 {
251 WPathBuffer wpath(pathName);
252 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateDirectory(wpath.GetBuffer()));
253 }
254
TryCreateDirectory(const wchar_t * pathName)255 inline Result FileSystemBase::TryCreateDirectory(const wchar_t* pathName)
256 {
257 return m_pImpl->TryCreateDirectory(pathName);
258 }
259
TryCreateDirectory(const char * pathName)260 inline Result FileSystemBase::TryCreateDirectory(const char* pathName)
261 {
262 WPathBuffer wpath(pathName);
263 return m_pImpl->TryCreateDirectory(wpath.GetBuffer());
264 }
265
RenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)266 inline void FileSystemBase::RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
267 {
268 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameDirectory(currentPath, newPath));
269 }
270
RenameDirectory(const char * currentPath,const char * newPath)271 inline void FileSystemBase::RenameDirectory( const char* currentPath, const char* newPath)
272 {
273 WPathBuffer wcurStr(currentPath);
274 WPathBuffer wnewStr(newPath);
275 NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
276 }
277
TryRenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)278 inline Result FileSystemBase::TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
279 {
280 return m_pImpl->TryRenameDirectory(currentPath, newPath);
281 }
282
TryRenameDirectory(const char * currentPath,const char * newPath)283 inline Result FileSystemBase::TryRenameDirectory( const char* currentPath, const char* newPath)
284 {
285 WPathBuffer wcurStr(currentPath);
286 WPathBuffer wnewStr(newPath);
287 return m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer());
288 }
289
290 void RegisterGlobalFileSystemBase(FileSystemBase& base);
291 FileSystemBase& GetGlobalFileSystemBase();
292
293 }}}
294 #endif
295