Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_ENVIRONMENT_H_
      6 #define BASE_ENVIRONMENT_H_
      7 
      8 #include <map>
      9 #include <memory>
     10 #include <string>
     11 
     12 #include "base/base_export.h"
     13 #include "base/strings/string16.h"
     14 #include "base/strings/string_piece.h"
     15 #include "build/build_config.h"
     16 
     17 namespace base {
     18 
     19 namespace env_vars {
     20 
     21 #if defined(OS_POSIX)
     22 BASE_EXPORT extern const char kHome[];
     23 #endif
     24 
     25 }  // namespace env_vars
     26 
     27 class BASE_EXPORT Environment {
     28  public:
     29   virtual ~Environment();
     30 
     31   // Returns the appropriate platform-specific instance.
     32   static std::unique_ptr<Environment> Create();
     33 
     34   // Gets an environment variable's value and stores it in |result|.
     35   // Returns false if the key is unset.
     36   virtual bool GetVar(StringPiece variable_name, std::string* result) = 0;
     37 
     38   // Syntactic sugar for GetVar(variable_name, nullptr);
     39   virtual bool HasVar(StringPiece variable_name);
     40 
     41   // Returns true on success, otherwise returns false.
     42   virtual bool SetVar(StringPiece variable_name,
     43                       const std::string& new_value) = 0;
     44 
     45   // Returns true on success, otherwise returns false.
     46   virtual bool UnSetVar(StringPiece variable_name) = 0;
     47 };
     48 
     49 
     50 #if defined(OS_WIN)
     51 
     52 typedef string16 NativeEnvironmentString;
     53 typedef std::map<NativeEnvironmentString, NativeEnvironmentString>
     54     EnvironmentMap;
     55 
     56 // Returns a modified environment vector constructed from the given environment
     57 // and the list of changes given in |changes|. Each key in the environment is
     58 // matched against the first element of the pairs. In the event of a match, the
     59 // value is replaced by the second of the pair, unless the second is empty, in
     60 // which case the key-value is removed.
     61 //
     62 // This Windows version takes and returns a Windows-style environment block
     63 // which is a concatenated list of null-terminated 16-bit strings. The end is
     64 // marked by a double-null terminator. The size of the returned string will
     65 // include the terminators.
     66 BASE_EXPORT string16 AlterEnvironment(const wchar_t* env,
     67                                       const EnvironmentMap& changes);
     68 
     69 #elif defined(OS_POSIX)
     70 
     71 typedef std::string NativeEnvironmentString;
     72 typedef std::map<NativeEnvironmentString, NativeEnvironmentString>
     73     EnvironmentMap;
     74 
     75 // See general comments for the Windows version above.
     76 //
     77 // This Posix version takes and returns a Posix-style environment block, which
     78 // is a null-terminated list of pointers to null-terminated strings. The
     79 // returned array will have appended to it the storage for the array itself so
     80 // there is only one pointer to manage, but this means that you can't copy the
     81 // array without keeping the original around.
     82 BASE_EXPORT std::unique_ptr<char* []> AlterEnvironment(
     83     const char* const* env,
     84     const EnvironmentMap& changes);
     85 
     86 #endif
     87 
     88 }  // namespace base
     89 
     90 #endif  // BASE_ENVIRONMENT_H_
     91