1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     fs_FileBase.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: 22754 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FS_FS_FILEBASE_H_
17 #define NN_FS_FS_FILEBASE_H_
18 
19 #include <cstdlib>
20 #include <cwchar>
21 #include <nn/fs/fs_Parameters.h>
22 #include <nn/util/util_Int64.h>
23 
24 #ifdef NN_PLATFORM_CTR
25     #include <nn/fs/CTR/fs_FileBase.h>
26 #endif
27 
28 namespace nn { namespace fs { namespace detail {
29 
30 class FileBase : public FileBaseImpl
31 {
32 protected:
FileBase()33     FileBase() : m_Position(0), m_Size(0) {}
34     FileBase(const wchar_t* pathName, bit32 mode);
35     FileBase(const char* pathName, bit32 mode);
36     void Initialize(const wchar_t* pathName, bit32 mode);
37     void Initialize(const char* pathName, bit32 mode);
38     nn::Result TryInitialize(const wchar_t* pathName, bit32 mode);
39     nn::Result TryInitialize(const char* pathName, bit32 mode);
40     nn::Result TryInitialize(const wchar_t* pathName, bit32 mode, nn::fs::PathMark pathMark);
41 
42     nn::Result TryRead(s32* pOut, void* buffer, size_t size);
43     nn::Result TryWrite(s32* pOut, const void* buffer, size_t size);
44     nn::Result TrySeek(s64 position, PositionBase base);
45     nn::Result TryGetPosition(s64* pOut) const;
46     nn::Result TrySetPosition(s64 position);
47     nn::Result TryGetSize(s64* pOut) const;
48     nn::Result TrySetSize(s64 size);
49     s32 Read(void* buffer, size_t size);
50     s32 Write(const void* buffer, size_t size);
51     void Seek(s64 position, PositionBase base);
52     s64 GetPosition() const;
53     void SetPosition(s64 position);
54     s64 GetSize() const;
55     void SetSize(s64 size);
56 
57 private:
58 
59     typedef nn::util::Int64<s64> S64;
60     S64 m_Position;
61     mutable S64 m_Size;
62 
63 };
64 
TryInitialize(const wchar_t * pathName,bit32 mode)65 inline nn::Result FileBase::TryInitialize(const wchar_t* pathName, bit32 mode)
66 {
67     this->m_Position = this->m_Size = 0;
68     return TryOpenImpl(pathName, mode);
69 }
70 
TryInitialize(const char * pathName,bit32 mode)71 inline nn::Result FileBase::TryInitialize(const char* pathName, bit32 mode)
72 {
73     static const size_t BUF_SIZE = MAX_PATHNAME_WCHAR_LEN + 1;
74     size_t pathLen = ::std::mbstowcs(0, pathName, 0) + 1;
75     NN_TASSERT_(pathLen <= BUF_SIZE);
76     wchar_t buffer[BUF_SIZE];
77     ::std::mbstowcs(buffer, pathName, pathLen);
78     return TryInitialize(buffer, mode);
79 }
80 
TryInitialize(const wchar_t * pathName,bit32 mode,nn::fs::PathMark pathMark)81 inline nn::Result FileBase::TryInitialize(const wchar_t* pathName, bit32 mode, nn::fs::PathMark pathMark)
82 {
83     this->m_Position = this->m_Size = 0;
84     return TryOpenImpl(pathName, mode, pathMark);
85 }
86 
Initialize(const wchar_t * pathName,bit32 mode)87 inline void FileBase::Initialize(const wchar_t* pathName, bit32 mode)
88 {
89     NN_UTIL_PANIC_IF_FAILED(TryInitialize(pathName, mode));
90 }
91 
Initialize(const char * pathName,bit32 mode)92 inline void FileBase::Initialize(const char* pathName, bit32 mode)
93 {
94     NN_UTIL_PANIC_IF_FAILED(TryInitialize(pathName, mode));
95 }
96 
FileBase(const wchar_t * pathName,bit32 mode)97 inline FileBase::FileBase(const wchar_t* pathName, bit32 mode)
98 {
99     Initialize(pathName, mode);
100 }
101 
FileBase(const char * pathName,bit32 mode)102 inline FileBase::FileBase(const char* pathName, bit32 mode)
103 {
104     Initialize(pathName, mode);
105 }
106 
TryGetPosition(s64 * pOut)107 inline nn::Result FileBase::TryGetPosition(s64* pOut) const
108 {
109     *pOut = m_Position;
110     return ResultSuccess();
111 }
112 
Read(void * buffer,size_t size)113 inline s32 FileBase::Read(void* buffer, size_t size)
114 {
115     s32 ret;
116     NN_UTIL_PANIC_IF_FAILED(TryRead(&ret, buffer, size));
117     return ret;
118 }
119 
Write(const void * buffer,size_t size)120 inline s32 FileBase::Write(const void* buffer, size_t size)
121 {
122     s32 ret;
123     NN_UTIL_PANIC_IF_FAILED(TryWrite(&ret, buffer, size));
124     return ret;
125 }
126 
Seek(s64 position,PositionBase base)127 inline void FileBase::Seek(s64 position, PositionBase base)
128 {
129     NN_UTIL_PANIC_IF_FAILED(TrySeek(position, base));
130 }
131 
GetPosition()132 inline s64 FileBase::GetPosition() const
133 {
134     s64 ret;
135     NN_UTIL_PANIC_IF_FAILED(TryGetPosition(&ret));
136     return ret;
137 }
138 
SetPosition(s64 position)139 inline void FileBase::SetPosition(s64 position)
140 {
141     NN_UTIL_PANIC_IF_FAILED(TrySetPosition(position));
142 }
143 
GetSize()144 inline s64 FileBase::GetSize() const
145 {
146     s64 ret;
147     NN_UTIL_PANIC_IF_FAILED(TryGetSize(&ret));
148     return ret;
149 }
150 
SetSize(s64 size)151 inline void FileBase::SetSize(s64 size)
152 {
153     NN_UTIL_PANIC_IF_FAILED(TrySetSize(size));
154 }
155 
156 }}}
157 
158 #endif
159