Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19001375
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-28 16:10:49

TAOIDL结构定义编译文件分析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::insert_copy (

      _tao_any,

      nms::AlarmInfo::_tao_any_destructor,

      nms::_tc_AlarmInfo,

      _tao_elem

    );

}

Ø         4 结构对象AlarmInfoAny的解析出来

// 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::insert_copy (…)

具体的结构到Any的模板实现类,放入insert,吸取extract,结构对象指针value,编码,解码。

  template

  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 *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的数据结构与流化是比较独立分开的。CORBACDR编码是通过IDL中规范定义的基本数据类型来判断类型的流化。经过编译的IDL定义的生成的C++结构是比较干净,基本不带其他信息,或者成员,所以在编写CORBA的程序的时候,我们不要再定义相同的C++数据结构,我们可以直接使用IDL编译后的C++结构。

阅读(458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~