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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
/// <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); } }
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; } }
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); }
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); }
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); } } }
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); } }
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); }
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); }
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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); }