Online Service 在线服务
New Articles 最新更新
Hot Articles 热点文章
Google 广告
首页 … 技术文档 Technical Articles
TAO下IDL结构定义编译文件分析
(时间:2007-7-27 18:12:49 共有 人次浏览)
 
TAO下IDL结构定义编译文件分析2005-09-21 lwx
 
 
 
 
 
每个IDL的定义的结构经过TAOIDL编译器编译将生成一些结构编码的函数的定义。主要分为TypeCode的处理函数和Any的处理函及其CDR编码的处理。每个IDL的定义的结构经过TAOIDL编译器编译将生成一些结构编码的函数的定义。主要分为TypeCode的处理函数和Any的处理函及其CDR编码的处理。由结构到Any的流化和解析,析构,及其结构与TypedCode处理组成。结构到Any类型是通过TAO的内部模板TAO::Any_Dual_Impl_T来实现。结构流编码通过TAO_OutputCDR,TAO_inputCDR.
 
 
 
 
 
IDL定义如下 
 
 
 
 
 
 
 
 
 
    // 告警信息定义 
 
 
 
 
    struct AlarmInfo { 
 
 
 
 
        GeneralizedTime         eventTime; 
 
 
 
 
        ObjectInstance          source; 
 
 
 
 
        ObjectClass             sourceClass; 
 
 
 
 
        NotificationIdentifier  notificationId; 
 
 
 
 
        CorrelatedNotifications alarmInfoCorrelatedNotifications; 
 
 
 
 
        ProbableCause           alarmInfoProbableCause; 
 
 
 
 
        SpecificProblems        alarmInfoSpecificProblems; 
 
 
 
 
        PerceivedSeverity       alarmInfoPerceivedSeverity; 
 
 
 
 
        boolean                 backedUpStatus; 
 
 
 
 
        ObjectInstance          backUpObject; 
 
 
 
 
        TrendIndication         alarmInfoTrendIndication; 
 
 
 
 
        ThresholdInfo           alarmInfoThresholdInfo; 
 
 
 
 
        AttributeChangeList     stateChangeDefinition; 
 
 
 
 
        AttributeList           monitoredAttributes; 
 
 
 
 
        ProposedRepairActions   alarmInfoProposedRepairActions; 
 
 
 
 
        AdditionalString           additionalText; 
 
 
 
 
        AdditionalInformation   additionalInfo; 
 
 
 
 
    };        
 
 
 
 
 
 
 
 
 
 
 
 
 
 
编译生成的文件*C.h/cpp 
 
 
 
 
 
 
 
 
 
  struct  AlarmInfo 
 
 
 
 
  { 
 
 
 
 
    typedef AlarmInfo_var _var_type; 
 
 
 
 
    
 
 
 
 
    static void _tao_any_destructor (void *); 
 
 
 
 
    TAO_String_Manager eventTime; 
 
 
 
 
    nms::ObjectInstance source; 
 
 
 
 
    nms::ObjectClass sourceClass; 
 
 
 
 
    nms::NotificationIdentifier notificationId; 
 
 
 
 
    nms::CorrelatedNotifications alarmInfoCorrelatedNotifications; 
 
 
 
 
    nms::ProbableCause alarmInfoProbableCause; 
 
 
 
 
    nms::SpecificProblems alarmInfoSpecificProblems; 
 
 
 
 
    nms::PerceivedSeverity alarmInfoPerceivedSeverity; 
 
 
 
 
    CORBA::Boolean backedUpStatus; 
 
 
 
 
    nms::ObjectInstance backUpObject; 
 
 
 
 
    nms::TrendIndication alarmInfoTrendIndication; 
 
 
 
 
    nms::ThresholdInfo alarmInfoThresholdInfo; 
 
 
 
 
    nms::AttributeChangeList stateChangeDefinition; 
 
 
 
 
    nms::AttributeList monitoredAttributes; 
 
 
 
 
    nms::ProposedRepairActions alarmInfoProposedRepairActions; 
 
 
 
 
    TAO_String_Manager additionalText; 
 
 
 
 
    nms::AdditionalInformation additionalInfo; 
 
 
 
 
  }; 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         1 里面包含一个静态成员函数是析构AlarmInfo指针内存空间 
 
 
 
 
