Пример #1
0
        public void MergeAltFileIntoGroup(RvFile file)
        {
            if (HeaderFT == HeaderFileType.Nothing && FileHeaderReader.FileHeaderReader.AltHeaderFile(file.HeaderFileType))
            {
                HeaderFT = file.HeaderFileType;
            }
            if (AltSize == null && file.Size != null)
            {
                AltSize = file.Size;
            }
            if (AltCRC == null && file.CRC != null)
            {
                AltCRC = file.CRC.Copy();
            }
            if (AltSHA1 == null && file.SHA1 != null)
            {
                AltSHA1 = file.SHA1.Copy();
            }
            if (AltMD5 == null && file.MD5 != null)
            {
                AltMD5 = file.MD5.Copy();
            }

            Files.Add(file);
            file.FileGroup = this;
        }
Пример #2
0
        //        private static CultureInfo enUS = new CultureInfo("en-US");
        public static RvDat ConvertFromExternalDat(string strFilename, DatHeader datHeaderExternal)
        {
            RvDat retDat = new RvDat
            {
                Filename    = Path.GetFileName(strFilename),
                Name        = datHeaderExternal.Name,
                RootDir     = datHeaderExternal.RootDir,
                Description = datHeaderExternal.Description,
                Category    = datHeaderExternal.Category,
                Version     = datHeaderExternal.Version,
                Date        = datHeaderExternal.Date,
                Author      = datHeaderExternal.Author,
                Email       = datHeaderExternal.Email,
                Homepage    = datHeaderExternal.Homepage,
                URL         = datHeaderExternal.URL,
                Comment     = datHeaderExternal.Comment,
                MergeType   = datHeaderExternal.MergeType
            };


            HeaderFileType headerFileType = FileHeaderReader.FileHeaderReader.GetFileTypeFromHeader(datHeaderExternal.Header);

            CopyDir(datHeaderExternal.BaseDir, headerFileType, retDat);

            return(retDat);
        }
Пример #3
0
        public static RvFile ConvertFromExternalDat(DatHeader datHeaderExternal, RvDat datFile)
        {
            RvFile newDirFromExternal = new RvFile(FileType.Dir);
            RvDat  newDatFromExternal = new RvDat();

            newDatFromExternal.SetData(RvDat.DatData.DatRootFullName, datFile.GetData(RvDat.DatData.DatRootFullName));
            newDatFromExternal.TimeStamp = datFile.TimeStamp;
            newDatFromExternal.Status    = DatUpdateStatus.Correct;
            newDatFromExternal.SetData(RvDat.DatData.DatName, datHeaderExternal.Name);
            newDatFromExternal.SetData(RvDat.DatData.RootDir, datHeaderExternal.RootDir);
            newDatFromExternal.SetData(RvDat.DatData.Description, datHeaderExternal.Description);
            newDatFromExternal.SetData(RvDat.DatData.Category, datHeaderExternal.Category);
            newDatFromExternal.SetData(RvDat.DatData.Version, datHeaderExternal.Version);
            newDatFromExternal.SetData(RvDat.DatData.Date, datHeaderExternal.Date);
            newDatFromExternal.SetData(RvDat.DatData.Author, datHeaderExternal.Author);
            newDatFromExternal.SetData(RvDat.DatData.Email, datHeaderExternal.Email);
            newDatFromExternal.SetData(RvDat.DatData.HomePage, datHeaderExternal.Homepage);
            newDatFromExternal.SetData(RvDat.DatData.URL, datHeaderExternal.URL);
            newDatFromExternal.SetData(RvDat.DatData.DirSetup, datHeaderExternal.Dir);
            newDatFromExternal.SetData(RvDat.DatData.Header, datHeaderExternal.Header);
            newDatFromExternal.MultiDatsInDirectory = datFile.MultiDatsInDirectory;
            newDatFromExternal.MultiDatOverride     = datFile.MultiDatOverride;

            newDirFromExternal.Dat = newDatFromExternal;



            HeaderFileType headerFileType = FileHeaderReader.FileHeaderReader.GetFileTypeFromHeader(datHeaderExternal.Header);

            CopyDir(datHeaderExternal.BaseDir, newDirFromExternal, newDatFromExternal, headerFileType, false);

            return(newDirFromExternal);
        }
Пример #4
0
        private static bool LoadDirFromDat(RvDat rvDat, string rootName, HeaderFileType datFileType)
        {
            if (DatFileLoader.Next != "(")
            {
                DatUpdate.SendAndShowDat("( not found after game", DatFileLoader.Filename);
                return(false);
            }
            DatFileLoader.Gn();

            if (DatFileLoader.Next.ToLower() != "name")
            {
                DatUpdate.SendAndShowDat("Name not found as first object in ( )", DatFileLoader.Filename);
                return(false);
            }
            string fullname = VarFix.CleanFullFileName(DatFileLoader.GnRest());

            fullname = Path.Combine(rootName, fullname);

            DatFileLoader.Gn();

            while (DatFileLoader.Next != ")")
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "dir":
                    DatFileLoader.Gn();
                    if (!LoadDirFromDat(rvDat, fullname, datFileType))
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                case "game":
                    DatFileLoader.Gn();
                    if (!LoadGameFromDat(rvDat, fullname, datFileType))
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                case "resource":
                    DatFileLoader.Gn();
                    if (!LoadGameFromDat(rvDat, fullname, datFileType))
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error Keyword " + DatFileLoader.Next + " not know in dir", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }
            return(true);
        }
Пример #5
0
 public Detector(HeaderFileType fType, int headerLength, int fileOffset, string headerId, Data data)
 {
     FType        = fType;
     HeaderLength = headerLength;
     FileOffset   = fileOffset;
     HeaderId     = headerId.ToLower();
     Data         = data;
 }
Пример #6
0
        public static bool ReadDat(string strFilename, out RvDat rvDat)
        {
            HeaderFileType datFileType = HeaderFileType.Nothing;

            rvDat = new RvDat();
            int errorCode = DatFileLoader.LoadDat(strFilename);

            if (errorCode != 0)
            {
                DatUpdate.ShowDat(new Win32Exception(errorCode).Message, strFilename);
                return(false);
            }

            string filename = Path.GetFileName(strFilename);

            DatFileLoader.Gn();
            if (DatFileLoader.EndOfStream())
            {
                return(false);
            }

            if (DatFileLoader.Next.ToLower() == "doscenter")
            {
                DatFileLoader.Gn();
                if (!LoadHeaderFromDat(filename, rvDat, out datFileType))
                {
                    return(false);
                }

                DatFileLoader.Gn();
            }

            while (!DatFileLoader.EndOfStream())
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "game":
                    DatFileLoader.Gn();
                    if (!LoadGameFromDat(rvDat, "", datFileType))
                    {
                        return(false);
                    }

                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error on line " + DatFileLoader.LineNumber + ": key word '" + DatFileLoader.Next + "' not known", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }

            DatFileLoader.Close();
            return(true);
        }
