static void gen_tf (const struct parse_tf *tf, FILE *out, FILE *f_strs, const array_t *arrs, int narrs) { char *buf_deps, *buf_ports; size_t sz_deps, sz_ports; FILE *f_ports = open_memstream (&buf_ports, &sz_ports); FILE *f_deps = open_memstream (&buf_deps, &sz_deps); int start = ftell (out); struct tf hdr = {ftell (f_strs) + VALID_OFS, tf->nrules}; if (tf->prefix) fwrite (tf->prefix, 1, strlen (tf->prefix) + 1, f_strs); else hdr.prefix = 0; fwrite (&hdr, sizeof hdr, 1, out); /* TODO: Alignment? */ struct rule rules[hdr.nrules]; memset (rules, 0, sizeof rules); int i = 0; for (struct parse_rule *r = tf->rules.head; r; r = r->next, i++) { struct rule *tmp = &rules[i]; tmp->idx = r->idx; tmp->in = gen_ports (ARR (r->in), r->in.n, f_ports); tmp->out = gen_ports (ARR (r->out), r->out.n, f_ports); tmp->match = arr_find (r->match, arrs, narrs); tmp->mask = arr_find (r->mask, arrs, narrs); tmp->rewrite = arr_find (r->rewrite, arrs, narrs); if (r->deps.head) tmp->deps = gen_deps (&r->deps, f_deps, f_ports, arrs, narrs); //tmp->desc = barfoo; } fclose (f_ports); fclose (f_deps); qsort (rules, hdr.nrules, sizeof *rules, rule_cmp); fwrite (rules, hdr.nrules, sizeof *rules, out); hdr.map_ofs = ftell (out) - start; gen_map (out, &tf->in_map, rules, ARR_LEN (rules)); hdr.ports_ofs = ftell (out) - start; fwrite (buf_ports, 1, sz_ports, out); free (buf_ports); hdr.deps_ofs = ftell (out) - start; fwrite (buf_deps, 1, sz_deps, out); free (buf_deps); int end = ftell (out); fseek (out, start, SEEK_SET); fwrite (&hdr, sizeof hdr, 1, out); fseek (out, end, SEEK_SET); }
static uint32_t gen_deps (struct list_parse_dep *deps, FILE *f_deps, FILE *f_ports, const array_t *arrs, int narrs) { uint32_t n = deps->n; uint32_t ret = VALID_OFS + ftell (f_deps); fwrite (&n, sizeof n, 1, f_deps); for (struct parse_dep *dep = deps->head; dep; dep = dep->next) { struct dep tmp = {dep->rule}; tmp.match = arr_find (dep->match, arrs, narrs); tmp.port = gen_ports (dep->ports, dep->nports, f_ports); fwrite (&tmp, sizeof tmp, 1, f_deps); } return ret; }
void GeneratorCCD::gen_ports(IR__::ComponentDef_ptr component) { // handle base component IR__::ComponentDef_var base = component->base_component(); if(!CORBA::is_nil(base)) { gen_ports(base); } // receptacles IR__::ContainedSeq_var contained_seq = component->contents(CORBA__::dk_Uses, false); CORBA::ULong len = contained_seq->length(); CORBA::ULong i; for( i= 0; i < len; i++) { IR__::UsesDef_var a_uses = IR__::UsesDef::_narrow(((*contained_seq)[i])); out << "<uses usesname=\""; out << a_uses -> name(); out << "\" repid=\"" ; out << IR__::InterfaceDef::_narrow(a_uses -> interface_type()) -> id(); out << "\"/>\n"; } // facets contained_seq = component->contents(CORBA__::dk_Provides, false); len = contained_seq->length(); for( i= 0; i < len; i++) { IR__::ProvidesDef_var a_provides = IR__::ProvidesDef::_narrow(((*contained_seq)[i])); out << "<provides providesname=\""; out << a_provides -> name(); out << "\" repid=\"" ; out << IR__::InterfaceDef::_narrow(a_provides -> interface_type()) -> id() << "\"" ; out << " facettag=\"" << facet_number_++ << "\""; out << "/>\n"; } // emitters contained_seq = component->contents(CORBA__::dk_Emits, false); len = contained_seq->length(); for( i= 0; i < len; i++) { IR__::EmitsDef_var a_emits = IR__::EmitsDef::_narrow(((*contained_seq)[i])); out << "<emits emitsname=\""; out << a_emits -> name(); out << "\" eventtype=\"" ; out << a_emits -> event() -> id(); out << "\">\n"; out << "<eventpolicy policy=\"normal\"/>\n"; out << "</emits>\n"; } // publisher contained_seq = component->contents(CORBA__::dk_Publishes, false); len = contained_seq->length(); for( i= 0; i < len; i++) { IR__::EventPortDef_var a_publishes = IR__::EventPortDef::_narrow(((*contained_seq)[i])); out << "<publishes publishesname=\""; out << a_publishes -> name(); out << "\" eventtype=\"" ; out << a_publishes -> event() -> id(); out << "\">\n"; out << "<eventpolicy policy=\"normal\"/>\n"; out << "</publishes>\n"; } // consumer contained_seq = component->contents(CORBA__::dk_Consumes, false); len = contained_seq->length(); for( i= 0; i < len; i++) { IR__::ConsumesDef_var a_consumes = IR__::ConsumesDef::_narrow(((*contained_seq)[i])); out << "<consumes consumesname=\""; out << a_consumes -> name(); out << "\" eventtype=\"" ; out << a_consumes -> event () -> id(); out << "\">\n"; out << "<eventpolicy policy=\"normal\"/>\n"; out << "</consumes>\n"; } }
// // composition // void GeneratorCCD::doComposition(CIDL::CompositionDef_ptr composition) { filename_ = ""; // check whether the descriptor has to be create elsewhere // for usage from project generator if (m_dir_prefix.length()) { filename_ = m_dir_prefix; } std::string id = composition->id(); IR__::Contained_ptr module_def = 0; std::string::size_type pos = id.find_last_of("/"); if(pos != std::string::npos) { id.replace(pos, string::npos, ":1.0"); module_def = repository_->lookup_id(id.c_str()); filename_.append(getAbsoluteName(module_def, "_")); filename_.append("_"); } // open output file filename_.append(composition->name()); filename_.append(".ccd"); out.open(filename_.c_str()); out << "<?xml version = '1.0' ?>\n"; out << "<!DOCTYPE corbacomponent PUBLIC \"-//OMG//DTD CORBA Component Descriptor\""; out << " \"http://www.qedo.org/corbacomponent.dtd\">\n\n"; out << "<corbacomponent>\n"; out.indent(); out << "<corbaversion>3.0</corbaversion>\n"; out << "<componentrepid repid=\"" << composition->ccm_component()->id() << "\"/>\n"; out << "<homerepid repid=\"" << composition->ccm_home()->id() << "\"/>\n"; out << "<componentkind>\n"; out.indent(); switch( composition->lifecycle() ) { case CIDL::lc_Service: out << "<service>\n"; break; case CIDL::lc_Session: out << "<session>\n"; break; case CIDL::lc_Process: out << "<process>\n"; break; case CIDL::lc_Entity: out << "<entity>\n"; break; case CIDL::lc_Extension: out << "<containerextension>\n"; break; default : {} } out.indent(); out << "<servant lifetime=\"container\"/>\n"; out.unindent(); switch( composition->lifecycle() ) { case CIDL::lc_Service: out << "</service>\n"; break; case CIDL::lc_Session: out << "</session>\n"; break; case CIDL::lc_Process: out << "</process>\n"; break; case CIDL::lc_Entity: out << "</entity>\n"; break; case CIDL::lc_Extension: out << "</containerextension>\n"; break; default : {} } out.unindent(); out << "</componentkind>\n"; out << "<threading policy=\"multithread\"/>\n"; out << "<configurationcomplete set=\"true\"/>\n\n"; //<segment name="Seg" segmenttag=""> // <segmentmember facettag="the_fork"/> //</segment> out << "<homefeatures name=\"" << composition->ccm_home()->name(); out << "\" repid=\"" << composition->ccm_home()->id() << "\">\n"; out << "</homefeatures>\n\n"; out << "<componentfeatures name=\"" << composition->ccm_component()->name(); out << "\" repid=\"" << composition->ccm_component()->id() << "\">\n"; out.indent(); out << "<ports>\n"; // manage ports out.indent(); gen_ports(composition->ccm_component()); //out << " <provides providesname="the_fork" repid="IDL:dinner/Fork:1.0" facettag="the_fork"/> // <provides providesname="the_name" repid="IDL:dinner/Named:1.0" facettag="the_name"/> out.unindent(); out << "</ports>\n"; out.unindent(); out << "</componentfeatures>\n"; out.unindent(); out << "</corbacomponent>"; // close file out.close(); }