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