Пример #7
0
 public static bool AltHeaderFile(HeaderFileType fileType)
 {
     return((fileType == HeaderFileType.A7800) ||
            (fileType == HeaderFileType.FDS) ||
            (fileType == HeaderFileType.Lynx) ||
            (fileType == HeaderFileType.NES) ||
            (fileType == HeaderFileType.PCE) ||
            (fileType == HeaderFileType.PSID) ||
            (fileType == HeaderFileType.SNES) ||
            (fileType == HeaderFileType.SPC));
 }
Пример #8
0
        public static int GetFileHeaderLength(HeaderFileType FType)
        {
            foreach (Detector d in Detectors)
            {
                if (d.FType == FType)
                {
                    return(d.FileOffset);
                }
            }

            return(0);
        }
Пример #9
0
 public GZip(RvFile tFile)
 {
     altType             = tFile.AltType;
     crc                 = tFile.CRC;
     md5Hash             = tFile.MD5;
     sha1Hash            = tFile.SHA1;
     uncompressedSize    = tFile.Size;
     altcrc              = tFile.AltCRC;
     altsha1Hash         = tFile.AltSHA1;
     altmd5Hash          = tFile.AltMD5;
     uncompressedAltSize = tFile.AltSize;
 }
Пример #10
0
        public FileGroup(RvFile sourceFile)
        {
            Size     = sourceFile.Size;
            CRC      = sourceFile.CRC.Copy();
            SHA1     = sourceFile.SHA1.Copy();
            MD5      = sourceFile.MD5.Copy();
            HeaderFT = FileHeaderReader.FileHeaderReader.AltHeaderFile(sourceFile.HeaderFileType)
                ? sourceFile.HeaderFileType :
                       HeaderFileType.Nothing;
            AltSize = sourceFile.AltSize;
            AltCRC  = sourceFile.AltCRC.Copy();
            AltSHA1 = sourceFile.AltSHA1.Copy();
            AltMD5  = sourceFile.AltMD5.Copy();

            Files.Add(sourceFile);
            sourceFile.FileGroup = this;
        }
Пример #11
0
        private static void LoadRomFromDat(RvGame rvGame, XmlNode romNode, HeaderFileType datFileType)
        {
            if (romNode.Attributes == null)
            {
                return;
            }

            RvRom rvRom = new RvRom
            {
                AltType = datFileType,
                Name    = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("name")),
                Size    = VarFix.ULong(romNode.Attributes.GetNamedItem("size")),
                CRC     = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("crc"), 8),
                SHA1    = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("sha1"), 40),
                MD5     = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("md5"), 32),
                Merge   = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("merge")),
                Status  = VarFix.ToLower(romNode.Attributes.GetNamedItem("status"))
            };

            rvGame.AddRom(rvRom);
        }
Пример #12
0
        private static bool LoadRomFromDat(string rootName, HeaderFileType datFileType, out RvRom rvRom, out string game, out string description, out string romof, out string cloneof)
        {
            // Set the current out vars to blank for the time being
            rvRom       = new RvRom();
            game        = "";
            description = "";
            romof       = "";
            cloneof     = "";

            if (!DatFileLoader.Next.Contains("¬"))
            {
                DatUpdate.SendAndShowDat("¬ not found in the rom definition on line " + DatFileLoader.LineNumber, DatFileLoader.Filename);
                return(false);
            }

            // Some old RC DATs have this behavior
            if (DatFileLoader.Next.Contains("¬N¬O"))
            {
                DatFileLoader.Next = DatFileLoader.Next.Replace("¬N¬O", "") + "¬¬";
            }

            string[] split = DatFileLoader.Next.Split('¬');
            game        = split[3];
            description = split[4];
            romof       = split[1];
            cloneof     = split[1];

            rvRom = new RvRom
            {
                Name  = split[5],
                CRC   = VarFix.CleanMD5SHA1(split[6], 8),
                Size  = Int64.TryParse(split[7], out var temp) ? VarFix.FixLong(split[7]) : null,
                Merge = split[9],
            };

            return(true);
        }
Пример #13
0
        private static bool LoadHeaderFromDat(XmlDocument doc, RvDat rvDat, string filename, out HeaderFileType datFileType)
        {
            datFileType = HeaderFileType.Nothing;

            if (doc.DocumentElement == null)
            {
                return(false);
            }
            XmlNode head = doc.DocumentElement.SelectSingleNode("header");

            rvDat.Filename = filename;

            if (head == null)
            {
                return(false);
            }
            rvDat.Name        = VarFix.CleanFileName(head.SelectSingleNode("name"));
            rvDat.RootDir     = VarFix.CleanFileName(head.SelectSingleNode("rootdir"));
            rvDat.Description = VarFix.String(head.SelectSingleNode("description"));
            rvDat.Category    = VarFix.String(head.SelectSingleNode("category"));
            rvDat.Version     = VarFix.String(head.SelectSingleNode("version"));
            rvDat.Date        = VarFix.String(head.SelectSingleNode("date"));
            rvDat.Author      = VarFix.String(head.SelectSingleNode("author"));
            rvDat.Email       = VarFix.String(head.SelectSingleNode("email"));
            rvDat.Homepage    = VarFix.String(head.SelectSingleNode("homepage"));
            rvDat.URL         = VarFix.String(head.SelectSingleNode("url"));
            rvDat.Comment     = VarFix.String(head.SelectSingleNode("comment"));


            XmlNode packingNode = head.SelectSingleNode("romvault") ?? head.SelectSingleNode("clrmamepro");

            if (packingNode?.Attributes != null)
            {
                // dat Header XML filename
                datFileType = FileHeaderReader.FileHeaderReader.GetFileTypeFromHeader(VarFix.String(packingNode.Attributes.GetNamedItem("header")));

                rvDat.MergeType = VarFix.String(packingNode.Attributes.GetNamedItem("forcemerging")).ToLower();
            }

            return(true);
        }
