5
void ExtractStreams(Archive &Arc,char *FileName,wchar *FileNameW)
10
if (Arc.HeaderCRC!=Arc.StreamHead.HeadCRC)
13
Log(Arc.FileName,St(MStreamBroken),FileName);
15
ErrHandler.SetErrorCode(CRC_ERROR);
19
if (Arc.StreamHead.Method<0x31 || Arc.StreamHead.Method>0x35 || Arc.StreamHead.UnpVer>PACK_VER)
22
Log(Arc.FileName,St(MStreamUnknown),FileName);
24
ErrHandler.SetErrorCode(WARNING);
28
char StreamName[NM+2];
29
if (FileName[0]!=0 && FileName[1]==0)
31
strcpy(StreamName,".\\");
32
strcpy(StreamName+2,FileName);
35
strcpy(StreamName,FileName);
36
if (strlen(StreamName)+strlen((char *)Arc.StreamHead.StreamName)>=sizeof(StreamName))
39
Log(Arc.FileName,St(MStreamBroken),FileName);
41
ErrHandler.SetErrorCode(CRC_ERROR);
45
strcat(StreamName,(char *)Arc.StreamHead.StreamName);
48
bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
50
if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
51
SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
54
if (CurFile.WCreate(StreamName))
57
Unpack Unpack(&DataIO);
60
Array<unsigned char> UnpData(Arc.StreamHead.UnpSize);
61
DataIO.SetPackedSizeToRead(Arc.StreamHead.DataSize);
62
DataIO.EnableShowProgress(false);
63
DataIO.SetFiles(&Arc,&CurFile);
64
Unpack.SetDestSize(Arc.StreamHead.UnpSize);
65
Unpack.DoUnpack(Arc.StreamHead.UnpVer,false);
67
if (Arc.StreamHead.StreamCRC!=~DataIO.UnpFileCRC)
70
Log(Arc.FileName,St(MStreamBroken),StreamName);
72
ErrHandler.SetErrorCode(CRC_ERROR);
78
if (Found && HostFile.Open(FileName,FileNameW,true,true))
79
SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
81
if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
82
SetFileAttr(FileName,FileNameW,fd.FileAttr);
87
void ExtractStreamsNew(Archive &Arc,char *FileName,wchar *FileNameW)
93
if (FileNameW!=NULL && *FileNameW!=0)
94
strcpyw(NameW,FileNameW);
96
CharToWide(FileName,NameW);
97
wchar StreamNameW[NM+2];
98
if (NameW[0]!=0 && NameW[1]==0)
100
strcpyw(StreamNameW,L".\\");
101
strcpyw(StreamNameW+2,NameW);
104
strcpyw(StreamNameW,NameW);
106
wchar *DestName=StreamNameW+strlenw(StreamNameW);
107
byte *SrcName=&Arc.SubHead.SubData[0];
108
int DestSize=Arc.SubHead.SubData.Size()/2;
110
if (strlenw(StreamNameW)+DestSize>=sizeof(StreamNameW)/sizeof(StreamNameW[0]))
112
#if !defined(SILENT) && !defined(SFX_MODULE)
113
Log(Arc.FileName,St(MStreamBroken),FileName);
115
ErrHandler.SetErrorCode(CRC_ERROR);
119
RawToWide(SrcName,DestName,DestSize);
120
DestName[DestSize]=0;
123
bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
125
if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
126
SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
128
WideToChar(StreamNameW,StreamName);
130
if (CurFile.WCreate(StreamName,StreamNameW) && Arc.ReadSubData(NULL,&CurFile))
133
if (Found && HostFile.Open(FileName,FileNameW,true,true))
134
SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime,
135
&fd.ftLastWriteTime);
136
if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
137
SetFileAttr(FileName,FileNameW,fd.FileAttr);