Thứ Năm, 6 tháng 3, 2014

ÁNH XẠ PHÍA SERVER,ÁNH XẠ TỪ IDL SANG C++

struct Date
{
long year;
long month;
long day;
};
// Chiều dài 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 với các kiểu dữ liệu cơ bản trong các thành phần của struct được ánh xạ
sang các kiểu tương ứng trong C++. Cũn cỏc kiểu dữ liệu như: tham chiếu đối
tượng, các tham chiếu giả đối tượng, các chuối thỡ được ánh xạ các lớp _var
tương ứng:
- 5 -
• CORBA::string_var
• CORBA::object_var
d> Union
Một kiểu Union trong IDL được ánh xạ sang một lớp trong C++. Lớp
này chứa:
• Cỏc hàm tạo lập (Constructors)
• Cỏc hàm huỷ (Destructors)
• Cỏc toỏn tử gỏn
• Cỏc thay đổi cho cỏc giỏ trị của union
• Cỏc bộ truy nhập cho cỏc giỏ trị của 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);
- 6 -
ID idInfo () const;
. . .
};
e> Cỏc định nghĩa kiểu
Cỏc định nghĩa kiểu trong IDL được ánh xạ trực tiếp sang các định nghĩa
kiểu của C++. Nếu định nghĩa kiểu IDL gốc được ánh xạ sang một vài
kiểu của C++ thỡ trỡnh biờn dịch của IDL sẽ sinh ra cỏc bớ danh tương
ứng cho mỗi kiểu trong C++.
// IDL
typedef octet example_octet;
typedef enum enum_values {
first,
second,
third
} enum_example;
// Kết quả trong C++
typedef octet example_octet;
enum enum_values {
first,
second,
third
};
typedef enum_values enum_example; // bí danh được tạo ra
f> Modules
Một module của IDL nên được ánh xạ sang một namespace của C++ với
tên tương tự
// IDL
module ABC
{
// Definitions

};

// Kết quả trong C++
class ABC
{
- 7 -
// Definitions

};
g> Sequences
Các sequences của IDL cả giưói hạn hay không giới hạn đều được ánh xạ
sang class của C++.
Chỳ ý: Khi chiều dài của sequence khụng giới hạn vượt quá chiều dài cực
đại thỡ C++ sẽ cấp phỏt trong suốt một buffer lớn hơn, nó sẽ copy buffer
cũ vào buffer mới và giải phong bộ nhớ khỏi buffer cũ. Tuy nhiên, nó sẽ
không thực hiện giải phóng bất kỳ bộ nhớ nào chưa bao giờ được dùng đến
nếu chiều dài cực đại giảm.
Xột vớ dụ sau: ỏnh xạ một sequence khụng giới hạn (unbounded)của 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;
- 8 -
CORBA::Long _ref_count;
};
í nghĩa của các hàm được mụt tả ở bảng sau:
Phương thức Mụ tả
LongSeq(CORBA::ULong
max=0)
bộ tạo lập cho một sequence không giới hạn chiếm một chiều dài
cực đại như một tham số. Các sequence giới hạn thỡ cú một chiều
dài cực đại xác định.
LongSeq(CORBA::ULong
max=0,
CORBA::ULong length,
CORBA::Long *data,
CORBA::Boolean
release=0)
Constructor này cho phép bạn đặt một chiều dài cực đại, chiều dài
hiện tại, một con trỏ tới bộ đệm dữ liệu kết hợp và một cờ giải
phóng.Nếu cờ giải phóng khác 0, ISB về C++ sẽ giải bộ nhớ kết
hợp với bộ đẹm dữ liệu khi tăng kích thước của sequence. Nếu cờ
giải phóng bằng 0 thỡ bộ nhớ của bộ dệm dữ liệu cũ khụng được
giải phóng. Sequence giới hạn có tất cả các thông số này trừ max.
LongSeq(const LongSeq&)Bộ tạo lập sao chép thực hiện sao chép sâu đối tượng nguồn.
~LongSeq(); Destructor giải phóng tất cả bộ nhớ của chính sequence nếu cờ giải
phóng (release flag) có giá trị khác không khi được tạo lập.
Operator=(const
LongSeq&j)
Toỏn tử gỏn thực hiện một sự ao chộp sõu, giải phóng việc lưu trữ
cũ nếu cần thiết
Maximum() Trả lại kích thước của sequence.
length() Hai phương thức được định nghĩa cho việc đặt và trả lại chiều dài
của sequence.
Operator[]() Hai toán tử chỉ mục được cung cấp cho việc truy nhập một phần tử
trong sequence. Một toán tử cho phép phần tử được thay đổi cũn
một toỏn tử chỉ cho phộp truy nhập đọc phần tử.
_release() Giải phóng sequence. Nếu cờ giải phóng của bộ tạo lập là khác 0
khi đối tượng được khởi tạo và kiểu phần tử của sequence là một
chuỗi hoặc tham chiếu đối tượng thỡ mỗi phần tử sẽ được giải
phóng trước khi buffer được giải phóng.
allocbuf()
freebuf()
Bạn nên dùng hai phương thức tĩnh này để cấp phát hay huỷ bất kỳ
bộ nhớ nào sử dụng bởi một sequence
Quản lý bộ nhớ về cỏc sequence
Bạn nên cân nhắc cẩn thận các vấn đề quản lý bộ nhớ được chỉ ra dưới đây:
• Nếu cờ giải phống được đặt giá trị khác 0 khi sequence được khởi tạo,
thỡ sequence sẽ giả định quản lý bộ nhớ của người dùng. Khi một phần
tử được gán, bộ nhớ cũ được giải phóng trước khi quyền sở hữu của bộ
nhớ của biểu thức bên tay phải được thừa nhận.
• Nếu cờ giải phóng được đặt giá trị khác 0 khi sequence được khởi tạo
và các phần tử của sequence là các chuỗi hay các tham chiếu đối tượng,
mỗi phần tử sẽ được giải phóng trước khi buffer chứa nội dung của
sequence được giải phóng và đối tượng bị huỷ.
• Tránh việc gán một phần tử của sequence sử dụng toán tử [] trừ khi cờ
giải phóng được đặt là 1, hoặc lỗi quản lý bộ nhớ xuất hiện.
- 9 -
• Các sequence được khởi tạo với cờ huỷ đặt bằng 0 không nên được sử
dụng như các tham biến đầu vào/ đầu ra bởi vỡ cỏc lỗi quản lý bộ nhớ
trong bộ dịch vụ đối tượng có thể đưa đến kết quả.
• Luôn luôn sử dụng allocbuf và freebuf để khởi tạo và giải phóng kho
lưu trữ được sử dụng với các sequence.
h> Array
Cỏc array của IDL được ánh xạ sang các array của C++, cái mà có thể
được khởi tạo tĩnh. Nếu các phần tử của array là các chuỗi hoặc các tham
chiếu đối tượng, thỡ cỏc phần tử của mảng trong C++ cú kiểu _var. Vớ dụ
đoạn chương trỡnh sau chỉ ra ba mảng với cỏc kiểu phần tử khỏc nhau.
// IDL
interface Intf
{
// definitions
};
typedef long L[10];
typedef string S[10];
typedef Intf A[10]; // kiểu tham chiếu đối tượng