Пример #14
0
        private ZipReturn ReadBody(bool deepScan)
        {
            using (BinaryReader zipBr = new BinaryReader(_zipFs, Encoding.UTF8, true))
            {
                byte ID1 = zipBr.ReadByte();
                byte ID2 = zipBr.ReadByte();

                if ((ID1 != 0x1f) || (ID2 != 0x8b))
                {
                    _zipFs.Close();
                    return(ZipReturn.ZipSignatureError);
                }

                byte CM = zipBr.ReadByte();
                if (CM != 8)
                {
                    _zipFs.Close();
                    return(ZipReturn.ZipUnsupportedCompression);
                }

                byte FLG = zipBr.ReadByte();


                uint MTime = zipBr.ReadUInt32();
                byte XFL   = zipBr.ReadByte();
                byte OS    = zipBr.ReadByte();

                //if FLG.FEXTRA set
                if ((FLG & 0x4) == 0x4)
                {
                    int    XLen  = zipBr.ReadInt16();
                    byte[] bytes = zipBr.ReadBytes(XLen);

                    if (XLen == 28)
                    {
                        md5Hash = new byte[16];
                        Array.Copy(bytes, 0, md5Hash, 0, 16);
                        crc = new byte[4];
                        Array.Copy(bytes, 16, crc, 0, 4);
                        uncompressedSize = BitConverter.ToUInt64(bytes, 20);
                    }

                    if (XLen == 77)
                    {
                        md5Hash = new byte[16];
                        Array.Copy(bytes, 0, md5Hash, 0, 16);
                        crc = new byte[4];
                        Array.Copy(bytes, 16, crc, 0, 4);
                        uncompressedSize = BitConverter.ToUInt64(bytes, 20);
                        altType          = (HeaderFileType)bytes[28];
                        altmd5Hash       = new byte[16];
                        Array.Copy(bytes, 29, altmd5Hash, 0, 16);
                        altsha1Hash = new byte[20];
                        Array.Copy(bytes, 45, altsha1Hash, 0, 20);
                        altcrc = new byte[4];
                        Array.Copy(bytes, 65, altcrc, 0, 4);
                        uncompressedAltSize = BitConverter.ToUInt64(bytes, 69);
                    }
                }

                //if FLG.FNAME set
                if ((FLG & 0x8) == 0x8)
                {
                    int    XLen  = zipBr.ReadInt16();
                    byte[] bytes = zipBr.ReadBytes(XLen);
                }

                //if FLG.FComment set
                if ((FLG & 0x10) == 0x10)
                {
                    int    XLen  = zipBr.ReadInt16();
                    byte[] bytes = zipBr.ReadBytes(XLen);
                }

                //if FLG.FHCRC set
                if ((FLG & 0x2) == 0x2)
                {
                    uint crc16 = zipBr.ReadUInt16();
                }
            }

            compressedSize = (ulong)(_zipFs.Length - _zipFs.Position) - 8;

            datapos = _zipFs.Position;
            if (deepScan)
            {
                if (Buffer0 == null)
                {
                    Buffer0 = new byte[Buffersize];
                }

                if (Buffer1 == null)
                {
                    Buffer1 = new byte[Buffersize];
                }

                Stream ds = new ZlibBaseStream(_zipFs, CompressionMode.Decompress, CompressionLevel.Default, ZlibStreamFlavor.DEFLATE, true);

                ThreadLoadBuffer lbuffer = new ThreadLoadBuffer(ds);

                ThreadCRC  crc32 = new ThreadCRC();
                ThreadMD5  md5   = new ThreadMD5();
                ThreadSHA1 sha1  = new ThreadSHA1();

                ulong uncompressedRead = 0;
                int   bufferRead       = ds.Read(Buffer0, 0, Buffersize);
                uncompressedRead += (ulong)bufferRead;
                bool whichBuffer = true;

                while (bufferRead > 0)
                {
                    // trigger the buffer loading worker
                    lbuffer.Trigger(whichBuffer ? Buffer1 : Buffer0, Buffersize);

                    byte[] buffer = whichBuffer ? Buffer0 : Buffer1;

                    // trigger the hashing workers
                    crc32.Trigger(buffer, bufferRead);
                    md5.Trigger(buffer, bufferRead);
                    sha1.Trigger(buffer, bufferRead);

                    lbuffer.Wait();
                    crc32.Wait();
                    md5.Wait();
                    sha1.Wait();

                    // setup next loop around
                    bufferRead        = lbuffer.SizeRead;
                    uncompressedRead += (ulong)bufferRead;
                    whichBuffer       = !whichBuffer;
                }

                // tell all the workers we are finished
                lbuffer.Finish();
                crc32.Finish();
                md5.Finish();
                sha1.Finish();

                // get the results
                byte[] testcrc  = crc32.Hash;
                byte[] testmd5  = md5.Hash;
                byte[] testsha1 = sha1.Hash;

                // cleanup
                lbuffer.Dispose();
                crc32.Dispose();
                md5.Dispose();
                sha1.Dispose();

                ds.Close();
                ds.Dispose();

                if (uncompressedSize != 0)
                {
                    if (uncompressedSize != uncompressedRead)
                    {
                        _zipFs.Close();
                        return(ZipReturn.ZipDecodeError);
                    }
                }
                else
                {
                    uncompressedSize = uncompressedRead;
                }

                if (crc != null)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        if (crc[i] == testcrc[i])
                        {
                            continue;
                        }

                        _zipFs.Close();
                        return(ZipReturn.ZipDecodeError);
                    }
                }
                else
                {
                    crc = testcrc;
                }

                if (md5Hash != null)
                {
                    for (int i = 0; i < 16; i++)
                    {
                        if (md5Hash[i] == testmd5[i])
                        {
                            continue;
                        }

                        _zipFs.Close();
                        return(ZipReturn.ZipDecodeError);
                    }
                }
                else
                {
                    md5Hash = testmd5;
                }

                if (sha1Hash != null)
                {
                    for (int i = 0; i < 20; i++)
                    {
                        if (sha1Hash[i] == testsha1[i])
                        {
                            continue;
                        }

                        _zipFs.Close();
                        return(ZipReturn.ZipDecodeError);
                    }
                }
                else
                {
                    sha1Hash = testsha1;
                }
            }

            _zipFs.Position = _zipFs.Length - 8;
            byte[] gzcrc;
            uint   gzLength;

            using (BinaryReader zipBr = new BinaryReader(_zipFs, Encoding.UTF8, true))
            {
                gzcrc    = zipBr.ReadBytes(4);
                gzLength = zipBr.ReadUInt32();
            }

            if (crc != null)
            {
                for (int i = 0; i < 4; i++)
                {
                    if (gzcrc[3 - i] == crc[i])
                    {
                        continue;
                    }

                    _zipFs.Close();
                    return(ZipReturn.ZipDecodeError);
                }
            }
            else
            {
                crc = new[] { gzcrc[3], gzcrc[2], gzcrc[1], gzcrc[0] };
            }

            if (uncompressedSize != 0)
            {
                if (gzLength != (uncompressedSize & 0xffffffff))
                {
                    _zipFs.Close();
                    return(ZipReturn.ZipDecodeError);
                }
            }

            return(ZipReturn.ZipGood);
        }
