TAO下IDL結構定義編譯文件分析

TAOIDL結構定義編譯文件分析2005-09-21 lwx

 

每個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 結構對象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<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的數據結構與流化是比較獨立分開的。CORBACDR編碼是通過IDL中規範定義的基本數據類型來判斷類型的流化。經過編譯的IDL定義的生成的C++結構是比較乾淨,基本不帶其他信息,或者成員,所以在編寫CORBA的程序的時候,我們不要再定義相同的C++數據結構,我們可以直接使用IDL編譯後的C++結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章