Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
0
        private bool LoadHeaderFromDat(XmlDocument doc, DatHeader datHeader)
        {
            XmlNodeList head = doc.SelectNodes("softwarelist");

            if (head == null)
            {
                return(false);
            }

            if (head.Count == 0)
            {
                return(false);
            }

            if (head[0].Attributes == null)
            {
                return(false);
            }

            datHeader.Filename    = _filename;
            datHeader.Name        = VarFix.String(head[0].Attributes.GetNamedItem("name"));
            datHeader.Description = VarFix.String(head[0].Attributes.GetNamedItem("description"));

            return(true);
        }
Ejemplo n.º 3
0
 public static void WriteDat(System.IO.Stream strOut, DatHeader datHeader, bool newStyle = false)
 {
     using (DatStreamWriter sw = new DatStreamWriter(strOut))
     {
         WriteToStream(sw, datHeader, newStyle);
     }
 }
Ejemplo n.º 4
0
        private static bool LoadCredits(DatFileLoader dfl, DatHeader datHeader, ReportError errorReport)
        {
            if (dfl.Next.ToLower() != "[credits]")
            {
                errorReport?.Invoke(dfl.Filename, "Looking for [CREDITS] but found " + dfl.Next + " , " + dfl.LineNumber);
                return(false);
            }

            while (!dfl.EndOfStream())
            {
                string line = dfl.Gn();
                if (line.Substring(0, 1) == "[")
                {
                    return(true);
                }

                string element;
                string value;
                if (!splitLine(line, out element, out value))
                {
                    return(false);
                }

                switch (element.ToLower())
                {
                case "author":
                    datHeader.Author = value;
                    break;

                case "email":
                    datHeader.Email = value;
                    break;

                case "homepage":
                    datHeader.URL = value;
                    break;

                case "url":
                    datHeader.URL = value;
                    break;

                case "version":
                    datHeader.Version = value;
                    break;

                case "date":
                    datHeader.Date = value;
                    break;

                case "comment":
                    datHeader.Comment = value;
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Unknown Line " + dfl.Next + " found in [CREDITS], " + dfl.LineNumber);
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 5
0
        private static void WriteToStream(DatStreamWriter sw, DatHeader datHeader, bool newStyle)
        {
            sw.WriteLine("<?xml version=\"1.0\"?>");
            if (newStyle)
            {
                sw.WriteLine("<RVDatFile>", 1);
            }
            else
            {
                sw.WriteLine("<DatFile>", 1);
            }

            WriteHeader(sw, datHeader);

            writeBase(sw, datHeader.BaseDir, newStyle);

            if (newStyle)
            {
                sw.WriteLine("</RVDatFile>", -1);
            }
            else
            {
                sw.WriteLine("</DatFile>", -1);
            }
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
        private static void SetMergeType(MergeType mt, DatHeader dh)
        {
            bool hasRom = DatHasRomOf.HasRomOf(dh.BaseDir);

            if (hasRom)
            {
                switch (mt)
                {
                case MergeType.Merge:
                    DatClean.DatSetMakeMergeSet(dh.BaseDir);
                    break;

                case MergeType.NonMerged:
                    DatClean.DatSetMakeNonMergeSet(dh.BaseDir);
                    break;

                case MergeType.Split:
                    DatClean.DatSetMakeSplitSet(dh.BaseDir);
                    //DatClean.RemoveNotCollected(dh.BaseDir);
                    break;

                case MergeType.CHDsMerge:
                    DatClean.DatSetMakeMergeSet(dh.BaseDir, false);
                    break;
                }



                DatClean.RemoveDupes(dh.BaseDir);
                DatClean.RemoveEmptySets(dh.BaseDir);
            }
        }
Ejemplo n.º 8
0
        public static void MakeDatSingleLevel(DatHeader tDatHeader)
        {
            DatBase[] db = tDatHeader.BaseDir.ToArray();
            tDatHeader.Dir = "noautodir";

            tDatHeader.BaseDir.ChildrenClear();
            DatDir root = new DatDir(DatFileType.UnSet)
            {
                Name  = tDatHeader.Name,
                DGame = new DatGame {
                    Description = tDatHeader.Description
                }
            };

            tDatHeader.BaseDir.ChildAdd(root);

            foreach (DatBase set in db)
            {
                string dirName = set.Name;
                if (!(set is DatDir romSet))
                {
                    continue;
                }
                DatBase[] dbr = romSet.ToArray();
                foreach (DatBase rom in dbr)
                {
                    rom.Name = dirName + "\\" + rom.Name;
                    root.ChildAdd(rom);
                }
            }
        }
Ejemplo n.º 9
0
        public static bool ReadDat(string strFilename, ReportError errorReport, out DatHeader datHeader)
        {
            using (DatFileLoader dfl = new DatFileLoader())
            {
                datHeader = new DatHeader {
                    BaseDir = new DatDir(DatFileType.UnSet)
                };
                int errorCode = dfl.LoadDat(strFilename, DatRead.Enc);
                if (errorCode != 0)
                {
                    errorReport?.Invoke(strFilename, new Win32Exception(errorCode).Message);
                    return(false);
                }

                dfl.Gn();
                if (dfl.EndOfStream())
                {
                    return(false);
                }
                if (dfl.Next.ToLower() == "clrmamepro" || dfl.Next.ToLower() == "clrmame")
                {
                    if (!LoadHeaderFromDat(dfl, strFilename, datHeader, errorReport))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }
                if (dfl.Next.ToLower() == "raine")
                {
                    while (dfl.Next.ToLower() != "emulator")
                    {
                        dfl.Gn();
                    }
                    if (!LoadHeaderFromDat(dfl, strFilename, datHeader, errorReport))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }
                if (dfl.Next.ToLower() == "romvault")
                {
                    if (!LoadHeaderFromDat(dfl, strFilename, datHeader, errorReport))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }

                while (!dfl.EndOfStream())
                {
                    bool res = ReadNextBlock(dfl, datHeader.BaseDir, errorReport);
                    if (!res)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 10
0
        private static bool ReadXMLDat(string fullname, ReportError ErrorReport, out DatHeader rvDat)
        {
            rvDat = null;
            int errorCode = FileStream.OpenFileRead(fullname, out Stream fs);

            if (errorCode != 0)
            {
                ErrorReport?.Invoke(fullname, errorCode + ": " + new Win32Exception(errorCode).Message);
                return(false);
            }

            bool retVal = false;

            try
            {
                retVal = ReadXMLDatFromStream(fs, fullname, ErrorReport, out rvDat);
            }
            catch (Exception e)
            {
                fs.Close();
                fs.Dispose();
                ErrorReport?.Invoke(fullname, $"Error Occured Reading Dat:\r\n{e.Message}\r\n");
                return(false);
            }
            fs.Close();
            fs.Dispose();

            return(retVal);
        }
Ejemplo n.º 11
0
        public bool ReadDat(string fullname, out DatHeader rvDat)
        {
            rvDat = null;

            System.Diagnostics.Debug.WriteLine("Reading : " + fullname);

            StreamReader myfile  = File.OpenText(fullname, Enc);
            string       strLine = null;

            while (string.IsNullOrWhiteSpace(strLine) && !myfile.EndOfStream)
            {
                strLine = myfile.ReadLine();
            }
            myfile.Close();

            if (strLine == null)
            {
                return(false);
            }


            if (strLine.ToLower().IndexOf("xml", StringComparison.Ordinal) >= 0)
            {
                if (!ReadXMLDat(fullname, out rvDat))
                {
                    return(false);
                }
            }
            else if ((strLine.ToLower().IndexOf("clrmamepro", StringComparison.Ordinal) >= 0) || (strLine.ToLower().IndexOf("clrmame", StringComparison.Ordinal) >= 0) || (strLine.ToLower().IndexOf("romvault", StringComparison.Ordinal) >= 0) || (strLine.ToLower().IndexOf("game", StringComparison.Ordinal) >= 0) || (strLine.ToLower().IndexOf("machine", StringComparison.Ordinal) >= 0))
            {
                DatCmpReader dcr = new DatCmpReader(ErrorReport);
                if (!dcr.ReadDat(fullname, out rvDat))
                {
                    return(false);
                }
            }
            else if (strLine.ToLower().IndexOf("doscenter", StringComparison.Ordinal) >= 0)
            {
                DatDOSReader ddr = new DatDOSReader(ErrorReport);
                if (!ddr.ReadDat(fullname, out rvDat))
                {
                    return(false);
                }
            }
            else if (strLine.ToLower().IndexOf("[credits]", StringComparison.Ordinal) >= 0)
            {
                DatROMCenterReader drcr = new DatROMCenterReader(ErrorReport);
                if (!drcr.ReadDat(fullname, out rvDat))
                {
                    return(false);
                }
            }
            else
            {
                ErrorReport?.Invoke(fullname, "Invalid DAT File");
                return(false);
            }

            return(true);
        }
Ejemplo n.º 12
0
        public void WriteDat(string strFilename, DatHeader datHeader, bool newStyle = false)
        {
            string dir = Path.GetDirectoryName(strFilename);

            if (!string.IsNullOrWhiteSpace(dir) && !Directory.Exists(dir))
            {
                System.IO.Directory.CreateDirectory(dir);
            }

            using (dsw sw = new dsw(strFilename))
            {
                sw.WriteLine("<?xml version=\"1.0\"?>");
                if (newStyle)
                {
                    sw.WriteLine("<RVDatFile>", 1);
                }
                else
                {
                    sw.WriteLine("<DatFile>", 1);
                }

                WriteHeader(sw, datHeader);

                writeBase(sw, datHeader.BaseDir, newStyle);

                if (newStyle)
                {
                    sw.WriteLine("</RVDatFile>", -1);
                }
                else
                {
                    sw.WriteLine("</DatFile>", -1);
                }
            }
        }
Ejemplo n.º 13
0
        protected DatFile BuildGenericDatFile(DatFileAttribute attribute)
        {
            DatHeader header = new DatHeader(Convert.ToUInt32(attribute.Translations.Count));
            List <IndexTableRecord> indexTableRecords = new List <IndexTableRecord>();
            List <ValueTableRecord> valueTableRecords = new List <ValueTableRecord>();
            List <KeyTableRecord>   keyTableRecords   = new List <KeyTableRecord>();

            foreach (Translation translation in attribute.Translations)
            {
                ValueTableRecord valueTableRecord = new ValueTableRecord(translation.Value);
                valueTableRecords.Add(valueTableRecord);
                KeyTableRecord keyTableRecord = new KeyTableRecord(translation.Key);
                keyTableRecords.Add(keyTableRecord);
                IndexTableRecord indexTableRecord = new IndexTableRecord(
                    translation.Crc32,
                    Convert.ToUInt32(keyTableRecord.Key.Length),
                    Convert.ToUInt32(valueTableRecord.Value.Length));
                indexTableRecords.Add(indexTableRecord);
            }

            IndexTable indexTable = new IndexTable(indexTableRecords);
            ValueTable valueTable = new ValueTable(valueTableRecords);
            KeyTable   keyTable   = new KeyTable(keyTableRecords);

            return(new DatFile(header, indexTable, valueTable, keyTable));
        }
Ejemplo n.º 14
0
        private static bool isFile(DatRule datRule, DatHeader dh)
        {
            FileType ft = datRule.Compression;

            if (!datRule.CompressionOverrideDAT)
            {
                switch (dh.Compression?.ToLower())
                {
                case "unzip":
                case "file":
                    ft = FileType.Dir;
                    break;

                case "7zip":
                case "7z":
                    ft = FileType.SevenZip;
                    break;

                case "zip":
                    ft = FileType.Zip;
                    break;
                }
            }

            if (Settings.rvSettings.FilesOnly)
            {
                ft = FileType.Dir;
            }

            return(ft == FileType.Dir);
        }
Ejemplo n.º 15
0
 public static void WriteDat(System.IO.Stream strOut, DatHeader datHeader)
 {
     using (DatStreamWriter sw = new DatStreamWriter(strOut))
     {
         WriteToStream(sw, datHeader);
     }
 }
Ejemplo n.º 16
0
        /// <inheritdoc/>
        public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
        {
            // Open a file reader
            Encoding             enc = filename.GetEncoding();
            SeparatedValueReader svr = new SeparatedValueReader(File.OpenRead(filename), enc)
            {
                Header           = true,
                Quotes           = true,
                Separator        = _delim,
                VerifyFieldCount = true,
            };

            // If we're somehow at the end of the stream already, we can't do anything
            if (svr.EndOfStream)
            {
                return;
            }

            // Read in the header
            svr.ReadHeader();

            // Loop through all of the data lines
            while (!svr.EndOfStream)
            {
                try
                {
                    // Get the current line, split and parse
                    svr.ReadNextLine();

                    // Create mapping dictionaries
                    Setter setter = new Setter();
                    setter.PopulateSettersFromList(svr.HeaderValues, svr.Line);

                    // Set DatHeader fields
                    DatHeader datHeader = new DatHeader();
                    setter.SetFields(datHeader);
                    Header.ConditionalCopy(datHeader);

                    // Set Machine and DatItem fields
                    if (setter.DatItemMappings.ContainsKey(DatItemField.Type))
                    {
                        DatItem datItem = DatItem.Create(setter.DatItemMappings[DatItemField.Type].AsItemType());
                        setter.SetFields(datItem);
                        datItem.Machine = new Machine();
                        setter.SetFields(datItem.Machine);
                        datItem.Source = new Source(indexId, filename);
                        ParseAddHelper(datItem, statsOnly);
                    }
                }
                catch (Exception ex) when(!throwOnError)
                {
                    string message = $"'{filename}' - There was an error parsing line {svr.LineNumber} '{svr.CurrentLine}'";

                    logger.Error(ex, message);
                }
            }

            svr.Dispose();
        }
Ejemplo n.º 17
0
 protected virtual bool ParseDat(BinaryReader stream)
 {
     stream.BaseStream.Seek(0x04, SeekOrigin.Begin);
     header = new DatHeader {
         fileSize = XorTools.ReadXorInt32(stream),
         dataSize = XorTools.ReadXorInt32(stream) + 16,
     };
     return((stream.BaseStream.Length - header.fileSize) == 32);
 }
Ejemplo n.º 18
0
        public DatFile Build(byte[] bytes)
        {
            DatHeader  header     = BuildDatHeader(bytes);
            IndexTable indexTable = BuildIndexTable(bytes, header.KeyCount);
            ValueTable valueTable = BuildValueTable(bytes, indexTable, header.KeyCount);
            KeyTable   keyTable   = BuildKeyTable(bytes, indexTable, header.KeyCount);

            return(new DatFile(header, indexTable, valueTable, keyTable));
        }
        protected DatFile FromBytesInternal([NotNull] byte[] bytes)
        {
            DatHeader  header     = BuildDatHeaderFromBytesInternal(bytes);
            IndexTable indexTable = BuildIndexTableFromBytesInternal(bytes, header.KeyCount);
            ValueTable valueTable = BuildValueTableFromBytesInternal(bytes, indexTable, header.KeyCount);
            KeyTable   keyTable   = BuildKeyTableFromBytesInternal(bytes, indexTable, header.KeyCount);

            return(new DatFile(header, indexTable, valueTable, keyTable));
        }
Ejemplo n.º 20
0
        private static bool ReadXMLDat(string fullname, ReportError ErrorReport, out DatHeader rvDat)
        {
            rvDat = null;
            int errorCode = FileStream.OpenFileRead(fullname, out Stream fs);

            if (errorCode != 0)
            {
                ErrorReport?.Invoke(fullname, errorCode + ": " + new Win32Exception(errorCode).Message);
                return(false);
            }

            XmlDocument doc = new XmlDocument {
                XmlResolver = null
            };

            try
            {
                doc.Load(fs);
            }
            catch (Exception e)
            {
                fs.Close();
                fs.Dispose();
                ErrorReport?.Invoke(fullname, $"Error Occured Reading Dat:\r\n{e.Message}\r\n");
                return(false);
            }
            fs.Close();
            fs.Dispose();

            if (doc.DocumentElement == null)
            {
                return(false);
            }

            XmlNode mame = doc.SelectSingleNode("mame");

            if (mame != null)
            {
                return(DatXmlReader.ReadMameDat(doc, fullname, out rvDat));
            }

            XmlNode head = doc.DocumentElement?.SelectSingleNode("header");

            if (head != null)
            {
                return(DatXmlReader.ReadDat(doc, fullname, out rvDat));
            }

            XmlNodeList headList = doc.SelectNodes("softwarelist");

            if (headList != null)
            {
                return(DatMessXmlReader.ReadDat(doc, fullname, out rvDat));
            }

            return(false);
        }
        /// <summary>
        /// Wrap creating a DAT file from files or a directory in parallel
        /// </summary>
        /// <param name="inputs">List of input filenames</param>
        /// /* Normal DAT header info */
        /// <param name="datHeader">All DatHeader info to be used</param>
        /// /* Standard DFD info */
        /// <param name="omitFromScan">Hash flag saying what hashes should not be calculated</param>
        /// <param name="removeDateFromAutomaticName">True if the date should be omitted from the DAT, false otherwise</param>
        /// <param name="archivesAsFiles">True if archives should be treated as files, false otherwise</param>
        /// <param name="chdsAsFiles">True if CHDs should be treated like regular files, false otherwise</param>
        /// <param name="skipFileType">Type of files that should be skipped on scan</param>
        /// <param name="addBlankFilesForEmptyFolder">True if blank items should be created for empty folders, false otherwise</param>
        /// <param name="addFileDates">True if dates should be archived for all files, false otherwise</param>
        /// <param name="filter">Filter object to be passed to the DatItem level</param>
        /// /* Output DAT info */
        /// <param name="tempDir">Name of the directory to create a temp folder in (blank is default temp directory)</param>
        /// <param name="outDir">Name of the directory to output the DAT to (blank is the current directory)</param>
        /// <param name="copyFiles">True if files should be copied to the temp directory before hashing, false otherwise</param>
        /// /* Filtering info */
        /// <param name="filter">Filter object to be passed to the DatItem level</param>
        private static void InitDatFromDir(List <string> inputs,
                                           /* Normal DAT header info */
                                           DatHeader datHeader,

                                           /* Standard DFD info */
                                           Hash omitFromScan,
                                           bool removeDateFromAutomaticName,
                                           bool archivesAsFiles,
                                           bool chdsAsFiles,
                                           SkipFileType skipFileType,
                                           bool addBlankFilesForEmptyFolder,
                                           bool addFileDates,

                                           /* Output DAT info */
                                           string tempDir,
                                           string outDir,
                                           bool copyFiles,

                                           /* Filtering info */
                                           Filter filter)
        {
            // Create a new DATFromDir object and process the inputs
            DatFile basedat = new DatFile(datHeader)
            {
                Date = DateTime.Now.ToString("yyyy-MM-dd"),
            };

            // For each input directory, create a DAT
            foreach (string path in inputs)
            {
                if (Directory.Exists(path) || File.Exists(path))
                {
                    // Clone the base Dat for information
                    DatFile datdata = new DatFile(basedat);

                    string basePath = Path.GetFullPath(path);
                    bool   success  = datdata.PopulateFromDir(basePath, omitFromScan, removeDateFromAutomaticName, archivesAsFiles,
                                                              skipFileType, addBlankFilesForEmptyFolder, addFileDates, tempDir, copyFiles, datHeader.Header, chdsAsFiles, filter);

                    // If it was a success, write the DAT out
                    if (success)
                    {
                        datdata.Write(outDir);
                    }

                    // Otherwise, show the help
                    else
                    {
                        Console.WriteLine();
                        _help.OutputIndividualFeature("DATFromDir");
                    }
                }
            }
        }
Ejemplo n.º 22
0
        protected DatItem Next()
        {
            DatHeader header = new DatHeader();

            if (Dat_next(_dat, ref header) == 1)
            {
                return(new DatItem(header, this, _index));
            }
            FuryException.Throw();
            return(null);
        }
Ejemplo n.º 23
0
        public bool ReadDat(string strFilename, out DatHeader datHeader)
        {
            _filename = strFilename;

            using (DatFileLoader dfl = new DatFileLoader())
            {
                datHeader = new DatHeader {
                    BaseDir = new DatDir(DatFileType.UnSet)
                };
                int errorCode = dfl.LoadDat(strFilename, System.Text.Encoding.UTF8);
                if (errorCode != 0)
                {
                    _errorReport?.Invoke(strFilename, new Win32Exception(errorCode).Message);
                    return(false);
                }

                dfl.Gn();
                if (dfl.EndOfStream())
                {
                    return(false);
                }
                if (dfl.Next.ToLower() == "doscenter")
                {
                    dfl.Gn();
                    if (!LoadHeaderFromDat(dfl, datHeader))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }

                while (!dfl.EndOfStream())
                {
                    switch (dfl.Next.ToLower())
                    {
                    case "game":
                        dfl.Gn();
                        if (!LoadGameFromDat(dfl, datHeader.BaseDir))
                        {
                            return(false);
                        }
                        dfl.Gn();
                        break;

                    default:
                        _errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known, on line " + dfl.LineNumber);
                        dfl.Gn();
                        break;
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 24
0
        public DatItem Item(int index)
        {
            CheckDisposed();
            DatHeader header = new DatHeader();

            if (Dat_header(_dat, (UInt32)index, ref header) == 1)
            {
                return(new DatItem(header, this, (UInt32)index));
            }
            FuryException.Throw();
            return(null);
        }
Ejemplo n.º 25
0
        private static bool LoadEmulator(DatFileLoader dfl, DatHeader datHeader, ReportError errorReport)
        {
            if (dfl.Next.ToLower() != "[emulator]")
            {
                errorReport?.Invoke(dfl.Filename, "Looking for [EMULATOR] but found " + dfl.Next + " , " + dfl.LineNumber);
                return(false);
            }

            while (!dfl.EndOfStream())
            {
                string line = dfl.Gn();
                if (line.Substring(0, 1) == "[")
                {
                    return(true);
                }

                string element;
                string value;
                if (!splitLine(line, out element, out value))
                {
                    return(false);
                }

                switch (element.ToLower())
                {
                case "refname":
                    datHeader.Name = value;
                    break;

                case "version":
                    datHeader.Description = value;
                    break;

                case "category":
                    datHeader.Category = value;
                    break;

                case "exe":
                    break;

                case "runcmd":
                    break;

                case "romspaths":
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Unknown Line " + dfl.Next + " found in [EMULATOR], " + dfl.LineNumber);
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 26
0
        private bool LoadHeaderFromDat(XmlDocument doc, DatHeader datHeader)
        {
            if (doc.DocumentElement == null)
            {
                return(false);
            }
            XmlNode head = doc.DocumentElement.SelectSingleNode("header");

            datHeader.Filename = _filename;

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

            datHeader.IsSuperDat = (datHeader.Type.ToLower() == "superdat") || (datHeader.Type.ToLower() == "gigadat");

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

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

                // zip, unzip, file
                datHeader.Compression = VarFix.String(packingNode.Attributes.GetNamedItem("forcepacking")).ToLower();

                // split, full
                datHeader.MergeType = VarFix.String(packingNode.Attributes.GetNamedItem("forcemerging")).ToLower();

                // noautodir, nogame
                datHeader.Dir = VarFix.String(packingNode.Attributes.GetNamedItem("dir")).ToLower();
            }

            // Look for: <notzipped>true</notzipped>
            string notzipped = VarFix.String(head.SelectSingleNode("notzipped"));

            datHeader.NotZipped = ((notzipped.ToLower() == "true") || (notzipped.ToLower() == "yes"));

            return(true);
        }
Ejemplo n.º 27
0
        public bool ReadDat(string strFilename, out DatHeader datHeader)
        {
            _filename = strFilename;

            using (DatFileLoader dfl = new DatFileLoader())
            {
                datHeader = new DatHeader {
                    BaseDir = new DatDir(DatFileType.UnSet)
                };
                int errorCode = dfl.LoadDat(strFilename);
                if (errorCode != 0)
                {
                    _errorReport?.Invoke(strFilename, new Win32Exception(errorCode).Message);
                    return(false);
                }

                dfl.Gn();
                if (dfl.EndOfStream())
                {
                    return(false);
                }
                if (dfl.Next.ToLower() == "clrmamepro" || dfl.Next.ToLower() == "clrmame")
                {
                    dfl.Gn();
                    if (!LoadHeaderFromDat(dfl, datHeader))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }
                if (dfl.Next.ToLower() == "romvault")
                {
                    dfl.Gn();
                    if (!LoadHeaderFromDat(dfl, datHeader))
                    {
                        return(false);
                    }
                    dfl.Gn();
                }

                while (!dfl.EndOfStream())
                {
                    bool res = ReadNextBlock(dfl, datHeader.BaseDir);
                    if (!res)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 28
0
        public static void WriteDat(string strFilename, DatHeader datHeader, bool newStyle = false)
        {
            string dir = Path.GetDirectoryName(strFilename);

            if (!string.IsNullOrWhiteSpace(dir) && !Directory.Exists(dir))
            {
                System.IO.Directory.CreateDirectory(dir);
            }

            using (DatStreamWriter sw = new DatStreamWriter(strFilename))
            {
                WriteToStream(sw, datHeader, newStyle);
            }
        }
Ejemplo n.º 29
0
        public bool ReadMameDat(XmlDocument doc, string strFilename, out DatHeader datHeader)
        {
            datHeader = new DatHeader {
                BaseDir = new DatDir(DatFileType.UnSet)
            };
            _filename = strFilename;

            if (!LoadMameHeaderFromDat(doc, datHeader))
            {
                return(false);
            }

            if (doc.DocumentElement == null)
            {
                return(false);
            }

            XmlNodeList dirNodeList = doc.DocumentElement.SelectNodes("dir");

            if (dirNodeList != null)
            {
                for (int i = 0; i < dirNodeList.Count; i++)
                {
                    LoadDirFromDat(datHeader.BaseDir, dirNodeList[i]);
                }
            }

            XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("game");

            if (gameNodeList != null)
            {
                for (int i = 0; i < gameNodeList.Count; i++)
                {
                    LoadGameFromDat(datHeader.BaseDir, gameNodeList[i]);
                }
            }


            XmlNodeList machineNodeList = doc.DocumentElement.SelectNodes("machine");

            if (machineNodeList != null)
            {
                for (int i = 0; i < machineNodeList.Count; i++)
                {
                    LoadGameFromDat(datHeader.BaseDir, machineNodeList[i]);
                }
            }

            return(true);
        }
Ejemplo n.º 30
0
        private static void WriteToStream(DatStreamWriter sw, DatHeader datHeader)
        {
            sw.WriteLine("<?xml version=\"1.0\"?>");
            sw.WriteLine(
                @"<!DOCTYPE mame [
<!ELEMENT mame (machine+)>
	<!ATTLIST mame build CDATA #IMPLIED>
	<!ATTLIST mame debug (yes|no) ""no"">
	<!ELEMENT machine (description, year?, manufacturer?, biosset*, rom*, disk*, device_ref*, sample*, chip*, display*, sound?, input?, dipswitch*, configuration*, port*, adjuster*, driver?, feature*, device*, slot*, softwarelist*, ramoption*)>
		<!ATTLIST machine name CDATA #REQUIRED>
		<!ATTLIST machine isbios (yes|no) ""no"">
		<!ATTLIST machine isdevice (yes|no) ""no"">
		<!ATTLIST machine runnable (yes|no) ""yes"">
		<!ATTLIST machine cloneof CDATA #IMPLIED>
		<!ATTLIST machine romof CDATA #IMPLIED>
		<!ELEMENT description (#PCDATA)>
		<!ELEMENT year (#PCDATA)>
		<!ELEMENT manufacturer (#PCDATA)>
		<!ELEMENT rom EMPTY>
			<!ATTLIST rom name CDATA #REQUIRED>
			<!ATTLIST rom bios CDATA #IMPLIED>
			<!ATTLIST rom size CDATA #REQUIRED>
			<!ATTLIST rom crc CDATA #IMPLIED>
			<!ATTLIST rom sha1 CDATA #IMPLIED>
			<!ATTLIST rom merge CDATA #IMPLIED>
			<!ATTLIST rom region CDATA #IMPLIED>
			<!ATTLIST rom offset CDATA #IMPLIED>
			<!ATTLIST rom status (baddump|nodump|good) ""good"">
			<!ATTLIST rom optional (yes|no) ""no"">
		<!ELEMENT disk EMPTY>
			<!ATTLIST disk name CDATA #REQUIRED>
			<!ATTLIST disk sha1 CDATA #IMPLIED>
			<!ATTLIST disk merge CDATA #IMPLIED>
			<!ATTLIST disk region CDATA #IMPLIED>
			<!ATTLIST disk index CDATA #IMPLIED>
			<!ATTLIST disk writable (yes|no) ""no"">
			<!ATTLIST disk status (baddump|nodump|good) ""good"">
			<!ATTLIST disk optional (yes|no) ""no"">
		<!ELEMENT device_ref EMPTY>
			<!ATTLIST device_ref name CDATA #REQUIRED>
]>

");

            sw.WriteLine($@"<mame build=""{datHeader.Name}"">");

            writeBase(sw, datHeader.BaseDir);

            sw.WriteLine("</mame>", -1);
        }
Ejemplo n.º 31
0
 protected override void WriteDatHeader()
 {
     DatHeader datHeader = new DatHeader();
     DatFile.Write(FileTools.StructureToByteArray(datHeader), 0, Marshal.SizeOf(datHeader));
 }