15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_ENVIRONMENT_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_ENVIRONMENT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string16.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace env_vars { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const char kHome[]; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace env_vars 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT Environment { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Environment(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Static factory method that returns the implementation that provide the 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate platform-specific instance. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Environment* Create(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets an environment variable's value and stores it in |result|. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if the key is unset. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetVar(const char* variable_name, std::string* result) = 0; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Syntactic sugar for GetVar(variable_name, NULL); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasVar(const char* variable_name); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true on success, otherwise returns false. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetVar(const char* variable_name, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& new_value) = 0; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true on success, otherwise returns false. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool UnSetVar(const char* variable_name) = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef string16 NativeEnvironmentString; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef std::map<NativeEnvironmentString, NativeEnvironmentString> 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EnvironmentMap; 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns a modified environment vector constructed from the given environment 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// and the list of changes given in |changes|. Each key in the environment is 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// matched against the first element of the pairs. In the event of a match, the 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// value is replaced by the second of the pair, unless the second is empty, in 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// which case the key-value is removed. 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This Windows version takes and returns a Windows-style environment block 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// which is a concatenated list of null-terminated 16-bit strings. The end is 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// marked by a double-null terminator. The size of the returned string will 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// include the terminators. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)BASE_EXPORT string16 AlterEnvironment(const wchar_t* env, 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const EnvironmentMap& changes); 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#elif defined(OS_POSIX) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef std::string NativeEnvironmentString; 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef std::map<NativeEnvironmentString, NativeEnvironmentString> 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EnvironmentMap; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// See general comments for the Windows version above. 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This Posix version takes and returns a Posix-style environment block, which 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// is a null-terminated list of pointers to null-terminated strings. The 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// returned array will have appended to it the storage for the array itself so 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// there is only one pointer to manage, but this means that you can't copy the 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// array without keeping the original around. 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)BASE_EXPORT scoped_ptr<char*[]> AlterEnvironment( 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const char* const* env, 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const EnvironmentMap& changes); 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_ENVIRONMENT_H_ 91