proboard/ZIP.CPP

369 lines
7.4 KiB
C++

#include <string.h>
#include "proboard.hpp"
static void near zip(File&);
static void near arc(File&);
static void near arj(File&);
static void near lzh(File&);
static void near zoo(File&);
static void near rar(File&);
static bool find_area(char *fn,FileArea &fa);
static void near print(char *,unsigned,unsigned,long,long);
# define NUM_EXT 5
void
list_archive(char *data)
{
char input[13];
io << "\f\n" << S_VIEW_ARCHIVE_TITLE_AND_PROMPT;
io.read(input,12,READMODE_UPALL);
if(!input[0]) return;
FileName fn;
File fh;
String param[40];
BitArray arealist(MAX_FILE_AREAS,1);
int npara=parse_data(data,param);
create_arealist(param,npara,arealist);
FileArea fa;
if(!find_area(input,fa))
{
io << "\n\n" << S_ARCHIVE_FILE_NOT_FOUND << "\n\n" << S_PRESS_ENTER_TO_CONTINUE;
return;
}
fn(fa.filepath,input);
fn.upperCase();
if(!fh.open(fn))
return;
fn.stripPath();
LOG(2,"Archive list requested (%s)",(char *)fn);
linecounter(0);
io << form("\n\f\n\7"
"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n"
"º \3%-12s \7³\3 %-44.44s\7º\n",(char *)fn,fa.name);
io << form("ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍËÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍ͹\n"
"º\6 %-15.15s\7º\6 %-12.12s\7º\6 %-6.6s\7º\6 %-9.9s\7º\6 %-9.9s\7º\n"
"ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍÍÎÍÍÍÍÍÍÍÍÍ͹\n",
S_ARCHIVE_HEADER_FILENAME,
S_ARCHIVE_HEADER_DATE,
S_ARCHIVE_HEADER_TIME,
S_ARCHIVE_HEADER_ORIGSIZE,
S_ARCHIVE_HEADER_COMPSIZE
);
linecounter(5);
stopped=0;
io.enablestop();
char ident_buf[20];
fh.read(ident_buf,20);
fh.seek(0);
if(ident_buf[0] == '\x1a') arc(fh);
else if(!strncmp(ident_buf,"PK\x03\x04",4)) zip(fh);
else if(!strncmp(&ident_buf[2],"-lh",3)) lzh(fh);
else if(!strncmp(ident_buf,"ZOO",3)) zoo(fh);
else if(!strncmp(ident_buf,"\x60\xEA",2)) arj(fh);
else if(!strncmp(ident_buf,"Rar",3)) rar(fh);
if(!stopped) io << "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍͼ\n\n"
<< S_PRESS_ENTER_TO_CONTINUE;
io.disablestop();
}
static void near
zip(File &f)
{
struct zipfile
{
unsigned long signature;
unsigned version,gp,method,time,date;
long crc,comsize,uncomsize;
unsigned length,extra;
} zip_record;
char name[80];
for(;;)
{
f.read(&zip_record,sizeof(zip_record));
if(zip_record.signature!=0x04034b50L) break;
f.read(name,zip_record.length);
name[zip_record.length]='\0';
print(name,zip_record.date,zip_record.time,zip_record.comsize,zip_record.uncomsize);
if(linecounter() || stopped) break;
f.seek(zip_record.comsize+zip_record.extra,seek_cur);
}
}
static void near
arc(File &f)
{
struct arcfile
{
char name[13];
long size;
unsigned date,time,crc;
long length;
} arc_record;
for(;;)
{
char mark;
f.read(&mark,1);
if(!mark) break;
f.read(&mark,1);
if(mark==1)
{
if(f.read(&arc_record,23) != 23) break;
arc_record.length=arc_record.size;
}
else
{
if(f.read(&arc_record,27) != 27) break;
}
print(arc_record.name,arc_record.date,arc_record.time,arc_record.size,arc_record.length);
if(linecounter() || stopped) break;
f.seek(arc_record.size,seek_cur);
}
}
static void near
print(char *name,unsigned date,unsigned time,long csize,long usize)
{
Date d; d.fileDate(date);
Time t; t.fileTime(time);
strip_path(name);
io << form("º\6 %-15s\7º\5 %02d %3.3s %04d \7º\2 %02d:%02d \7º\3 %8ld \7º\6 %8ld \7º\n",name,d[0],months_short[d[1]],d[2]+1900,t[0],t[1],usize,csize);
}
static void near
lzh(File &f)
{
struct lzhfile
{
unsigned char headsiz,headchk;
char headid[3];
int method;
unsigned long pacsiz,orgsiz;
unsigned int time,date,attr;
unsigned char fnlen;
char Fname[80];
} lzh_record;
for(;;)
{
if(f.read(&lzh_record.headsiz,1)<1) break;
if(f.read(&lzh_record.headchk,(int)lzh_record.headsiz+1)<((int)lzh_record.headsiz+1)) break;
if(strncmp(lzh_record.headid,"-lh",3)) break;
lzh_record.Fname[lzh_record.fnlen]='\0';
print(lzh_record.Fname,lzh_record.date,lzh_record.time,lzh_record.pacsiz,lzh_record.orgsiz);
if(linecounter() || stopped) break;
f.seek(lzh_record.pacsiz,seek_cur);
}
}
static void near
zoo(File &f)
{
struct zoo_header
{
char text[20];
unsigned long zoo_tag;
long zoo_start;
// De rest moeme nie-Šn!
} zoo_record;
struct direntry
{
long zoo_tag;
char type,packing_method;
long next,offset;
unsigned date,time,file_crc;
long org_size,size_now;
unsigned char major_ver,minor_ver,deleted,struc;
long comment;
unsigned int cmt_size;
char fname[13];
} zoo_head;
f.read(&zoo_record,sizeof(zoo_record));
f.seek(zoo_record.zoo_start);
for(;;)
{
f.read(&zoo_head,sizeof(zoo_head));
if(!zoo_head.next) break;
print(zoo_head.fname,zoo_head.date,zoo_head.time,zoo_head.size_now,zoo_head.org_size);
if(linecounter() || stopped) break;
f.seek(zoo_head.next);
}
}
static void near
arj(File &f)
{
struct {
unsigned id;
unsigned hdrsize;
byte first_hdrsize;
byte version;
byte version_needed;
byte OS;
byte arjflags;
byte method;
byte filetype;
byte reserved1;
unsigned time;
unsigned date;
long comsize;
long uncomsize;
long crc;
unsigned filespecpos;
unsigned accessmode;
} arj_record;
char name[80];
for(int count = 1;;count++)
{
//unsigned extheadersize;
long pos = f.pos();
f.read(&arj_record,sizeof(arj_record));
if(arj_record.id != 0xEA60 || !arj_record.hdrsize) break;
f.seek(pos+arj_record.first_hdrsize+4);
f.read(name,80);
if(count > 1)
{
print(name,arj_record.date,arj_record.time,arj_record.comsize,arj_record.uncomsize);
if(linecounter() || stopped) break;
}
if(count == 1)
f.seek(pos+arj_record.hdrsize+10);
else
f.seek(pos+arj_record.hdrsize+10+arj_record.comsize);
}
}
static void near
rar(File &f)
{
struct block_header
{
word crc;
byte type;
word flags;
word blockSize;
};
struct file_header
{
word crc;
byte type;
word flags;
word blockSize;
long packSize;
long unpackSize;
byte hostOs;
dword fileCrc;
word fileTime;
word fileDate;
byte unpackVersion;
byte method;
word nameSize;
dword fileAttr;
};
for(;;)
{
block_header bh;
file_header fh;
long pos = f.pos();
if(f.read(&bh,sizeof(bh)) != sizeof(bh))
break;
if(bh.type == 0x74)
{
f.seek(pos);
f.read(&fh,sizeof(fh));
char *fname = new char[fh.nameSize+1];
f.read(fname,fh.nameSize);
fname[fh.nameSize] = '\0';
print(fname,fh.fileDate,fh.fileTime,fh.packSize,fh.unpackSize);
f.seek(pos + fh.blockSize + fh.packSize);
}
else
{
f.seek(pos + bh.blockSize);
}
}
}
bool
find_area(char *fn,FileArea &fa)
{
File idx;
if(idx.open(FileName(syspath,"FILESIDX.PB") , fmode_read , cfg.fastmode ? 8192:4096))
{
FilesIdx fidx;
for(;;)
{
if(idx.read(&fidx,sizeof(fidx)) != sizeof(fidx)) break;
if(!stricmp(fidx.name,fn))
{
if(fa.read(fidx.area) && check_access(fa.level,fa.flags,fa.flagsNot))
return TRUE;
}
}
}
return FALSE;
}