Пример #15
0
        private static bool ScanAFile(string realFilename, Stream memzip, string displayFilename)
        {
            Compress.File.File fStream = new Compress.File.File();
            if (string.IsNullOrEmpty(realFilename) && memzip != null)
            {
                fStream.ZipFileOpen(memzip);
            }
            else
            {
                ZipReturn zRet = fStream.ZipFileOpen(realFilename, -1, true);
                if (zRet != ZipReturn.ZipGood)
                {
                    return(false);
                }
            }

            bool     ret   = false;
            FileScan fScan = new FileScan();
            List <FileScan.FileResults> resScan = fScan.Scan(fStream, true, true);

            HeaderFileType foundFileType = resScan[0].HeaderFileType;

            if (foundFileType == HeaderFileType.CHD)
            {
                // read altheader values from CHD file.
            }

            RvFile tFile = new RvFile
            {
                Size    = resScan[0].Size,
                CRC     = resScan[0].CRC,
                MD5     = resScan[0].MD5,
                SHA1    = resScan[0].SHA1,
                AltType = resScan[0].HeaderFileType,
                AltSize = resScan[0].AltSize,
                AltCRC  = resScan[0].AltCRC,
                AltMD5  = resScan[0].AltMD5,
                AltSHA1 = resScan[0].AltSHA1
            };


            // test if needed.
            FindStatus res = RvRomFileMatchup.FileneededTest(tFile);

            if (res == FindStatus.FileNeededInArchive)
            {
                _bgw?.ReportProgress(0, new bgwShowError(displayFilename, "found"));
                Debug.WriteLine("Reading file as " + tFile.SHA1);
                string outfile = RomRootDir.Getfilename(tFile.SHA1);

                gZip gz1 = new gZip();
                gz1.ZipFileCreate(outfile);
                gz1.ExtraData = tFile.SetExtraData();
                gz1.ZipFileOpenWriteStream(false, true, "", tFile.Size, 8, out Stream write, null);

                fStream.ZipFileOpenReadStream(0, out Stream s, out ulong _);
                // do copy
                StreamCopier.StreamCopy(s, write, tFile.Size);

                fStream.ZipFileCloseReadStream();
                fStream.ZipFileClose();

                gz1.ZipFileCloseWriteStream(tFile.CRC);
                tFile.CompressedSize = gz1.CompressedSize;
                gz1.ZipFileClose();


                tFile.DBWrite();
                ret = true;
            }
            else if (res == FindStatus.FoundFileInArchive)
            {
                ret = true;
            }
            fStream.ZipFileClose();

            if (foundFileType == HeaderFileType.ZIP || foundFileType == HeaderFileType.SevenZip || foundFileType == HeaderFileType.GZ)
            {
                ICompress fz;
                switch (foundFileType)
                {
                case HeaderFileType.SevenZip:
                    fz = new SevenZ();
                    break;

                case HeaderFileType.GZ:
                    fz = new gZip();
                    break;

                //case HeaderFileType.ZIP:
                default:
                    fz = new Zip();
                    break;
                }

                ZipReturn zp;

                if (string.IsNullOrEmpty(realFilename) && memzip != null)
                {
                    memzip.Position = 0;
                    zp = fz.ZipFileOpen(memzip);
                }
                else
                {
                    zp = fz.ZipFileOpen(realFilename);
                }

                if (zp == ZipReturn.ZipGood)
                {
                    bool allZipFound = true;
                    for (int i = 0; i < fz.LocalFilesCount(); i++)
                    {
                        LocalFile lf       = fz.GetLocalFile(i);
                        ZipReturn openFile = fz.ZipFileOpenReadStream(i, out Stream stream, out ulong streamSize);

                        if (streamSize <= _inMemorySize)
                        {
                            if (openFile == ZipReturn.ZipTryingToAccessADirectory)
                            {
                                continue;
                            }
                            byte[] tmpFile = new byte[streamSize];
                            stream.Read(tmpFile, 0, (int)streamSize);
                            using (Stream memStream = new MemoryStream(tmpFile, false))
                            {
                                allZipFound &= ScanAFile(null, memStream, lf.Filename);
                            }
                        }
                        else
                        {
                            string file = Path.Combine(_tmpDir, Guid.NewGuid().ToString());
                            FileStream.OpenFileWrite(file, out Stream fs);
                            ulong sizetogo = streamSize;
                            while (sizetogo > 0)
                            {
                                int sizenow = sizetogo > (ulong)Buffersize ? Buffersize : (int)sizetogo;
                                stream.Read(Buffer, 0, sizenow);
                                fs.Write(Buffer, 0, sizenow);
                                sizetogo -= (ulong)sizenow;
                            }
                            fs.Close();

                            allZipFound &= ScanAFile(file, null, lf.Filename);

                            File.Delete(file);
                        }
                        //fz.ZipFileCloseReadStream();
                    }
                    fz.ZipFileClose();
                    ret |= allZipFound;
                }
                else
                {
                    ret = false;
                }
            }

            return(ret);
        }
Пример #16
0
        public static bool ReadDat(string strFilename, out RvDat rvDat)
        {
            HeaderFileType datFileType = HeaderFileType.Nothing;

            rvDat = new RvDat();
            int errorCode = DatFileLoader.LoadDat(strFilename);

            if (errorCode != 0)
            {
                DatUpdate.ShowDat(new Win32Exception(errorCode).Message, strFilename);
                return(false);
            }

            string filename = Path.GetFileName(strFilename);

            DatFileLoader.Gn();
            if (DatFileLoader.EndOfStream())
            {
                return(false);
            }

            if (DatFileLoader.Next.ToLower() == "[credits]")
            {
                if (!LoadHeaderFromDat(filename, rvDat, out datFileType, DatFileLoader.Next.ToLower()))
                {
                    return(false);
                }

                DatFileLoader.Gn();
            }
            else if (DatFileLoader.Next.ToLower() == "[dat]")
            {
                if (!LoadHeaderFromDat(filename, rvDat, out datFileType, DatFileLoader.Next.ToLower()))
                {
                    return(false);
                }

                DatFileLoader.Gn();
            }
            else if (DatFileLoader.Next.ToLower() == "[emulator]")
            {
                if (!LoadHeaderFromDat(filename, rvDat, out datFileType, DatFileLoader.Next.ToLower()))
                {
                    return(false);
                }

                DatFileLoader.Gn();
            }

            // Everything else if a rom/game
            string lastgame  = "";
            bool   foundgame = false;
            RvGame rvGame    = new RvGame();

            while (!DatFileLoader.EndOfStream())
            {
                // Set loop variables
                foundgame = true;
                string game = "", description = "", romof = "", cloneof = "";
                RvRom  rvRom = new RvRom();

                if (!LoadRomFromDat("", datFileType, out rvRom, out game, out description, out romof, out cloneof))
                {
                    return(false);
                }

                DatFileLoader.Gn();

                // If we have a new game finally, add the last one
                if (lastgame != game && lastgame != "")
                {
                    rvDat.AddGame(rvGame);
                    foundgame = false;
                    rvGame    = new RvGame();
                }

                // For everything else, add to the new rvGame
                rvGame.Name        = (String.IsNullOrEmpty(rvGame.Name) ? game : rvGame.Name);
                rvGame.Description = (String.IsNullOrEmpty(rvGame.Description) ? description : rvGame.Description);
                rvGame.CloneOf     = (String.IsNullOrEmpty(rvGame.CloneOf) ? cloneof : rvGame.CloneOf);
                rvGame.RomOf       = (String.IsNullOrEmpty(rvGame.RomOf) ? romof : rvGame.RomOf);
                rvGame.AddRom(rvRom);
                lastgame = game;
            }

            // If we had a lingering game, add it
            if (foundgame)
            {
                rvDat.AddGame(rvGame);
            }

            DatFileLoader.Close();
            return(true);
        }
