1 Reply Latest reply on Jan 5, 2011 5:25 PM by jordana309-36

    Calling another program in a nativeProcess

    jordana309-36 Level 1

      I'm writing an encoding program in AIR. Previously, another program was required (Directory Monitor) to watch a folder to be modified by AIR, and then Directory Monitor would start the encoding process. This process involves a batch file (.bat) calling a PERL script, which creates another .bat. The first batch file (the root bat) then calls that newly created .bat, which does some things using other progroms, and calls the .bat file necissary for the encoding of that particular codex (quicktime, directX, etc). After, that third batch file actually encodes the file by calling several different exe files (about 7 of them). Problem is, AIR won't allow the .bat that starts through AIR to call the PERL-created .bat. I have no idea why. I currently catch all output and display it in a <p> tag that I've made to look like a terminal window. I can't figure out how to call the next bat. Ideas? Here's my code (create two .bat files, and have the one you pass through in AIR call the second one. You'll see that AIR won't let that happen).

       

      [CODE]

       

          /* Testing the new NativeProcess */
          function makeItGo()
          {
              // Check if native process is even supported
              if(air.NativeProcess.isSupported)
              {
                  /* We first create a file object and attach it to our executable file. We pass that into a startupInfo object, which will be used to initialize the program. We will include in that our arguments to pass into the native application when it is started. "Native application" means that it's a Windows app, not AIR. We also, need to create a process handle, attach listeners (so we can pass in information and get the output into AIR to play with). Finally, we start the application. */
                  var file = new air.File();
                  //file = file.resolvePath("C:\\Documents and Settings\\me\\Desktop\\my\\apps\\directories\\TestScript.bat"); // Doesn't work. Cannot start a .bat.
                  file = file.resolvePath("C:\\WINDOWS\\system32\\cmd.exe");
                  var nativeProcessStartupInfo = new air.NativeProcessStartupInfo();
                  nativeProcessStartupInfo.executable = file;
                  encodeProcess = new air.NativeProcess();
                  // Attach listeners to catch all outgoing data (through STDOUT), and to allow us to give additional input, if desired.
                  encodeProcess.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, outputHandler); // Listener on STDOUT
                  encodeProcess.addEventListener(air.ProgressEvent.STANDARD_INPUT_PROGRESS, inputHandler); // Triggered by NativeProcess object when STDIN stream is flushed.
                  encodeProcess.addEventListener(air.NativeProcessExitEvent, processExited); // Triggered when the application exits. We need to remove all handles and listeners.
                  // Start the application.
                  encodeProcess.start(nativeProcessStartupInfo);
                  // Create string to pass through as a command to our first batch file, and pass it through.
                  var command = "\"" + applicationRoot + "\\moviesInNeedOfEncoding\\encodeWatchFolders.bat\"\n";
                  encodeProcess.standardInput.writeUTFBytes(command);
              }
              else
              {
                  alert("NativeProcess is not supported!");
              }
          } // End makeItGo()
         
          /* When the application outputs something on STDOUT, we catch that event (the data) in the function below */
          function outputHandler()
          {
              var consoleBox = document.getElementById("consoleOutput");
              var data = encodeProcess.standardOutput.readUTFBytes(encodeProcess.standardOutput.bytesAvailable);
              consoleBox.innerText += data;
          }

       

          /* Whenever input is sent to the console, this function makes sure the new output is shown in the console. Not sure it's needed, but it works with it in. */
          function inputHandler(event)
          {
              outputHandler();
          }
         
          /* This takes commands that we type in, and passes it along. */
          function sendToConsole()
          {
              var inputBox = document.getElementById("consoleInput");
              encodeProcess.standardInput.writeUTFBytes(inputBox.value);
              inputBox.value = "";
              return false;
          }
         
          /* Removes all listeners, closes the process, and removes the AIR handle on the process, allowing it to close. */
          function processExited()
          {
              encodeProcess.removeEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA);
              encodeProcess.removeEventListener(air.ProgressEvent.STANDARD_INPUT_PROGRESS);
              encodeProcess.removeEventListener(air.NativeProcessExitEvent);
              encodeProcess.closeInput();
              encodeProcess.exit(false); // False means don't force the exit.
          }

       

      [/CODE]