Ejemplo n.º 1
0
        void RunBizHawk()
        {
            string infile      = IN_FromPath;
            string cue_content = null;

            var cfr = new CueFileResolver();

RERUN:
            var ext = Path.GetExtension(infile).ToLowerInvariant();

            if (ext == ".iso")
            {
                //make a fake cue file to represent this iso file and rerun it as a cue
                string filebase = Path.GetFileName(infile);
                cue_content = string.Format(@"
						FILE ""{0}"" BINARY
							TRACK 01 MODE1/2048
								INDEX 01 00:00:00"                                ,
                                            filebase);
                infile = Path.ChangeExtension(infile, ".cue");
                goto RERUN;
            }
            if (ext == ".cue")
            {
                //TODO - major renovation of error handling needed

                //TODO - make sure code is designed so no matter what happens, a disc is disposed in case of errors.
                //perhaps the CUE_Format2 (once renamed to something like Context) can handle that
                var cuePath    = IN_FromPath;
                var cueContext = new CUE_Context();
                cueContext.DiscMountPolicy = IN_DiscMountPolicy;

                cueContext.Resolver = cfr;
                if (!cfr.IsHardcodedResolve)
                {
                    cfr.SetBaseDirectory(Path.GetDirectoryName(infile));
                }

                //parse the cue file
                var parseJob = new ParseCueJob();
                if (cue_content == null)
                {
                    cue_content = File.ReadAllText(cuePath);
                }
                parseJob.IN_CueString = cue_content;
                bool okParse = true;
                try { parseJob.Run(parseJob); }
                catch (DiscJobAbortException) { okParse = false; parseJob.FinishLog(); }
                if (!string.IsNullOrEmpty(parseJob.OUT_Log))
                {
                    Console.WriteLine(parseJob.OUT_Log);
                }
                ConcatenateJobLog(parseJob);
                if (!okParse)
                {
                    goto DONE;
                }

                //compile the cue file:
                //includes this work: resolve required bin files and find out what it's gonna take to load the cue
                var compileJob = new CompileCueJob();
                compileJob.IN_CueContext = cueContext;
                compileJob.IN_CueFile    = parseJob.OUT_CueFile;
                bool okCompile = true;
                try { compileJob.Run(); }
                catch (DiscJobAbortException) { okCompile = false; compileJob.FinishLog(); }
                if (!string.IsNullOrEmpty(compileJob.OUT_Log))
                {
                    Console.WriteLine(compileJob.OUT_Log);
                }
                ConcatenateJobLog(compileJob);
                if (!okCompile || compileJob.OUT_ErrorLevel)
                {
                    goto DONE;
                }

                //check slow loading threshold
                if (compileJob.OUT_LoadTime > IN_SlowLoadAbortThreshold)
                {
                    Warn("Loading terminated due to slow load threshold");
                    OUT_SlowLoadAborted = true;
                    goto DONE;
                }

                //actually load it all up
                var loadJob = new LoadCueJob();
                loadJob.IN_CompileJob = compileJob;
                loadJob.Run();
                //TODO - need better handling of log output
                if (!string.IsNullOrEmpty(loadJob.OUT_Log))
                {
                    Console.WriteLine(loadJob.OUT_Log);
                }
                ConcatenateJobLog(loadJob);

                OUT_Disc = loadJob.OUT_Disc;
                //OUT_Disc.DiscMountPolicy = IN_DiscMountPolicy; //NOT SURE WE NEED THIS (only makes sense for cue probably)
            }
            else if (ext == ".ccd")
            {
                CCD_Format ccdLoader = new CCD_Format();
                OUT_Disc = ccdLoader.LoadCCDToDisc(IN_FromPath, IN_DiscMountPolicy);
            }


DONE:

            //setup the lowest level synth provider
            if (OUT_Disc != null)
            {
                var sssp = new ArraySectorSynthProvider()
                {
                    Sectors  = OUT_Disc._Sectors,
                    FirstLBA = -150
                };
                OUT_Disc.SynthProvider = sssp;
            }
        }
Ejemplo n.º 2
0
		void RunBizHawk()
		{
			string infile = IN_FromPath;
			string cue_content = null;

			var cfr = new CueFileResolver();

		RERUN:
			var ext = Path.GetExtension(infile).ToLowerInvariant();

			if (ext == ".iso")
			{
				//make a fake cue file to represent this iso file and rerun it as a cue
				string filebase = Path.GetFileName(infile);
				cue_content = string.Format(@"
						FILE ""{0}"" BINARY
							TRACK 01 MODE1/2048
								INDEX 01 00:00:00",
					filebase);
				infile = Path.ChangeExtension(infile, ".cue");
				goto RERUN;
			}
			if (ext == ".cue")
			{
				//TODO - make sure code is designed so no matter what happens, a disc is disposed in case of errors.
				//perhaps the CUE_Format2 (once renamed to something like Context) can handle that
				var cuePath = IN_FromPath;
				var cueContext = new CUE_Context();
				cueContext.DiscMountPolicy = IN_DiscMountPolicy;

				cueContext.Resolver = cfr;
				if (!cfr.IsHardcodedResolve) cfr.SetBaseDirectory(Path.GetDirectoryName(infile));

				//parse the cue file
				var parseJob = new ParseCueJob();
				if (cue_content == null)
					cue_content = File.ReadAllText(cuePath);
				parseJob.IN_CueString = cue_content;
				parseJob.Run(parseJob);
				//TODO - need better handling of log output
				if (!string.IsNullOrEmpty(parseJob.OUT_Log)) Console.WriteLine(parseJob.OUT_Log);
				ConcatenateJobLog(parseJob);

				//compile the cue file:
				//includes this work: resolve required bin files and find out what it's gonna take to load the cue
				var compileJob = new CompileCueJob();
				compileJob.IN_CueContext = cueContext;
				compileJob.IN_CueFile = parseJob.OUT_CueFile;
				compileJob.Run();
				//TODO - need better handling of log output
				if (!string.IsNullOrEmpty(compileJob.OUT_Log)) Console.WriteLine(compileJob.OUT_Log);
				ConcatenateJobLog(compileJob);
				if (compileJob.OUT_ErrorLevel)
					goto DONE;

				//check slow loading threshold
				if (compileJob.OUT_LoadTime >= IN_SlowLoadAbortThreshold)
				{
					Warn("Loading terminated due to slow load threshold");
					OUT_SlowLoadAborted = true;
					goto DONE;
				}

				//actually load it all up
				var loadJob = new LoadCueJob();
				loadJob.IN_CompileJob = compileJob;
				loadJob.Run();
				//TODO - need better handling of log output
				if (!string.IsNullOrEmpty(loadJob.OUT_Log)) Console.WriteLine(loadJob.OUT_Log);
				ConcatenateJobLog(loadJob);

				OUT_Disc = loadJob.OUT_Disc;
				//OUT_Disc.DiscMountPolicy = IN_DiscMountPolicy; //NOT SURE WE NEED THIS (only makes sense for cue probably)
			}
			else if (ext == ".ccd")
			{
				CCD_Format ccdLoader = new CCD_Format();
				OUT_Disc = ccdLoader.LoadCCDToDisc(IN_FromPath, IN_DiscMountPolicy);
			}


		DONE:

			//setup the lowest level synth provider
			if (OUT_Disc != null)
			{
				var sssp = new ArraySectorSynthProvider()
				{
					Sectors = OUT_Disc._Sectors,
					FirstLBA = -150
				};
				OUT_Disc.SynthProvider = sssp;
			}
		}