Пример #17
0
        private static void CopyDir(DatDir datD, RvFile rvD, RvDat rvDat, HeaderFileType headerFileType, bool gameFile)
        {
            DatBase[] datB = datD.ToArray();
            if (datB == null)
            {
                return;
            }
            foreach (DatBase b in datB)
            {
                switch (b)
                {
                case DatDir nDir:
                    RvFile nd = new RvFile(ConvE(nDir.DatFileType))
                    {
                        Name      = nDir.Name + GetExt(nDir.DatFileType),
                        Dat       = rvDat,
                        DatStatus = ConvE(nDir.DatStatus)
                    };
                    if (nDir.DGame == null && !gameFile)
                    {
                        nd.Tree = new RvTreeRow();
                    }

                    rvD.ChildAdd(nd);

                    if (nDir.DGame != null)
                    {
                        DatGame dGame = nDir.DGame;
                        RvGame  cGame = new RvGame();
                        CheckAttribute(cGame, dGame.Description, RvGame.GameData.Description);
                        CheckAttribute(cGame, dGame.RomOf, RvGame.GameData.RomOf);
                        CheckAttribute(cGame, dGame.IsBios, RvGame.GameData.IsBios);
                        CheckAttribute(cGame, dGame.SourceFile, RvGame.GameData.Sourcefile);
                        CheckAttribute(cGame, dGame.CloneOf, RvGame.GameData.CloneOf);
                        CheckAttribute(cGame, dGame.SampleOf, RvGame.GameData.SampleOf);
                        CheckAttribute(cGame, dGame.Board, RvGame.GameData.Board);
                        CheckAttribute(cGame, dGame.Year, RvGame.GameData.Year);
                        CheckAttribute(cGame, dGame.Manufacturer, RvGame.GameData.Manufacturer);

                        if (nDir.DGame.IsEmuArc)
                        {
                            cGame.AddData(RvGame.GameData.EmuArc, "yes");
                            CheckAttribute(cGame, dGame.TitleId, RvGame.GameData.TitleId);
                            CheckAttribute(cGame, dGame.Publisher, RvGame.GameData.Publisher);
                            CheckAttribute(cGame, dGame.Developer, RvGame.GameData.Developer);
                            CheckAttribute(cGame, dGame.Genre, RvGame.GameData.Genre);
                            CheckAttribute(cGame, dGame.SubGenre, RvGame.GameData.SubGenre);
                            CheckAttribute(cGame, dGame.Ratings, RvGame.GameData.Ratings);
                            CheckAttribute(cGame, dGame.Score, RvGame.GameData.Score);
                            CheckAttribute(cGame, dGame.Players, RvGame.GameData.Players);
                            CheckAttribute(cGame, dGame.Enabled, RvGame.GameData.Enabled);
                            CheckAttribute(cGame, dGame.CRC, RvGame.GameData.CRC);
                            CheckAttribute(cGame, dGame.RelatedTo, RvGame.GameData.RelatedTo);
                            CheckAttribute(cGame, dGame.Source, RvGame.GameData.Source);
                        }
                        nd.Game = cGame;
                    }

                    CopyDir(nDir, nd, rvDat, headerFileType, gameFile || nDir.DGame != null);
                    break;

                case DatFile nFile:
                    RvFile nf = new RvFile(ConvE(nFile.DatFileType))
                    {
                        Name           = nFile.Name,
                        Size           = nFile.Size,
                        CRC            = nFile.CRC,
                        SHA1           = nFile.SHA1,
                        MD5            = nFile.MD5,
                        Merge          = nFile.Merge,
                        Status         = nFile.Status,
                        Dat            = rvDat,
                        DatStatus      = ConvE(nFile.DatStatus),
                        HeaderFileType = headerFileType
                    };
#if dt
                    DateTime dt;
                    if (!string.IsNullOrEmpty(nFile.DateModified) && DateTime.TryParseExact(nFile.DateModified, "yyyy/MM/dd HH:mm:ss", enUS, DateTimeStyles.None, out dt))
                    {
                        nf.DatModTimeStamp = dt.Ticks;
                    }
#endif
                    if (nFile.isDisk)
                    {
                        nf.HeaderFileType = HeaderFileType.CHD;
                    }

                    if (nf.HeaderFileType != HeaderFileType.Nothing)
                    {
                        nf.FileStatusSet(FileStatus.HeaderFileTypeFromDAT);
                    }
                    if (nf.Size != null)
                    {
                        nf.FileStatusSet(FileStatus.SizeFromDAT);
                    }
                    if (nf.CRC != null)
                    {
                        nf.FileStatusSet(FileStatus.CRCFromDAT);
                    }
                    if (nf.SHA1 != null)
                    {
                        nf.FileStatusSet(FileStatus.SHA1FromDAT);
                    }
                    if (nf.MD5 != null)
                    {
                        nf.FileStatusSet(FileStatus.MD5FromDAT);
                    }


                    rvD.ChildAdd(nf);
                    break;
                }
            }
        }
Пример #18
0
        private static void LoadDirFromDat(RvDat rvDat, XmlNode dirNode, string rootDir, HeaderFileType datFileType)
        {
            if (dirNode.Attributes == null)
            {
                return;
            }

            string fullname = VarFix.CleanFullFileName(dirNode.Attributes.GetNamedItem("name"));

            XmlNodeList dirNodeList = dirNode.SelectNodes("dir");

            if (dirNodeList != null)
            {
                for (int i = 0; i < dirNodeList.Count; i++)
                {
                    LoadDirFromDat(rvDat, dirNodeList[i], Path.Combine(rootDir, fullname), datFileType);
                }
            }

            XmlNodeList gameNodeList = dirNode.SelectNodes("game");

            if (gameNodeList != null)
            {
                for (int i = 0; i < gameNodeList.Count; i++)
                {
                    LoadGameFromDat(rvDat, gameNodeList[i], Path.Combine(rootDir, fullname), datFileType);
                }
            }
        }
