/lib/UnrarXLib/rawread.cpp
http://github.com/xbmc/xbmc · C++ · 101 lines · 82 code · 19 blank · 0 comment · 5 complexity · 3681605375f51d8abe36b5a8e891ebd1 MD5 · raw file
- #include "rar.hpp"
- RawRead::RawRead(File *SrcFile)
- {
- RawRead::SrcFile=SrcFile;
- ReadPos=0;
- DataSize=0;
- #ifndef SHELL_EXT
- Crypt=NULL;
- #endif
- }
- void RawRead::Read(int Size)
- {
- #if !defined(SHELL_EXT) && !defined(NOCRYPT)
- if (Crypt!=NULL)
- {
- int CurSize=Data.Size();
- int SizeToRead=Size-(CurSize-DataSize);
- if (SizeToRead>0)
- {
- int AlignedReadSize=SizeToRead+((~SizeToRead+1)&0xf);
- Data.Add(AlignedReadSize);
- int ReadSize=SrcFile->Read(&Data[CurSize],AlignedReadSize);
- Crypt->DecryptBlock(&Data[CurSize],AlignedReadSize);
- DataSize+=ReadSize==0 ? 0:Size;
- }
- else
- DataSize+=Size;
- }
- else
- #endif
- if (Size!=0)
- {
- Data.Add(Size);
- DataSize+=SrcFile->Read(&Data[DataSize],Size);
- }
- }
- void RawRead::Read(byte *SrcData,int Size)
- {
- if (Size!=0)
- {
- Data.Add(Size);
- memcpy(&Data[DataSize],SrcData,Size);
- DataSize+=Size;
- }
- }
- void RawRead::Get(byte &Field)
- {
- Field=Data[ReadPos];
- ReadPos++;
- }
- void RawRead::Get(ushort &Field)
- {
- Field=Data[ReadPos]+(Data[ReadPos+1]<<8);
- ReadPos+=2;
- }
- void RawRead::Get(uint &Field)
- {
- Field=Data[ReadPos]+(Data[ReadPos+1]<<8)+(Data[ReadPos+2]<<16)+
- (Data[ReadPos+3]<<24);
- ReadPos+=4;
- }
- void RawRead::Get8(Int64 &Field)
- {
- uint Low,High;
- Get(Low);
- Get(High);
- Field=int32to64(High,Low);
- }
- void RawRead::Get(byte *Field,int Size)
- {
- memcpy(Field,&Data[ReadPos],Size);
- ReadPos+=Size;
- }
- void RawRead::Get(wchar *Field,int Size)
- {
- RawToWide(&Data[ReadPos],Field,Size);
- ReadPos+=2*Size;
- }
- uint RawRead::GetCRC(bool ProcessedOnly)
- {
- return(DataSize>2 ? CRC(0xffffffff,&Data[2],(ProcessedOnly ? ReadPos:DataSize)-2):0xffffffff);
- }