Exemple #1
0
        private static bool LoadEmulator(DatFileLoader dfl, ReportError errorReport)
        {
            dfl.Gn();
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after emulator, on line " + dfl.LineNumber);
                return(false);
            }

            dfl.Gn();
            while (dfl.Next != ")")
            {
                switch (dfl.Next.ToLower())
                {
                case "name":
                    dfl.GnRest();
                    break;

                case "version":
                    dfl.GnRest();
                    break;

                case "debug":
                    dfl.GnRest();
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in emulator, on line " + dfl.LineNumber);
                    break;
                }
                dfl.Gn();
            }
            return(true);
        }
        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);
        }
Exemple #3
0
        private static bool LoadArchiveFromDat(DatFileLoader dfl, ReportError errorReport)
        {
            dfl.Gn();

            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after Archive, on line " + dfl.LineNumber);
                return(false);
            }

            dfl.Gn();
            while (dfl.Next != ")")
            {
                switch (dfl.Next.ToLower())
                {
                case "name":
                    dfl.Gn();
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not know in Archive, on line " + dfl.LineNumber);
                    break;
                }
                dfl.Gn();
            }
            return(true);
        }
Exemple #4
0
        private static bool LoadDirFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            dfl.Gn();
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after game, on line " + dfl.LineNumber);
                return(false);
            }

            dfl.Gn();
            if (dfl.Next.ToLower() != "name")
            {
                errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber);
                return(false);
            }
            DatDir dir = new DatDir(DatFileType.UnSet)
            {
                Name = dfl.GnRest()
            };

            dfl.Gn();
            parentDir.ChildAdd(dir);

            while (dfl.Next != ")")
            {
                bool res = ReadNextBlock(dfl, dir, errorReport);
                if (!res)
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #5
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);
        }
Exemple #6
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);
        }
Exemple #7
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);
        }
Exemple #8
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);
        }
        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);
        }
Exemple #10
0
        private static bool LoadFileFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after file, on line " + dfl.LineNumber);
                return(false);
            }
            dfl.Gn();

            if (dfl.Next.ToLower() != "name")
            {
                errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber);
                return(false);
            }

            DatFile dRom = new DatFile(DatFileType.UnSet)
            {
                Name = dfl.GnNameToSize()
            };

            dfl.Gn();


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

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

                case "date":
                    dRom.DateModified = dfl.Gn() + " " + dfl.Gn();
                    dfl.Gn();
                    break;

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

            parentDir.ChildAdd(dRom);

            return(true);
        }
        private static bool LoadDat(DatFileLoader dfl, DatHeader datHeader, ReportError errorReport)
        {
            if (dfl.Next.ToLower() != "[dat]")
            {
                errorReport?.Invoke(dfl.Filename, "Looking for [DAT] 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 "version":
                    //datVersion = value;
                    break;

                case "plugin":
                    //plugin = value;
                    break;

                case "split":
                    datHeader.Split = value;
                    break;

                case "merge":
                    datHeader.MergeType = value;
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Unknown Line " + dfl.Next + " found in [DAT], " + dfl.LineNumber);
                    return(false);
                }
            }
            return(true);
        }
Exemple #12
0
 /// <summary>
 /// Send data through a client using the name of the client
 /// </summary>
 /// <param name="name">Client name</param>
 /// <param name="sendData">Byet buffer with the data to be sent</param>
 /// <param name="nrbytes">Number of bytes to be sent</param>
 /// <returns></returns>
 public bool SendDataAsync(string name, byte[] sendData, int nrbytes)
 {
     if (sendData.Length < nrbytes)
     {
         nrbytes = sendData.Length;
     }
     if (AllConnections.ContainsKey(name))
     {
         TConnection C = AllConnections[name];
         try
         {
             C.ConnectionSocket.BeginSend(C.IncomingData, 0, C.IncomingData.Length, 0, new AsyncCallback(SendCallback), C.Address);
             C.DataReceived = false;
             return(true);
         }
         catch
         {
             ReportError?.Invoke("BeginSend failed in SendDataAsync", "name");
             return(false);
         }
     }
     else
     {
         return(false);
     }
 }