Пример #19
0
        private static bool ScanAFile(string realFilename, Stream memzip, string displayFilename)
        {
            Stream fStream;

            if (string.IsNullOrEmpty(realFilename) && memzip != null)
            {
                fStream = memzip;
            }
            else
            {
                int errorCode = FileStream.OpenFileRead(realFilename, out fStream);
                if (errorCode != 0)
                {
                    return(false);
                }
            }

            bool           ret           = false;
            HeaderFileType foundFileType = FileHeaderReader.FileHeaderReader.GetType(fStream, out int offset);

            fStream.Position = 0;
            RvFile tFile = UnCompFiles.CheckSumRead(fStream, offset);

            tFile.AltType = foundFileType;


            if (foundFileType == HeaderFileType.CHD)
            {
                // read altheader values from CHD file.
            }

            // test if needed.
            FindStatus res = RvRomFileMatchup.FileneededTest(tFile);

            if (res == FindStatus.FileNeededInArchive)
            {
                _bgw?.ReportProgress(0, new bgwShowError(displayFilename, "found"));
                Debug.WriteLine("Reading file as " + tFile.SHA1);
                GZip   gz      = new GZip(tFile);
                string outfile = RomRootDir.Getfilename(tFile.SHA1);
                fStream.Position = 0;
                gz.WriteGZip(outfile, fStream, false);

                tFile.CompressedSize = gz.compressedSize;
                tFile.DBWrite();
                ret = true;
            }
            else if (res == FindStatus.FoundFileInArchive)
            {
                ret = true;
            }

            if (foundFileType == HeaderFileType.ZIP || foundFileType == HeaderFileType.SevenZip || foundFileType == HeaderFileType.GZ)
            {
                ICompress fz;
                switch (foundFileType)
                {
                case HeaderFileType.SevenZip:
                    fz = new SevenZ();
                    break;

                case HeaderFileType.GZ:
                    fz = new gZip();
                    break;

                //case HeaderFileType.ZIP:
                default:
                    fz = new Zip();
                    break;
                }

                fStream.Position = 0;

                ZipReturn zp;

                if (string.IsNullOrEmpty(realFilename) && memzip != null)
                {
                    zp = fz.ZipFileOpen(memzip);
                }
                else
                {
                    zp = fz.ZipFileOpen(realFilename);
                }

                if (zp == ZipReturn.ZipGood)
                {
                    bool allZipFound = true;
                    for (int i = 0; i < fz.LocalFilesCount(); i++)
                    {
                        ZipReturn openFile = fz.ZipFileOpenReadStream(i, out Stream stream, out ulong streamSize);

                        if (streamSize <= _inMemorySize)
                        {
                            if (openFile == ZipReturn.ZipTryingToAccessADirectory)
                            {
                                continue;
                            }
                            byte[] tmpFile = new byte[streamSize];
                            stream.Read(tmpFile, 0, (int)streamSize);
                            using (Stream memStream = new MemoryStream(tmpFile, false))
                            {
                                allZipFound &= ScanAFile(null, memStream, fz.Filename(i));
                            }
                        }
                        else
                        {
                            string file = Path.Combine(_tmpDir, Guid.NewGuid().ToString());
                            FileStream.OpenFileWrite(file, out Stream fs);
                            ulong sizetogo = streamSize;
                            while (sizetogo > 0)
                            {
                                int sizenow = sizetogo > (ulong)Buffersize ? Buffersize : (int)sizetogo;
                                stream.Read(Buffer, 0, sizenow);
                                fs.Write(Buffer, 0, sizenow);
                                sizetogo -= (ulong)sizenow;
                            }
                            fs.Close();

                            allZipFound &= ScanAFile(file, null, fz.Filename(i));

                            File.Delete(file);
                        }
                        //fz.ZipFileCloseReadStream();
                    }
                    fz.ZipFileClose();
                    ret |= allZipFound;
                }
                else
                {
                    ret = false;
                }
            }

            if (!string.IsNullOrEmpty(realFilename) || memzip == null)
            {
                fStream.Close();
                fStream.Dispose();
            }


            return(ret);
        }
Пример #20
0
        private static bool LoadRomFromDat(RvGame rvGame, HeaderFileType datFileType)
        {
            if (DatFileLoader.Next != "(")
            {
                DatUpdate.SendAndShowDat("( not found after rom on line " + DatFileLoader.LineNumber, DatFileLoader.Filename);
                return(false);
            }

            DatFileLoader.Gn();
            if (DatFileLoader.Next.ToLower() != "name")
            {
                DatUpdate.SendAndShowDat("Name not found as first object in ( ) on line " + DatFileLoader.LineNumber, DatFileLoader.Filename);
                return(false);
            }

            RvRom rvRom = new RvRom
            {
                Name    = VarFix.CleanFullFileName(DatFileLoader.Gn()),
                AltType = datFileType
            };

            DatFileLoader.Gn();
            while (rvRom.CRC == null || rvRom.Size == null || DatFileLoader.Next != ")")
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "size":
                    rvRom.Size = VarFix.ULong(DatFileLoader.Gn());
                    DatFileLoader.Gn();
                    break;

                case "crc":
                    rvRom.CRC = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 8);
                    DatFileLoader.Gn();
                    break;

                case "md5":
                    rvRom.MD5 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 32);
                    DatFileLoader.Gn();
                    break;

                case "sha1":
                    rvRom.SHA1 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 40);
                    DatFileLoader.Gn();
                    break;

                case "sha256":
                    // No-op until larger hashes are supported
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "sha384":
                    // No-op until larger hashes are supported
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "sha512":
                    // No-op until larger hashes are supported
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "date":
                    rvRom.Date  = DatFileLoader.Gn();
                    rvRom.Date += " " + DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                default:
                    rvRom.Name += " " + DatFileLoader.Next;
                    DatFileLoader.Gn();
                    break;
                }
            }

            rvGame.AddRom(rvRom);
            return(true);
        }
