private MacFolderEntry cpt_folder(string name, FileHdr fileh, byte[] cptindex, int cptptr) { int nfiles; FileHdr filehdr; List <ArchiveDirectoryEntry> entries = new List <ArchiveDirectoryEntry>(); cptptr += FILEHDRSIZE; nfiles = fileh.foldersize; for (int i = 0; i < nfiles; i++, cptptr += FILEHDRSIZE) { if (cpt_filehdr(out filehdr, cptindex, cptptr) == -1) { throw new ApplicationException(string.Format("Can't read file header #{0}", i + 1)); } if (filehdr.folder != 0) { entries.Add(cpt_folder(text, filehdr, cptindex, cptptr)); i += filehdr.foldersize; cptptr += filehdr.foldersize * FILEHDRSIZE; } else { if ((filehdr.cptFlag & 1) == 1) { Console.Error.WriteLine("File is password protected, skipping file"); } else { entries.Add(new MacFileEntry(this, filehdr)); } } } return(new MacFolderEntry(name, entries)); }
private int cpt_filehdr(out FileHdr f, byte[] hdr, int hdrOff) { f = new FileHdr(); info = new byte[INFOBYTES]; int n = hdr[hdrOff + F_FNAME] & BYTEMASK; if (n > F_NAMELEN) { n = F_NAMELEN; } info[I_NAMEOFF] = (byte)n; copy(info, I_NAMEOFF + 1, hdr, hdrOff + F_FNAME + 1, n); text = transname(hdr, hdrOff + F_FNAME + 1, n); f.folder = hdr[hdrOff + F_FOLDER]; f.fName = text; if (f.folder != 0) { f.foldersize = get2(hdr, hdrOff + F_FOLDERSIZE); } else { f.fName = text; f.cptFlag = get2(hdr, hdrOff + F_CPTFLAG); f.rsrcLength = get4(hdr, hdrOff + F_RSRCLENGTH); f.dataLength = get4(hdr, hdrOff + F_DATALENGTH); f.compRLength = get4(hdr, hdrOff + F_COMPRLENGTH); f.compDLength = get4(hdr, hdrOff + F_COMPDLENGTH); f.fType = transname(hdr, hdrOff + F_FTYPE, 4); f.fCreator = transname(hdr, hdrOff + F_CREATOR, 4); f.fileCRC = get4(hdr, hdrOff + F_FILECRC); f.FndrFlags = get2(hdr, hdrOff + F_FNDRFLAGS); f.filepos = get4(hdr, hdrOff + F_FILEPOS); f.volume = hdr[hdrOff + F_VOLUME]; } if (f.folder == 0) { copy(info, I_TYPEOFF, hdr, hdrOff + F_FTYPE, 4); copy(info, I_AUTHOFF, hdr, hdrOff + F_CREATOR, 4); copy(info, I_FLAGOFF, hdr, hdrOff + F_FNDRFLAGS, 2); copy(info, I_DLENOFF, hdr, hdrOff + F_DATALENGTH, 4); copy(info, I_RLENOFF, hdr, hdrOff + F_RSRCLENGTH, 4); copy(info, I_CTIMOFF, hdr, hdrOff + F_CREATIONDATE, 4); copy(info, I_MTIMOFF, hdr, hdrOff + F_MODDATE, 4); } return(1); }
public ForkFolder(CompactProArchive archive, FileHdr hdr) { rsrcFork = new ForkEntry(archive, "rsrc", hdr.filepos, hdr.compRLength, hdr.rsrcLength, ((ushort)(hdr.cptFlag & 2))); dataFork = new ForkEntry(archive, "data", hdr.filepos + hdr.compRLength, hdr.compDLength, hdr.dataLength, ((ushort)(hdr.cptFlag & 4))); }
public MacFileEntry(CompactProArchive archive, FileHdr hdr) { this.archive = archive; this.hdr = hdr; this.forks = new ForkFolder(archive, hdr); }
public MacFileEntry(CompactProArchive archive, MacFolderEntry?parent, FileHdr hdr) : base(archive, parent, hdr.fName !) { this.hdr = hdr; this.Entries = new ForkFolder(archive, this, hdr); }