Thứ Hai, 20 tháng 1, 2014

quá trình ánh xạ (mapping) từ ngôn ngữ đặc tả sang ngôn ngữ cài đặt.doc.DOC

long month;
long day;
};
// Chiu di thay i
struct Address
{
string aptNum;
string streetName;
string city;
string state;
string zipCode;
};
};
// C++
class INVENT
{
struct Date
{
CORBA::Long year;
CORBA::Long month;
CORBA::Long day;
};
struct Address
{
CORBA::String_var aptNum;
CORBA::String_var streetName;
CORBA::String_var city;
CORBA::String_var state;
CORBA::String_var zipCode;
Address &operator=(const Address &_obj);
};
};
i vi cỏc kiu d liu c bn trong cỏc thnh phn ca struct c ỏnh x
sang cỏc kiu tng ng trong C++. Cũn cỏc kiu d liu nh: tham chiu i
tng, cỏc tham chiu gi i tng, cỏc chui thỡ c ỏnh x cỏc lp _var
tng ng:
CORBA::string_var
CORBA::object_var
d> Union
- 5 -
Mt kiu Union trong IDL c ỏnh x sang mt lp trong C++. Lp
ny cha:
Cỏc hm to lp (Constructors)
Cỏc hm hu (Destructors)
Cỏc toỏn t gỏn
Cỏc thay i cho cỏc giỏ tr ca union
Cỏc b truy nhp cho cỏc giỏ tr ca union.
Vớ d:
// IDL
union OrderItem switch (long)
{
case 1: itemStruct itemInfo;
case 2: orderStruct orderInfo;
default: ID idInfo;
};
// C++
class OrderItem
{
public:
OrderItem();
OrderItem(const OrderItem &);
~OrderItem();
OrderItem &operator=(const OrderItem&);
void _d (CORBA::Long);
CORBA::Long _d () const;
void itemInfo (const itemStruct &);
const itemStruct & itemInfo () const;
itemStruct & itemInfo ();
void orderInfo (const orderStruct &);
const orderStruct & orderInfo () const;
orderStruct & orderInfo ();
void idInfo (ID);
ID idInfo () const;
. . .
};
- 6 -
e> Cỏc nh ngha kiu
Cỏc nh ngha kiu trong IDL c ỏnh x trc tip sang cỏc nh ngha
kiu ca C++. Nu nh ngha kiu IDL gc c ỏnh x sang mt vi
kiu ca C++ thỡ trỡnh biờn dch ca IDL s sinh ra cỏc bớ danh tng ng
cho mi kiu trong C++.
// IDL
typedef octet example_octet;
typedef enum enum_values {
first,
second,
third
} enum_example;
// Kt qu trong C++
typedef octet example_octet;
enum enum_values {
first,
second,
third
};
typedef enum_values enum_example; // bớ danh c to ra
f> Modules
Mt module ca IDL nờn c ỏnh x sang mt namespace ca C++ vi
tờn tng t
// IDL
module ABC
{
// Definitions

};

// Kt qu trong C++
class ABC
{
// Definitions

};
g> Sequences
- 7 -
Cỏc sequences ca IDL c giúi hn hay khụng gii hn u c ỏnh x
sang class ca C++.
Chỳ ý: Khi chiu di ca sequence khụng gii hn vt quỏ chiu di cc
i thỡ C++ s cp phỏt trong sut mt buffer ln hn, nú s copy buffer c
vo buffer mi v gii phong b nh khi buffer c. Tuy nhiờn, nú s
khụng thc hin gii phúng bt k b nh no cha bao gi c dựng n
nu chiu di cc i gim.
Xột vớ d sau: ỏnh x mt sequence khụng gii hn (unbounded)ca IDL
sang C++
// IDL
typedef sequence<long> LongSeq;

