VitaShell/fex/unrar/archive.cpp
Sergi Granell 02aad5cc47 Cleanup..
2016-01-20 22:36:36 +01:00

98 lines
1.5 KiB
C++

#include <stdio.h>
#include "rar.hpp"
#include "unrar.h"
Archive::Archive() : Raw( this )
{
OldFormat=false;
Solid=false;
CurBlockPos=0;
NextBlockPos=0;
memset(&NewMhd,0,sizeof(NewMhd));
NewMhd.HeadType=MAIN_HEAD;
NewMhd.HeadSize=SIZEOF_NEWMHD;
HeaderCRC=0;
}
bool Archive::IsSignature(byte *D)
{
bool Valid=false;
if (D[0]==0x52)
#ifndef SFX_MODULE
if (D[1]==0x45 && D[2]==0x7e && D[3]==0x5e)
{
OldFormat=true;
Valid=true;
}
else
#endif
if (D[1]==0x61 && D[2]==0x72 && D[3]==0x21 && D[4]==0x1a && D[5]==0x07 && D[6]==0x00)
{
OldFormat=false;
Valid=true;
}
return(Valid);
}
unrar_err_t Archive::IsArchive()
{
if (Read(MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD)
return unrar_err_not_arc;
if (IsSignature(MarkHead.Mark))
{
if (OldFormat)
Seek(0,SEEK_SET);
}
else
{
if (SFXSize==0)
return unrar_err_not_arc;
}
unrar_err_t error =
ReadHeader();
// (no need to seek to next)
if ( error != unrar_ok )
return error;
#ifndef SFX_MODULE
if (OldFormat)
{
NewMhd.Flags=OldMhd.Flags & 0x3f;
NewMhd.HeadSize=OldMhd.HeadSize;
}
else
#endif
{
if (HeaderCRC!=NewMhd.HeadCRC)
{
return unrar_err_corrupt;
}
}
bool
Volume=(NewMhd.Flags & MHD_VOLUME);
Solid=(NewMhd.Flags & MHD_SOLID)!=0;
bool
Encrypted=(NewMhd.Flags & MHD_PASSWORD)!=0;
// (removed decryption and volume handling)
if ( Encrypted )
return unrar_err_encrypted;
if ( Volume )
return unrar_err_segmented;
return unrar_ok;
}
void Archive::SeekToNext()
{
Seek(NextBlockPos,SEEK_SET);
}