// Kết quả trong C++
typedef CORBA::Long L[10];
typedef CORBA::String_var S[10];
typedef Intf_var A[10];
Cách sử dụng kiểu được quản lý kiểu _var cho cỏc chuỗi và cỏc tham
chiếu đối tượng cho phép bộ nhớ được quản lý trong suốt khi các phần
tử của mảng được gán.
Cỏc slice của mảng
Kiểu _slice của mảng được sử dụng khi truyền tham số cho các mảng nhiều
chiều. Một slice của một mảng với tất cả các chiều của mảng gốc trừ chiều
đầu tiên. Kiểu mảng _slice cung cấp một cách thuận lợi cho việc truyền và trả
lại các tham số. Một đị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;
- 10 -
Nếu bạn chỉ có mảng một chiều, một mảng slice chỉ là một kiểu. Như bạn
thấy ở ví dụ trờn, ta cú mảng long L[10] thỡ một mảng slice sẽ trả lại kết
quả trong kiểu dữ liệu là CORBA::Long
Quản lý bộ nhớ cho cỏc mảng
Trỡnh biờn dịch IDL của C++ sinh ra hai hàm phục vụ cho việc cấp phỏt và
giải phúng bộ nhớ kết hợp với cỏc mảng. Cỏc hàm này cho phộp ORB quản
lý bộ nhớ mà khụng ghi đè các toán tử new và delete.
// IDL
typedef long L[10];