Exemple #13
0
 private bool MonitorConnection()
 {
     if (StartConnection == false || DisconnectReceived)
     {
         ReportError?.Invoke("A disconnect was received while waiting for data");
         Connstats.NrDisconnects++;
         return(false);
     }
     if (ServerSocket.Connected == false)
     {
         ReportError?.Invoke("The socket is no longer connected");
         Connstats.NrDisconnects++;
         return(false);
     }
     if (SendTimer.ElapsedMilliseconds > SendTimeout)
     {
         ReportError?.Invoke("Timeout waiting for the data to be sent");
         Connstats.NrDisconnects++;
         return(false);
     }
     if (receiveTimer.ElapsedMilliseconds > ReceiveTimeout)
     {
         ReportError?.Invoke("Timeout waiting for reply");
         Connstats.NrDisconnects++;
         return(false);
     }
     return(true);
 }
        public View3dControl(string name, bool gdi_compatible_backbuffer)
        {
            try
            {
                BackColor = Color.Gray;
                if (this.IsInDesignMode())
                {
                    return;
                }
                SetStyle(ControlStyles.Selectable, false);

                View3d        = View3d.Create();
                Window        = new View3d.Window(View3d, Handle, gdi_compatible_backbuffer, dbg_name: name);
                Window.Error += (s, a) => ReportError?.Invoke(this, new ReportErrorEventArgs(a.Message));

                InitializeComponent();

                Name                     = name;
                ClickTimeMS              = 180;
                MouseNavigation          = true;
                DefaultKeyboardShortcuts = true;
            }
            catch
            {
                Dispose();
                throw;
            }
        }
Exemple #15
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);
        }
Exemple #16
0
        public RGOClientRW(string IPAddress, string serviceName) : base(IPAddress, RGOStarterBase.RWServicePort, serviceName)
        {
            if (ClientID == 0)
            {
                throw new Exception("The client ID is undefined");
            }

            Request          = new RequestRW();
            Request.ClientID = ClientID;

            Reply = new ReplyRW();
            client.ReportError = p => ReportError?.Invoke("RGOClientRW", p);
        }
Exemple #17
0
        private void ReadCallback(IAsyncResult ar)
        {
            //get the client from the asynchronous state object
            TConnection C = null;

            try
            {
                C = AllConnections[(string)ar.AsyncState];
            }
            catch
            {
                ReportError?.Invoke("ReadCallback received from a client that is no longer in the database", "");
                return;
            }

            int bytesread = 0;

            try
            {
                bytesread = C.ConnectionSocket.EndReceive(ar); //acknowledge the data receipt
            }
            catch
            {
                ReportError?.Invoke("EndReceive failed during ReadCallback", C.Address);
            }
            if (bytesread > 0)
            {
                C.ConnStats.LastComm.Restart();
                C.ConnStats.Receivedpackets++;
                //call external function to process the data
                NewDataReceived?.Invoke(C.Address, C.IncomingData, bytesread);
                C.NrReceivedBytes = bytesread;
                C.DataReceived    = true;

                //call the data processing method of the connection itself
                C.ProcessData();
                C.ProcessDataAction?.Invoke();

                //set the socket back to listening mode
                try
                {
                    C.ConnectionSocket.BeginReceive(C.IncomingData, 0, C.IncomingData.Length, 0, new AsyncCallback(ReadCallback), C.Address);
                }
                catch
                {
                    ReportError?.Invoke("BeginReceive failed during ReadCallback", C.Address);
                }
            }
        }
