public bool importFile(int fnum, bool isid, byte[] data)
        {
            DinnerEntry e   = fileInfo(fnum, isid);
            FileHeader  hdr = readHeader(fnum, isid);

            byte[] fl;
            if (e.compressed && hdr.compressed && hdr.tot_size != e.size)
            {
                UInt32 decompsz = (uint)data.Length;
                if (e.header)
                {
                    hdr  = new FileHeader(data);
                    fl   = data;
                    data = new byte[fl.Length - FileHeader.size];
                    Array.Copy(fl, FileHeader.size, data, 0, data.Length);
                    hdr.setSize(decompsz);
                }
                else
                {
                    hdr.setSize(decompsz);
                }
                byte[] cmpr = RNC.compress(data);
                data = new byte[cmpr.Length + FileHeader.size];
                Array.Copy(hdr.buf, 0, data, 0, FileHeader.size);
                Array.Copy(cmpr, 0, data, FileHeader.size, cmpr.Length);
            }
            int resize = data.Length - (int)e.size;

            if (resize != 0)
            {
                resizeDisk(resize, ref e);
            }
            Array.Copy(data, 0, diskbuf, e.offset, data.Length);
            return(true);
        }
        public byte[] readFile(int fnum, bool isid)
        {
            DinnerEntry e   = fileInfo(fnum, isid);
            FileHeader  hdr = readHeader(fnum, isid);

            byte[] res = null;
            if (e.compressed && hdr.compressed && hdr.tot_size != e.size)
            {
                byte[] fl = new byte[e.size - FileHeader.size];
                Array.Copy(diskbuf, e.offset + FileHeader.size, fl, 0, e.size - FileHeader.size);
                res = RNC.decompress(fl);
                if (e.header)
                {
                    fl  = res;
                    res = new byte[fl.Length + FileHeader.size];
                    Array.Copy(hdr.buf, res, FileHeader.size);
                    Array.Copy(fl, 0, res, FileHeader.size, fl.Length);
                }
            }
            else
            {
                res = new byte[e.size];
                Array.Copy(diskbuf, e.offset, res, 0, e.size);
            }
            return(res);
        }
Exemple #3
0
        public FileHeader readHeader(int fnum, bool isid)
        {
            DinnerEntry e = fileInfo(fnum, isid);

            byte[] finfo = new byte[FileHeader.size];
            Array.Copy(diskbuf, e.offset, finfo, 0, FileHeader.size);
            return(new FileHeader(finfo));
        }
Exemple #4
0
 public void setDinner(DinnerEntry e)
 {
     for (int i = 0; i < dinners.Length; i++)
     {
         if (dinners[i].id == e.id)
         {
             dinners[i]         = e;
             dinners[i].resized = true;
             return;
         }
     }
 }
Exemple #5
0
        public void resizeDisk(int resize, ref DinnerEntry e)
        {
            for (int i = 0; i < dinners.Length; i++)
            {
                dinners[i].resized = false;
            }
            uint prevsz = e.size;

            e.size = (uint)((int)e.size + resize);
            uint curpos = normpos(e.offset + prevsz);
            uint newpos = normpos(e.offset + e.size);

            setDinner(e);
            if (curpos == newpos)
            {
                return;
            }
            DinnerEntry ce;

            while (!(ce = findDinnerByOffset(curpos)).isEmpty())
            {
                ce.old_offset = ce.offset;
                ce.offset     = newpos;
//                Console.WriteLine(String.Format("found {0:d} @{1:X8}->@{2:X8} size={3:X4}", ce.id,ce.old_offset,ce.offset, ce.size));
                setDinner(ce);
                curpos += ce.size;
                newpos += ce.size;
                normpos(ref curpos);
                normpos(ref newpos);
            }
            for (int i = 0; i < dinners.Length; i++)
            {
                dinners[i].resized = false;
            }
//            if (newpos != diskbuf.Length)
            {
                byte[] prevbuf = diskbuf;
                diskbuf = new byte[newpos];
                Array.Copy(prevbuf, diskbuf, e.offset);
                curpos = normpos(e.offset + e.size);
                while (!(ce = findDinnerByOffset(curpos)).isEmpty())
                {
                    //                   Console.WriteLine(String.Format("moveing {0:d} {1:X8}->{2:X8} {3:X4}",ce.id,ce.old_offset,ce.offset,ce.size));
                    Array.Copy(prevbuf, ce.old_offset, diskbuf, ce.offset, ce.size);
                    curpos += ce.size;
                    normpos(ref curpos);
                    setDinner(ce);
                }
            }
        }
Exemple #6
0
        public byte[] readFile(int fnum, bool isid)
        {
            DinnerEntry e   = fileInfo(fnum, isid);
            FileHeader  hdr = readHeader(fnum, isid);

            byte[] res = null;
            if (e.compressed && hdr.compressed && hdr.tot_size != e.size)
            {
                throw new Exception("Cant get compressed file");
            }
            else
            {
                res = new byte[e.size];
                Array.Copy(diskbuf, e.offset, res, 0, e.size);
            }
            return(res);
        }
