1 bool Archive::GetComment(Array<byte> &CmtData)
5 SaveFilePos SavePos(*this);
11 Seek(SFXSize+SIZEOF_OLDMHD,SEEK_SET);
12 CmtLength=GetByte()+(GetByte()<<8);
17 if (NewMhd.Flags & MHD_COMMENT)
19 Seek(SFXSize+SIZEOF_MARKHEAD+SIZEOF_NEWMHD,SEEK_SET);
24 Seek(SFXSize+SIZEOF_MARKHEAD+NewMhd.HeadSize,SEEK_SET);
25 return(SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData)!=0);
28 if (CommHead.HeadCRC!=HeaderCRC)
30 Log(FileName,St(MLogCommHead));
34 CmtLength=CommHead.HeadSize-SIZEOF_COMMHEAD;
38 if ((OldFormat && (OldMhd.Flags & MHD_PACK_COMMENT)) || (!OldFormat && CommHead.Method!=0x30))
40 if (!OldFormat && (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x35))
43 Unpack Unpack(&DataIO);
45 DataIO.SetTestMode(true);
49 UnpCmtLength=GetByte()+(GetByte()<<8);
51 DataIO.SetCmt13Encryption();
54 UnpCmtLength=CommHead.UnpSize;
55 DataIO.SetFiles(this,NULL);
56 DataIO.EnableShowProgress(false);
57 DataIO.SetPackedSizeToRead(CmtLength);
58 Unpack.SetDestSize(UnpCmtLength);
59 Unpack.DoUnpack(CommHead.UnpVer,false);
61 if (!OldFormat && ((~DataIO.UnpFileCRC)&0xffff)!=CommHead.CommCRC)
63 Log(FileName,St(MLogCommBrk));
69 unsigned char *UnpData;
71 DataIO.GetUnpackedData(&UnpData,&UnpDataSize);
72 CmtData.Alloc(UnpDataSize);
73 memcpy(&CmtData[0],UnpData,UnpDataSize);
78 CmtData.Alloc(CmtLength);
80 Read(&CmtData[0],CmtLength);
81 if (!OldFormat && CommHead.CommCRC!=(~CRC(0xffffffff,&CmtData[0],CmtLength)&0xffff))
83 Log(FileName,St(MLogCommBrk));
90 #if defined(_WIN_32) && !defined(_WIN_CE) && !defined(_XBOX) && !defined(_LINUX)
92 OemToCharBuff((char*)&CmtData[0],(char*)&CmtData[0],CmtData.Size());
94 return(CmtData.Size()>0);
98 int Archive::ReadCommentData(Array<byte> &CmtData)
100 bool Unicode=SubHead.SubFlags & SUBHEAD_FLAGS_CMT_UNICODE;
101 if (!ReadSubData(&CmtData,NULL))
103 int CmtSize=CmtData.Size();
107 Array<wchar> CmtDataW(CmtSize+1);
108 RawToWide(&CmtData[0],&CmtDataW[0],CmtSize);
110 CmtData.Alloc(CmtSize*2);
111 WideToChar(&CmtDataW[0],(char *)&CmtData[0]);
112 CmtSize=strlen((char *)&CmtData[0]);
113 CmtData.Alloc(CmtSize);
119 void Archive::ViewComment()
122 if (Cmd->DisableComment)
125 if (GetComment(CmtBuf))
127 int CmtSize=CmtBuf.Size();
128 char *ChPtr=(char *)memchr(&CmtBuf[0],0x1A,CmtSize);
130 CmtSize=ChPtr-(char *)&CmtBuf[0];
132 OutComment((char *)&CmtBuf[0],CmtSize);
139 void Archive::ViewFileComment()
141 if (!(NewLhd.Flags & LHD_COMMENT) || Cmd->DisableComment || OldFormat)
144 mprintf(St(MFileComment));
146 const int MaxSize=0x8000;
147 Array<char> CmtBuf(MaxSize);
148 SaveFilePos SavePos(*this);
149 Seek(CurBlockPos+SIZEOF_NEWLHD+NewLhd.NameSize,SEEK_SET);
150 Int64 SaveCurBlockPos=CurBlockPos;
151 Int64 SaveNextBlockPos=NextBlockPos;
153 int Size=ReadHeader();
155 CurBlockPos=SaveCurBlockPos;
156 NextBlockPos=SaveNextBlockPos;
158 if (Size<7 || CommHead.HeadType!=COMM_HEAD)
160 if (CommHead.HeadCRC!=HeaderCRC)
163 Log(FileName,St(MLogCommHead));
167 if (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER ||
168 CommHead.Method > 0x30 || CommHead.UnpSize > MaxSize)
170 Read(&CmtBuf[0],CommHead.UnpSize);
171 if (CommHead.CommCRC!=((~CRC(0xffffffff,&CmtBuf[0],CommHead.UnpSize)&0xffff)))
173 Log(FileName,St(MLogBrokFCmt));
177 OutComment(&CmtBuf[0],CommHead.UnpSize);