Exemple #18
0
        private void AcceptConnectCallback(IAsyncResult ar)
        {
            Listener = (Socket)ar.AsyncState;

            //acknowledge the connection
            Socket incomingSocket = null;

            try
            {
                incomingSocket = Listener.EndAccept(ar);
            }
            catch
            {
                ReportError?.Invoke("EndAccept failed on incoming connection", "");
            }

            //put the listener back to listening
            Listener.BeginAccept(new AsyncCallback(AcceptConnectCallback), Listener);

            if (incomingSocket == null)
            {
                return;
            }
            IPEndPoint ep = (IPEndPoint)incomingSocket.RemoteEndPoint;

            TConnection C = new TConnection();

            C.Setup(incomingSocket, ep.Address, ep.Port, ConnectionBufSize);

            if (AllConnections.ContainsKey(C.Address) == false)
            {
                AllConnections.Add(C.Address, C);
                AllConnectionsList.Add(C);
            }

            //Signal that a new connection has been created
            NewConnection?.Invoke(C);

            //configure the socket to receive incoming data and arm the data reception event
            try
            {
                C.ConnectionSocket.BeginReceive(C.IncomingData, 0, C.IncomingData.Length, 0, new AsyncCallback(ReadCallback), C.Address);
            }
            catch
            {
                ReportError?.Invoke("BeginReceive failed on new connection", C.Address);
            }
        }
Exemple #19
0
        public RGOClientServerComm(string IPAddress, int portNr, string serviceName) : base(IPAddress, portNr, serviceName)
        {
            log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType + "_" + serviceName);

            if (ClientID != 0)
            {
                throw new Exception("A RGOClientServerComm has already been created. Only one RGO client is allowed per process");
            }
            Request = new CClientInfo();
            Reply   = new ServerInfo();

            //generate "random" ClientID
            ClientID           = (uint)DateTime.Now.Ticks;
            Request.ClientID   = ClientID;
            client.ReportError = p => ReportError?.Invoke("RGOClientServerComm", p);
        }
Exemple #20
0
        private static bool ReadNextBlock(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            switch (dfl.Next.ToLower())
            {
            case "dir":
                if (!LoadDirFromDat(dfl, parentDir, errorReport))
                {
                    return(false);
                }
                break;

            case "game":
            case "machine":
                if (!LoadGameFromDat(dfl, parentDir, errorReport))
                {
                    return(false);
                }
                break;

            case "resource":
                if (!LoadGameFromDat(dfl, parentDir, errorReport))
                {
                    return(false);
                }
                break;

            case "emulator":
                if (!LoadEmulator(dfl, errorReport))
                {
                    return(false);
                }
                break;

            case "#":     // comments

                dfl.GnRest();
                break;

            default:
                errorReport?.Invoke(dfl.Filename, "Error Keyword " + dfl.Next + " not know in dir, on line " + dfl.LineNumber);
                break;
            }
            dfl.Gn();
            return(true);
        }
Exemple #21
0
        public static bool ReadXMLDatFromStream(Stream fs, string fullname, ReportError ErrorReport, out DatHeader rvDat)
        {
            rvDat = null;
            XmlDocument doc = new XmlDocument {
                XmlResolver = null
            };

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

            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);
        }
Exemple #22
0
        private void SendCallback(IAsyncResult ar)
        {
            var name = "";

            try
            {
                // Retrieve the socket from the state object.
                TConnection C = AllConnections[(string)ar.AsyncState];
                name = C.Address;

                // Complete sending the data to the remote device.
                int bytesSent = C.ConnectionSocket.EndSend(ar);
            }
            catch
            {
                ReportError?.Invoke("EndSend failed during SendCallback", name);
            }
        }
Exemple #23
0
        private static bool LoadDiskFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            dfl.Gn();
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after rom, on line " + dfl.LineNumber);
                return(false);
            }

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

            DatFile dRom = new DatFile(DatFileType.UnSet)
            {
                Name   = VarFix.CleanCHD(dfl.Gn()),
                isDisk = true
            };

            dfl.Gn();
            while (dfl.Next != ")")
            {
                switch (dfl.Next.ToLower())
                {
                case "sha1":
                    dRom.SHA1 = VarFix.CleanMD5SHA1(dfl.Gn(), 40);
                    break;

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

                case "region":
                    dRom.Region = VarFix.String(dfl.Gn());
                    break;

                case "merge":
                    dRom.Merge = VarFix.String(dfl.Gn());
                    break;

                case "index":
                    dfl.Gn();
                    break;

                case "flags":
                    dRom.Status = VarFix.ToLower(dfl.Gn());
                    break;

                case "nodump":
                    dRom.Status = "nodump";
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in rom, on line " + dfl.LineNumber);
                    break;
                }
                dfl.Gn();
            }
            parentDir.ChildAdd(dRom);

            return(true);
        }
