void VariableRegistry::updateFromCodecDatum(const Datum &codec) { mprintf(M_SYSTEM_MESSAGE_DOMAIN, "Received new codec, updating variable registry."); if(!codec.isDictionary()) { merror(M_SYSTEM_MESSAGE_DOMAIN, "Invalid codec received. Registry is unchanged."); return; } boost::mutex::scoped_lock s_lock(lock); master_variable_list.clear(); // add the placeholders //addPlaceholders(); ////////////////////////////////////////////////////////////////// // now add what's in the codec ScarabDatum *datum = codec.getScarabDatum(); ScarabDatum ** keys = datum->data.dict->keys; int size = datum->data.dict->tablesize; int maxCodecCode = -1; // find the maximum codec value for(int i = 0; i < size; ++i) { if(keys[i]) { long long code = keys[i]->data.integer; maxCodecCode = (maxCodecCode < code) ? code : maxCodecCode; } } // add each variable in order to the registry for(int i = N_RESERVED_CODEC_CODES; i<=maxCodecCode; ++i) { ScarabDatum *key = scarab_new_integer(i); ScarabDatum *serializedVariable = scarab_dict_get(datum, key); scarab_free_datum(key); if(!serializedVariable) { shared_ptr<EmptyVariable> empty_var(new EmptyVariable); master_variable_list.push_back(empty_var); continue; } else { if(serializedVariable->type != SCARAB_DICT) { // these must be placeholder datums in the package // that we should ignore. mwarning(M_SYSTEM_MESSAGE_DOMAIN, "Bad variable received from network stream"); shared_ptr<EmptyVariable> empty_var(new EmptyVariable); master_variable_list.push_back(empty_var); continue; } VariableProperties *props = new VariableProperties(serializedVariable); if(props == NULL){ mwarning(M_SYSTEM_MESSAGE_DOMAIN, "Bad variable received from network stream"); shared_ptr<EmptyVariable> empty_var(new EmptyVariable); master_variable_list.push_back(empty_var); continue; } shared_ptr<Variable> newvar(new GlobalVariable(props)); newvar->setCodecCode(i); //necessary? .. Yup master_variable_list.push_back(newvar); std::string tag = newvar->getVariableName(); if(!tag.empty()){ master_variable_dictionary[tag] = newvar; } } } }
void delete_var(t_var **root) { empty_var(*root); free(*root); *root = NULL; }