12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/pnacl_options.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <iterator>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "native_client/src/include/nacl_string.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)nacl::string ReplaceBadFSChars(nacl::string str,
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               const nacl::string& bad_chars,
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               const nacl::string& replacement) {
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t replace_pos = str.find_first_of(bad_chars);
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (replace_pos != nacl::string::npos) {
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    str = str.replace(replace_pos, 1, replacement);
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    replace_pos = str.find_first_of(bad_chars);
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return str;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace plugin {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochPnaclOptions::PnaclOptions() : translate_(false), opt_level_(2) { }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PnaclOptions::~PnaclOptions() {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)nacl::string PnaclOptions::GetCacheKey() const {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(jvoung): We need to read the PNaCl translator's manifest
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to grab the NaCl / PNaCl ABI version too.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  nacl::stringstream ss;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cast opt_level_ as int so that it doesn't think it's a char.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ss << "-O:" << static_cast<int>(opt_level_)
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)     <<  ";cache_validators:" << cache_validators_;
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // HTML5 FileSystem-based cache does not allow some characters which
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // may appear in URLs, ETags, or Last-Modified times.  Once we move to
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // our own cache-backend, it will be more tolerant of various cache
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // key values.
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // See: http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  nacl::string key = ss.str();
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  key = ReplaceBadFSChars(key, "/", "_FWDSLASH_");
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  key = ReplaceBadFSChars(key, "\\", "_BCKSLASH_");
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  key = ReplaceBadFSChars(key, "\0", "_NULL_");
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return key;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PnaclOptions::set_opt_level(int32_t l) {
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (l <= 0) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    opt_level_ = 0;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Currently only allow 0 or 2, since that is what we test.
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  opt_level_ = 2;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::vector<char> PnaclOptions::GetOptCommandline() const {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<char> result;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  nacl::string str;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  nacl::stringstream ss;
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ss << "-O" << opt_level_;
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  str = ss.str();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::copy(str.begin(), str.end(), std::back_inserter(result));
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  result.push_back('\x00');
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace plugin
77