blob: 37ea5155a62a7a1e293770d44282ec7922c5a2d5 [file] [log] [blame]
namespace third_party_unrar {
ArcMemory::ArcMemory()
{
Loaded=false;
SeekPos=0;
}
void ArcMemory::Load(const byte *Data,size_t Size)
{
ArcData.Alloc(Size);
memcpy(&ArcData[0],Data,Size);
Loaded=true;
SeekPos=0;
}
bool ArcMemory::Unload()
{
if (!Loaded)
return false;
Loaded=false;
return true;
}
bool ArcMemory::Read(void *Data,size_t Size,size_t &Result)
{
if (!Loaded)
return false;
Result=(size_t)Min(Size,ArcData.Size()-SeekPos);
memcpy(Data,&ArcData[(size_t)SeekPos],Result);
SeekPos+=Result;
return true;
}
bool ArcMemory::Seek(int64 Offset,int Method)
{
if (!Loaded)
return false;
if (Method==SEEK_SET)
{
if (Offset<0)
SeekPos=0;
else
SeekPos=Min((uint64)Offset,ArcData.Size());
}
else
if (Method==SEEK_CUR || Method==SEEK_END)
{
if (Method==SEEK_END)
SeekPos=ArcData.Size();
SeekPos+=(uint64)Offset;
if (SeekPos>ArcData.Size())
SeekPos=Offset<0 ? 0 : ArcData.Size();
}
return true;
}
bool ArcMemory::Tell(int64 *Pos)
{
if (!Loaded)
return false;
*Pos=SeekPos;
return true;
}
} // namespace third_party_unrar