1 // THIS FILE IS SLIGHTLY MODIFIED TO WORK WITH XBMC
4 void ExtractStreams(Archive &Arc,char *FileName,wchar *FileNameW)
9 if (Arc.HeaderCRC!=Arc.StreamHead.HeadCRC)
12 Log(Arc.FileName,St(MStreamBroken),FileName);
14 ErrHandler.SetErrorCode(CRC_ERROR);
18 if (Arc.StreamHead.Method<0x31 || Arc.StreamHead.Method>0x35 || Arc.StreamHead.UnpVer>PACK_VER)
21 Log(Arc.FileName,St(MStreamUnknown),FileName);
23 ErrHandler.SetErrorCode(WARNING);
27 char StreamName[NM+2];
28 if (FileName[0]!=0 && FileName[1]==0)
30 strcpy(StreamName,".\\");
31 strcpy(StreamName+2,FileName);
34 strcpy(StreamName,FileName);
35 if (strlen(StreamName)+strlen((char *)Arc.StreamHead.StreamName)>=sizeof(StreamName))
38 Log(Arc.FileName,St(MStreamBroken),FileName);
40 ErrHandler.SetErrorCode(CRC_ERROR);
44 strcat(StreamName,(char *)Arc.StreamHead.StreamName);
47 bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
49 if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
50 SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
53 if (CurFile.WCreate(StreamName))
56 Unpack Unpack(&DataIO);
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);
66 if (Arc.StreamHead.StreamCRC!=~DataIO.UnpFileCRC)
69 Log(Arc.FileName,St(MStreamBroken),StreamName);
71 ErrHandler.SetErrorCode(CRC_ERROR);
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);
86 void ExtractStreamsNew(Archive &Arc,char *FileName,wchar *FileNameW)
92 if (FileNameW!=NULL && *FileNameW!=0)
93 strcpyw(NameW,FileNameW);
95 CharToWide(FileName,NameW);
96 wchar StreamNameW[NM+2];
97 if (NameW[0]!=0 && NameW[1]==0)
99 strcpyw(StreamNameW,L".\\");
100 strcpyw(StreamNameW+2,NameW);
103 strcpyw(StreamNameW,NameW);
105 wchar *DestName=StreamNameW+strlenw(StreamNameW);
106 byte *SrcName=&Arc.SubHead.SubData[0];
107 int DestSize=Arc.SubHead.SubData.Size()/2;
109 if (strlenw(StreamNameW)+DestSize>=sizeof(StreamNameW)/sizeof(StreamNameW[0]))
111 #if !defined(SILENT) && !defined(SFX_MODULE)
112 Log(Arc.FileName,St(MStreamBroken),FileName);
114 ErrHandler.SetErrorCode(CRC_ERROR);
118 RawToWide(SrcName,DestName,DestSize);
119 DestName[DestSize]=0;
122 bool Found=FindFile::FastFind(FileName,FileNameW,&fd);
124 if (fd.FileAttr & FILE_ATTRIBUTE_READONLY)
125 SetFileAttr(FileName,FileNameW,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY);
127 WideToChar(StreamNameW,StreamName);
129 if (CurFile.WCreate(StreamName,StreamNameW) && Arc.ReadSubData(NULL,&CurFile))
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);