Merge pull request #4011 from fritsch/vdpau-settings
[vuplus_xbmc] / lib / UnrarXLib / win32stm.cpp
1 // THIS FILE IS SLIGHTLY MODIFIED TO WORK WITH XBMC
2
3 #ifndef SFX_MODULE
4 void ExtractStreams(Archive &Arc,char *FileName,wchar *FileNameW)
5 {
6   if (!WinNT())
7     return;
8
9   if (Arc.HeaderCRC!=Arc.StreamHead.HeadCRC)
10   {
11 #ifndef SILENT
12     Log(Arc.FileName,St(MStreamBroken),FileName);
13 #endif
14     ErrHandler.SetErrorCode(CRC_ERROR);
15     return;
16   }
17
18   if (Arc.StreamHead.Method<0x31 || Arc.StreamHead.Method>0x35 || Arc.StreamHead.UnpVer>PACK_VER)
19   {
20 #ifndef SILENT
21     Log(Arc.FileName,St(MStreamUnknown),FileName);
22 #endif
23     ErrHandler.SetErrorCode(WARNING);
24     return;
25   }
26
27   char StreamName[NM+2];
28   if (FileName[0]!=0 && FileName[1]==0)
29   {
30     strcpy(StreamName,".\\");
31     strcpy(StreamName+2,FileName);
32   }
33   else
34     strcpy(StreamName,FileName);
35   if (strlen(StreamName)+strlen((char *)Arc.StreamHead.StreamName)>=sizeof(StreamName))
36   {
37 #ifndef SILENT
38     Log(Arc.FileName,St(MStreamBroken),FileName);
39 #endif
40     ErrHandler.SetErrorCode(CRC_ERROR);
41     return;
42   }
43
44   strcat(StreamName,(char *)Arc.StreamHead.StreamName);
45
46   FindData fd;
47   bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
48
49   if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
50     SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
51
52   File CurFile;
53   if (CurFile.WCreate(StreamName))
54   {
55     ComprDataIO DataIO;
56     Unpack Unpack(&DataIO);
57     Unpack.Init();
58
59     Array<unsigned char> UnpData(Arc.StreamHead.UnpSize);
60     DataIO.SetPackedSizeToRead(Arc.StreamHead.DataSize);
61     DataIO.EnableShowProgress(false);
62     DataIO.SetFiles(&Arc,&CurFile);
63     Unpack.SetDestSize(Arc.StreamHead.UnpSize);
64     Unpack.DoUnpack(Arc.StreamHead.UnpVer,false);
65
66     if (Arc.StreamHead.StreamCRC!=~DataIO.UnpFileCRC)
67     {
68 #ifndef SILENT
69       Log(Arc.FileName,St(MStreamBroken),StreamName);
70 #endif
71       ErrHandler.SetErrorCode(CRC_ERROR);
72     }
73     else
74       CurFile.Close();
75   }
76   File HostFile;
77   if (Found && HostFile.Open(FileName,FileNameW,true,true))
78     /*SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
79                 &fd.ftLastWriteTime);*/
80   if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
81     SetFileAttr(FileName,FileNameW,fd.FileAttr);
82 }
83 #endif
84
85
86 void ExtractStreamsNew(Archive &Arc,char *FileName,wchar *FileNameW)
87 {
88   if (!WinNT())
89     return;
90
91   wchar NameW[NM];
92   if (FileNameW!=NULL && *FileNameW!=0)
93     strcpyw(NameW,FileNameW);
94   else
95     CharToWide(FileName,NameW);
96   wchar StreamNameW[NM+2];
97   if (NameW[0]!=0 && NameW[1]==0)
98   {
99     strcpyw(StreamNameW,L".\\");
100     strcpyw(StreamNameW+2,NameW);
101   }
102   else
103     strcpyw(StreamNameW,NameW);
104
105   wchar *DestName=StreamNameW+strlenw(StreamNameW);
106   byte *SrcName=&Arc.SubHead.SubData[0];
107   int DestSize=Arc.SubHead.SubData.Size()/2;
108
109   if (strlenw(StreamNameW)+DestSize>=sizeof(StreamNameW)/sizeof(StreamNameW[0]))
110   {
111 #if !defined(SILENT) && !defined(SFX_MODULE)
112     Log(Arc.FileName,St(MStreamBroken),FileName);
113 #endif
114     ErrHandler.SetErrorCode(CRC_ERROR);
115     return;
116   }
117
118   RawToWide(SrcName,DestName,DestSize);
119   DestName[DestSize]=0;
120
121   FindData fd;
122   bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
123
124   if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
125     SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
126   char StreamName[NM];
127   WideToChar(StreamNameW,StreamName);
128   File CurFile;
129   if (CurFile.WCreate(StreamName,StreamNameW) && Arc.ReadSubData(NULL,&CurFile))
130     CurFile.Close();
131   File HostFile;
132   if (Found && HostFile.Open(FileName,FileNameW,true,true))
133 /*    SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
134                 &fd.ftLastWriteTime);*/
135   if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
136     SetFileAttr(FileName,FileNameW,fd.FileAttr);
137 }