Exemple #24
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);
        }
Exemple #25
0
        private static bool LoadGameFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            dfl.Gn();
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after game, on line " + dfl.LineNumber);
                return(false);
            }

            dfl.Gn();
            string snext = dfl.Next.ToLower();

            string pathextra = "";

            if (snext == "rebuildto")
            {
                pathextra = dfl.Gn();
                dfl.Gn();
                snext = dfl.Next.ToLower();
            }

            if (snext != "name")
            {
                errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber);
                return(false);
            }

            string name = dfl.GnRest();

            name = Path.Combine(pathextra, name);

            dfl.Gn();
            DatDir dDir = new DatDir(DatFileType.UnSet)
            {
                Name = name, DGame = new DatGame()
            };
            DatGame dGame = dDir.DGame;

            while (dfl.Next != ")" && !dfl.EndOfStream())
            {
                switch (dfl.Next.ToLower())
                {
                case "romof":
                    dGame.RomOf = dfl.GnRest();
                    break;

                case "description":
                    string description = dfl.GnRestQ();
                    int    idx1        = description.IndexOf("\"");
                    if (idx1 != -1)
                    {
                        int idx2 = description.IndexOf("\"", idx1 + 1);
                        if (idx2 != -1)
                        {
                            description = description.Substring(idx1 + 1, idx2 - idx1 - 1);
                        }
                    }
                    dGame.Description = description;
                    break;

                case "sourcefile":
                    dGame.SourceFile = dfl.GnRest();
                    break;

                case "cloneof":
                    dGame.CloneOf = dfl.GnRest();
                    break;

                case "sampleof":
                    dGame.SampleOf = dfl.GnRest();
                    break;

                case "board":
                    dGame.Board = dfl.GnRest();
                    break;

                case "year":
                    dGame.Year = dfl.GnRest();
                    break;

                case "manufacturer":
                    dGame.Manufacturer = dfl.GnRest();
                    break;

                case "history":
                    dGame.History = dfl.GnRest();
                    break;

                case "isdevice":
                    dGame.IsDevice = dfl.GnRest();
                    break;

                case "serial":
                case "rebuildto":
                case "sample":
                case "biosset":
                case "chip":
                case "video":
                case "sound":
                case "input":
                case "dipswitch":
                case "driver":
                case "display":
                case "comment":
                case "releaseyear":
                case "releasemonth":
                case "releaseday":
                case "genre":
                case "developer":
                case "publisher":
                case "homepage":
                case "users":
                case "version":
                case "license":
                case "device_ref":
                case "driverstatus":
                case "ismechanical":
                case "#":     // comments

                    dfl.GnRest();
                    break;

                case "name":
                    string tmpName = dfl.GnRest();
                    errorReport?.Invoke(dfl.Filename, "Error: multiple names found in one game '" + tmpName + "' will be ignored, on line " + dfl.LineNumber);
                    break;

                case "rom":
                    if (!LoadRomFromDat(dfl, dDir, errorReport))
                    {
                        return(false);
                    }
                    break;

                case "disk":
                    if (!LoadDiskFromDat(dfl, dDir, errorReport))
                    {
                        return(false);
                    }
                    break;

                case "archive":
                    if (!LoadArchiveFromDat(dfl, errorReport))
                    {
                        return(false);
                    }
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in game, on line " + dfl.LineNumber);
                    break;
                }
                dfl.Gn();
            }
            parentDir.ChildAdd(dDir);
            return(true);
        }
