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