2 * Copyright 2005-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Stefano Ceccherini, burton666@libero.it
30 BDataIO::Read(void* buffer
, size_t size
)
32 return B_NOT_SUPPORTED
;
37 BDataIO::Write(const void* buffer
, size_t size
)
39 return B_NOT_SUPPORTED
;
51 BDataIO::ReadExactly(void* buffer
, size_t size
, size_t* _bytesRead
)
53 uint8
* out
= (uint8
*)buffer
;
54 size_t bytesRemaining
= size
;
55 status_t error
= B_OK
;
57 while (bytesRemaining
> 0) {
58 ssize_t bytesRead
= Read(out
, bytesRemaining
);
65 error
= B_PARTIAL_READ
;
70 bytesRemaining
-= bytesRead
;
73 if (_bytesRead
!= NULL
)
74 *_bytesRead
= size
- bytesRemaining
;
81 BDataIO::WriteExactly(const void* buffer
, size_t size
, size_t* _bytesWritten
)
83 const uint8
* in
= (const uint8
*)buffer
;
84 size_t bytesRemaining
= size
;
85 status_t error
= B_OK
;
87 while (bytesRemaining
> 0) {
88 ssize_t bytesWritten
= Write(in
, bytesRemaining
);
89 if (bytesWritten
< 0) {
94 if (bytesWritten
== 0) {
95 error
= B_PARTIAL_WRITE
;
100 bytesRemaining
-= bytesWritten
;
103 if (_bytesWritten
!= NULL
)
104 *_bytesWritten
= size
- bytesRemaining
;
110 // Private or Reserved
112 BDataIO::BDataIO(const BDataIO
&)
114 // Copying not allowed
119 BDataIO::operator=(const BDataIO
&)
121 // Copying not allowed
130 _ReservedDataIO1__7BDataIO(BDataIO
* self
)
132 return self
->BDataIO::Flush();
139 // TODO: RELEASE: Remove!
142 _ZN7BDataIO16_ReservedDataIO1Ev(BDataIO
* self
)
144 return self
->BDataIO::Flush();
152 void BDataIO::_ReservedDataIO2(){}
153 void BDataIO::_ReservedDataIO3(){}
154 void BDataIO::_ReservedDataIO4(){}
155 void BDataIO::_ReservedDataIO5(){}
156 void BDataIO::_ReservedDataIO6(){}
157 void BDataIO::_ReservedDataIO7(){}
158 void BDataIO::_ReservedDataIO8(){}
159 void BDataIO::_ReservedDataIO9(){}
160 void BDataIO::_ReservedDataIO10(){}
161 void BDataIO::_ReservedDataIO11(){}
162 void BDataIO::_ReservedDataIO12(){}
168 BPositionIO::BPositionIO()
173 BPositionIO::~BPositionIO()
179 BPositionIO::Read(void* buffer
, size_t size
)
181 off_t curPos
= Position();
182 ssize_t result
= ReadAt(curPos
, buffer
, size
);
184 Seek(result
, SEEK_CUR
);
191 BPositionIO::Write(const void* buffer
, size_t size
)
193 off_t curPos
= Position();
194 ssize_t result
= WriteAt(curPos
, buffer
, size
);
196 Seek(result
, SEEK_CUR
);
203 BPositionIO::ReadAtExactly(off_t position
, void* buffer
, size_t size
,
206 uint8
* out
= (uint8
*)buffer
;
207 size_t bytesRemaining
= size
;
208 status_t error
= B_OK
;
210 while (bytesRemaining
> 0) {
211 ssize_t bytesRead
= ReadAt(position
, out
, bytesRemaining
);
217 if (bytesRead
== 0) {
218 error
= B_PARTIAL_READ
;
223 bytesRemaining
-= bytesRead
;
224 position
+= bytesRead
;
227 if (_bytesRead
!= NULL
)
228 *_bytesRead
= size
- bytesRemaining
;
235 BPositionIO::WriteAtExactly(off_t position
, const void* buffer
, size_t size
,
236 size_t* _bytesWritten
)
238 const uint8
* in
= (const uint8
*)buffer
;
239 size_t bytesRemaining
= size
;
240 status_t error
= B_OK
;
242 while (bytesRemaining
> 0) {
243 ssize_t bytesWritten
= WriteAt(position
, in
, bytesRemaining
);
244 if (bytesWritten
< 0) {
245 error
= bytesWritten
;
249 if (bytesWritten
== 0) {
250 error
= B_PARTIAL_WRITE
;
255 bytesRemaining
-= bytesWritten
;
256 position
+= bytesWritten
;
259 if (_bytesWritten
!= NULL
)
260 *_bytesWritten
= size
- bytesRemaining
;
267 BPositionIO::SetSize(off_t size
)
274 BPositionIO::GetSize(off_t
* size
) const
279 off_t currentPos
= Position();
281 return (status_t
)currentPos
;
283 *size
= const_cast<BPositionIO
*>(this)->Seek(0, SEEK_END
);
285 return (status_t
)*size
;
287 off_t pos
= const_cast<BPositionIO
*>(this)->Seek(currentPos
, SEEK_SET
);
289 if (pos
!= currentPos
)
290 return pos
< 0 ? (status_t
)pos
: B_ERROR
;
297 extern "C" void _ReservedPositionIO1__11BPositionIO() {}
298 void BPositionIO::_ReservedPositionIO2(){}
299 void BPositionIO::_ReservedPositionIO3(){}
300 void BPositionIO::_ReservedPositionIO4(){}
301 void BPositionIO::_ReservedPositionIO5(){}
302 void BPositionIO::_ReservedPositionIO6(){}
303 void BPositionIO::_ReservedPositionIO7(){}
304 void BPositionIO::_ReservedPositionIO8(){}
305 void BPositionIO::_ReservedPositionIO9(){}
306 void BPositionIO::_ReservedPositionIO10(){}
307 void BPositionIO::_ReservedPositionIO11(){}
308 void BPositionIO::_ReservedPositionIO12(){}
314 BMemoryIO::BMemoryIO(void* buffer
, size_t length
)
317 fBuffer(static_cast<char*>(buffer
)),
325 BMemoryIO::BMemoryIO(const void* buffer
, size_t length
)
328 fBuffer(const_cast<char*>(static_cast<const char*>(buffer
))),
336 BMemoryIO::~BMemoryIO()
342 BMemoryIO::ReadAt(off_t pos
, void* buffer
, size_t size
)
344 if (buffer
== NULL
|| pos
< 0)
347 ssize_t sizeRead
= 0;
348 if (pos
< (off_t
)fLength
) {
349 sizeRead
= min_c((off_t
)size
, (off_t
)fLength
- pos
);
350 memcpy(buffer
, fBuffer
+ pos
, sizeRead
);
358 BMemoryIO::WriteAt(off_t pos
, const void* buffer
, size_t size
)
361 return B_NOT_ALLOWED
;
363 if (buffer
== NULL
|| pos
< 0)
366 ssize_t sizeWritten
= 0;
367 if (pos
< (off_t
)fBufferSize
) {
368 sizeWritten
= min_c((off_t
)size
, (off_t
)fBufferSize
- pos
);
369 memcpy(fBuffer
+ pos
, buffer
, sizeWritten
);
372 if (pos
+ sizeWritten
> (off_t
)fLength
)
373 fLength
= pos
+ sizeWritten
;
380 BMemoryIO::Seek(off_t position
, uint32 seek_mode
)
384 fPosition
= position
;
387 fPosition
+= position
;
390 fPosition
= fLength
+ position
;
401 BMemoryIO::Position() const
408 BMemoryIO::SetSize(off_t size
)
411 return B_NOT_ALLOWED
;
413 if (size
> (off_t
)fBufferSize
)
422 // Private or Reserved
424 BMemoryIO::BMemoryIO(const BMemoryIO
&)
426 //Copying not allowed
431 BMemoryIO::operator=(const BMemoryIO
&)
433 //Copying not allowed
439 void BMemoryIO::_ReservedMemoryIO1(){}
440 void BMemoryIO::_ReservedMemoryIO2(){}
446 BMallocIO::BMallocIO()
457 BMallocIO::~BMallocIO()
464 BMallocIO::ReadAt(off_t pos
, void* buffer
, size_t size
)
469 ssize_t sizeRead
= 0;
470 if (pos
< (off_t
)fLength
) {
471 sizeRead
= min_c((off_t
)size
, (off_t
)fLength
- pos
);
472 memcpy(buffer
, fData
+ pos
, sizeRead
);
480 BMallocIO::WriteAt(off_t pos
, const void* buffer
, size_t size
)
485 size_t newSize
= max_c(pos
+ (off_t
)size
, (off_t
)fLength
);
486 status_t error
= B_OK
;
488 if (newSize
> fMallocSize
)
489 error
= SetSize(newSize
);
492 memcpy(fData
+ pos
, buffer
, size
);
493 if (pos
+ size
> fLength
)
494 fLength
= pos
+ size
;
497 return error
!= B_OK
? error
: size
;
502 BMallocIO::Seek(off_t position
, uint32 seekMode
)
506 fPosition
= position
;
509 fPosition
= fLength
+ position
;
512 fPosition
+= position
;
522 BMallocIO::Position() const
529 BMallocIO::SetSize(off_t size
)
531 status_t error
= B_OK
;
533 // size == 0, free the memory
538 // size != 0, see, if necessary to resize
539 size_t newSize
= (size
+ fBlockSize
- 1) / fBlockSize
* fBlockSize
;
540 if (size
!= (off_t
)fMallocSize
) {
542 if (char* newData
= static_cast<char*>(realloc(fData
, newSize
))) {
543 // set the new area to 0
544 if (newSize
> fMallocSize
)
545 memset(newData
+ fMallocSize
, 0, newSize
- fMallocSize
);
547 fMallocSize
= newSize
;
548 } else // couldn't alloc the memory
561 BMallocIO::SetBlockSize(size_t blockSize
)
566 if (blockSize
!= fBlockSize
)
567 fBlockSize
= blockSize
;
572 BMallocIO::Buffer() const
579 BMallocIO::BufferLength() const
585 // Private or Reserved
587 BMallocIO::BMallocIO(const BMallocIO
&)
589 // copying not allowed...
594 BMallocIO::operator=(const BMallocIO
&)
596 // copying not allowed...
602 void BMallocIO::_ReservedMallocIO1() {}
603 void BMallocIO::_ReservedMallocIO2() {}