Exemple #26
0
        private static bool LoadHeaderFromDat(DatFileLoader dfl, string filename, DatHeader datHeader, ReportError errorReport)
        {
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after DOSCenter, on line " + dfl.LineNumber);
                return(false);
            }
            dfl.Gn();

            datHeader.Filename = filename;

            while (dfl.Next != ")")
            {
                string nextstr = dfl.Next.ToLower();
                if ((nextstr.Length > 5) && (nextstr.Substring(0, 5) == "name:"))  // this is needed as there is no space after 'name:'
                {
                    datHeader.Name = (dfl.Next.Substring(5) + " " + dfl.GnRest()).Trim();
                    dfl.Gn();
                }
                else
                {
                    switch (nextstr)
                    {
                    case "name":
                    case "name:":
                        datHeader.Name = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "description":
                    case "description:":
                        datHeader.Description = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "version":
                    case "version:":
                        datHeader.Version = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "date":
                    case "date:":
                        datHeader.Date = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "author":
                    case "author:":
                        datHeader.Author = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "homepage":
                    case "homepage:":
                        datHeader.Homepage = dfl.GnRest();
                        dfl.Gn();
                        break;

                    case "comment":
                    case "comment:":
                        datHeader.Comment = dfl.GnRest();
                        dfl.Gn();
                        break;

                    default:
                        errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in DOSReader, on line " + dfl.LineNumber);
                        dfl.Gn();
                        break;
                    }
                }
            }
            return(true);
        }
Exemple #27
0
        private static bool LoadRomFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            dfl.Gn();
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after rom, on line " + dfl.LineNumber);
                return(false);
            }

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


            DatFile dRom = new DatFile(DatFileType.UnSet)
            {
                Name = dfl.Gn()
            };

            dfl.Gn();


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

                case "hash":
                    dfl.Gn();
                    break;

                case "crc":
                case "crc32":
                    dRom.CRC = VarFix.CleanMD5SHA1(dfl.Gn(), 8);
                    break;

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

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

                case "merge":
                    dRom.Merge = VarFix.String(dfl.Gn());
                    break;

                case "flags":
                    string flags = VarFix.ToLower(dfl.Gn());
                    if (string.IsNullOrWhiteSpace(dRom.Status))
                    {
                        dRom.Status = flags;
                    }
                    break;

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

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

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

                case "regiona":
                case "regionb":
                    while (dfl.Next != ")")
                    {
                        dfl.Gn();
                    }
                    continue;

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

                case "nodump":
                    dRom.Status = "nodump";
                    break;

                case "baddump":
                    dRom.Status = "baddump";
                    break;


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

            parentDir.ChildAdd(dRom);

            return(true);
        }
