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,size_t NameSize,byte * EncName,size_t EncSize,wchar * NameW,size_t MaxDecSize)14 void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncSize,
15 wchar *NameW,size_t MaxDecSize)
16 {
17 size_t EncPos=0,DecPos=0;
18 byte HighByte=EncPos<EncSize ? EncName[EncPos++] : 0;
19 while (EncPos<EncSize && DecPos<MaxDecSize)
20 {
21 if (FlagBits==0)
22 {
23 if (EncPos>=EncSize)
24 break;
25 Flags=EncName[EncPos++];
26 FlagBits=8;
27 }
28 switch(Flags>>6)
29 {
30 case 0:
31 if (EncPos>=EncSize)
32 break;
33 NameW[DecPos++]=EncName[EncPos++];
34 break;
35 case 1:
36 if (EncPos>=EncSize)
37 break;
38 NameW[DecPos++]=EncName[EncPos++]+(HighByte<<8);
39 break;
40 case 2:
41 if (EncPos+1>=EncSize)
42 break;
43 NameW[DecPos++]=EncName[EncPos]+(EncName[EncPos+1]<<8);
44 EncPos+=2;
45 break;
46 case 3:
47 {
48 if (EncPos>=EncSize)
49 break;
50 int Length=EncName[EncPos++];
51 if ((Length & 0x80)!=0)
52 {
53 if (EncPos>=EncSize)
54 break;
55 byte Correction=EncName[EncPos++];
56 for (Length=(Length&0x7f)+2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
57 NameW[DecPos]=((Name[DecPos]+Correction)&0xff)+(HighByte<<8);
58 }
59 else
60 for (Length+=2;Length>0 && DecPos<MaxDecSize && DecPos<NameSize;Length--,DecPos++)
61 NameW[DecPos]=Name[DecPos];
62 }
63 break;
64 }
65 Flags<<=2;
66 FlagBits-=2;
67 }
68 NameW[DecPos<MaxDecSize ? DecPos:MaxDecSize-1]=0;
69 }
70