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