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