// Kết quả trong C++
inline L_slice *L_alloc(); // Cấp phát động một mảng. Trả lại giá trị
NULL nếu lỗi.
inline void L_free(L_slice *data); // Giải phóng bộ nhớ mảng được cấp
phát bởi L_loc.
* Quản lý cỏc ngoại lệ (Exception)
Một exception trong Idl được ánh xạ sang một lớp của C++. Lớp này chứa
các thành phần sau:
• Cỏc bộ tạo lập (constructor)
• Destructors
• Một hàm _narrow static để xác định kiểu của 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);
- 11 -
NonExist ();
NonExist (const NonExist &);
~NonExist ();
NonExist & operator=(const NonExist &);
void _raise ();
ID BadId;
};
};
Cỏc thuộc tớnh của lớp Exception là public vỡ vậy bạn cú thể truy nhập trực
tiếp.
Ánh xạ cỏc cỏc bộ phận
Các bộ phận của lớp ngoại lệ được ánh xạ theo cách tương tự như các cấu
trúc. Tất cả các bộ phận của ngoại lệ là dữ liệu công cộng trong lớp của C++,
và được truy nhập trực tiếp.
Var
Một lớp _var được sinh ra cho một ngoại lệ.
Out
Một lớp Out được sinh ra cho một ngoại lệ.
Cỏc hàm bộ phận
Với ngoại lệ của IDL là TYPE cú cỏc hàm bộ phận sau:
static TYPE * _narrow(CORBA::Exception_ptr Except);
TYPE(); Đây là constructor mặc định cho ngoại lệ
TYPE(cỏc tham chiếu bộ phận);
TYPE (const TYPE & From);
~TYPE ();
TYPE & operator=(const TYPE & From);
void _raise ();
* Quản lý cỏc giao diện (interface)
Một giao diện trong IDL được ỏnh xạ sang một lớp của C++. Lớp này chứa các định nghĩa của cỏc
thao tỏc, cỏc thuộc tớnh, cỏc hằng, và cỏc kiểu người dùng định nghĩa (UDTs).
Với một giao diện INTF, đoạn mó giao diện được sinh ra chứa cỏc phần sau:
• Kiểu tham chiếu đối tượng (INTF_ptr)
• Kiểu biến tham chiếu đối tượng (INTF_var)
• Hàm bộ phận tĩnh _duplicate
• Hàm bộ phận tĩnh _narrow
• Hàm bộ phận tĩnh _nil
• UDTs
• Cỏc hàm bộ phận về cỏc thuộc tớnh và cỏc thao tỏc
Xột vớ dụ sau:
// OMG IDL
- 12 -
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 kiểu tham chiếu đối tượng và các hàm bộ phận được mô tả như sau:
static INTF_ptr _duplicate (INTF_ptr Obj)
Hàm bộ phận tĩnh này sao chép một tham chiếu đối tượng INTF đang tồn tại
và trả lại một tham chiếu đối tượng INTF mới. Tham chiếu đối tượng INTF
mới phải được giải phóng bằng việc gọi hamf bộ phận CORBA::realease. Nếu
một lỗi xuất hiện thỡ một tham chiếu tới đối tượng INTF nil được trả lại. Đối
số Obj xác định tham chiếu đối tượng được sao chép.
static INTF_ptr _narrow (CORBA::Object_ptr Obj)
Hàm bộ phận tĩnh này trả lại một tham chiếu đối tượng INTF mới dựa vào
một tham chiếu đối tượng CORBA::Object_ptr đang tồn tại. Tham chiếu đối tượng
Obiect_ptr có thể được khởi tạo bằng việc gọi hàm bộ phận
CORBA::ORB::string_to_object hoặc cú thể được trả lại như một tham chiếu từ một thao tỏc.
Tham chiếu đối tượng INTF_ptr phải tương ứng với một đối tượng INTF
hoặc tương ứng với một đối tượng mà kế thừa từ đối tượng INTF. Tham chiếu
đối tượng INTF mới phải được giải phóng bằng việc gọi hàm bộ phận
CORBA::release. Đối số Obj xác định tham chiếu đối tượng để thu hẹp tới
- 13 -
một tham chiếu đối tượng INTF. Tham biến Obj không bị thay đổi bởi các
hàm bộ phận này và nên đựoc giải phóng bởi người sử dụng khi nó không
được sử dụng nữa. Nếu Obj không được thu hẹp tới một tham chiếu đối tượng
INTF thỡ một tham chiếu đối tượng INTF nil được trả lại.
static INTF_ptr _nil ( )
Hàm bộ phận static này trả lại một tham chiếu đối tượng nil mới cho giao diện INTF. Tham chiếu
mới khụng phải được giải phúng bằng cỏch gọi hàm bộ phận CORBA::release.
Cỏc kiểu tham chiếu đối tượng
Một lớp giao diện (INTF) là một lớp ảo; CORBA chuẩn khụng cho phộp bạn:
Khởi tạo hay hold một instance của lớp giao diện.
Sử dụng một con trỏ hay một tham chiếu tới một lớp giao diện.
Thay vỡ đó bạn cú thể sử dụng một kiểu tham chiếu đối tượng: lớp INTF_ptr
hay INTF_var.
Bạn cú thể giành được tham chiếu đối tượng bằng việc sử dụng hàm bộ phận
static _nrrow. Cỏc thao tỏc truy nhập trờn cỏc lớp này thỡ sử dụng toỏn tử ->
Lớp _var của INTF đơn giản hoỏ việc quản lý bộ nhớ bằng việc huỷ tự động
tham chiếu đối tượng khi lớp _var của INTF nằm ngoài phạm vi được cấp
phỏt lại.
Cỏc thuộc tớnh
Một thuộc tớnh chỉ đọc trong OMG IDL được ỏnh xạ sang một hàm C++ mà
hàm đó trả lại giỏ trị thuộc tớnh. Một thuộc tính đọc-ghi ỏnh xạ sang hai hàm
C++ được chũng hàm, một hàm trả lại giỏ trị thuộc tớnh và một hàm trả lại
tập giỏ trị thuộc tớnh. Tờn của hàm bộ phận được chồng hàm là tờn của thuộc
tớnh. Cỏc thuộc tính được tạo ra theo cách tương tự mà các hàm được tạo 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.
Trong CORBA các bộ điều hợp đối tượng(object adapter ) liên kết các đối
tượng CORBA với các servant của ngôn ngữ lập trình. Về khái niệm thì bộ
điều hợp đối tượng làm trung gian giữa ORB và các servant của ngôn ngữ lập
- 14 -

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

Đăng nhận xét