Merge pull request #4852 from FernetMenta/aefixes
[vuplus_xbmc] / lib / UnrarXLib / rawread.cpp
1 #include "rar.hpp"
2
3 RawRead::RawRead(File *SrcFile)
4 {
5   RawRead::SrcFile=SrcFile;
6   ReadPos=0;
7   DataSize=0;
8 #ifndef SHELL_EXT
9   Crypt=NULL;
10 #endif
11 }
12
13
14 void RawRead::Read(int Size)
15 {
16 #if !defined(SHELL_EXT) && !defined(NOCRYPT)
17   if (Crypt!=NULL)
18   {
19     int CurSize=Data.Size();
20     int SizeToRead=Size-(CurSize-DataSize);
21     if (SizeToRead>0)
22     {
23       int AlignedReadSize=SizeToRead+((~SizeToRead+1)&0xf);
24       Data.Add(AlignedReadSize);
25       int ReadSize=SrcFile->Read(&Data[CurSize],AlignedReadSize);
26       Crypt->DecryptBlock(&Data[CurSize],AlignedReadSize);
27       DataSize+=ReadSize==0 ? 0:Size;
28     }
29     else
30       DataSize+=Size;
31   }
32   else
33 #endif
34     if (Size!=0)
35     {
36       Data.Add(Size);
37       DataSize+=SrcFile->Read(&Data[DataSize],Size);
38     }
39 }
40
41
42 void RawRead::Read(byte *SrcData,int Size)
43 {
44   if (Size!=0)
45   {
46     Data.Add(Size);
47     memcpy(&Data[DataSize],SrcData,Size);
48     DataSize+=Size;
49   }
50 }
51
52
53 void RawRead::Get(byte &Field)
54 {
55   Field=Data[ReadPos];
56   ReadPos++;
57 }
58
59
60 void RawRead::Get(ushort &Field)
61 {
62   Field=Data[ReadPos]+(Data[ReadPos+1]<<8);
63   ReadPos+=2;
64 }
65
66
67 void RawRead::Get(uint &Field)
68 {
69   Field=Data[ReadPos]+(Data[ReadPos+1]<<8)+(Data[ReadPos+2]<<16)+
70         (Data[ReadPos+3]<<24);
71   ReadPos+=4;
72 }
73
74
75 void RawRead::Get8(Int64 &Field)
76 {
77   uint Low,High;
78   Get(Low);
79   Get(High);
80   Field=int32to64(High,Low);
81 }
82
83
84 void RawRead::Get(byte *Field,int Size)
85 {
86   memcpy(Field,&Data[ReadPos],Size);
87   ReadPos+=Size;
88 }
89
90
91 void RawRead::Get(wchar *Field,int Size)
92 {
93   RawToWide(&Data[ReadPos],Field,Size);
94   ReadPos+=2*Size;
95 }
96
97
98 uint RawRead::GetCRC(bool ProcessedOnly)
99 {
100   return(DataSize>2 ? CRC(0xffffffff,&Data[2],(ProcessedOnly ? ReadPos:DataSize)-2):0xffffffff);
101 }