~ubuntu-branches/ubuntu/quantal/unrar-nonfree/quantal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#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));
}