// Results in the generation of this C++ code
class LongSeq
{
public:
LongSeq(CORBA::ULong max=0);
LongSeq(CORBA::ULong max=0, CORBA::ULong length,
CORBA::Long *data, CORBA::Boolean release = 0);
LongSeq(const LongSeq&);
~LongSeq();
LongSeq& operator=(const LongSeq&);
CORBA::ULong maximum() const;
void length(CORBA::ULong len);
CORBA::ULong length() const;
const CORBA::ULong& operator[](CORBA::ULong index) const;

static LongSeq *_duplicate(LongSeq* ptr);
static void _release(LongSeq *ptr);
static CORBA::Long *allocbuf(CORBA::ULong nelems);
static void freebuf(CORBA::Long *data);
private:
CORBA::Long *_contents;
CORBA::ULong _count;
CORBA::ULong _num_allocated:
CORBA::Boolean _release_flag;
CORBA::Long _ref_count;
};
í ngha ca cỏc hm c mụt t bng sau:
- 8 -
Phng thc Mụ t
LongSeq(CORBA::ULong
max=0)
b to lp cho mt sequence khụng gii hn chim mt chiu di
cc i nh mt tham s. Cỏc sequence gii hn thỡ cú mt chiu
di cc i xỏc nh.
LongSeq(CORBA::ULong
max=0,
CORBA::ULong length,
CORBA::Long *data,
CORBA::Boolean
release=0)
Constructor ny cho phộp bn t mt chiu di cc i, chiu di
hin ti, mt con tr ti b m d liu kt hp v mt c gii
phúng.Nu c gii phúng khỏc 0, ISB v C++ s gii b nh kt
hp vi b m d liu khi tng kớch thc ca sequence. Nu c
gii phúng bng 0 thỡ b nh ca b dm d liu c khụng c
gii phúng. Sequence gii hn cú tt c cỏc thụng s ny tr max.
LongSeq(const LongSeq&)B to lp sao chộp thc hin sao chộp sõu i tng ngun.
~LongSeq(); Destructor gii phúng tt c b nh ca chớnh sequence nu c gii
phúng (release flag) cú giỏ tr khỏc khụng khi c to lp.
Operator=(const
LongSeq&j)
Toỏn t gỏn thc hin mt s ao chộp sõu, gii phúng vic lu tr
c nu cn thit
Maximum() Tr li kớch thc ca sequence.
length() Hai phng thc c nh ngha cho vic t v tr li chiu di
ca sequence.
Operator[]() Hai toỏn t ch mc c cung cp cho vic truy nhp mt phn t
trong sequence. Mt toỏn t cho phộp phn t c thay i cũn
mt toỏn t ch cho phộp truy nhp c phn t.
_release() Gii phúng sequence. Nu c gii phúng ca b to lp l khỏc 0
khi i tng c khi to v kiu phn t ca sequence l mt
chui hoc tham chiu i tng thỡ mi phn t s c gii
phúng trc khi buffer c gii phúng.
allocbuf()
freebuf()
Bn nờn dựng hai phng thc tnh ny cp phỏt hay hu bt k
b nh no s dng bi mt sequence
Qun lý b nh v cỏc sequence
Bn nờn cõn nhc cn thn cỏc vn qun lý b nh c ch ra di õy:
Nu c gii phng c t giỏ tr khỏc 0 khi sequence c khi to,
thỡ sequence s gi nh qun lý b nh ca ngi dựng. Khi mt phn
t c gỏn, b nh c c gii phúng trc khi quyn s hu ca b
nh ca biu thc bờn tay phi c tha nhn.
Nu c gii phúng c t giỏ tr khỏc 0 khi sequence c khi to
v cỏc phn t ca sequence l cỏc chui hay cỏc tham chiu i tng,
mi phn t s c gii phúng trc khi buffer cha ni dung ca
sequence c gii phúng v i tng b hu.
Trỏnh vic gỏn mt phn t ca sequence s dng toỏn t [] tr khi c
gii phúng c t l 1, hoc li qun lý b nh xut hin.
Cỏc sequence c khi to vi c hu t bng 0 khụng nờn c s
dng nh cỏc tham bin u vo/ u ra bi vỡ cỏc li qun lý b nh
trong b dch v i tng cú th a n kt qu.
- 9 -
Luụn luụn s dng allocbuf v freebuf khi to v gii phúng kho
lu tr c s dng vi cỏc sequence.
h> Array
Cỏc array ca IDL c ỏnh x sang cỏc array ca C++, cỏi m cú th
c khi to tnh. Nu cỏc phn t ca array l cỏc chui hoc cỏc tham
chiu i tng, thỡ cỏc phn t ca mng trong C++ cú kiu _var. Vớ d
on chng trỡnh sau ch ra ba mng vi cỏc kiu phn t khỏc nhau.
// IDL
interface Intf
{
// definitions
};
typedef long L[10];
typedef string S[10];
typedef Intf A[10]; // kiu tham chiu i tng

