Beispiel #1
0
        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));
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 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)));
 }
Beispiel #4
0
 public MacFileEntry(CompactProArchive archive, FileHdr hdr)
 {
     this.archive = archive;
     this.hdr     = hdr;
     this.forks   = new ForkFolder(archive, hdr);
 }
Beispiel #5
0
 public MacFileEntry(CompactProArchive archive, MacFolderEntry?parent, FileHdr hdr)
     : base(archive, parent, hdr.fName !)
 {
     this.hdr     = hdr;
     this.Entries = new ForkFolder(archive, this, hdr);
 }