1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: io_HioFileStream.cpp
4
5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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 $Revision: 13145 $
14 *---------------------------------------------------------------------------*/
15
16 #include "precompiled.h"
17
18 #include <nw/io/io_HioFileStream.h>
19
20 #include <nw/types.h>
21 #include <nw/assert.h>
22 #include <nw/ut/ut_Inlines.h>
23 #include <nw/ut/ut_RuntimeTypeInfo.h>
24
25 namespace
26 {
GetHioFileSize(nn::hio::HostFile & file)27 s64 GetHioFileSize( nn::hio::HostFile& file )
28 {
29 s64 current;
30 file.Seek( ¤t, 0, nn::hio::HostFile::SEEK_TYPE_CURRENT );
31
32 s64 fileSize;
33 file.Seek( &fileSize, 0, nn::hio::HostFile::SEEK_TYPE_END );
34 file.Seek( current, nn::hio::HostFile::SEEK_TYPE_SET );
35
36 return fileSize;
37 }
38 }
39
40 namespace nw {
41 namespace io {
42
43 NW_UT_RUNTIME_TYPEINFO_DEFINITION(HioFileStream,IOStream);
44
Initialize()45 void HioFileStream::Initialize()
46 {
47 m_CanRead = false;
48 m_CanWrite = false;
49 m_CloseEnableFlag = false;
50 m_CloseOnDestroyFlag = false;
51 m_IsAvailable = false;
52 }
53
HioFileStream()54 HioFileStream::HioFileStream()
55 {
56 this->Initialize();
57 }
58
HioFileStream(const char * path,bit32 accessMode,nn::hio::HostFile::OpenDisp disp)59 HioFileStream::HioFileStream( const char* path, bit32 accessMode,
60 nn::hio::HostFile::OpenDisp disp )
61 {
62 Initialize();
63 Open( path, accessMode, disp );
64 }
65
66 #ifdef NW_PLATFORM_CTRWIN
HioFileStream(...)67 HioFileStream::HioFileStream( ... )
68 {
69 // TODO: PC 版は未対応
70 }
71 #else
HioFileStream(nn::hio::HostFile * openedFile,bit32 accessMode,bool closeEnable)72 HioFileStream::HioFileStream(
73 nn::hio::HostFile* openedFile, bit32 accessMode, bool closeEnable )
74 {
75 Initialize();
76 Open( openedFile, accessMode, closeEnable );
77 }
78 #endif
79
~HioFileStream()80 HioFileStream::~HioFileStream()
81 {
82 if ( m_CloseOnDestroyFlag )
83 {
84 this->Close();
85 }
86 }
87
Open(const char * path,bit32 accessMode,nn::hio::HostFile::OpenDisp disp)88 bool HioFileStream::Open( const char* path, bit32 accessMode,
89 nn::hio::HostFile::OpenDisp disp )
90 {
91 if ( m_CloseOnDestroyFlag )
92 {
93 Close();
94 }
95 m_CanRead = ( accessMode & nn::hio::HostFile::ACCESS_MODE_READ ) ? true : false;
96 m_CanWrite = ( accessMode & nn::hio::HostFile::ACCESS_MODE_WRITE ) ? true : false;
97 m_CloseEnableFlag = true;
98 m_CloseOnDestroyFlag = true;
99 m_IsAvailable = false;
100
101 if ( m_File.Open( path, accessMode, disp ).IsSuccess() )
102 {
103 m_pOpenedFile = &m_File;
104 s64 fileSize = GetHioFileSize( *m_pOpenedFile );
105 m_FilePosition.SetFileSize( static_cast<u32>(fileSize) );
106 m_pOpenedFile->Seek( 0, nn::hio::HostFile::SEEK_TYPE_SET );
107 m_IsAvailable = true;
108 return true;
109 }
110 return false;
111 }
112
113 #ifdef NW_PLATFORM_CTRWIN
Open(...)114 bool HioFileStream::Open( ... )
115 {
116 // TODO: PC 版は未対応
117 }
118 #else
Open(nn::hio::HostFile * openedFile,bit32 accessMode,bool closeEnable)119 bool HioFileStream::Open(
120 nn::hio::HostFile* openedFile, bit32 accessMode, bool closeEnable )
121 {
122 if ( m_CloseOnDestroyFlag )
123 {
124 Close();
125 }
126 m_CanRead = ( accessMode & nn::hio::HostFile::ACCESS_MODE_READ ) ? true : false;
127 m_CanWrite = ( accessMode & nn::hio::HostFile::ACCESS_MODE_WRITE ) ? true : false;
128
129 // 外部でオープンされたファイルなので、デストラクタや Close 関数で、
130 // クローズするかどうかはユーザ指定可能
131 m_CloseEnableFlag = closeEnable;
132 m_CloseOnDestroyFlag = true;
133 m_IsAvailable = false;
134
135 m_pOpenedFile = openedFile;
136 s64 result = m_pOpenedFile->Seek( 0, nn::hio::HostFile::SEEK_TYPE_SET );
137 if ( result != -1 )
138 {
139 s64 fileSize = GetHioFileSize( *m_pOpenedFile );
140 m_FilePosition.SetFileSize( static_cast<u32>(fileSize) );
141 m_pOpenedFile->Seek( 0, nn::hio::HostFile::SEEK_TYPE_SET );
142 m_IsAvailable = true;
143 return true;
144 }
145 return false;
146 }
147 #endif
148
Close()149 void HioFileStream::Close()
150 {
151 if ( m_CloseEnableFlag && m_IsAvailable )
152 {
153 nn::Result result = m_pOpenedFile->Close();
154 NW_ASSERT( result.IsSuccess() );
155 m_pOpenedFile = NULL;
156 m_IsAvailable = false;
157 }
158 }
159
Read(void * buf,u32 length)160 s32 HioFileStream::Read( void* buf, u32 length )
161 {
162 NW_ASSERTMSG( m_IsAvailable, "HostFile is not opened" );
163 if ( m_CanRead == false )
164 {
165 return -1;
166 }
167
168 m_pOpenedFile->Seek( m_FilePosition.Tell(), nn::hio::HostFile::SEEK_TYPE_SET );
169 s32 readBytes = m_pOpenedFile->Read( buf, length );
170 if ( readBytes > 0 )
171 {
172 m_FilePosition.Skip( readBytes );
173 }
174 return readBytes;
175 }
176
Write(const void * buf,u32 length)177 s32 HioFileStream::Write( const void* buf, u32 length )
178 {
179 NW_ASSERTMSG( m_IsAvailable, "HostFile is not opened" );
180 if ( m_CanWrite == false )
181 {
182 return -1;
183 }
184
185 m_pOpenedFile->Seek( m_FilePosition.Tell(), nn::hio::HostFile::SEEK_TYPE_SET );
186 s32 writeBytes = m_pOpenedFile->Write( buf, length );
187 if ( writeBytes > 0 )
188 {
189 m_FilePosition.Skip( writeBytes );
190 }
191 return writeBytes;
192 }
193
Seek(s32 offset,u32 origin)194 void HioFileStream::Seek( s32 offset, u32 origin )
195 {
196 NW_ASSERTMSG( m_IsAvailable, "HostFile is not opened" );
197 m_FilePosition.Seek( offset, origin );
198 }
199
200
201 } /* namespace io */
202 } /* namespace nw */
203
204