95 lines
2.0 KiB
C++
95 lines
2.0 KiB
C++
#include <os2.h>
|
|
|
|
|
|
|
|
void ExtractOS2EA(Archive &Arc,char *FileName)
|
|
{
|
|
if (_osmode != OS2_MODE)
|
|
{
|
|
mprintf(St(MSkipEA));
|
|
return;
|
|
}
|
|
|
|
if (Arc.HeaderCRC!=Arc.EAHead.HeadCRC)
|
|
{
|
|
Log(Arc.FileName,St(MEABroken),FileName);
|
|
ErrHandler.SetErrorCode(CRC_ERROR);
|
|
return;
|
|
}
|
|
|
|
if (Arc.EAHead.Method<0x31 || Arc.EAHead.Method>0x35 || Arc.EAHead.UnpVer>PACK_VER)
|
|
{
|
|
Log(Arc.FileName,St(MEAUnknHeader),FileName);
|
|
ErrHandler.SetErrorCode(WARNING);
|
|
return;
|
|
}
|
|
|
|
struct StructEAOP2
|
|
{
|
|
char *GEAPtr;
|
|
char *FEAPtr;
|
|
unsigned long Error;
|
|
} EAOP2;
|
|
|
|
ComprDataIO DataIO;
|
|
Unpack Unpack(&DataIO);
|
|
Unpack.Init();
|
|
|
|
Array<unsigned char> UnpData(Arc.EAHead.UnpSize);
|
|
DataIO.SetUnpackToMemory(&UnpData[0],Arc.EAHead.UnpSize);
|
|
DataIO.SetPackedSizeToRead(Arc.EAHead.DataSize);
|
|
DataIO.EnableShowProgress(false);
|
|
DataIO.SetFiles(&Arc,NULL);
|
|
Unpack.SetDestSize(Arc.EAHead.UnpSize);
|
|
Unpack.DoUnpack(Arc.EAHead.UnpVer,false);
|
|
|
|
if (Arc.EAHead.EACRC!=~DataIO.UnpFileCRC)
|
|
{
|
|
Log(Arc.FileName,St(MEABroken),FileName);
|
|
ErrHandler.SetErrorCode(CRC_ERROR);
|
|
return;
|
|
}
|
|
|
|
EAOP2.FEAPtr=(char *)&UnpData[0];
|
|
EAOP2.GEAPtr=NULL;
|
|
if (DosSetPathInfo((unsigned char *)FileName,2,&EAOP2,sizeof(EAOP2),0x10)!=0)
|
|
{
|
|
Log(Arc.FileName,St(MCannotSetEA),FileName);
|
|
ErrHandler.SetErrorCode(WARNING);
|
|
}
|
|
File::SetCloseFileTimeByName(FileName,&Arc.NewLhd.mtime,&Arc.NewLhd.atime);
|
|
mprintf(St(MShowEA));
|
|
}
|
|
|
|
|
|
void ExtractOS2EANew(Archive &Arc,char *FileName)
|
|
{
|
|
if (_osmode != OS2_MODE)
|
|
{
|
|
mprintf(St(MSkipEA));
|
|
return;
|
|
}
|
|
|
|
Array<byte> SubData;
|
|
if (!Arc.ReadSubData(&SubData,NULL))
|
|
return;
|
|
|
|
struct StructEAOP2
|
|
{
|
|
char *GEAPtr;
|
|
char *FEAPtr;
|
|
unsigned long Error;
|
|
} EAOP2;
|
|
|
|
EAOP2.FEAPtr=(char *)&SubData[0];
|
|
EAOP2.GEAPtr=NULL;
|
|
if (DosSetPathInfo((unsigned char *)FileName,2,&EAOP2,sizeof(EAOP2),0x10)!=0)
|
|
{
|
|
Log(Arc.FileName,St(MCannotSetEA),FileName);
|
|
ErrHandler.SetErrorCode(WARNING);
|
|
}
|
|
File::SetCloseFileTimeByName(FileName,&Arc.NewLhd.mtime,&Arc.NewLhd.atime);
|
|
mprintf(St(MShowEA));
|
|
}
|
|
|