// Kt qu trong C++
typedef CORBA::Long L[10];
typedef CORBA::String_var S[10];
typedef Intf_var A[10];
Cỏch s dng kiu c qun lý kiu _var cho cỏc chui v cỏc tham
chiu i tng cho phộp b nh c qun lý trong sut khi cỏc phn
t ca mng c gỏn.
Cỏc slice ca mng
Kiu _slice ca mng c s dng khi truyn tham s cho cỏc mng nhiu
chiu. Mt slice ca mt mng vi tt c cỏc chiu ca mng gc tr chiu
u tiờn. Kiu mng _slice cung cp mt cỏch thun li cho vic truyn v tr
li cỏc tham s. Mt nh ngh a ki u cho m i slice c phỏt sinh.
// IDL
typedef long L[10];
typedef string str[1][2][3];

// Results in the generation of these slices
typedef CORBA::Long L_slice[10];
typedef CORBA::String_var str_slice[2][3];
typedef str_slice *str_slice_ptr;
Nu bn ch cú mng mt chiu, mt mng slice ch l mt kiu. Nh bn
thy vớ d trờn, ta cú mng long L[10] thỡ mt mng slice s tr li kt qu
trong kiu d liu l CORBA::Long
- 10 -
Qun lý b nh cho cỏc mng
Trỡnh biờn dch IDL ca C++ sinh ra hai hm phc v cho vic cp phỏt v
gii phúng b nh kt hp vi cỏc mng. Cỏc hm ny cho phộp ORB qun lý
b nh m khụng ghi ố cỏc toỏn t new v delete.
// IDL
typedef long L[10];

// Kt qu trong C++
inline L_slice *L_alloc(); // Cp phỏt ng mt mng. Tr li giỏ
tr NULL nu li.
inline void L_free(L_slice *data); // Gii phúng b nh mng c cp
phỏt bi L_loc.
* Qun lý cỏc ngoi l (Exception)
Mt exception trong Idl c ỏnh x sang mt lp ca C++. Lp ny cha
cỏc thnh phn sau:
Cỏc b to lp (constructor)
Destructors
Mt hm _narrow static xỏc nh kiu ca exception.

