39 FileName program(programName);
40 FileName isisExecutableFileName(
"$ISISROOT/bin/" + program.name());
41 bool isIsisProgram =
false;
43 if(isisExecutableFileName.fileExists()) {
45 program = isisExecutableFileName;
48 PvlGroup &dataDir = Preference::Preferences().findGroup(
"DataDirectory");
49 QString tempDir = dataDir[
"Temporary"];
51 QString command = program.expanded() +
" " + parameters +
53 QStringList split = QProcess::splitCommand(command);
54 QString app = split.takeFirst();
58 QString msg =
"Program [" + programName +
"] does not appear to be a "
60 throw IException(IException::Unknown, msg, _FILEINFO_);
67 server.listen(serverName);
69 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
70 env.insert(
"TEMPORARY", tempDir);
72 QProcess childProcess;
73 childProcess.setProcessEnvironment(env);
74 childProcess.setProcessChannelMode(QProcess::ForwardedChannels);
75 childProcess.start(app, paramList);
76 childProcess.waitForStarted();
78 bool connected =
false;
80 while(!connected && childProcess.state() != QProcess::NotRunning) {
83 connected = server.waitForNewConnection(30000);
84 childProcess.waitForFinished(100);
88 QString msg =
"Isis child process failed to communicate with parent";
89 throw IException(IException::Programmer, msg, _FILEINFO_);
92 QLocalSocket *childSocket = server.nextPendingConnection();
96 while(childSocket->state() != QLocalSocket::UnconnectedState) {
97 bool insideCode =
true;
98 bool messageDone =
false;
104 if(childSocket->waitForReadyRead(1000)) {
105 lineData = childSocket->read(childSocket->bytesAvailable());
107 for(
int i = 0; i < lineData.size(); i++) {
109 if(lineData[i] != (
char)27) {
117 if(lineData[i] != (
char)27) {
118 message += lineData[i];
138 childProcess.waitForFinished();
140 if(childProcess.exitCode() != 0) {
141 QString msg =
"Running Isis program [" + programName +
"] failed with "
142 "return status [" +
toString(childProcess.exitCode()) +
"]";
143 throw IException(errors, IException::Unknown, msg, _FILEINFO_);
162 if(code ==
"PROGRESSTEXT" && iApp) {
163 iApp->UpdateProgress(msg,
true);
165 else if(code ==
"PROGRESS" && iApp) {
166 iApp->UpdateProgress(toInt(msg),
true);
168 else if(code ==
"LOG" && iApp) {
169 stringstream msgStream;
174 if(logPvl.groups() == 1 &&
175 logPvl.keywords() == 0 &&
176 logPvl.objects() == 0) {
177 iApp->Log(logPvl.group(0));
180 else if(code ==
"GUILOG" && iApp) {
183 else if(code ==
"ERROR") {
184 stringstream msgStream;
187 msgStream >> errorPvl;
189 for(
int i = 0; i < errorPvl.groups(); i++) {
190 PvlGroup &g = errorPvl.group(i);
191 QString emsg = g[
"Message"];
192 int ecode = g[
"Code"];
193 QString efile = g[
"File"];
194 int eline = g[
"Line"];
197 IException((IException::ErrorType)ecode, emsg, efile.toLatin1().data(), eline));