00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "blocxx/BLOCXX_config.h"
00036 #include "blocxx/EnvVars.hpp"
00037
00038 #include <algorithm>
00039 #include <cstring>
00040
00041 #if defined(OW_DARWIN)
00042
00043
00044
00045
00046 #include <crt_externs.h>
00047 #define environ (*_NSGetEnviron())
00048
00049
00050
00051
00052
00053
00054 #else
00055
00056
00057
00058
00059
00060 extern char** environ;
00061 #endif
00062
00063 namespace BLOCXX_NAMESPACE
00064 {
00065
00066 namespace
00067 {
00068
00069 void getKeyValue(
00070 const char *const strArg,
00071 String& key,
00072 String& value)
00073 {
00074 key.erase();
00075 value.erase();
00076
00077 const char* p = ::strchr(strArg, '=');
00078 if(p)
00079 {
00080 key = String(strArg, size_t(p-strArg));
00081 value = p+1;
00082 }
00083 }
00084
00085 inline bool isValidKey(const String &key)
00086 {
00087
00088
00089
00090
00091
00092 return key.length() && key.indexOf('=') == String::npos;
00093 }
00094
00095 }
00096
00098 EnvVars::EnvVars(EEnvVarFlag flag)
00099 : m_envMap()
00100 , m_envp(0)
00101 {
00102 if(flag == E_CURRENT_ENVIRONMENT)
00103 {
00104 fillEnvMap(environ, m_envMap);
00105 }
00106 }
00107
00109 EnvVars::EnvVars(const char* const envp[])
00110 : m_envMap()
00111 , m_envp(0)
00112 {
00113 fillEnvMap(envp, m_envMap);
00114 }
00115
00117 EnvVars::~EnvVars()
00118 {
00119 deleteEnvp();
00120 }
00121
00123
00124 void
00125 EnvVars::fillEnvMap(EnvMap& envMap)
00126 {
00127 fillEnvMap(environ, envMap);
00128 }
00129
00131
00132 void
00133 EnvVars::fillEnvMap(const char* const envp[], EnvMap& envMap)
00134 {
00135 envMap.clear();
00136 String key, value;
00137 for(size_t i = 0; envp[i]; i++)
00138 {
00139 getKeyValue(envp[i], key, value);
00140 if(isValidKey(key))
00141 {
00142 envMap[key] = value;
00143 }
00144 }
00145 }
00146
00148 void
00149 EnvVars::deleteEnvp() const
00150 {
00151 if(m_envp)
00152 {
00153 int i;
00154
00155
00156 for(i = 0; m_envp[i]; i++)
00157 {
00158
00159
00160
00161 delete [] m_envp[i];
00162 }
00163
00164 delete [] m_envp;
00165 m_envp = 0;
00166 }
00167 }
00168
00170 String
00171 EnvVars::getValue(const String& key,
00172 const String& notFoundRetVal) const
00173 {
00174 EnvMap::const_iterator it = m_envMap.find(key);
00175 return (it != m_envMap.end()) ? it->second : notFoundRetVal;
00176 }
00177
00179 const char* const*
00180 EnvVars::getenvp() const
00181 {
00182 if(!m_envp)
00183 {
00184 int i;
00185 m_envp = new char* [m_envMap.size()+1];
00186 std::fill(m_envp, m_envp+m_envMap.size()+1, (char*)0);
00187 try
00188 {
00189 EnvMap::const_iterator it = m_envMap.begin();
00190 for(i = 0; it != m_envMap.end(); i++, it++)
00191 {
00192 size_t klen = it->first.length();
00193 size_t vlen = it->second.length();
00194
00195 m_envp[i] = new char[klen + vlen + 2];
00196 ::strcpy(m_envp[i], it->first.c_str());
00197 m_envp[i][klen] = '=';
00198 ::strcpy(m_envp[i]+klen+1, it->second.c_str());
00199 }
00200 }
00201 catch(...)
00202 {
00203 deleteEnvp();
00204 throw;
00205 }
00206 }
00207
00208 return m_envp;
00209 }
00210
00212 bool
00213 EnvVars::removeVar(const String& varName)
00214 {
00215 bool cc = false;
00216 EnvMap::iterator it = m_envMap.find(varName);
00217 if (it != m_envMap.end())
00218 {
00219 cc = true;
00220 deleteEnvp();
00221 m_envMap.erase(it);
00222 }
00223
00224 return cc;
00225 }
00226
00228 bool
00229 EnvVars::addVar(const String& name, const String& value)
00230 {
00231 bool cc = false;
00232 if(isValidKey(name) && m_envMap.find(name) == m_envMap.end())
00233 {
00234 cc = true;
00235 deleteEnvp();
00236 m_envMap[name] = value;
00237 }
00238 return cc;
00239 }
00240
00242 bool
00243 EnvVars::setVar(const String& key, const String& value)
00244 {
00245 bool cc = false;
00246 if( isValidKey(key))
00247 {
00248 cc = true;
00249 deleteEnvp();
00250 m_envMap[key] = value;
00251 }
00252 return cc;
00253 }
00254
00256 bool
00257 EnvVars::setVar(const String& keyValue)
00258 {
00259 String key, value;
00260 getKeyValue(keyValue.c_str(), key, value);
00261 return setVar(key, value);
00262 }
00263
00265 bool
00266 EnvVars::updateVar(const String& name, const String& value)
00267 {
00268 bool cc = false;
00269 EnvMap::iterator it = m_envMap.find(name);
00270 if (it != m_envMap.end())
00271 {
00272 cc = true;
00273 deleteEnvp();
00274 it->second = value;
00275 }
00276
00277 return cc;
00278 }
00279
00280 }