00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "environment.h"
00013 #include "module.h"
00014 #include "kernel.h"
00015
00016 using namespace VRUT;
00017
00018
00019 Environment::Environment()
00020 {
00021 }
00022
00023
00024 Environment::~Environment()
00025 {
00026 }
00027
00028
00029 wxString Environment::GetParam(const Parameter::ParameterIdentificator & paramId) const
00030 {
00031 PoolNameInstParamList::const_iterator poolIt = registeredParameters.find(paramId.poolName);
00032 if (poolIt != registeredParameters.end())
00033 {
00034 NameInstParamList::const_iterator paramIt = poolIt->second.find(paramId.paramName);
00035 if (paramIt != poolIt->second.end())
00036 {
00037 InstParamList::const_iterator instIt = paramIt->second.find(paramId.instName);
00038 if (instIt != paramIt->second.end())
00039 return instIt->second.value;
00040 }
00041 }
00042
00043 return wxEmptyString;
00044 }
00045
00046
00047 void Environment::GetParams(const Parameter::ParameterIdentificator & paramId, std::vector<NameValue> * values) const
00048 {
00049 if (!values)
00050 return;
00051
00052 for (PoolNameInstParamList::const_iterator poolIt = registeredParameters.begin();
00053 poolIt != registeredParameters.end(); poolIt++)
00054 {
00055 wxString poolName = poolIt->first;
00056 if (poolName.Upper().Matches(paramId.poolName.Upper()))
00057 {
00058 for (NameInstParamList::const_iterator parIt = poolIt->second.begin();
00059 parIt != poolIt->second.end(); parIt++)
00060 {
00061 wxString parName = parIt->first;
00062 if (parName.Upper().Matches(paramId.paramName.Upper()))
00063 {
00064 for (InstParamList::const_iterator instIt = parIt->second.begin();
00065 instIt != parIt->second.end(); instIt++)
00066 {
00067 wxString instName = instIt->first;
00068 if (instName.Upper().Matches(paramId.instName.Upper()))
00069 {
00070 Parameter::ParameterIdentificator pi(poolName, parName, instName);
00071 NameValue ret(pi.ToString(), CloneWxString(instIt->second.value));
00072 values->push_back(ret);
00073 }
00074 }
00075 }
00076 }
00077 }
00078 }
00079 }
00080
00081
00082 bool Environment::SetParam(const Parameter::ParameterIdentificator & paramId, const wxString & value, bool forceDefault)
00083 {
00084 bool found = false;
00085
00086 for (PoolNameInstParamList::iterator poolIt = registeredParameters.begin();
00087 poolIt != registeredParameters.end(); poolIt++)
00088 {
00089 wxString poolName = poolIt->first;
00090 if (poolName.Upper().Matches(paramId.poolName.Upper()))
00091 {
00092 for (NameInstParamList::iterator parIt = poolIt->second.begin();
00093 parIt != poolIt->second.end(); parIt++)
00094 {
00095 wxString parName = parIt->first;
00096 if (parName.Upper().Matches(paramId.paramName.Upper()))
00097 {
00098 for (InstParamList::iterator instIt = parIt->second.begin();
00099 instIt != parIt->second.end(); instIt++)
00100 {
00101 wxString instName = instIt->first;
00102 if (instName.Upper().Matches(paramId.instName.Upper()))
00103 {
00104 Parameter::ParameterIdentificator pi(poolName, parName, instName);
00105 if (forceDefault && instIt->second.defaultValue != value)
00106 instIt->second.defaultValue = CloneWxString(value);
00107
00108 {
00109 instIt->second.value = CloneWxString(value);
00110 wxCommandEvent paramEvt = Event::GET_EVT_PARAM_SET(pi, value);
00111 KERNEL->GetMessageSink()->PostEvent(paramEvt);
00112 LOGVERBOSE(wxString::Format(wxT("<Environment>%s = %s"), pi.ToString().c_str(), value.c_str()));
00113 }
00114 found = true;
00115 }
00116 }
00117 }
00118 }
00119 }
00120 }
00121
00123 if (!found && !RegisterParam(paramId, value))
00124 LOGERROR(wxString::Format(wxT("<Environment>Parameter '%s' not found and not valid to register"), paramId.ToString().c_str()));
00125
00126 return found;
00127 }
00128
00129
00130 bool Environment::RegisterParam(const Parameter::ParameterIdentificator & paramId, const wxString & value)
00131 {
00132 if (paramId.IsValid())
00133 {
00135 wxString instNameExact = wxT("predef");
00136 if ((paramId.instName.Find('*') == wxNOT_FOUND)
00137 && (paramId.instName.Find('?') == wxNOT_FOUND)
00138 && !paramId.instName.IsEmpty())
00139 instNameExact = CloneWxString(paramId.instName);
00140
00141 Parameter parameter(value, value);
00142 InstParamList ipl;
00143 ipl.insert(InstParamList::value_type(instNameExact, parameter));
00144
00145 PoolNameInstParamList::iterator poolIt = registeredParameters.find(paramId.poolName);
00146 if (poolIt == registeredParameters.end())
00147 {
00148 NameInstParamList nipl;
00149 nipl.insert(NameInstParamList::value_type(CloneWxString(paramId.paramName), ipl));
00150 registeredParameters.insert(PoolNameInstParamList::value_type(CloneWxString(paramId.poolName), nipl));
00151 }
00152 else
00153 {
00154 NameInstParamList::iterator paramIt = poolIt->second.find(paramId.paramName);
00155 if (paramIt == poolIt->second.end())
00156 poolIt->second.insert(NameInstParamList::value_type(CloneWxString(paramId.paramName), ipl));
00157 else
00158 {
00159 InstParamList::iterator instIt = paramIt->second.find(instNameExact);
00160 if (instIt == paramIt->second.end())
00161 paramIt->second.insert(InstParamList::value_type(instNameExact, parameter));
00162 else
00163 {
00167 return false;
00168 }
00169 }
00170 }
00171 Parameter::ParameterIdentificator pi(paramId.poolName, paramId.paramName, instNameExact);
00172 LOGVERBOSE(wxString::Format(wxT("<Environment>Registered %s = %s"), pi.ToString().c_str(), value.c_str()));
00173 return true;
00174 }
00175 return false;
00176 }
00177
00178
00179 bool Environment::UnregisterParam(const Parameter::ParameterIdentificator & paramId)
00180 {
00181 bool found = false;
00182
00183 PoolNameInstParamList::iterator poolIt = registeredParameters.find(paramId.poolName);
00184 if (poolIt != registeredParameters.end())
00185 {
00186 std::vector<NameInstParamList::iterator> forDeletion;
00187 for (NameInstParamList::iterator parIt = poolIt->second.begin();
00188 parIt != poolIt->second.end(); parIt++)
00189 {
00190 wxString parName = parIt->first;
00191 if (parName.Matches(paramId.paramName))
00192 {
00193 std::vector<InstParamList::iterator> forDeletionInst;
00194 for (InstParamList::iterator instIt = parIt->second.begin();
00195 instIt != parIt->second.end(); instIt++)
00196 {
00197 wxString instName = instIt->first;
00198 if (instName.Matches(paramId.instName)
00199 && !instName.IsSameAs(wxT("predef")))
00200 {
00201 forDeletionInst.push_back(instIt);
00202 Parameter::ParameterIdentificator pi(poolIt->first, parName, instName);
00203 found = true;
00204 LOGVERBOSE(wxString::Format(wxT("<Environment>Unregistered parameter %s"), pi.ToString().c_str()));
00205 }
00206 }
00207 for (std::vector<InstParamList::iterator>::const_iterator delIt = forDeletionInst.begin();
00208 delIt != forDeletionInst.end(); delIt++)
00209 parIt->second.erase(*delIt);
00210 if (parIt->second.empty())
00211 forDeletion.push_back(parIt);
00212 }
00213 }
00214 for (std::vector<NameInstParamList::iterator>::const_iterator delIt = forDeletion.begin();
00215 delIt != forDeletion.end(); delIt++)
00216 poolIt->second.erase(*delIt);
00217 if (poolIt->second.empty())
00218 registeredParameters.erase(poolIt);
00219 }
00220
00221 return found;
00222 }
00223
00224
00225 void Environment::ApplyPendingParams(Module * module, const wxString altName)
00226 {
00227 bool found = false;
00228 const wxString poolName = module->GetName();
00229 LOGVERBOSE(wxT("<Environment>Applying default parameter values to ") + poolName);
00230 PoolNameInstParamList::const_iterator poolIt = registeredParameters.find(poolName);
00231 if (poolIt == registeredParameters.end() && !altName.IsEmpty())
00232 poolIt = registeredParameters.find(altName);
00233 if (poolIt != registeredParameters.end())
00234 {
00235 for (NameInstParamList::const_iterator parIt = poolIt->second.begin();
00236 parIt != poolIt->second.end(); parIt++)
00237 {
00239 wxString instName = wxString::Format(wxT("%i"), module->GetID().GetInstanceID());
00240 Parameter::ParameterIdentificator pi(poolIt->first, parIt->first, instName);
00241 InstParamList::const_iterator instIt = parIt->second.find(instName);
00242 if (instIt == parIt->second.end())
00243 {
00245 instIt = parIt->second.find(wxT("predef"));
00246 if (instIt == parIt->second.end())
00247 continue;
00248 RegisterParam(pi, instIt->second.value);
00249 }
00250 found = true;
00251 wxCommandEvent paramEvt = Event::GET_EVT_PARAM_SET(pi, instIt->second.value);
00253 module->PostEvent(paramEvt, true);
00255 wxCommandEvent paramEvt2 = Event::GET_EVT_PARAM_SET(pi, instIt->second.value);
00256 KERNEL->GetMessageSink()->PostEvent(paramEvt2);
00257 LOGVERBOSE(wxString::Format(wxT("%s = %s"), pi.ToString().c_str(), instIt->second.value.c_str()));
00258 }
00259 }
00260
00261 if (!found)
00262 LOGVERBOSE(wxT("<Environment>No default parameter values pending for ") + module->GetName());
00263 }