google-chromegoogle-chrome-devtoolsgoogle-nativeclientppapi

Extracting the outputs/results from an executed .pexe file


My goal is to convert a C++ program in to a .pexe file in order to execute it later on a remote computer. The .pexe file will contain some mathematical formulas or functions to be calculated on a remote computer, so I’ll be basically using the computational power of the remote computer. For all this I’ll be using the nacl_sdk with the Pepper library and I will be grateful if someone could clarify some things for me:

  1. Is it possible to save the outputs of the executed .pexe file on the remote computer in to a file, if it’s possible then how? Which file formats are supported?
  2. Is it possible to send the outputs of the executed .pexe file on the remote computer automatically to the host computer, if it’s possible then how?
  3. Do I have to install anything for that to work on the remote computer?

Any suggestion will be appreciated.


Solution

  • From what I've tried it seems like you can't capture the stuff that your pexe writes to stdout - it just goes to the stdout of the browser (it took me hours to realize that it does go somewhere - I followed a bad tutorial that had me believe the pexes stdout was going to be posted to the javascript side and was wondering why it "did nothing").

    I currently work on porting my stuff to .pexe also, and it turned out to be quite simple, but that has to do with the way I write my programs:

    I write my (C++) programs such that all code-parts read inputs only from an std::istream object and write their outputs to some std::ostream object. Then I just pass std::cin and std::cout to the top-level call and can use the program interactively in the shell. But then I can easily swap out the top-level call to use an std::ifstream and std::ofstream to use the program for batch-processing (without pipes from cat and redirecting to files, which can be troublesome under some circumstances).

    Since I write my programs like that, I can just implement the message handler like

    class foo : public pp::Instance {
       ... ctor, dtor,...
       virtual void HandleMessage(const pp::Var& msg) override {
           std::stringstream i, o;
           i << msg.AsString();
           toplevelCall(i,o);
           PostMessage(o.str());
       }
    };
    

    so the data I get from the browser is put into a stringstream, which the rest of the code can use for inputs. It gets another stringstream where the rest of the code can write its outputs to. And then I just send that output back to the browser. (Downside is you have to wait for the program to finish before you get to see the result - you could derive a class from ostream and have the << operator post to the browser directly... nacl should come with a class that does that - I don't know if it actually does...)

    On the html/js side, you can then have a textarea and a pre (which I like to call stdin and stdout ;-) ) and a button which posts the content of the textarea to the pexe - And have an eventhandler that writes the messages from the pexe to the pre like this

    <embed id='pnacl' type='application/x-pnacl' src='manifest.nmf' width='0' height='0'/>
    <textarea id="stdin">Type your input here...</textarea>
    <pre id='stdout' width='80' height='25'></pre>
    
    <script>
      var pnacl = document.getElementById('pnacl');
      var stdout = document.getElementById('stdout');
      var stdin = document.getElementById('stdin');
      pnacl.addEventListener('message', function(ev){stdout.textContent += ev.data;});
    </script>
    <button onclick="pnacl.postMessage(stdin.value);">Submit</button>
    

    Congratulations! Your program now runs in the browser!

    I am not through with porting my compilers, but it seems like this would even work for stuff that uses flex & bison (you only have to copy FlexLexer.h to the include directory of the pnacl sdk and ignore the warnings about the "register" storage location specifier :-)