// OMG IDL
module INVENT
{
exception NonExist
{
ID BadId;
};
};
// C++
class INVENT
{
. . .
class NonExist : public CORBA::UserException
{
public:
static NonExist * _narrow(CORBA::Exception_ptr);
NonExist (ID _BadId);
NonExist ();
NonExist (const NonExist &);
~NonExist ();
- 11 -
NonExist & operator=(const NonExist &);
void _raise ();
ID BadId;
};
};
Cỏc thuc tớnh ca lp Exception l public vỡ vy bn cú th truy nhp trc
tip.
nh x cỏc cỏc b phn
Cỏc b phn ca lp ngoi l c ỏnh x theo cỏch tng t nh cỏc cu
trỳc. Tt c cỏc b phn ca ngoi l l d liu cụng cng trong lp ca C++,
v c truy nhp trc tip.
Var
Mt lp _var c sinh ra cho mt ngoi l.
Out
Mt lp Out c sinh ra cho mt ngoi l.
Cỏc hm b phn
Vi ngoi l ca IDL l TYPE cú cỏc hm b phn sau:
static TYPE * _narrow(CORBA::Exception_ptr Except);
TYPE(); õy l constructor mc nh cho ngoi l
TYPE(cỏc tham chiu b phn);
TYPE (const TYPE & From);
~TYPE ();
TYPE & operator=(const TYPE & From);
void _raise ();
* Qun lý cỏc giao din (interface)
Mt giao din trong IDL c ỏnh x sang mt lp ca C++. Lp ny
cha cỏc nh ngha ca cỏc thao tỏc, cỏc thuc tớnh, cỏc hng, v cỏc kiu
ngi dựng nh ngha (UDTs).
Vi mt giao din INTF, on mó giao din c sinh ra cha cỏc phn
sau:
Kiu tham chiu i tng (INTF_ptr)
Kiu bin tham chiu i tng (INTF_var)
Hm b phn tnh _duplicate
Hm b phn tnh _narrow
Hm b phn tnh _nil
UDTs
Cỏc hm b phn v cỏc thuc tớnh v cỏc thao tỏc
- 12 -
Xột vớ d sau:
// OMG IDL
module INVENT
{
interface Order
{
void cancelOrder ();
};
};
nh x sang C++ nh sau:
// C++
class INVENT
{
. . .
class Order;
typedef Order * Order_ptr;
class Order : public virtual CORBA::Object
{
. . .
static Order_ptr _duplicate(Order_ptr obj);
static Order_ptr _narrow(CORBA::Object_ptr obj);
static Order_ptr _nil();
virtual void cancelOrder () = 0;
. . .
};
};
Cỏc kiu tham chiu i tng v cỏc hm b phn c mụ t nh sau:
static INTF_ptr _duplicate (INTF_ptr Obj)
Hm b phn tnh ny sao chộp mt tham chiu i tng INTF ang tn ti
v tr li mt tham chiu i tng INTF mi. Tham chiu i tng INTF
mi phi c gii phúng bng vic gi hamf b phn CORBA::realease. Nu
mt li xut hin thỡ mt tham chiu ti i tng INTF nil c tr li. i
s Obj xỏc nh tham chiu i tng c sao chộp.
static INTF_ptr _narrow (CORBA::Object_ptr Obj)
Hm b phn tnh ny tr li mt tham chiu i tng INTF mi da vo
mt tham chiu i tng CORBA::Object_ptr ang tn ti. Tham chiu i
tng Obiect_ptr cú th c khi to bng vic gi hm b phn
CORBA::ORB::string_to_object hoc cú th c tr li nh mt tham chiu
t mt thao tỏc.
- 13 -
Tham chiu i tng INTF_ptr phi tng ng vi mt i tng INTF
hoc tng ng vi mt i tng m k tha t i tng INTF. Tham chiu
i tng INTF mi phi c gii phúng bng vic gi hm b phn
CORBA::release. i s Obj xỏc nh tham chiu i tng thu hp ti
mt tham chiu i tng INTF. Tham bin Obj khụng b thay i bi cỏc
hm b phn ny v nờn oc gii phúng bi ngi s dng khi nú khụng
c s dng na. Nu Obj khụng c thu hp ti mt tham chiu i tng
INTF thỡ mt tham chiu i tng INTF nil c tr li.
static INTF_ptr _nil ( )
Hm b phn static ny tr li mt tham chiu i tng nil mi cho giao
din INTF. Tham chiu mi khụng phi c gii phúng bng cỏch gi hm
b phn CORBA::release.
Cỏc kiu tham chiu i tng
Mt lp giao din (INTF) l mt lp o; CORBA chun khụng cho phộp bn:
Khi to hay hold mt instance ca lp giao din.
S dng mt con tr hay mt tham chiu ti mt lp giao din.
Thay vỡ ú bn cú th s dng mt kiu tham chiu i tng: lp INTF_ptr
hay INTF_var.
Bn cú th ginh c tham chiu i tng bng vic s dng hm b phn
static _nrrow. Cỏc thao tỏc truy nhp trờn cỏc lp ny thỡ s dng toỏn t ->
Lp _var ca INTF n gin hoỏ vic qun lý b nh bng vic hu t ng
tham chiu i tng khi lp _var ca INTF nm ngoi phm vi c cp
phỏt li.
Cỏc thuc tớnh
Mt thuc tớnh ch c trong OMG IDL c ỏnh x sang mt hm C++ m
hm ú tr li giỏ tr thuc tớnh. Mt thuc tớnh c-ghi ỏnh x sang hai hm
C++ c chũng hm, mt hm tr li giỏ tr thuc tớnh v mt hm tr li tp
giỏ tr thuc tớnh. Tờn ca hm b phn c chng hm l tờn ca thuc tớnh.
Cỏc thuc tớnh c to ra theo cỏch tng t m cỏc hm c to ra.
II. ánh xạ phía server
Trong phần này chúng ta sẽ xem cách mà các giao tiếp IDL ánh xạ sang
các lớp C++ cùng với sự hỗ trợ việc tạo và gọi đối tợng CORBA ở bên phía
server và một số vấn đề liên quan khác .
1 . Mở đầu :
Trong mô hình CORBA các đối tợng server thực hiện bởi ứng dụng
server.Tại server, đối tợng CORBA đợc thực thi và thể hịên bởi các hàm ngôn
- 14 -

Không có nhận xét nào:

Đăng nhận xét