mirror of
https://github.com/themitosan/fpPS4-Temmie-s-Launcher.git
synced 2025-04-02 10:31:50 -04:00
278 lines
No EOL
6.5 KiB
JavaScript
278 lines
No EOL
6.5 KiB
JavaScript
/*
|
|
***********************************************************************************
|
|
|
|
fpPS4 Temmie's launcher
|
|
exec.js
|
|
|
|
This file contains all functions related to spawning processes or running
|
|
external software
|
|
|
|
Many thanks to red_prig for sharing Microsoft NTSTATUS Values database
|
|
|
|
***********************************************************************************
|
|
*/
|
|
|
|
temp_EXEC = {
|
|
|
|
/*
|
|
Exec variables
|
|
*/
|
|
|
|
// Microsoft NTSTATUS Values database
|
|
exitCodeList: temp_NTSTATUS,
|
|
|
|
// Executable output
|
|
outputData: '',
|
|
|
|
// Exit code
|
|
lastExitCode: 0,
|
|
|
|
// Exit code data
|
|
exitStatus: {id: '', desc: ''},
|
|
|
|
/*
|
|
Exec functions
|
|
*/
|
|
|
|
// Kill process
|
|
killProcess: function(processName){
|
|
|
|
if (processName !== void 0 && processName !== ''){
|
|
|
|
// Check if fpPS4 process is active
|
|
var processExeName = APP.path.parse(processName).base,
|
|
getEmuProcessData = APP.getProcessInfo(processExeName);
|
|
|
|
// If found fpPS4 process, try killing it
|
|
if (getEmuProcessData !== void 0){
|
|
|
|
try {
|
|
process.kill(getEmuProcessData.th32ProcessID);
|
|
} catch (err) {
|
|
throw new Error('ERROR - (emumanager) Unable to close ' + processExeName + ' process!\n' + err);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Process executable output data
|
|
processStdOutput: function(args){
|
|
|
|
// Variables
|
|
var data = args.data,
|
|
mode = args.mode,
|
|
brFix = args.brFix,
|
|
printLog = args.printLog,
|
|
pData = data.toString().split('\n');
|
|
|
|
// Check if can print log
|
|
if (printLog === !0){
|
|
|
|
// Fix lines
|
|
if (brFix === !0){
|
|
pData.forEach(function(line){
|
|
|
|
// Check each line
|
|
if (line !== '' && line !== '\n' && '\r' && line.replace(RegExp(' ', 'gi'), '') !== ''){
|
|
|
|
// Log line
|
|
console[mode](line);
|
|
|
|
// If fpPS4 is running, check each line
|
|
if (APP.emumanager.emuRunning === !0){
|
|
APP.exec.processEmuOutput(line);
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
} else {
|
|
console[mode](data);
|
|
}
|
|
|
|
}
|
|
|
|
// End
|
|
return data;
|
|
|
|
},
|
|
|
|
// Process fpPS4 output
|
|
processEmuOutput: function(str){
|
|
|
|
// Check if current line is a nop function
|
|
if (str.slice(0, 8) === 'nop nid:'){
|
|
|
|
// Update emu options fade color
|
|
TMS.css('APP_EMU_OPTIONS_FADE', {'background-color': '#400b'});
|
|
|
|
// Push error to list
|
|
APP.emumanager.emuErrorList.push(str.replace('\r', ''));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
/*
|
|
Run external process
|
|
|
|
data: [Object]
|
|
exe: String - Path (or name of executable)
|
|
args: Array - List of arguments to include to main exec
|
|
isEmu: Boolean - Declare if is fpPS4 running a game
|
|
printLog: Boolean - Print log on console if window mode is disabled
|
|
useLogWindow: Boolean - If true, output data from process will be rendered on a external window
|
|
callback: Function - Function to be executed after process is closed
|
|
*/
|
|
run: function(data){
|
|
|
|
// Check if executable is present
|
|
if (data.exe !== void 0 && data.exe !== ''){
|
|
|
|
// Check for missing data
|
|
if (data['isEmu'] === void 0){
|
|
data['isEmu'] = !1;
|
|
}
|
|
if (data['args'] === void 0){
|
|
data['args'] = [];
|
|
}
|
|
if (data['useLogWindow'] === void 0){
|
|
data['useLogWindow'] = !0;
|
|
}
|
|
if (data['printLog'] === void 0){
|
|
data['printLog'] = !0;
|
|
}
|
|
|
|
// Reset sdt data
|
|
APP.exec.execOutputData = '';
|
|
|
|
// Change context path to current emu folder
|
|
process.chdir(APP.path.parse(data.exe).dir);
|
|
|
|
// If is fpPS4
|
|
if (data.isEmu === !0){
|
|
data['exe'] = APP.path.parse(APP.settings.data.fpPS4_Path).base;
|
|
}
|
|
|
|
// Force running using log window if launcher is running on a non-windows os
|
|
if (APP.os.platform() !== 'win32'){
|
|
data.useLogWindow = !0;
|
|
}
|
|
|
|
// Run external window
|
|
if (data.useLogWindow === !0){
|
|
|
|
// Window state
|
|
var winMode, pressAnyKey = '';
|
|
switch (APP.settings.data.logWindowMode){
|
|
|
|
// Normal
|
|
case 'normal':
|
|
winMode = '';
|
|
break;
|
|
|
|
// Maximized
|
|
case 'max':
|
|
winMode = '/MAX ';
|
|
break;
|
|
|
|
// Minimized
|
|
case 'min':
|
|
winMode = '/MIN ';
|
|
break;
|
|
|
|
}
|
|
|
|
// Ask user to press any key
|
|
if (APP.settings.data.logPauseOnExitProcess === !0){
|
|
pressAnyKey = ' ^& pause';
|
|
}
|
|
|
|
// Transform args into string
|
|
var gPath = '\"' + data.args[data.args.indexOf('-e') + 1] + '\"',
|
|
parseArgs = data.args.toString().replace(RegExp(',', 'gi'), ' ').replace(data.args[data.args.indexOf('-e') + 1], gPath),
|
|
execLine = 'start ' + winMode + 'cmd /C ' + data.exe + ' ' + parseArgs + pressAnyKey;
|
|
|
|
// Check for non-windows OS
|
|
if (APP.os.platform() !== 'win32'){
|
|
execLine = `wine wineconsole "Z:${data.exe}" ${parseArgs}`;
|
|
}
|
|
|
|
// Exec process
|
|
APP.exec['processData'] = APP.childProcess.exec(execLine);
|
|
|
|
} else {
|
|
|
|
// Log on window console and set stream as string (utf-8)
|
|
APP.exec['processData'] = APP.childProcess.spawn(APP.tools.fixPath(data.exe), data.args, {detached: !0});
|
|
APP.exec.processData.stdout.setEncoding('utf8');
|
|
APP.exec.processData.stderr.setEncoding('utf8');
|
|
|
|
// Log on stdout and stderr
|
|
APP.exec.processData.stdout.on('data', function(stData){
|
|
APP.exec.outputData = APP.exec.outputData + APP.exec.processStdOutput({ data: stData, mode: 'info', brFix: data.isEmu, printLog: data.printLog });
|
|
});
|
|
APP.exec.processData.stderr.on('data', function(stData){
|
|
APP.exec.outputData = APP.exec.outputData + APP.exec.processStdOutput({ data: stData, mode: 'error', brFix: data.isEmu, printLog: data.printLog });
|
|
});
|
|
|
|
}
|
|
|
|
// Log on close
|
|
APP.exec.processData.on('close', function(code){
|
|
|
|
// Reset chdir
|
|
process.chdir(APP.settings.nwPath);
|
|
|
|
// Log exit code
|
|
APP.log.add({data: 'INFO - (exec) ' + APP.path.parse(data.exe).name + ' was closed with exit code ' + code});
|
|
|
|
// Get exit code data
|
|
const errData = APP.exec.exitCodeList[code];
|
|
|
|
// Return error code
|
|
if (code !== 0 && errData !== void 0){
|
|
console.error('ERROR - ' + errData.id + ' (' + code + ')\n' + errData.desc);
|
|
}
|
|
|
|
// Remove module
|
|
delete APP.exec['processData'];
|
|
|
|
// Set exec exit code
|
|
APP.exec.lastExitCode = code;
|
|
|
|
// Set exit status
|
|
if (errData !== void 0){
|
|
APP.exec.exitStatus.id = errData.id;
|
|
APP.exec.exitStatus.desc = errData.desc;
|
|
}
|
|
|
|
// If was fpPS4 running a title, close emu options
|
|
if (data.isEmu === !0){
|
|
APP.emumanager.stop();
|
|
}
|
|
|
|
// Execute callback
|
|
if (data.callback !== void 0 && typeof data.callback === 'function'){
|
|
data.callback(code);
|
|
}
|
|
|
|
// Reset fpPS4 error list
|
|
APP.emumanager.emuErrorList = [];
|
|
|
|
// Return exit code
|
|
return code;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Delete
|
|
delete temp_NTSTATUS; |