1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fs_FileSystemBase.h
4 
5   Copyright (C)2009 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: 35057 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FS_FS_FILESYSTEMBASE_H_
17 #define NN_FS_FS_FILESYSTEMBASE_H_
18 
19 #include <cstdlib>
20 #include <cwchar>
21 #include <nn/err.h>
22 #include <nn/fs/fs_Parameters.h>
23 #include <nn/util/util_Result.h>
24 
25 #ifdef NN_PLATFORM_CTR
26     #include <nn/fs/CTR/fs_FileSystemBase.h>
27 #endif
28 
29 namespace nn { namespace fs { namespace detail {
30 
31 class FileSystemBase
32 {
33 public:
FileSystemBase()34     FileSystemBase() : m_pImpl(NULL) {};
~FileSystemBase()35     ~FileSystemBase() {};
36 
37     void Initialize(FileSystemBaseImpl& impl);
38     void Finalize();
39 
40     void DeleteFile( const wchar_t* pathName );
41     void DeleteFile( const char* pathName );
42     Result TryDeleteFile( const wchar_t* pathName );
43     Result TryDeleteFile( const char* pathName );
44     void RenameFile( const wchar_t* currentPath, const wchar_t* newPath);
45     void RenameFile( const char* currentPath, const char* newPath);
46     Result TryRenameFile( const wchar_t* currentPath, const wchar_t* newPath);
47     Result TryRenameFile( const char* currentPath, const char* newPath);
48     void DeleteDirectory( const wchar_t* pathName );
49     void DeleteDirectory( const char* pathName );
50     Result TryDeleteDirectory( const wchar_t* pathName );
51     Result TryDeleteDirectory( const char* pathName );
52     void DeleteDirectoryRecursively( const wchar_t* pathName );
53     void DeleteDirectoryRecursively( const char* pathName );
54     Result TryDeleteDirectoryRecursively( const wchar_t* pathName );
55     Result TryDeleteDirectoryRecursively( const char* pathName );
56     void CreateFile( const wchar_t* pathName, s64 size );
57     void CreateFile( const char* pathName, s64 size );
58     Result TryCreateFile( const wchar_t* pathName, s64 size );
59     Result TryCreateFile( const char* pathName, s64 size );
60     void CreateDirectory( const wchar_t* pathName );
61     void CreateDirectory( const char* pathName );
62     Result TryCreateDirectory( const wchar_t* pathName );
63     Result TryCreateDirectory( const char* pathName );
64     void RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
65     void RenameDirectory( const char* currentPath, const char* newPath);
66     Result TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
67     Result TryRenameDirectory( const char* currentPath, const char* newPath);
68 
69 private:
70     FileSystemBaseImpl* m_pImpl;
71 };
72 
73 class WPathBuffer
74 {
75 public:
WPathBuffer(const char * pathName)76     explicit WPathBuffer(const char* pathName)
77     {
78         ::std::mbstowcs(m_pBuffer, pathName, sizeof(m_pBuffer) / sizeof(*m_pBuffer));
79     }
~WPathBuffer()80     ~WPathBuffer() {}
81 
GetBuffer()82     const wchar_t* GetBuffer() const { return m_pBuffer; }
83 
84 private:
85     wchar_t m_pBuffer[MAX_FILE_PATH_LENGTH + 1 + 8];
86 };
87 
Initialize(FileSystemBaseImpl & impl)88 inline void FileSystemBase::Initialize(FileSystemBaseImpl& impl)
89 {
90     NN_TASSERT_(!m_pImpl);
91 
92     m_pImpl = &impl;
93 }
94 
Finalize()95 inline void FileSystemBase::Finalize()
96 {
97     m_pImpl->Finalize();
98     m_pImpl = NULL;
99 }
100 
DeleteFile(const wchar_t * pathName)101 inline void FileSystemBase::DeleteFile(const wchar_t* pathName)
102 {
103     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteFile(pathName));
104 }
105 
DeleteFile(const char * pathName)106 inline void FileSystemBase::DeleteFile(const char* pathName)
107 {
108     WPathBuffer wpath(pathName);
109     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteFile(wpath.GetBuffer()));
110 }
111 
TryDeleteFile(const wchar_t * pathName)112 inline Result FileSystemBase::TryDeleteFile(const wchar_t* pathName)
113 {
114     return m_pImpl->TryDeleteFile(pathName);
115 }
116 
TryDeleteFile(const char * pathName)117 inline Result FileSystemBase::TryDeleteFile(const char* pathName)
118 {
119     WPathBuffer wpath(pathName);
120     return m_pImpl->TryDeleteFile(wpath.GetBuffer());
121 }
122 
RenameFile(const wchar_t * currentPath,const wchar_t * newPath)123 inline void FileSystemBase::RenameFile( const wchar_t* currentPath, const wchar_t* newPath)
124 {
125     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameFile(currentPath, newPath));
126 }
127 
RenameFile(const char * currentPath,const char * newPath)128 inline void FileSystemBase::RenameFile( const char* currentPath, const char* newPath)
129 {
130     WPathBuffer wcurStr(currentPath);
131     WPathBuffer wnewStr(newPath);
132     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
133 }
134 
TryRenameFile(const wchar_t * currentPath,const wchar_t * newPath)135 inline Result FileSystemBase::TryRenameFile( const wchar_t* currentPath, const wchar_t* newPath)
136 {
137     return m_pImpl->TryRenameFile(currentPath, newPath);
138 }
139 
TryRenameFile(const char * currentPath,const char * newPath)140 inline Result FileSystemBase::TryRenameFile( const char* currentPath, const char* newPath)
141 {
142     WPathBuffer wcurStr(currentPath);
143     WPathBuffer wnewStr(newPath);
144     return m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer());
145 }
146 
DeleteDirectory(const wchar_t * pathName)147 inline void FileSystemBase::DeleteDirectory(const wchar_t* pathName)
148 {
149     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectory(pathName));
150 }
151 
DeleteDirectory(const char * pathName)152 inline void FileSystemBase::DeleteDirectory(const char* pathName)
153 {
154     WPathBuffer wpath(pathName);
155     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectory(wpath.GetBuffer()));
156 }
157 
DeleteDirectoryRecursively(const wchar_t * pathName)158 inline void FileSystemBase::DeleteDirectoryRecursively(const wchar_t* pathName)
159 {
160     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectoryRecursively(pathName));
161 }
162 
DeleteDirectoryRecursively(const char * pathName)163 inline void FileSystemBase::DeleteDirectoryRecursively(const char* pathName)
164 {
165     WPathBuffer wpath(pathName);
166     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer()));
167 }
168 
TryDeleteDirectory(const wchar_t * pathName)169 inline Result FileSystemBase::TryDeleteDirectory(const wchar_t* pathName)
170 {
171     return m_pImpl->TryDeleteDirectory(pathName);
172 }
173 
TryDeleteDirectory(const char * pathName)174 inline Result FileSystemBase::TryDeleteDirectory(const char* pathName)
175 {
176     WPathBuffer wpath(pathName);
177     return m_pImpl->TryDeleteDirectory(wpath.GetBuffer());
178 }
179 
TryDeleteDirectoryRecursively(const wchar_t * pathName)180 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const wchar_t* pathName)
181 {
182     return m_pImpl->TryDeleteDirectoryRecursively(pathName);
183 }
184 
TryDeleteDirectoryRecursively(const char * pathName)185 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const char* pathName)
186 {
187     WPathBuffer wpath(pathName);
188     return m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer());
189 }
190 
CreateFile(const wchar_t * pathName,s64 size)191 inline void FileSystemBase::CreateFile(const wchar_t* pathName, s64 size)
192 {
193     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateFile(pathName, size));
194 }
195 
CreateFile(const char * pathName,s64 size)196 inline void FileSystemBase::CreateFile(const char* pathName, s64 size)
197 {
198     WPathBuffer wpath(pathName);
199     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateFile(wpath.GetBuffer(), size));
200 }
201 
TryCreateFile(const wchar_t * pathName,s64 size)202 inline Result FileSystemBase::TryCreateFile(const wchar_t* pathName, s64 size)
203 {
204     return m_pImpl->TryCreateFile(pathName, size);
205 }
206 
TryCreateFile(const char * pathName,s64 size)207 inline Result FileSystemBase::TryCreateFile(const char* pathName, s64 size)
208 {
209     WPathBuffer wpath(pathName);
210     return m_pImpl->TryCreateFile(wpath.GetBuffer(), size);
211 }
212 
CreateDirectory(const wchar_t * pathName)213 inline void FileSystemBase::CreateDirectory(const wchar_t* pathName)
214 {
215     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateDirectory(pathName));
216 }
217 
CreateDirectory(const char * pathName)218 inline void FileSystemBase::CreateDirectory(const char* pathName)
219 {
220     WPathBuffer wpath(pathName);
221     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryCreateDirectory(wpath.GetBuffer()));
222 }
223 
TryCreateDirectory(const wchar_t * pathName)224 inline Result FileSystemBase::TryCreateDirectory(const wchar_t* pathName)
225 {
226     return m_pImpl->TryCreateDirectory(pathName);
227 }
228 
TryCreateDirectory(const char * pathName)229 inline Result FileSystemBase::TryCreateDirectory(const char* pathName)
230 {
231     WPathBuffer wpath(pathName);
232     return m_pImpl->TryCreateDirectory(wpath.GetBuffer());
233 }
234 
RenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)235 inline void FileSystemBase::RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
236 {
237     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameDirectory(currentPath, newPath));
238 }
239 
RenameDirectory(const char * currentPath,const char * newPath)240 inline void FileSystemBase::RenameDirectory( const char* currentPath, const char* newPath)
241 {
242     WPathBuffer wcurStr(currentPath);
243     WPathBuffer wnewStr(newPath);
244     NN_ERR_THROW_FATAL_ALL(m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
245 }
246 
TryRenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)247 inline Result FileSystemBase::TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
248 {
249     return m_pImpl->TryRenameDirectory(currentPath, newPath);
250 }
251 
TryRenameDirectory(const char * currentPath,const char * newPath)252 inline Result FileSystemBase::TryRenameDirectory( const char* currentPath, const char* newPath)
253 {
254     WPathBuffer wcurStr(currentPath);
255     WPathBuffer wnewStr(newPath);
256     return m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer());
257 }
258 
259 void RegisterGlobalFileSystemBase(FileSystemBase& base);
260 FileSystemBase& GetGlobalFileSystemBase();
261 
262 }}}
263 #endif
264