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( &current, 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