Exemple #7
0
        public bool readDinner()
        {
            FileStream fs = new FileStream(path + disk_file, FileMode.Open);

            diskbuf = new byte[fs.Length];
            fs.Read(diskbuf, 0, (int)fs.Length);
            fs.Close();
            BinaryReader br = new BinaryReader(new FileStream(path + dinner_file, FileMode.Open));

            dinnerSize = br.ReadUInt32();
            version    = getVersion();
            dinners    = new DinnerEntry[dinnerSize];
            for (uint i = 0; i < dinnerSize; i++)
            {
                dinners[i] = new DinnerEntry(br, version);
            }
            br.Close();
            return(true);
        }
Exemple #8
0
        public bool importFile(int fnum, bool isid, byte[] data)
        {
            DinnerEntry e   = fileInfo(fnum, isid);
            FileHeader  hdr = readHeader(fnum, isid);

            byte[] fl;
            if (e.compressed && hdr.compressed && hdr.tot_size != e.size)
            {
                UInt32 decompsz = (uint)data.Length;
                if (e.header)
                {
                    hdr  = new FileHeader(data);
                    fl   = data;
                    data = new byte[fl.Length - FileHeader.size];
                    Array.Copy(fl, FileHeader.size, data, 0, data.Length);
                    hdr.setSize(decompsz);
                }
                else
                {
                    hdr.setSize(decompsz);
                }
                byte[] cmpr = RNCCompressor.compress(data);
                data = new byte[cmpr.Length + FileHeader.size];
                Array.Copy(hdr.buf, 0, data, 0, FileHeader.size);
                Array.Copy(cmpr, 0, data, FileHeader.size, cmpr.Length);
            }
            int resize = data.Length - (int)e.size;

            if (resize != 0)
            {
                resizeDisk(resize, ref e);
            }
            if (InstallPack)
            {
                FileStream f = new FileStream(Path.Combine(path, fnum.ToString() + ".bin"), FileMode.Create);
                f.Write(data, 0, data.Length);
                f.Close();
            }
            Array.Copy(data, 0, diskbuf, e.offset, data.Length);
            return(true);
        }
 public void setDinner(DinnerEntry e)
 {
     for (int i=0;i<dinners.Length;i++)
         if (dinners[i].id == e.id)
         {
             dinners[i] = e;
             dinners[i].resized = true;
             return;
         }
 }
Exemple #10
0
 public void resizeDisk(int resize,ref DinnerEntry e)
 {
     for (int i = 0; i < dinners.Length; i++)
         dinners[i].resized = false;
     uint prevsz = e.size;
     e.size = (uint)((int)e.size+resize);
     uint curpos = normpos(e.offset + prevsz);
     uint newpos = normpos(e.offset + e.size);
     setDinner(e);
     if (curpos == newpos) return;
     DinnerEntry ce;
     while (!(ce = findDinnerByOffset(curpos)).isEmpty())
     {
         ce.old_offset = ce.offset;
         ce.offset = newpos;
     //                Console.WriteLine(String.Format("found {0:d} @{1:X8}->@{2:X8} size={3:X4}", ce.id,ce.old_offset,ce.offset, ce.size));
         setDinner(ce);
         curpos += ce.size;
         newpos += ce.size;
         normpos(ref curpos);
         normpos(ref newpos);
     }
     for (int i = 0; i < dinners.Length; i++)
         dinners[i].resized = false;
     //            if (newpos != diskbuf.Length)
     {
         byte[] prevbuf = diskbuf;
         diskbuf=new byte[newpos];
         Array.Copy(prevbuf, diskbuf, e.offset);
         curpos = normpos(e.offset + e.size);
         while (!(ce = findDinnerByOffset(curpos)).isEmpty())
         {
      //                   Console.WriteLine(String.Format("moveing {0:d} {1:X8}->{2:X8} {3:X4}",ce.id,ce.old_offset,ce.offset,ce.size));
             Array.Copy(prevbuf, ce.old_offset, diskbuf, ce.offset, ce.size);
             curpos += ce.size;
             normpos(ref curpos);
             setDinner(ce);
         }
     }
 }
Exemple #11
0
 public bool readDinner()
 {
     FileStream fs = new FileStream(path + disk_file, FileMode.Open);
     diskbuf=new byte[fs.Length];
     fs.Read(diskbuf,0,(int)fs.Length);
     fs.Close();
     BinaryReader br=new BinaryReader(new FileStream(path+dinner_file,FileMode.Open));
     dinnerSize=br.ReadUInt32();
     version = getVersion();
     dinners = new DinnerEntry[dinnerSize];
     for (uint i=0;i<dinnerSize;i++)
         dinners[i]=new DinnerEntry(br,version);
     br.Close();
     return true;
 }