1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
// Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#include "CLimitReadFile.h"
#include "irrString.h"
namespace irr
{
namespace io
{
CLimitReadFile::CLimitReadFile(IReadFile* alreadyOpenedFile, long pos,
long areaSize, const io::path& name)
: Filename(name), AreaStart(0), AreaEnd(0), Pos(0),
File(alreadyOpenedFile)
{
#ifdef _DEBUG
setDebugName("CLimitReadFile");
#endif
if (File)
{
File->grab();
AreaStart = pos;
AreaEnd = AreaStart + areaSize;
}
}
CLimitReadFile::~CLimitReadFile()
{
if (File)
File->drop();
}
//! returns how much was read
s32 CLimitReadFile::read(void* buffer, u32 sizeToRead)
{
#if 1
if (0 == File)
return 0;
s32 r = AreaStart + Pos;
s32 toRead = core::s32_min(AreaEnd, r + sizeToRead) - core::s32_max(AreaStart, r);
if (toRead < 0)
return 0;
File->seek(r);
r = File->read(buffer, toRead);
Pos += r;
return r;
#else
const long pos = File->getPos();
if (pos >= AreaEnd)
return 0;
if (pos + (long)sizeToRead >= AreaEnd)
sizeToRead = AreaEnd - pos;
return File->read(buffer, sizeToRead);
#endif
}
//! changes position in file, returns true if successful
bool CLimitReadFile::seek(long finalPos, bool relativeMovement)
{
#if 1
Pos = core::s32_clamp(finalPos + (relativeMovement ? Pos : 0 ), 0, AreaEnd - AreaStart);
return true;
#else
const long pos = File->getPos();
if (relativeMovement)
{
if (pos + finalPos > AreaEnd)
finalPos = AreaEnd - pos;
}
else
{
finalPos += AreaStart;
if (finalPos > AreaEnd)
return false;
}
return File->seek(finalPos, relativeMovement);
#endif
}
//! returns size of file
long CLimitReadFile::getSize() const
{
return AreaEnd - AreaStart;
}
//! returns where in the file we are.
long CLimitReadFile::getPos() const
{
#if 1
return Pos;
#else
return File->getPos() - AreaStart;
#endif
}
//! returns name of file
const io::path& CLimitReadFile::getFileName() const
{
return Filename;
}
IReadFile* createLimitReadFile(const io::path& fileName, IReadFile* alreadyOpenedFile, long pos, long areaSize)
{
return new CLimitReadFile(alreadyOpenedFile, pos, areaSize, fileName);
}
} // end namespace io
} // end namespace irr
|