Пример #21
0
        private static bool LoadGameFromDat(RvDat rvDat, string rootName, HeaderFileType datFileType)
        {
            if (DatFileLoader.Next != "(")
            {
                DatUpdate.SendAndShowDat("( not found after game", DatFileLoader.Filename);
                return(false);
            }
            DatFileLoader.Gn();

            string snext = DatFileLoader.Next.ToLower();

            string pathextra = "";

            if (snext == "rebuildto")
            {
                pathextra = VarFix.CleanFullFileName(DatFileLoader.Gn());
                DatFileLoader.Gn();
                snext = DatFileLoader.Next.ToLower();
            }

            if (snext != "name")
            {
                DatUpdate.SendAndShowDat("Name not found as first object in ( )", DatFileLoader.Filename);
                return(false);
            }


            string name = VarFix.CleanFullFileName(DatFileLoader.GnRest());

            name = Path.Combine(pathextra, name);
            name = Path.Combine(rootName, name);

            DatFileLoader.Gn();

            RvGame rvGame = new RvGame {
                Name = name
            };

            while (DatFileLoader.Next != ")")
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "romof":
                    rvGame.RomOf = VarFix.CleanFileName(DatFileLoader.GnRest());
                    DatFileLoader.Gn();
                    break;

                case "description":
                    rvGame.Description = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "sourcefile":
                    rvGame.SourceFile = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "cloneof":
                    rvGame.CloneOf = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "sampleof":
                    rvGame.SampleOf = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "board":
                    rvGame.Board = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "year":
                    rvGame.Year = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "manufacturer":
                    rvGame.Manufacturer = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "serial":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "rebuildto":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "sample":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "biosset":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "chip":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "video":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "sound":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "input":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "dipswitch":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "driver":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;


                case "rom":
                    DatFileLoader.Gn();
                    if (!LoadRomFromDat(rvGame, datFileType))
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                case "disk":
                    DatFileLoader.Gn();
                    if (!LoadDiskFromDat(rvGame))
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                case "archive":
                    DatFileLoader.Gn();
                    if (!LoadArchiveFromDat())
                    {
                        return(false);
                    }
                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error: key word '" + DatFileLoader.Next + "' not known in game", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }
            rvDat.AddGame(rvGame);
            return(true);
        }
Пример #22
0
        private static void LoadGameFromDat(RvDat rvDat, XmlNode gameNode, string rootDir, HeaderFileType datFileType)
        {
            if (gameNode.Attributes == null)
            {
                return;
            }

            RvGame rvGame = new RvGame
            {
                Name         = VarFix.CleanFullFileName(gameNode.Attributes.GetNamedItem("name")),
                RomOf        = VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("romof")),
                CloneOf      = VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof")),
                SampleOf     = VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("sampleof")),
                Description  = VarFix.String(gameNode.SelectSingleNode("description")),
                SourceFile   = VarFix.String(gameNode.Attributes.GetNamedItem("sourcefile")),
                IsBios       = VarFix.String(gameNode.Attributes.GetNamedItem("isbios")),
                Board        = VarFix.String(gameNode.Attributes.GetNamedItem("board")),
                Year         = VarFix.String(gameNode.SelectSingleNode("year")),
                Manufacturer = VarFix.String(gameNode.SelectSingleNode("manufacturer"))
            };

            XmlNode trurip = gameNode.SelectSingleNode("trurip");

            if (trurip != null)
            {
                rvGame.IsTrurip           = true;
                rvGame.Publisher          = VarFix.String(trurip.SelectSingleNode("publisher"));
                rvGame.Developer          = VarFix.String(trurip.SelectSingleNode("developer"));
                rvGame.Edition            = VarFix.String(trurip.SelectSingleNode("edition"));
                rvGame.Version            = VarFix.String(trurip.SelectSingleNode("version"));
                rvGame.Type               = VarFix.String(trurip.SelectSingleNode("type"));
                rvGame.Media              = VarFix.String(trurip.SelectSingleNode("media"));
                rvGame.Language           = VarFix.String(trurip.SelectSingleNode("language"));
                rvGame.Players            = VarFix.String(trurip.SelectSingleNode("players"));
                rvGame.Ratings            = VarFix.String(trurip.SelectSingleNode("ratings"));
                rvGame.Peripheral         = VarFix.String(trurip.SelectSingleNode("peripheral"));
                rvGame.Genre              = VarFix.String(trurip.SelectSingleNode("genre"));
                rvGame.MediaCatalogNumber = VarFix.String(trurip.SelectSingleNode("mediacatalognumber"));
                rvGame.BarCode            = VarFix.String(trurip.SelectSingleNode("barcode"));
            }

            rvGame.Name = Path.Combine(rootDir, rvGame.Name);

            rvDat.AddGame(rvGame);

            XmlNodeList romNodeList = gameNode.SelectNodes("rom");

            if (romNodeList != null)
            {
                for (int i = 0; i < romNodeList.Count; i++)
                {
                    LoadRomFromDat(rvGame, romNodeList[i], datFileType);
                }
            }

            XmlNodeList diskNodeList = gameNode.SelectNodes("disk");

            if (diskNodeList != null)
            {
                for (int i = 0; i < diskNodeList.Count; i++)
                {
                    LoadDiskFromDat(rvGame, diskNodeList[i]);
                }
            }
        }
Пример #23
0
        private static bool LoadHeaderFromDat(string filename, RvDat rvDat, out HeaderFileType datFileType)
        {
            datFileType = HeaderFileType.Nothing;

            if (DatFileLoader.Next != "(")
            {
                DatUpdate.SendAndShowDat("( not found after clrmamepro", DatFileLoader.Filename);
                return(false);
            }
            DatFileLoader.Gn();

            rvDat.Filename = filename;

            while (DatFileLoader.Next != ")")
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "name":
                    rvDat.Name = VarFix.CleanFileName(DatFileLoader.GnRest());
                    DatFileLoader.Gn();
                    break;

                case "description":
                    rvDat.Description = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "category":
                    rvDat.Category = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "version":
                    rvDat.Version = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "date":
                    rvDat.Date = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "author":
                    rvDat.Author = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "email":
                    rvDat.Email = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "homepage":
                    rvDat.Homepage = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "url":
                    rvDat.URL = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "comment":
                    rvDat.Comment = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "header":
                    datFileType = FileHeaderReader.FileHeaderReader.GetFileTypeFromHeader(DatFileLoader.GnRest());
                    DatFileLoader.Gn();
                    break;

                case "forcezipping":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "forcepacking":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;     // incorrect usage

                case "forcemerging":
                    rvDat.MergeType = DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "forcenodump":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                case "dir":
                    DatFileLoader.GnRest();
                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error: key word '" + DatFileLoader.Next + "' not known in clrmamepro", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }

            return(true);
        }
