diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_enum.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_enum.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_enum.cpp b/TAO/TAO_IDL/be/be_enum.cpp index 335301785f5..e80f8704cf0 100644 --- a/TAO/TAO_IDL/be/be_enum.cpp +++ b/TAO/TAO_IDL/be/be_enum.cpp @@ -82,6 +82,101 @@ be_enum::member_count (void) return this->member_count_; } + +// generate typecode. +// Typecode for enum comprises the enumerated value followed by the +// encapsulation of the parameters + +int +be_enum::gen_typecode (void) +{ + TAO_OutStream *cs; // output stream + TAO_NL nl; // end line + TAO_CodeGen *cg = TAO_CODEGEN::instance (); + + cs = cg->client_stubs (); + cs->indent (); // start from whatever indentation level we were at + + *cs << "CORBA::tk_enum, // typecode kind" << nl; + *cs << this->tc_encap_len () << ", // encapsulation length\n"; + // now emit the encapsulation + return this->gen_encapsulation (); +} + +int +be_enum::gen_encapsulation (void) +{ + TAO_OutStream *cs; // output stream + TAO_NL nl; // end line + TAO_CodeGen *cg = TAO_CODEGEN::instance (); + long i, arrlen; + + + cs = cg->client_stubs (); + cs->indent (); // start from whatever indentation level we were at + + *cs << "TAO_ENCAP_BYTE_ORDER, // byte order" << nl; + // generate repoID + *cs << (ACE_OS::strlen (this->repoID ())+1) << ", "; + + ACE_UINT32 *arr; + (void)this->tc_name2long (this->repoID (), arr, arrlen); + for (i=0; i < arrlen; i++) + { + cs->print ("ACE_NTOHL (0x%x), ", arr[i]); + } + *cs << " // repository ID = " << this->repoID () << nl; + // generate name + *cs << (ACE_OS::strlen (this->local_name ()->get_string ())+1) << ", "; + (void)this->tc_name2long(this->local_name ()->get_string (), arr, arrlen); + for (i=0; i < arrlen; i++) + { + cs->print ("ACE_NTOHL (0x%x), ", arr[i]); + } + *cs << " // name = " << this->local_name () << nl; + // generate the member count + *cs << this->member_count () << ", // member count\n"; + cs->incr_indent (0); + // hand over to the scope to generate the typecode for elements + if (be_scope::gen_encapsulation () == -1) + { + ACE_ERROR ((LM_ERROR, "be_structure: cannot generate code for members\n")); + return -1; + } + cs->decr_indent (0); + return 0; +} + +// compute typecode size +long +be_enum::tc_size (void) +{ + // 4 bytes for enumeration, 4 bytes for storing encap length val, followed by the + // actual encapsulation length + return 4 + 4 + this->tc_encap_len (); +} + +// return encapsulation length +long +be_enum::tc_encap_len (void) +{ + if (this->encap_len_ == -1) // not computed yet + { + this->encap_len_ = 4; // holds the byte order flag + + this->encap_len_ += this->repoID_encap_len (); // repoID storage + + // do the same thing for the local name + this->encap_len_ += this->name_encap_len (); + + this->encap_len_ += 4; // to hold the member count + + // compute encap length for members + this->encap_len_ += be_scope::tc_encap_len (); + } + return this->encap_len_; +} + int be_enum::accept (be_visitor *visitor) { |