1 #include "rar.hpp"
2
EncodeFileName()3 EncodeFileName::EncodeFileName()
4 {
5 Flags=0;
6 FlagBits=0;
7 FlagsPos=0;
8 DestSize=0;
9 }
10
11
12
13
Decode(char * Name,byte * EncName,size_t EncSize,wchar * NameW,size_t MaxDecSize)14 void EncodeFileName::Decode(char *Name,byte *EncName,size_t EncSize,wchar *NameW,
15 size_t MaxDecSize)
16 {
17 size_t EncPos=0,DecPos=0;
18 byte HighByte=EncName[EncPos++];
19 while (EncPos<EncSize && DecPos<MaxDecSize)
20 {
21 if (FlagBits==0)
22 {
23 Flags=EncName[EncPos++];
24 FlagBits=8;
25 }
26 switch(Flags>>6)
27 {
28 case 0:
29 NameW[DecPos++]=EncName[EncPos++];
30 break;
31 case 1:
32 NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8);
33 break;
34 case 2:
35 NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8);
36 EncPos+=2;
37 break;
38 case 3:
39 {
40 int Length=EncName[EncPos++];
41 if (Length & 0x80)
42 {
43 byte Correction=EncName[EncPos++];
44 for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++)
45 NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8);
46 }
47 else
48 for (Length+=2;Length>0 && DecPos<MaxDecSize;Length--,DecPos++)
49 NameW[DecPos]=Name[DecPos];
50 }
51 break;
52 }
53 Flags<<=2;
54 FlagBits-=2;
55 }
56 NameW[DecPos<MaxDecSize ? DecPos:MaxDecSize-1]=0;
57 }
58