Mercurial > flash_v2
diff host/libcdl/interface.cxx @ 103:95f3e12a6327 ecos-sw-2000-06-23
Merge from eCos master repository on 2000-06-23-16:41:10-BST
| author | jlarmour |
|---|---|
| date | Fri, 23 Jun 2000 17:06:31 +0000 |
| parents | 6736c52df507 |
| children | 6ed91473a1cd |
line wrap: on
line diff
--- a/host/libcdl/interface.cxx +++ b/host/libcdl/interface.cxx @@ -231,12 +231,17 @@ CdlInterfaceBody::parse_interface(CdlInt new_interface->CdlBuildableBody::check_properties(interp); new_interface->CdlDefinableBody::check_properties(interp); - // A few properties do not make sense for interfaces. - // Start with the value-related ones. Interfaces always - // have the flavor Data. + // The flavor "none" makes no sense for interfaces. + // The flavor "bool" makes very little sense, but may be useful + // in weird cases. Both booldata and data make sense. + // The default flavor is "data", because interfaces are + // essentially just counters. if (new_interface->has_property(CdlPropertyId_Flavor)) { - CdlParse::report_error(interp, "", "An interface should not have a `flavor' property."); + if (CdlValueFlavor_None == new_interface->get_flavor()) { + CdlParse::report_error(interp, "", "An interface should not have the `none' flavor."); + } } + // Interfaces cannot be modified directly by the user, so // there is no point in entry_proc, check_proc, dialog or // wizard @@ -342,17 +347,22 @@ CdlInterfaceBody::save(CdlInterpreter in if (!minimal) { const std::vector<CdlReferrer>& referrers = this->get_referrers(); std::vector<CdlReferrer>::const_iterator ref_i; + int real_referrers = 0; for (ref_i = referrers.begin(); ref_i != referrers.end(); ref_i++) { CdlNode node = ref_i->get_source(); CdlProperty prop = ref_i->get_source_property(); CdlValuable valuable = dynamic_cast<CdlValuable>(node); if ((0 != valuable) && (CdlPropertyId_Implements == prop->get_property_name())) { + real_referrers++; data += std::string(indentation, ' ') + " # Implemented by " + valuable->get_name() + ", " + (valuable->is_active() ? "active" : "inactive") + ", " + (valuable->is_enabled() ? "enabled" : "disabled") + '\n'; } } + if (0 == real_referrers) { + data += std::string(indentation, ' ') + " # No options implement this inferface\n"; + } } interp->write_data(chan, data); @@ -469,10 +479,43 @@ CdlInterfaceBody::recalculate(CdlTransac } } } - if (count != old_value.get_integer_value()) { - CdlValue new_value = old_value; - new_value.set_integer_value(count, CdlValueSource_Default); - transaction->set_whole_value(this, old_value, new_value); + + // What to do with the count depends on the flavor. + switch(this->get_flavor()) { + case CdlValueFlavor_Bool : + { + bool new_bool = (count > 0); + if (new_bool != old_value.is_enabled()) { + CdlValue new_value = old_value; + new_value.set_enabled(new_bool, CdlValueSource_Default); + transaction->set_whole_value(this, old_value, new_value); + } + break; + } + case CdlValueFlavor_BoolData: + { + // The only thing that actually needs checking is the count value. + // Iff that has changed then the boolean part may need changing as well. + if (count != old_value.get_integer_value()) { + CdlValue new_value = old_value; + new_value.set_enabled_and_value(count > 0, count, CdlValueSource_Default); + transaction->set_whole_value(this, old_value, new_value); + } + + break; + } + case CdlValueFlavor_Data: + { + if (count != old_value.get_integer_value()) { + CdlValue new_value = old_value; + new_value.set_integer_value(count, CdlValueSource_Default); + transaction->set_whole_value(this, old_value, new_value); + } + break; + } + + default: + break; } CYG_REPORT_RETURN();
