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