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