void 
 
 
 
 
nms::AlarmInfo::_tao_any_destructor ( 
 
 
 
 
    void *_tao_void_pointer 
 
 
 
 
  ) 
 
 
 
 
{ 
 
 
 
 
  AlarmInfo *_tao_tmp_pointer = 
 
 
 
 
    ACE_static_cast (AlarmInfo *, _tao_void_pointer); 
 
 
 
 
  delete _tao_tmp_pointer; 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
在CPP还定义的Typdecode的函数,并设置函数指针 
 
 
 
 
 
 
 
 
 
static CORBA::TypeCode _tc_TAO_tc_nms_AlarmInfo ( 
 
 
 
 
    CORBA::tk_struct, 
 
 
 
 
    sizeof (_oc_nms_AlarmInfo), 
 
 
 
 
    (char *) &_oc_nms_AlarmInfo, 
 
 
 
 
    0, 
 
 
 
 
    sizeof (nms::AlarmInfo) 
 
 
 
 
  ); 
 
 
 
 
 
 
 
 
 
namespace nms 
 
 
 
 
{ 
 
 
 
 
  ::CORBA::TypeCode_ptr _tc_AlarmInfo = 
 
 
 
 
    &_tc_TAO_tc_nms_AlarmInfo; 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         2 定义AlarmInfo 到的Any析构的函数 
 
 
 
 
void 
 
 
 
 
nms::AlarmInfo::_tao_any_destructor ( 
 
 
 
 
    void *_tao_void_pointer 
 
 
 
 
  ) 
 
 
 
 
{ 
 
 
 
 
  AlarmInfo *_tao_tmp_pointer = 
 
 
 
 
    ACE_static_cast (AlarmInfo *, _tao_void_pointer); 
 
 
 
 
  delete _tao_tmp_pointer; 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         3 结构对象AlarmInfo放入Any的打包 
 
 
 
 
void operator<<= ( 
 
 
 
 
    CORBA::Any &_tao_any, 
 
 
 
 
    const nms::AlarmInfo &_tao_elem 
 
 
 
 
  ) 
 
 
 
 
{ 
 
 
 
 
  TAO::Any_Dual_Impl_T<nms::AlarmInfo>::insert_copy ( 
 
 
 
 
      _tao_any, 
 
 
 
 
      nms::AlarmInfo::_tao_any_destructor, 
 
 
 
 
      nms::_tc_AlarmInfo, 
 
 
 
 
      _tao_elem 
 
 
 
 
    ); 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         4 结构对象AlarmInfo从Any的解析出来 
 
 
 
 
// Extraction to non-const pointer (deprecated). 
 
 
 
 
CORBA::Boolean operator>>= ( 
 
 
 
 
    const CORBA::Any &_tao_any, 
 
 
 
 
    nms::AlarmInfo *&_tao_elem 
 
 
 
 
  ) 
 
 
 
 
{ 
 
 
 
 
  return _tao_any >>= ACE_const_cast ( 
 
 
 
 
      const nms::AlarmInfo *&, 
 
 
 
 
      _tao_elem 
 
 
 
 
    ); 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         结构与TAO内部的实现类的关系 
 
 
 
 
  TAO::Any_Dual_Impl_T<nms::AlarmInfo>::insert_copy (…) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
具体的结构到Any的模板实现类,放入insert,吸取extract,结构对象指针value,编码,解码。 
 
 
 
 
  template<typename T> 
 
 
 
 
  class Any_Basic_Impl_T : public Any_Impl 
 
 
 
 
  { 
 
 
 
 
  public: 
 
 
 
 
    Any_Basic_Impl_T (CORBA::TypeCode_ptr, 
 
 
 
 
                      const T & val); 
 
 
 
 
    virtual ~Any_Basic_Impl_T (void); 
 
 
 
 
 
 
 
 
 
    static void insert (CORBA::Any &, 
 
 
 
 
                        CORBA::TypeCode_ptr, 
 
 
 
 
                        const T &); 
 
 
 
 
    static CORBA::Boolean extract (const CORBA::Any &, 
 
 
 
 
                                   CORBA::TypeCode_ptr, 
 
 
 
 
                                   T &); 
 
 
 
 
 
 
 
 
 
    virtual CORBA::Boolean marshal_value (TAO_OutputCDR &); 
 
 
 
 
    CORBA::Boolean demarshal_value (TAO_InputCDR &); 
 
 
 
 
    virtual void _tao_decode (TAO_InputCDR & 
 
 
 
 
                              ACE_ENV_ARG_DECL_WITH_DEFAULTS); 
 
 
 
 
 
 
 
 
 
    virtual const void *value (void) const; 
 
 
 
 
    static Any_Basic_Impl_T<T> *create_empty (CORBA::TypeCode_ptr); 
 
 
 
 
 
 
 
 
 
  private: 
 
 
 
 
    T value_; 
 
 
 
 
  }; 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         在编译的IDL的文件中产生了一个*C.i的文件,该文件主要是将定义的数据结构类型流化到CDR的对象中,及其从CDR流中解析出来。 
 
 
 
 
 
 
 
 
 
Ø         结构到ANY的操作符
void operator<<= (CORBA::Any &, const nms::AlarmInfo &); // copying version 
 
 
 
 
 void operator<<= (CORBA::Any &, nms::AlarmInfo*); // noncopying version 
 
 
 
 
 CORBA::Boolean operator>>= (const CORBA::Any &, nms::AlarmInfo *&); // deprecated 
 
 
 
 
 CORBA::Boolean operator>>= (const CORBA::Any &, const nms::AlarmInfo *&); 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ø         结构到CDR的流化和解码处理
CORBA::Boolean operator<< (TAO_OutputCDR &, const nms::AlarmInfo &); 
 
 
 
 
 CORBA::Boolean operator>> (TAO_InputCDR &, nms::AlarmInfo &); 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
流化成CDR格式的流 
 
 
 
 
ACE_INLINE 
 
 
 
 
CORBA::Boolean operator<< ( 
 
 
 
 
    TAO_OutputCDR &strm, 
 
 
 
 
    const nms::AlarmInfo &_tao_aggregate 
 
 
 
 
  ) 
 
 
 
 
{ 
 
 
 
 
  return 
 
 
 
 
    (strm << _tao_aggregate.eventTime.in ()) && 
 
 
 
 
    (strm << _tao_aggregate.source) && 
 
 
 
 
    (strm << _tao_aggregate.sourceClass) && 
 
 
 
 
    (strm << _tao_aggregate.notificationId) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoCorrelatedNotifications) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoProbableCause) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoSpecificProblems) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoPerceivedSeverity) && 
 
 
 
 
    (strm << CORBA::Any::from_boolean (_tao_aggregate.backedUpStatus)) && 
 
 
 
 
    (strm << _tao_aggregate.backUpObject) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoTrendIndication) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoThresholdInfo) && 
 
 
 
 
    (strm << _tao_aggregate.stateChangeDefinition) && 
 
 
 
 
    (strm << _tao_aggregate.monitoredAttributes) && 
 
 
 
 
    (strm << _tao_aggregate.alarmInfoProposedRepairActions) && 
 
 
 
 
    (strm << _tao_aggregate.additionalText.in ()) && 
 
 
 
 
    (strm << _tao_aggregate.additionalInfo); 
 
 
 
 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
可以见到IDL的数据结构与流化是比较独立分开的。CORBA的CDR编码是通过IDL中规范定义的基本数据类型来判断类型的流化。经过编译的IDL定义的生成的C++结构是比较干净,基本不带其他信息,或者成员,所以在编写CORBA的程序的时候,我们不要再定义相同的C++数据结构,我们可以直接使用IDL编译后的C++结构。
 
打印 【打印该页】 【关闭窗口

此技术资料来自网络,仅供参考。未经许可,不得转载。
若有侵权,请及时与我们取得联系!
FAQS 常见问题
Consultation 即时咨询
Contact Us 联系我们