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