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