Exemple #28
0
        private static bool LoadGameFromDat(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            if (dfl.Next != "(")
            {
                errorReport?.Invoke(dfl.Filename, "( not found after game, on line " + dfl.LineNumber);
                return(false);
            }
            dfl.Gn();

            string sNext = dfl.Next.ToLower();

            if (sNext != "name")
            {
                errorReport?.Invoke(dfl.Filename, "Name not found as first object in ( ), on line " + dfl.LineNumber);
                return(false);
            }


            string name       = dfl.GnRest();
            int    nameLength = name.Length;

            if (nameLength > 4 && name.ToLower().Substring(nameLength - 4, 4) == ".zip")
            {
                name = name.Substring(0, nameLength - 4);
            }

            dfl.Gn();

            DatDir dDir = new DatDir(DatFileType.UnSet)
            {
                Name = name, DGame = new DatGame()
            };

            while (dfl.Next != ")")
            {
                switch (dfl.Next.ToLower())
                {
                case "file":
                    dfl.Gn();
                    if (!LoadFileFromDat(dfl, dDir, errorReport))
                    {
                        return(false);
                    }
                    dfl.Gn();
                    break;

                case "rom":
                    dfl.Gn();
                    if (!LoadFileFromDat(dfl, dDir, errorReport))
                    {
                        return(false);
                    }
                    dfl.Gn();
                    break;

                default:
                    errorReport?.Invoke(dfl.Filename, "Error: key word '" + dfl.Next + "' not known in game, on line " + dfl.LineNumber);
                    dfl.Gn();
                    break;
                }
            }
            parentDir.ChildAdd(dDir);
            return(true);
        }
        public static bool ReadDat(string strFilename, ReportError errorReport, out DatHeader datHeader)
        {
            datHeader = new DatHeader
            {
                BaseDir  = new DatDir(DatFileType.UnSet),
                Filename = strFilename
            };

            using (DatFileLoader dfl = new DatFileLoader())
            {
                dfl.LoadDat(strFilename);
                dfl.Gn();

                while (!dfl.EndOfStream())
                {
                    switch (dfl.Next.ToLower())
                    {
                    case "[credits]":
                        //getcredits
                        if (!LoadCredits(dfl, datHeader, errorReport))
                        {
                            return(false);
                        }
                        break;

                    case "[dat]":
                        //getdat
                        if (!LoadDat(dfl, datHeader, errorReport))
                        {
                            return(false);
                        }
                        break;

                    case "[emulator]":
                        //emulator
                        if (!LoadEmulator(dfl, datHeader, errorReport))
                        {
                            return(false);
                        }
                        break;

                    case "[games]":
                        //games
                        if (!LoadGame(dfl, datHeader.BaseDir, errorReport))
                        {
                            return(false);
                        }
                        break;

                    case "[resources]":
                        //resources
                        if (!LoadGame(dfl, datHeader.BaseDir, errorReport))
                        {
                            return(false);
                        }
                        break;

                    case "[disks]":
                        //games
                        if (!LoadDisks(dfl, datHeader.BaseDir, errorReport))
                        {
                            return(false);
                        }
                        break;

                    default:
                        errorReport?.Invoke(dfl.Filename, "Unknown Line " + dfl.Next + " , " + dfl.LineNumber);
                        return(false);
                    }
                }
            }

            return(true);
        }
        private static bool LoadDisks(DatFileLoader dfl, DatDir parentDir, ReportError errorReport)
        {
            if (dfl.Next.ToLower() != "[disks]")
            {
                errorReport?.Invoke(dfl.Filename, "Looking for [DISKS] but found " + dfl.Next + " , " + dfl.LineNumber);
                return(false);
            }

            while (!dfl.EndOfStream())
            {
                string line = dfl.Gn();

                if (line.Substring(0, 1) == "[")
                {
                    return(true);
                }

                string[] parts = line.Split('¬');

                // 1 parent name         = clone of
                // 2 parent description  = description (from parent)
                // 3 game name           = name (game)
                // 4 game description    = description
                // 5 rom name            = name (rom)
                // 6 rom crc             = crc
                // 7 rom size            = size
                // 8 romof name          = romof
                // 9 merge name          = merge

                string ParentName        = parts[1];
                string ParentDescription = parts[2];
                string GameName          = parts[3];
                string GameDescription   = parts[4];
                string romName           = parts[5];
                string romCRC            = parts[6];
                string romSize           = parts[7];
                string romOf             = parts[8];
                string merge             = parts[9];

                int    index;
                DatDir dDir;
                DatDir searchDir = new DatDir(DatFileType.Dir)
                {
                    Name = GameName
                };
                if (parentDir.ChildNameSearch(searchDir, out index) != 0)
                {
                    dDir = new DatDir(DatFileType.UnSet)
                    {
                        Name = GameName, DGame = new DatGame()
                    };
                    DatGame dGame = dDir.DGame;
                    dGame.Description = GameDescription;
                    if (ParentName != GameName)
                    {
                        dGame.CloneOf = ParentName;
                    }
                    parentDir.ChildAdd(dDir);
                }
                else
                {
                    dDir = (DatDir)parentDir.Child(index);
                    // need to check everything matches
                }

                DatFile dRom = new DatFile(DatFileType.UnSet)
                {
                    isDisk = true,
                    Name   = VarFix.CleanCHD(romName),
                    SHA1   = VarFix.CleanMD5SHA1(romCRC, 40),
                    Merge  = merge
                };
                // dRom.Size = VarFix.ULong(romSize);
                // check romof=ParentName

                dDir.ChildAdd(dRom);
            }
            return(true);
        }