203 BufferSize = FileSize;
211 if ((size == 0 && ptr) || !BufferSize) {
218 Buffer =
new char [BufferSize];
226 BufferChangeBeg = -1;
227 BufferChangeEnd = -1;
240 if (FileSize <= BufferSize) {
243 readsize = BufferSize;
258 TrueFileStart = prevpos;
261 if (FileSize <= BufferSize) {
274 BufferFilePos = prevpos;
285 long actual =
Read(Buffer, readsize);
287 if (actual != readsize) {
368 size = BufferChangeEnd - BufferChangeBeg;
413 if (strcmp(filename,
File_Name() ) == 0) {
466 if (IsOpen && UseBuffer) {
526 BufferRights = rights;
528 if (rights !=
READ ||
529 (rights ==
READ && FileSize > BufferSize)) {
531 if (rights ==
WRITE) {
548 if (BufferRights ==
WRITE) {
558 BufferChangeBeg = -1;
559 BufferChangeEnd = -1;
600 if (BufferRights !=
READ) {
604 if (size >= (BufferSize - BufferPos)) {
605 sizetowrite = (BufferSize - BufferPos);
610 if (sizetowrite != BufferSize) {
615 if (FileSize < BufferSize) {
619 readsize = BufferSize;
620 BufferFilePos = FilePos;
626 Read( Buffer, BufferSize);
635 BufferChangeBeg = -1;
636 BufferChangeEnd = -1;
642 memmove((
char *)Buffer + BufferPos, (
char *)buffer + sizewritten, sizetowrite);
645 sizewritten += sizetowrite;
648 if (BufferChangeBeg == -1) {
649 BufferChangeBeg = BufferPos;
650 BufferChangeEnd = BufferPos;
652 if (BufferChangeBeg > BufferPos) {
653 BufferChangeBeg = BufferPos;
657 BufferPos += sizetowrite;
659 if (BufferChangeEnd < BufferPos) {
660 BufferChangeEnd = BufferPos;
663 FilePos = BufferFilePos + BufferPos;
665 if (FileSize < FilePos) {
672 if (BufferPos == BufferSize) {
676 BufferFilePos = FilePos;
677 BufferChangeBeg = -1;
678 BufferChangeEnd = -1;
680 if (size && FileSize > FilePos) {
684 Read( Buffer, BufferSize);
742 if (BufferRights !=
WRITE) {
746 if (size >= (BufferSize - BufferPos)) {
747 sizetoread = (BufferSize - BufferPos);
755 if (FileSize < BufferSize) {
759 readsize = BufferSize;
760 BufferFilePos = FilePos;
766 Read( Buffer, BufferSize);
775 BufferChangeBeg = -1;
776 BufferChangeEnd = -1;
781 memmove((
char *)buffer + sizeread, (
char *)Buffer + BufferPos, sizetoread);
783 sizeread += sizetoread;
785 BufferPos += sizetoread;
786 FilePos = BufferFilePos + BufferPos;
791 if (BufferPos == BufferSize) {
795 BufferFilePos = FilePos;
796 BufferChangeBeg = -1;
797 BufferChangeEnd = -1;
799 if (size && FileSize > FilePos) {
803 Read( Buffer, BufferSize);
855 bool adjusted =
false;
872 if (pos >= TrueFileStart) {
873 pos -= TrueFileStart;
884 if (FilePos > FileSize) {
888 if (FileSize <= BufferSize) {
891 if (FilePos >= BufferFilePos &&
892 FilePos < (BufferFilePos + BufferSize)) {
893 BufferPos = FilePos - BufferFilePos;
909 if (TrueFileStart && adjusted) {
910 return( FilePos + TrueFileStart);
938 if (IsOpen && UseBuffer) {
virtual int Write(void const *buffer, int size)
virtual bool Is_Available(int forced=false)
virtual int Read(void *buffer, int size)
virtual int Seek(int pos, int dir=SEEK_CUR)
virtual int Open(char const *filename, int rights=READ)
virtual ~BufferIOFileClass(void)
bool Cache(long size=0, void *ptr=NULL)
virtual bool Is_Open(void) const
virtual char const * Set_Name(char const *filename)
virtual char const * Set_Name(char const *filename)
virtual bool Is_Available(int forced=false)
virtual int Open(char const *filename, int rights=READ)
virtual int Seek(int pos, int dir=SEEK_CUR)
virtual char const * File_Name(void) const
virtual bool Is_Open(void) const
virtual int Write(void const *buffer, int size)
virtual void Error(int error, int canretry=false, char const *filename=NULL)
virtual int Read(void *buffer, int size)