Thứ Năm, 13 tháng 2, 2014

Mô hình Client - Server

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:
Phng thc Mụ t
- 8 -
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
Xột vớ d sau:
- 12 -
// 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.
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
- 13 -
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
ngữ lập trình và dữ liệu. Các thực thể ngôn ngữ lập trình thực thi và thể hiện các
đối tợng CORBA đợc gọi là các servant.
Các servant cung cấp các phần thân của đối tợng CORBA, hay nói cách khác
chúng là thể hiện của các đối tợng CORBA.
- 14 -

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

Đăng nhận xét