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