Пример #24
0
        private static void CopyDir(DatDir datD, HeaderFileType headerFileType, RvDat retDat = null, RvGame retGame = null)
        {
            DatBase[] datB = datD.ToArray();
            if (datB == null)
            {
                return;
            }
            foreach (DatBase b in datB)
            {
                switch (b)
                {
                case DatDir nDir:
                    if (nDir.DGame == null)
                    {
                        break;
                    }

                    DatGame dGame = nDir.DGame;
                    RvGame  cGame = new RvGame();

                    cGame.Name         = b.Name;
                    cGame.Description  = dGame.Description;
                    cGame.Manufacturer = dGame.Manufacturer;
                    cGame.CloneOf      = dGame.CloneOf;
                    cGame.RomOf        = dGame.RomOf;
                    cGame.SampleOf     = dGame.SampleOf;
                    cGame.SourceFile   = dGame.SourceFile;
                    cGame.IsBios       = dGame.IsBios;
                    cGame.Board        = dGame.Board;
                    cGame.Year         = dGame.Year;

                    if (dGame.IsEmuArc)
                    {
                        cGame.IsTrurip  = true;
                        cGame.Publisher = dGame.Publisher;
                        cGame.Developer = dGame.Developer;
                        //cGame.Edition
                        //cGame.Version
                        //cGame.Type
                        //cGame.Media
                        //cGame.Language
                        cGame.Players = dGame.Players;
                        cGame.Ratings = dGame.Ratings;
                        cGame.Genre   = dGame.Genre;
                        //cGame.Peripheral
                        //cGame.BarCode
                        //cGame.MediaCatalogNumber
                    }
                    retDat?.AddGame(cGame);
                    CopyDir(nDir, headerFileType, null, cGame);

                    break;

                case DatFile nFile:
                    if (nFile.isDisk)
                    {
                        break;
                    }

                    RvRom nf = new RvRom()
                    {
                        Name    = nFile.Name,
                        Size    = nFile.Size,
                        CRC     = nFile.CRC,
                        SHA1    = nFile.SHA1,
                        MD5     = nFile.MD5,
                        Merge   = nFile.Merge,
                        Status  = nFile.Status,
                        AltType = headerFileType
                    };

                    retGame?.AddRom(nf);
                    break;
                }
            }
        }
Пример #25
0
        private static bool LoadRomFromDat(RvGame rvGame, HeaderFileType datFileType)
        {
            if (DatFileLoader.Next != "(")
            {
                DatUpdate.SendAndShowDat("( not found after rom", DatFileLoader.Filename);
                return(false);
            }
            DatFileLoader.Gn();

            if (DatFileLoader.Next.ToLower() != "name")
            {
                DatUpdate.SendAndShowDat("Name not found as first object in ( )", DatFileLoader.Filename);
                return(false);
            }


            RvRom rvRom = new RvRom
            {
                Name    = VarFix.CleanFullFileName(DatFileLoader.Gn()),
                AltType = datFileType
            };

            DatFileLoader.Gn();


            while (DatFileLoader.Next != ")")
            {
                switch (DatFileLoader.Next.ToLower())
                {
                case "size":
                    rvRom.Size = VarFix.ULong(DatFileLoader.Gn());
                    DatFileLoader.Gn();
                    break;

                case "crc":
                    rvRom.CRC = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 8);
                    DatFileLoader.Gn();
                    break;

                case "sha1":
                    rvRom.SHA1 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 40);
                    DatFileLoader.Gn();
                    break;

                case "md5":
                    rvRom.MD5 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 32);
                    DatFileLoader.Gn();
                    break;

                case "merge":
                    rvRom.Merge = VarFix.CleanFullFileName(DatFileLoader.Gn());
                    DatFileLoader.Gn();
                    break;

                case "flags":
                    rvRom.Status = VarFix.ToLower(DatFileLoader.Gn());
                    DatFileLoader.Gn();
                    break;

                case "date":
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "bios":
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "region":
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "offs":
                    DatFileLoader.Gn();
                    DatFileLoader.Gn();
                    break;

                case "nodump":
                    rvRom.Status = "nodump";
                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error: key word '" + DatFileLoader.Next + "' not known in rom", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }

            rvGame.AddRom(rvRom);

            return(true);
        }
Пример #26
0
        private static bool LoadHeaderFromDat(string filename, RvDat rvDat, out HeaderFileType datFileType, string blockstart)
        {
            datFileType    = HeaderFileType.Nothing;
            rvDat.Filename = filename;

            while (DatFileLoader.Next.ToLower() != "[games]")
            {
                // Split the line by '='
                string key   = DatFileLoader.Next.Split('=')[0];
                string value = DatFileLoader.Next.Remove(0, key.Length + (DatFileLoader.Next.Contains("=") ? 1 : 0));
                string block = blockstart;

                switch (key.ToLower())
                {
                // CREDITS block
                case "[credits]":
                    block = key;
                    DatFileLoader.Gn();
                    break;

                case "author":
                    rvDat.Author = value;
                    DatFileLoader.Gn();
                    break;

                case "version":
                    if (block == "[credits]")
                    {
                        rvDat.Date = value;
                    }
                    else if (block == "[dat]")
                    {
                        rvDat.Version = value;
                    }

                    DatFileLoader.Gn();
                    break;

                case "comment":
                    rvDat.Name        = value;
                    rvDat.Description = value;
                    rvDat.Comment     = value;
                    DatFileLoader.Gn();
                    break;

                case "url":
                    rvDat.URL = value;
                    DatFileLoader.Gn();
                    break;

                // DAT block
                case "[dat]":
                    block = key;
                    DatFileLoader.Gn();
                    break;

                case "plugin":
                    DatFileLoader.Gn();
                    break;

                case "split":
                    switch (value)
                    {
                    case "0":
                        rvDat.MergeType = (String.IsNullOrEmpty(rvDat.MergeType) ? "" : rvDat.MergeType);
                        break;

                    case "1":
                        rvDat.MergeType = (String.IsNullOrEmpty(rvDat.MergeType) ? "split" : rvDat.MergeType);
                        break;
                    }
                    DatFileLoader.Gn();
                    break;

                case "merge":
                    switch (value)
                    {
                    case "0":
                        rvDat.MergeType = (String.IsNullOrEmpty(rvDat.MergeType) ? "" : rvDat.MergeType);
                        break;

                    case "1":
                        rvDat.MergeType = (String.IsNullOrEmpty(rvDat.MergeType) ? "merge" : rvDat.MergeType);
                        break;
                    }
                    DatFileLoader.Gn();
                    break;

                // EMULATOR block
                case "[emulator]":
                    block = key;
                    DatFileLoader.Gn();
                    break;

                case "refname":
                    DatFileLoader.Gn();
                    break;

                default:
                    DatUpdate.SendAndShowDat("Error on line " + DatFileLoader.LineNumber + ": key word '" + key + "' not known in romcenter", DatFileLoader.Filename);
                    DatFileLoader.Gn();
                    break;
                }
            }

            return(true);
        }