Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / encname.cpp
1 #include "rar.hpp"
2
3 EncodeFileName::EncodeFileName()
4 {
5   Flags=0;
6   FlagBits=0;
7   FlagsPos=0;
8   DestSize=0;
9 }
10
11
12
13
14 void EncodeFileName::Decode(char *Name,byte *EncName,int EncSize,wchar *NameW,
15                             int MaxDecSize)
16 {
17   int 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 }