1 #include "rar.hpp"
2 
RawRead(File * SrcFile)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 
Read(size_t Size)14 void RawRead::Read(size_t Size)
15 {
16 #if !defined(SHELL_EXT) && !defined(RAR_NOCRYPT)
17   if (Crypt!=NULL)
18   {
19     size_t CurSize=Data.Size();
20     size_t SizeToRead=Size-(CurSize-DataSize);
21     if (SizeToRead>0)
22     {
23       size_t AlignedReadSize=SizeToRead+((~SizeToRead+1)&0xf);
24       Data.Add(AlignedReadSize);
25       size_t 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 
Read(byte * SrcData,size_t Size)42 void RawRead::Read(byte *SrcData,size_t Size)
43 {
44   if (Size!=0)
45   {
46     Data.Add(Size);
47     memcpy(&Data[DataSize],SrcData,Size);
48     DataSize+=Size;
49   }
50 }
51 
52 
Get(byte & Field)53 void RawRead::Get(byte &Field)
54 {
55   if (ReadPos<DataSize)
56   {
57     Field=Data[ReadPos];
58     ReadPos++;
59   }
60   else
61     Field=0;
62 }
63 
64 
Get(ushort & Field)65 void RawRead::Get(ushort &Field)
66 {
67   if (ReadPos+1<DataSize)
68   {
69     Field=Data[ReadPos]+(Data[ReadPos+1]<<8);
70     ReadPos+=2;
71   }
72   else
73     Field=0;
74 }
75 
76 
Get(uint & Field)77 void RawRead::Get(uint &Field)
78 {
79   if (ReadPos+3<DataSize)
80   {
81     Field=Data[ReadPos]+(Data[ReadPos+1]<<8)+(Data[ReadPos+2]<<16)+
82           (Data[ReadPos+3]<<24);
83     ReadPos+=4;
84   }
85   else
86     Field=0;
87 }
88 
89 
Get8(int64 & Field)90 void RawRead::Get8(int64 &Field)
91 {
92   uint Low,High;
93   Get(Low);
94   Get(High);
95   Field=INT32TO64(High,Low);
96 }
97 
98 
Get(byte * Field,size_t Size)99 void RawRead::Get(byte *Field,size_t Size)
100 {
101   if (ReadPos+Size-1<DataSize)
102   {
103     memcpy(Field,&Data[ReadPos],Size);
104     ReadPos+=Size;
105   }
106   else
107     memset(Field,0,Size);
108 }
109 
110 
Get(wchar * Field,size_t Size)111 void RawRead::Get(wchar *Field,size_t Size)
112 {
113   if (ReadPos+2*Size-1<DataSize)
114   {
115     RawToWide(&Data[ReadPos],Field,Size);
116     ReadPos+=sizeof(wchar)*Size;
117   }
118   else
119     memset(Field,0,sizeof(wchar)*Size);
120 }
121 
122 
GetCRC(bool ProcessedOnly)123 uint RawRead::GetCRC(bool ProcessedOnly)
124 {
125   return(DataSize>2 ? CRC(0xffffffff,&Data[2],(ProcessedOnly ? ReadPos:DataSize)-2):0xffffffff);
126 }
127