1 #include "libplatform/impl.h"
2 
3 namespace mp4v2 { namespace platform { namespace io {
4 
5 ///////////////////////////////////////////////////////////////////////////////
6 
7 namespace {
8     const File::Size __maxChunkSize = 1024*1024;
9 }
10 
11 ///////////////////////////////////////////////////////////////////////////////
12 
File(std::string name_,Mode mode_,FileProvider * provider_)13 File::File( std::string name_, Mode mode_, FileProvider* provider_ )
14     : _name     ( name_ )
15     , _isOpen   ( false )
16     , _mode     ( mode_ )
17     , _size     ( 0 )
18     , _position ( 0 )
19     , _provider ( provider_ ? *provider_ : standard() )
20     , name      ( _name )
21     , isOpen    ( _isOpen )
22     , mode      ( _mode )
23     , size      ( _size )
24     , position  ( _position )
25 {
26 }
27 
28 ///////////////////////////////////////////////////////////////////////////////
29 
~File()30 File::~File()
31 {
32     close();
33     delete &_provider;
34 }
35 
36 ///////////////////////////////////////////////////////////////////////////////
37 
38 void
setMode(Mode mode_)39 File::setMode( Mode mode_ )
40 {
41     _mode = mode_;
42 }
43 
44 void
setName(const std::string & name_)45 File::setName( const std::string& name_ )
46 {
47     _name = name_;
48 }
49 
50 ///////////////////////////////////////////////////////////////////////////////
51 
52 bool
open(std::string name_,Mode mode_)53 File::open( std::string name_, Mode mode_ )
54 {
55     if( _isOpen )
56         return true;
57 
58     if( !name_.empty() )
59         setName( name_ );
60     if( mode_ != MODE_UNDEFINED )
61         setMode( mode_ );
62 
63     if( _provider.open( _name, _mode ))
64         return true;
65 
66     FileSystem::getFileSize( _name, _size );
67 
68     _isOpen = true;
69     return false;
70 }
71 
72 bool
seek(Size pos)73 File::seek( Size pos )
74 {
75     if( !_isOpen )
76         return true;
77 
78     if( _provider.seek( pos ))
79         return true;
80     _position = pos;
81     return false;
82 }
83 
84 bool
read(void * buffer,Size size,Size & nin,Size maxChunkSize)85 File::read( void* buffer, Size size, Size& nin, Size maxChunkSize )
86 {
87     nin = 0;
88 
89     if( !_isOpen )
90         return true;
91 
92     if( _provider.read( buffer, size, nin, maxChunkSize ))
93         return true;
94 
95     _position += nin;
96     if( _position > _size )
97         _size = _position;
98 
99     return false;
100 }
101 
102 bool
write(const void * buffer,Size size,Size & nout,Size maxChunkSize)103 File::write( const void* buffer, Size size, Size& nout, Size maxChunkSize )
104 {
105     nout = 0;
106 
107     if( !_isOpen )
108         return true;
109 
110     if( _provider.write( buffer, size, nout, maxChunkSize ))
111         return true;
112 
113     _position += nout;
114     if( _position > _size )
115         _size = _position;
116 
117     return false;
118 }
119 
120 bool
close()121 File::close()
122 {
123     if( !_isOpen )
124         return false;
125     if( _provider.close() )
126         return true;
127 
128     _isOpen = false;
129     return false;
130 }
131 
132 ///////////////////////////////////////////////////////////////////////////////
133 
CustomFileProvider(const MP4FileProvider & provider)134 CustomFileProvider::CustomFileProvider( const MP4FileProvider& provider )
135     : _handle( NULL )
136 {
137     memcpy( &_call, &provider, sizeof(MP4FileProvider) );
138 }
139 
140 bool
open(std::string name,Mode mode)141 CustomFileProvider::open( std::string name, Mode mode )
142 {
143     MP4FileMode fm;
144     switch( mode ) {
145         case MODE_READ:   fm = FILEMODE_READ;   break;
146         case MODE_MODIFY: fm = FILEMODE_MODIFY; break;
147         case MODE_CREATE: fm = FILEMODE_CREATE; break;
148 
149         case MODE_UNDEFINED:
150         default:
151             fm = FILEMODE_UNDEFINED;
152             break;
153     }
154 
155     _handle = _call.open( name.c_str(), fm );
156     return _handle == NULL;
157 }
158 
159 bool
seek(Size pos)160 CustomFileProvider::seek( Size pos )
161 {
162     return _call.seek( _handle, pos );
163 }
164 
165 bool
read(void * buffer,Size size,Size & nin,Size maxChunkSize)166 CustomFileProvider::read( void* buffer, Size size, Size& nin, Size maxChunkSize )
167 {
168     return _call.read( _handle, buffer, size, &nin, maxChunkSize );
169 }
170 
171 bool
write(const void * buffer,Size size,Size & nout,Size maxChunkSize)172 CustomFileProvider::write( const void* buffer, Size size, Size& nout, Size maxChunkSize )
173 {
174     return _call.write( _handle, buffer, size, &nout, maxChunkSize );
175 }
176 
177 bool
close()178 CustomFileProvider::close()
179 {
180     return _call.close( _handle );
181 }
182 
183 ///////////////////////////////////////////////////////////////////////////////
184 
185 }}} // namespace mp4v2::platform::io
186