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: 25433 $
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 CreateDirectory( const wchar_t* pathName );
56     void CreateDirectory( const char* pathName );
57     Result TryCreateDirectory( const wchar_t* pathName );
58     Result TryCreateDirectory( const char* pathName );
59     void RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
60     void RenameDirectory( const char* currentPath, const char* newPath);
61     Result TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath);
62     Result TryRenameDirectory( const char* currentPath, const char* newPath);
63 
64 private:
65     FileSystemBaseImpl* m_pImpl;
66 };
67 
68 class WPathBuffer
69 {
70 public:
WPathBuffer(const char * pathName)71     WPathBuffer(const char* pathName)
72     {
73         ::std::mbstowcs(m_pBuffer, pathName, sizeof(m_pBuffer) / sizeof(*m_pBuffer));
74     }
~WPathBuffer()75     ~WPathBuffer() {}
76 
GetBuffer()77     const wchar_t* GetBuffer() const { return m_pBuffer; }
78 
79 private:
80     wchar_t m_pBuffer[MAX_FILE_PATH_LENGTH + 1 + 8];
81 };
82 
Initialize(FileSystemBaseImpl & impl)83 inline void FileSystemBase::Initialize(FileSystemBaseImpl& impl)
84 {
85     NN_TASSERT_(!m_pImpl);
86 
87     m_pImpl = &impl;
88 }
89 
Finalize()90 inline void FileSystemBase::Finalize()
91 {
92     m_pImpl->Finalize();
93 }
94 
DeleteFile(const wchar_t * pathName)95 inline void FileSystemBase::DeleteFile(const wchar_t* pathName)
96 {
97     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteFile(pathName));
98 }
99 
DeleteFile(const char * pathName)100 inline void FileSystemBase::DeleteFile(const char* pathName)
101 {
102     WPathBuffer wpath(pathName);
103     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteFile(wpath.GetBuffer()));
104 }
105 
TryDeleteFile(const wchar_t * pathName)106 inline Result FileSystemBase::TryDeleteFile(const wchar_t* pathName)
107 {
108     return m_pImpl->TryDeleteFile(pathName);
109 }
110 
TryDeleteFile(const char * pathName)111 inline Result FileSystemBase::TryDeleteFile(const char* pathName)
112 {
113     WPathBuffer wpath(pathName);
114     return m_pImpl->TryDeleteFile(wpath.GetBuffer());
115 }
116 
RenameFile(const wchar_t * currentPath,const wchar_t * newPath)117 inline void FileSystemBase::RenameFile( const wchar_t* currentPath, const wchar_t* newPath)
118 {
119     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryRenameFile(currentPath, newPath));
120 }
121 
RenameFile(const char * currentPath,const char * newPath)122 inline void FileSystemBase::RenameFile( const char* currentPath, const char* newPath)
123 {
124     WPathBuffer wcurStr(currentPath);
125     WPathBuffer wnewStr(newPath);
126     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
127 }
128 
TryRenameFile(const wchar_t * currentPath,const wchar_t * newPath)129 inline Result FileSystemBase::TryRenameFile( const wchar_t* currentPath, const wchar_t* newPath)
130 {
131     return m_pImpl->TryRenameFile(currentPath, newPath);
132 }
133 
TryRenameFile(const char * currentPath,const char * newPath)134 inline Result FileSystemBase::TryRenameFile( const char* currentPath, const char* newPath)
135 {
136     WPathBuffer wcurStr(currentPath);
137     WPathBuffer wnewStr(newPath);
138     return m_pImpl->TryRenameFile(wcurStr.GetBuffer(), wnewStr.GetBuffer());
139 }
140 
DeleteDirectory(const wchar_t * pathName)141 inline void FileSystemBase::DeleteDirectory(const wchar_t* pathName)
142 {
143     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteDirectory(pathName));
144 }
145 
DeleteDirectory(const char * pathName)146 inline void FileSystemBase::DeleteDirectory(const char* pathName)
147 {
148     WPathBuffer wpath(pathName);
149     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteDirectory(wpath.GetBuffer()));
150 }
151 
DeleteDirectoryRecursively(const wchar_t * pathName)152 inline void FileSystemBase::DeleteDirectoryRecursively(const wchar_t* pathName)
153 {
154     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteDirectoryRecursively(pathName));
155 }
156 
DeleteDirectoryRecursively(const char * pathName)157 inline void FileSystemBase::DeleteDirectoryRecursively(const char* pathName)
158 {
159     WPathBuffer wpath(pathName);
160     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer()));
161 }
162 
TryDeleteDirectory(const wchar_t * pathName)163 inline Result FileSystemBase::TryDeleteDirectory(const wchar_t* pathName)
164 {
165     return m_pImpl->TryDeleteDirectory(pathName);
166 }
167 
TryDeleteDirectory(const char * pathName)168 inline Result FileSystemBase::TryDeleteDirectory(const char* pathName)
169 {
170     WPathBuffer wpath(pathName);
171     return m_pImpl->TryDeleteDirectory(wpath.GetBuffer());
172 }
173 
TryDeleteDirectoryRecursively(const wchar_t * pathName)174 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const wchar_t* pathName)
175 {
176     return m_pImpl->TryDeleteDirectoryRecursively(pathName);
177 }
178 
TryDeleteDirectoryRecursively(const char * pathName)179 inline Result FileSystemBase::TryDeleteDirectoryRecursively(const char* pathName)
180 {
181     WPathBuffer wpath(pathName);
182     return m_pImpl->TryDeleteDirectoryRecursively(wpath.GetBuffer());
183 }
184 
CreateDirectory(const wchar_t * pathName)185 inline void FileSystemBase::CreateDirectory(const wchar_t* pathName)
186 {
187     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryCreateDirectory(pathName));
188 }
189 
CreateDirectory(const char * pathName)190 inline void FileSystemBase::CreateDirectory(const char* pathName)
191 {
192     WPathBuffer wpath(pathName);
193     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryCreateDirectory(wpath.GetBuffer()));
194 }
195 
TryCreateDirectory(const wchar_t * pathName)196 inline Result FileSystemBase::TryCreateDirectory(const wchar_t* pathName)
197 {
198     return m_pImpl->TryCreateDirectory(pathName);
199 }
200 
TryCreateDirectory(const char * pathName)201 inline Result FileSystemBase::TryCreateDirectory(const char* pathName)
202 {
203     WPathBuffer wpath(pathName);
204     return m_pImpl->TryCreateDirectory(wpath.GetBuffer());
205 }
206 
RenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)207 inline void FileSystemBase::RenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
208 {
209     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryRenameDirectory(currentPath, newPath));
210 }
211 
RenameDirectory(const char * currentPath,const char * newPath)212 inline void FileSystemBase::RenameDirectory( const char* currentPath, const char* newPath)
213 {
214     WPathBuffer wcurStr(currentPath);
215     WPathBuffer wnewStr(newPath);
216     NN_UTIL_PANIC_IF_FAILED(m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer()));
217 }
218 
TryRenameDirectory(const wchar_t * currentPath,const wchar_t * newPath)219 inline Result FileSystemBase::TryRenameDirectory( const wchar_t* currentPath, const wchar_t* newPath)
220 {
221     return m_pImpl->TryRenameDirectory(currentPath, newPath);
222 }
223 
TryRenameDirectory(const char * currentPath,const char * newPath)224 inline Result FileSystemBase::TryRenameDirectory( const char* currentPath, const char* newPath)
225 {
226     WPathBuffer wcurStr(currentPath);
227     WPathBuffer wnewStr(newPath);
228     return m_pImpl->TryRenameDirectory(wcurStr.GetBuffer(), wnewStr.GetBuffer());
229 }
230 
231 void RegisterGlobalFileSystemBase(FileSystemBase& base);
232 FileSystemBase& GetGlobalFileSystemBase();
233 
234 }}}
235 #endif
236