Π”ΠΈΠΏΠ»ΠΎΠΌΡ‹, курсовыС, Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅...
Брочная ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅

ВСхнология CORBA

Лабораторная Ρ€Π°Π±ΠΎΡ‚Π°ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π­Ρ‚Π° панСль — ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ внСсти измСнСния. Если Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ дСйствиС мастСра программиста Π½Π΅ ΡƒΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅Ρ‚, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ просто ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π΅Π³ΠΎ названия Π² Π»Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ. Боздавая ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ дСйствиС с ΠΈΠΌΠ΅Π½Π΅ΠΌ WelcomeImpl: Hello (Π² Π»Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ), ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ пустого (Π² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ) ΠΌΠ΅Ρ‚ΠΎΠ΄Π°… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ВСхнология CORBA (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Лабораторная Ρ€Π°Π±ΠΎΡ‚Π°:

ВСхнология CORBA

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ВСстированиС CORBA-соСдинСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ

Рассмотрим созданиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚/сСрвСрной ИБ, состоящСй ΠΈΠ·:

Β· CORBA-сСрвСра, ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ ΠΊ Π½Π΅ΠΌΡƒ CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°;

Β· CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, способного ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊ CORBA-сСрвСру.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ CORBA-сСрвСра

Для построСния CORBA-сСрвСра Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ мастСра CORBA Server ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ File | New | Other | Multitier | CORBA Server (рис. 1).

Рисунок 1

Когда мастСр создания сСрвСра Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (рис. 2):

1. Какого Ρ€ΠΎΠ΄Π° CORBA-сСрвСр слСдуСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ: консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (опция Console Application) ΠΈΠ»ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ (Window Application)? НС Π»ΠΈΡˆΠ½Π΅ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сСрвСр CORBA — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, производящая экзСмпляры ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰Π°Ρ ΠΎΠ± ΡΡ‚ΠΎΠΌ всС заинтСрСсованныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹.

Рисунок 2

2. ИмСна IDL-Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ интСрфСйсов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΊΠ½ΠΎΠΏΠΊΠ° Add) Π»ΠΈΠ±ΠΎ, Ссли ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Add New IDL File, мастСр сам создаст пустой IDL-Ρ„Π°ΠΉΠ» ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

ПослС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ OK гСнСрируСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΈ Π² ΠΎΠΊΠ½Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° открываСтся пустой IDL-Ρ„Π°ΠΉΠ».

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ дСйствиСм Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ описаниС интСрфСйса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ IDL (рис. 5.3).

Рисунок 3

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ описаниС Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ User.idl.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 4.

Рисунок 4

Π’ ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ управлСния Memo1 Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΎΡΠΈΡ‚ΡŒΡΡ строка привСтствия ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ ΠΊ CORBA-сСрвСру ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ CORBAServerProject.

Для создания ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сСрвСром ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ File | New | Other | Multitier | CORBA Object Implementation для запуска ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ мастСра (рис. 5).

Рисунок 5

Π—Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ мастСр собираСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° описания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° IDL ΠΈ ΠΈΠΌΡ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ интСрфСйса) ΠΈ ΠΎΡ‚Π±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π° ΡΠΊΡ€Π°Π½Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ (рис. 5.6).

.

Рисунок 6

Π’ ΠΏΠΎΠ»Π΅ Interface Name слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка имя интСрфСйса User:Welcome; это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π°Π²Ρ‚оматичСскому заполнСнию ΠΈΠΌΠ΅Π½ΠΈ класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ сгСнСрированы мастСром CORBA Object Implementation. Имя самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° WelcomeObject проставляСтся Π² ΠΏΠΎΠ»Π΅ Object Names. Π’ ΡΠ°ΠΌΠΎΠΌ Π½ΠΈΠ·Ρƒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Π² Π»Π΅Π²ΠΎΠΉ Π΅Π΅ ΡΡ‚ΠΎΡ€ΠΎΠ½Π΅ находится ΠΊΠ½ΠΎΠΏΠΊΠ° Show Updates. Π‘ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Show Updates программист ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ всС измСнСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, происходящиС ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π°Π²Ρ‚оматичСской ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ исходных тСкстов. ПослС наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Ok появляСтся ΠΎΠΊΠ½ΠΎ (рис. 7), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСва отобраТаСтся список всСх ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ мастСра дСйствий, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ находятся исходныС тСксты, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… дСйствий.

Рисунок 7

Π­Ρ‚Π° панСль — ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ внСсти измСнСния. Если Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ дСйствиС мастСра программиста Π½Π΅ ΡƒΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅Ρ‚, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ просто ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π΅Π³ΠΎ названия Π² Π»Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ. Боздавая ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ дСйствиС с ΠΈΠΌΠ΅Π½Π΅ΠΌ WelcomeImpl:Hello (Π² Π»Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ), ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ пустого (Π² ΠΏΡ€Π°Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ) ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hello внСсти ΠΊΠΎΠ΄ привСтствия. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ компиляции этого ΠΊΠΎΠ΄Π° Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Ρ„ΠΎΡ€ΠΌΡ‹ #include " CORBAServerUnit.h" , Π° ΡΡΡ‹Π»ΠΊΡƒ extern TForm1 *Form1;.

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (рис. 8).

Рисунок 8

CORBAServerProject.cpp

#include

#pragma hdrstop

//—————————————————————————————————————-

#include «WelcomeServer.h»

#include

USEFORM («CORBAServerUnit.cpp», Form1);

//—————————————————————————————————————-

WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize ();

// Initialize the ORB and BOA

CORBA:ORB_var orb = CORBA: ORB_init (__argc, __argv);

CORBA:BOA_var boa = orb->BOA_init (__argc, __argv);

WelcomeImpl welcome_WelcomeObject («WelcomeObject»);

boa->obj_is_ready (&welcome_WelcomeObject);

Application->CreateForm (__classid (TForm1), &Form1);

Application->Run ();

}

catch (Exception &exception)

{

Application->ShowException (&exception);

}

catch (…)

{

try

{

throw Exception (««);

}

catch (Exception &exception)

{

Application->ShowException (&exception);

}

}

return 0;

}

WelcomeServer.cpp

#pragma hdrstop

#include

#include «WelcomeServer.h»

#include «CORBAServerUnit.h»

//—————————————————————————————————————-

#pragma package (smart_init)

extern TForm1 *Form1;

WelcomeImpl:WelcomeImpl (const char *object_name):

_sk_User:_sk_Welcome (object_name)

{

}

void WelcomeImpl: Hello ()

{

Form1->Memo1->Lines->Add («Hello, client!»);

}

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ CORBA-мастСров C++ Builder являСтся ΠΈΡ… ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ измСнСния Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ исходными тСкстами. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° программист ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ IDL-Ρ„Π°ΠΉΠ», срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ исправляСт Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ (stubs) ΠΈ скСлСты (skeletons) прилоТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

ДСйствия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для проСктирования клиСнтского прилоТСния, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΡΠ»ΠΎΠΆΠ½Ρ‹.

Для построСния CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ мастСра CORBA Client ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ File | New | Other | Multitier | CORBA Server (рис. 5.9).

Рисунок 9

Π’ ΠΏΠΎΡΠ²ΠΈΠ²ΡˆΠ΅ΠΌΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ (рис. 5.10) Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ прилоТСния ΠΈ Π²Π²Π΅ΡΡ‚ΠΈ имя IDL-Ρ„Π°ΠΉΠ»Π° user.idl, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ этого ΠΈΠΌΠ΅Π½ΠΈ, Π° ΠΏΡ€ΠΎΡΡ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ IDL-Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚).

Рисунок 10

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСслоТный интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ с CORBA-сСрвСром (рис. 11).

Рисунок 11

#include

#pragma hdrstop

#include «CORBAClientUnit.h»

#include «user_c.hh» // !!!

//—————————————————————————————————————-

#pragma package (smart_init)

#pragma resource «*.dfm»

TForm2 *Form2;

//—————————————————————————————————————-

__fastcall TForm2: TForm2(TComponent* Owner)

: TForm (Owner)

{

}

//—————————————————————————————————————-

void __fastcall TForm2: Button1Click (TObject *Sender)

{

User:Welcome_var H = User: Welcome:_bind («WelcomeObject»);

H->Hello ();

}

Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ CORBA-сСрвСру» ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ исходный тСкст, производящий Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hello() ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° WelcomeObject интСрфСйса Welcome модуля User.

ВСстированиС ИБ

Для тСстирования Π˜Π‘ слСдуСт Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Smart Agent ΠΈΠ· ΠΌΠ΅Π½ΡŽ Tools (это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° c:Inprisevbrokerbinosagent.exe) (рис. 12).

Рисунок 12

ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (Π²Π½Π΅ срСды C++ Builder) Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ CORBA-сСрвСр ΠΈ CORBA-ΠΊΠ»ΠΈΠ΅Π½Ρ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ ИБ

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ ИБ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ· Π±Π°Π½ΠΊΠΎΠΌΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ Π±Π°Π½ΠΊΠ° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΅ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (рис. 15).

Рисунок 15

Для ускорСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… сСрвСры Π±Π°Π½ΠΊΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ коммСнтариями ΠΊ Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Xaction.idl

enum EnumAction {

balance,

withdraw,

deposit

};

enum EnumStatus {

OK,

invalid,

complete,

incomplete

};

struct xaction {

long UserID;

long PIN;

long account;

double amount;

:EnumAction action;

double balance;

:EnumStatus status;

};

interface Server {

exception NoServer {

string message;

};

:xaction HandleTransaction (

inout :xaction Transaction

);

/* raises (

:Server:NoServer

);

*/

long Balance ();

};

banking.idl

#include «xaction.idl»

interface BankServer {

:xaction HandleTransaction (

inout :xaction Transaction

);

long BankID ();

};

module Bank {

interface Account {

float balance ();

};

interface AccountManager {

:Bank:Account open (

in string name

);

};

};

Рисунок 16. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΈΠ½Ρ‚СрфСйс Π±Π°Π½ΠΊΠΎΠΌΠ°Ρ‚Π°

Рисунок 17. Π Π΅ΠΆΠΈΠΌ «ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅»

ATMUnit/h

//—————————————————————————————————————-

#ifndef atmunitH

#define atmunitH

//—————————————————————————————————————-

#include

#include

#include

#include

#include

#include

#include

//—————————————————————————————————————-

class ATMObject

{

private:

long _ID;

String _serverName;

public:

ATMObject (){_serverName = «Wells Fargo»; _ID = 100;};

ATMObject (String name){_serverName = name; _ID = 100;};

String serverName (){return _serverName;}

void serverName (String name){_serverName = name;}

long ID (){return _ID;}

void ID (long id){_ID = id;}

};

class TFormATM: public TForm

{

__published: // IDE-managed Components

TEdit *NameBox;

TEdit *PINBox;

TEdit *AmountBox;

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TRadioGroup *Action;

TMemo *Memo1;

TRadioGroup *AccountType;

TStatusBar *StatusBar1;

TBitBtn *BitBtn1;

TBitBtn *BitBtn2;

TGroupBox *GroupBox1;

TGroupBox *GroupBox2;

TBitBtn *BitBtn3;

TLabel *Label4;

TLabel *Label5;

TBevel *Bevel1;

void __fastcall FormCreate (TObject/* */ *Sender);

void __fastcall BitBtn1Click (TObject *Sender);

void __fastcall BitBtn2Click (TObject *Sender);

void __fastcall BitBtn3Click (TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TFormATM (TComponent* Owner);

ATMObject * ATM;

long __fastcall TestConnection ();

};

//—————————————————————————————————————-

extern PACKAGE TFormATM *FormATM;

//—————————————————————————————————————-

#endif

ATMUnit.cpp

#include

#pragma hdrstop

#include «atmunit.h»

#include «servname.h»

#include «xaction_c.hh»

//—————————————————————————————————————-

#pragma package (smart_init)

#pragma resource «*.dfm»

USE_STD_NS

TFormATM *FormATM;

//—————————————————————————————————————-

__fastcall TFormATM: TFormATM (TComponent* Owner)

: TForm (Owner)

{

}

char * const * argV;

int argC;

//—————————————————————————————————————-

// /////////////////////////////////////

// Mimic streaming to VCL Memo Window

// /////////////////////////////////////

class catchit: public streambuf

{

TMemo * M;

int ct;

String S;

char * cbuff;

public:

catchit (TMemo *Memo){M = Memo; ct = 1;};

int sync ();

int overflow (int ch);

};

int catchit: overflow (int ch)

{

S += (char)ch;

return 0;

}

int catchit: sync ()

{

// M->Lines->Strings[ct++] = S;

M->Lines->Add (S);

S = «» ;

return ct;

}

// ////////////////////////////////////////////

// class _update

// Instantiate this object to interface with the view

// Usage: new _update (FormATM);

// ////////////////////////////////////////////

class _update

{

private:

TFormATM * theForm;

public:

__fastcall _update (TFormATM* ATMForm)

{

theForm = ATMForm;

}

long AccountType ()

{

return (long)theForm->AccountType->ItemIndex + 1;

}

EnumAction ActionType ()

{

return (EnumAction)theForm->Action->ItemIndex;

}

long UserID ()

{

if (theForm->NameBox->Text == «John») return 0;

if (theForm->NameBox->Text == «Bill») return 1;

if (theForm->NameBox->Text == «Jim») return 2;

if (theForm->NameBox->Text == «Gene») return 3;

if (theForm->NameBox->Text == «Wally») return 4;

if (theForm->NameBox->Text == «Frank») return 5;

return -1; // нСизвСстный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

}

long PIN()

{ try {

return (long)theForm->PINBox->Text.ToInt ();

} catch (Exception &e) {

return (long)0;

}

}

double Amount ()

{

return theForm->AmountBox->Text.ToDouble ();

}

void UpdateList ()

{ theForm->Memo1->Lines->Clear ();

theForm->Memo1->Lines->Add («John, PIN:123, Bank 1»);

theForm->Memo1->Lines->Add («Bill, PIN:456, Bank 1»);

theForm->Memo1->Lines->Add («Jim, PIN:789, Bank 1»);

theForm->Memo1->Lines->Add («Gene, PIN:123, Bank 2»);

theForm->Memo1->Lines->Add («Wally, PIN:456, Bank 2»);

theForm->Memo1->Lines->Add («Frank, PIN:789, Bank 2»);

}

void UpdateMemo (String str)

{

theForm->Memo1->Lines->Add (str);

}

void UpdateStatus (String str)

{

theForm->StatusBar1->SimpleText = str;

}

void Clear ()

{

theForm->Memo1->Clear ();

}

};

#define mrOK 1

long __fastcall TFormATM: TestConnection ()

{ // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° соСдинСния

try {

CORBA:ORB_ptr orb = CORBA: ORB_init ();

Server_ptr S = Server:_bind (ServerNameDlg->ServerNameEdit->Text.c_str ());

return S->Balance ();

} catch (CORBA:Exception &e) {

return 0;

}

}

//—————————————————————————————————————-

void __fastcall TFormATM: FormCreate (TObject *Sender)

{

ATM = new ATMObject ();

}

//—————————————————————————————————————-

void __fastcall TFormATM: BitBtn1Click (TObject *Sender)

{ // АдминистрированиС

if (ServerNameDlg->ShowModal () == mrOK) {

ATM->serverName (ServerNameDlg->ServerNameEdit->Text);

}

}

//—————————————————————————————————————-

void __fastcall TFormATM: BitBtn2Click (TObject *Sender)

{ // Бписок ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

_update * U = new _update (FormATM);

U->UpdateList ();

delete U;

}

//—————————————————————————————————————-

void __fastcall TFormATM: BitBtn3Click (TObject *Sender)

{ // Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

catchit cbuf(Memo1);

ostream CCout(&cbuf); // Visibroker ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Cout

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ интСрфСйса просмотра ATM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

_update* Input = new _update(FormATM);

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

xaction_var X = new xaction;

// «Π—асСлСниС» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

X->UserID = Input->UserID();

try {

X->PIN = Input->PIN ();

} catch (Exception &e) {

X->PIN = 0;

}

X->amount = Input->Amount ();

X->action = Input->ActionType ();

X->account = Input->AccountType ();

X->balance = 0.00;

X->status = incomplete;

try {

// Π‘Ρ‚Π°Ρ€Ρ‚ ORB

CORBA:ORB_ptr orb = CORBA: ORB_init ();

Input->UpdateStatus(«* ORB Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.»);

// ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ ATM-сСрвСру

Server_ptr ATMServer = Server:_bind (ATM->serverName ().c_str ());

Input->UpdateStatus(«ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ ATM-сСрвСру Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.»);

Input->UpdateStatus («ATM-сСрвСр ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚.»);

// ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ATM-сСрвСру

ATMServer->HandleTransaction (X);

if (X->status == complete) {

Input->UpdateMemo («Π‘аланс счёта: $» + CurrToStr (X->balance));

Input->UpdateMemo («Π’ранзакция Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.»);

} else if (X->status == incomplete) {

Input->UpdateMemo(«Π’ранзакция Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π°.»);

Input->UpdateMemo («Π‘аланс счёта: $» + CurrToStr (X->balance));

} else if (X->status == invalid) {

Input->Clear ();

Input->UpdateMemo («* ID ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ PIN Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹!»);

}

}

catch (const CORBA: Exception& e) {

CCout << e._name () << endl;

Input->UpdateStatus («* ATM-сСрвСр ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½!»);

}

}

//—————————————————————————————————————-

Servername.h

//——————————————————————————————————————

#ifndef servnameH

#define servnameH

//——————————————————————————————————————

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//——————————————————————————————————————

class TServerNameDlg: public TForm

{

__published:

TButton *OKBtn;

TButton *CancelBtn;

TBevel *Bevel1;

TLabel *Label1;

TLabel *ServerNameLabel;

TEdit *ServerNameEdit;

TLabel *Label2;

TButton *ConnectButton;

TLabel *Label3;

TLabel *CountLabel;

TLabel *ResultLabel;

void __fastcall FormShow (TObject/* */ *Sender);

void __fastcall ConnectButtonClick (TObject/* */ *Sender);

void __fastcall OKBtnClick (TObject/* */ *Sender);

private:

public:

virtual __fastcall TServerNameDlg (TComponent* AOwner);

};

//——————————————————————————————————————

extern PACKAGE TServerNameDlg *ServerNameDlg;

//——————————————————————————————————————

#endif

Servername.cpp

#include

#pragma hdrstop

#include «servname.h»

#include «atmunit.h»

//——————————————————————————————————-

#pragma resource «*.dfm»

TServerNameDlg *ServerNameDlg;

//——————————————————————————————————-

__fastcall TServerNameDlg: TServerNameDlg (TComponent* AOwner)

: TForm (AOwner)

{

}

//——————————————————————————————————-

void __fastcall TServerNameDlg: FormShow (TObject/* */ *Sender)

{

ServerNameLabel->Caption = FormATM->ATM->serverName ();

ServerNameEdit->Text = ServerNameLabel->Caption;

ResultLabel->Caption = «» ;

}

//—————————————————————————————————————-

void __fastcall TServerNameDlg: ConnectButtonClick (TObject/* */ *Sender)

{

CountLabel->Caption = String (FormATM->TestConnection ());

if (CountLabel->Caption == «0»)

ResultLabel->Caption = «* БоСдинСния Π½Π΅Ρ‚!» ;

else

ResultLabel->Caption = «Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ установлСно.» ;

}

//—————————————————————————————————————-

void __fastcall TServerNameDlg: OKBtnClick (TObject/* */ *Sender)

{

if (CountLabel->Caption ≠ String («0»)) {

FormATM->ATM->serverName (ServerNameEdit->Text);

}

}

//—————————————————————————————————————-

Рисунок 5.18. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΈΠ½Ρ‚СрфСйс ATM-сСрвСра

#ifndef atmserverunitH

#define atmserverunitH

//—————————————————————————————————————-

#include

#include

#include

#include

#include «xaction_s.hh»

#include «banking_s.hh»

#include

//—————————————————————————————————————-

class TForm2: public TForm

{

__published: // IDE-managed Components

TLabel *Transactions;

TEdit *Count;

TEdit *ServerNameEdit;

TLabel *Label1;

TBitBtn *BitBtn1;

TGroupBox *GroupBox2;

TGroupBox *GroupBox1;

TBitBtn *BitBtn2;

TMemo *Memo1;

TComboBox *BankBox;

void __fastcall FormClose (TObject *Sender, TCloseAction &Action);

void __fastcall BitBtn1Click (TObject *Sender);

void __fastcall BitBtn2Click (TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm2(TComponent* Owner);

void StartServer ();

void DownServer ();

CORBA:ORB_var orb;

CORBA:BOA_var boa;

CORBA:Object_ptr obj;

String CurrentServerName;

};

//—————————————————————————————————————-

extern PACKAGE TForm2 *Form2;

//—————————————————————————————————————-

#endif

ATMServerUnit.cpp

#include

#pragma hdrstop

#include «atmserverunit.h»

//—————————————————————————————————————-

#pragma package (smart_init)

#pragma resource «*.dfm»

TForm2 *Form2;

//—————————————————————————————————————-

__fastcall TForm2: TForm2(TComponent* Owner)

: TForm (Owner)

{

}

//—————————————————————————————————————-

char * const * argV;

int argC;

//—————————————————————————————————————-

// /////////////////////////////////////

// Implement CORBA object from skeleton class

// /////////////////////////////////////

class ATMServerImpl: public _sk_Server

{

public:

ATMServerImpl (const char *object_name);

void UpCount (int i = 0){

if (i == 1) {

Form2->Memo1->Lines->Add («ATM-сСрвСр Π²ΠΊΠ»ΡŽΡ‡Π΅Π½.»);

return;

}

Form2->Count->Text = String (count++);

}

virtual xaction HandleTransaction (xaction& Transaction)

{

UpCount ();

Form2->Memo1->Lines->Add («Π‘Π°Π½ΠΊ Π½Π°ΠΉΠ΄Π΅Π½.»);

Transaction.status = invalid;

for (int i = 0; i < UserCount; i++) {

if (Transaction.UserID == CardHolders[i]->UserID) {

if (Transaction.PIN == CardHolders[i]->PIN) {

Transaction.status = OK;

try {

BankServer_var BankServer = BankServer:_bind ((*Banks[CardHolders[i]->Bank]).c_str ());

BankServer->HandleTransaction (Transaction);

Form2->Memo1->Lines->Add («Π’ранзакция с «+ *Banks[CardHolders[i]->Bank]);

} catch (CORBA:Exception &e){

Form2->Memo1->Lines->Add («* Π‘Π΅Ρ€Π²Π΅Ρ€ Π±Π°Π½ΠΊΠ° нСдоступСн!»);

return Transaction;

}

}

}

}

// Transaction. status = complete;

return Transaction;

}

virtual CORBA: Long Balance (){UpCount (); return CORBA: Long (count);}

class NoServer: public CORBA: UserException

{

public:

NoServer (){}

static ATMServerImpl: NoServer* _narrow () throw (CORBA:SystemException);

};

private:

int count;

struct _user{

long UserID;

long Bank;

long PIN;

};

_user * CardHolders[10];

long BankOne;

long BankTwo;

int UserCount;

String * Banks[10];

};

ATMServerImpl:ATMServerImpl (const char *object_name=NULL) :

_sk_Server (object_name)

{

count = 0;

UserCount = 0;

UpCount (1);

Banks[0] = new String («BankOne»);

Banks[1] = new String («BankTwo»);

TStrings *SL = new TStringList ();

SL->Add (*Banks[0]);

SL->Add (*Banks[1]);

Form2->BankBox->Items->Assign (SL);

Form2->BankBox->ItemIndex = 0;

BankOne = 0;

BankTwo = 1;

CardHolders[0] = new _user;

CardHolders[1] = new _user;

CardHolders[2] = new _user;

CardHolders[3] = new _user;

CardHolders[4] = new _user;

CardHolders[5] = new _user;

// user 1

CardHolders[0]->UserID = 0; // «John» ;

CardHolders[0]->PIN = 123;

CardHolders[0]->Bank = BankOne;

UserCount++;

CardHolders[1]->UserID = 1; // «Bill» ;

CardHolders[1]->PIN = 456;

CardHolders[1]->Bank = BankOne;

UserCount++;

CardHolders[2]->UserID = 2; // «Jim» ;

CardHolders[2]->PIN = 789;

CardHolders[2]->Bank = BankOne;

UserCount++;

CardHolders[3]->UserID = 3; // «John» ;

CardHolders[3]->PIN = 123;

CardHolders[3]->Bank = BankTwo;

UserCount++;

CardHolders[4]->UserID = 4; // «Bill» ;

CardHolders[4]->PIN = 456;

CardHolders[4]->Bank = BankTwo;

UserCount++;

CardHolders[5]->UserID = 5; // «Jim» ;

CardHolders[5]->PIN = 789;

CardHolders[5]->Bank = BankTwo;

UserCount++;

}

ATMServerImpl* ATMServer;

void TForm2: StartServer ()

{

try {

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ORB ΠΈ BOA

orb = CORBA: ORB_init (argC, argV);

boa = orb->BOA_init (argC, argV);

if (obj) {

Form2->Memo1->Lines->Add («* ATM-сСрвСр ΡƒΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½!»);

ServerNameEdit->Text = CurrentServerName;

} else {

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

obj = new ATMServerImpl (ServerNameEdit->Text.c_str ()); //" Wells Fargo");

CurrentServerName = ServerNameEdit->Text;

// Экспорт созданного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

boa->obj_is_ready (obj);

// ОТиданиС приходящих запросов

// boa->impl_is_ready();

}

} catch (const CORBA: Exception& e) {

ShowMessage («* ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ CORBA-ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅!»);

}

}

void TForm2: DownServer ()

{

try {

if (obj) {

boa->deactivate_obj (obj);

obj->_release ();

obj = obj->_nil ();

}

Form2->Memo1->Lines->Add («* ATM-сСрвСр ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½!»);

} catch (CORBA:Exception &e){

ShowMessage («* ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ATM-сСрвСра!»);

}

}

//—————————————————————————————————————-

class ServerThread: public TThread

{

public:

__fastcall ServerThread (bool CS):TThread (CS){};

void __fastcall Execute ()

{

try {

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π²Ρ†ΠΈΡ ORB ΠΈ BOA

CORBA:ORB_var orb = CORBA: ORB_init (argC, argV);

CORBA:BOA_var boa = orb->BOA_init (argC, argV);

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ATMServerImpl ATMServerWells Fargo»);

// Экспорт созданного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

boa->obj_is_ready(&ATMServer);

// ОТиданиС приходящих запросов

boa->impl_is_ready();

} catch (const CORBA: Exception& e) {

ShowMessage («* ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ CORBA-ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅!»);

}

}

};

ServerThread * ST;

//—————————————————————————————————————-

void __fastcall TForm2: FormClose (TObject *Sender, TCloseAction &Action)

{ // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сСрвСра

BitBtn1->Caption = «Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ AYM-сСрвСра» ;

DownServer ();

}

//—————————————————————————————————————-

void __fastcall TForm2: BitBtn1Click (TObject *Sender)

{ // Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ATM-сСрвСра

static bool ServerStarted = false;

if (!ServerStarted) { // Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сСрвСра

Form2->Height = 237;

BitBtn1->Caption = «ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ATM-сСрвСра» ;

// ST = new ServerThread (false);

StartServer ();

} else { // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сСрвСра

Form2->Height = 108;

BitBtn1->Caption = «Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ATM-сСрвСра» ;

DownServer ();

}

ServerStarted = !ServerStarted;

}

//—————————————————————————————————————-

void __fastcall TForm2: BitBtn2Click (TObject *Sender)

{ // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π² ΡΠΏΠΈΡΠΊΠ΅ Π±Π°Π½ΠΊΠ°

try { // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π² ΡΠΏΠΈΡΠΊΠ΅ Π±Π°Π½ΠΊΠ°

BankServer_ptr BankServer =

BankServer:_bind (Form2->BankBox->Items->Strings[BankBox->ItemIndex]. c_str ());

// занСсСниС ID Π±Π°Π½ΠΊΠ° Π² Memo

long ID = BankServer->BankID ();

Form2->Memo1->Lines->Add (

AnsiString («Π‘Π°Π½ΠΊ «) +

(ID == 800? AnsiString («BankTwo»): AnsiString («BankOne»)) +

AnsiString («ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½.»));

} catch (CORBA:Exception &e){

ShowMessage (e._name ());

}

}

Рисунок 5.19. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ интСрфСйс BankServerOne

#ifndef BankUnitOneH

#define BankUnitOneH

//—————————————————————————————————————-

#include

#include

#include

#include

#include

#include

//—————————————————————————————————————-

class TBankOneForm: public TForm

{

__published: // IDE-managed Components

TEdit *CountBox;

TLabel *Label1;

TMemo *Memo1;

TBitBtn *BitBtn1;

TStatusBar *StatusBar1;

void __fastcall BitBtn1Click (TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TBankOneForm (TComponent* Owner);

};

//—————————————————————————————————————-

extern PACKAGE TBankOneForm *BankOneForm;

//—————————————————————————————————————-

#endif

BankUnitOne.cpp

//—————————————————————————————————————-

#include

#pragma hdrstop

#include «BankUnitOne.h»

#include «banking_s.hh»

//—————————————————————————————————————-

#pragma package (smart_init)

#pragma resource «*.dfm»

AnsiString Accounts [] = {" ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°", «ΠšΡ€Π΅Π΄ΠΈΡ‚» };

AnsiString Operations [] = {" Баланс", «Π‘Π½ΡΡ‚ΡŒ», «Π’нСсти» };

TBankOneForm *BankOneForm;

//—————————————————————————————————————-

__fastcall TBankOneForm: TBankOneForm (TComponent* Owner)

: TForm (Owner)

{

}

//—————————————————————————————————————-

char * const * argV;

int argC;

//—————————————————————————————————————-

// ///////////////////////////////////////////

// Implement CORBA object from skeleton class

// ///////////////////////////////////////////

class BankServerImpl: public _sk_BankServer

{

public:

BankServerImpl (const char *object_name);

void UpCount (int i = 0) {

if (i == 1) {

BankOneForm->StatusBar1->SimpleText = «Π‘Π΅Ρ€Π²Π΅Ρ€ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½» ;

return;

}

BankOneForm->CountBox->Text = String (++count);

}

virtual long BankID ()

{

return BankNumber;

}

virtual xaction HandleTransaction (xaction& Transaction)

{

bool PostChange = false;

double workingBalance = 0;

UpCount ();

Transaction.status = incomplete;

BankOneForm->Memo1->Lines->Add («ID ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°: «+ String (Transaction.UserID));

BankOneForm->Memo1->Lines->Add («Π‘Ρ‡Π΅Ρ‚: « + Accounts[Transaction.account]);

BankOneForm->Memo1->Lines->Add («ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ: « + Operations[Transaction.action]);

for (int i = 0; i < UserCount; i++) {

if (Transaction.UserID == Customers[i]->UserID) {

if (Transaction.account == 1)

workingBalance = Customers[i]->AccountChecking;

else

workingBalance = Customers[i]->AccountSavings;

switch (Transaction.action) {

case balance:

Transaction.balance = workingBalance;

Transaction.status = complete;

break;

case withdraw:

Transaction.balance = workingBalance;

workingBalance -= Transaction. amount;

if (workingBalance < 0) {

Transaction.status = incomplete;

} else {

Transaction.balance = workingBalance;

Transaction.status = complete;

PostChange = true;

}

break;

case deposit:

workingBalance += Transaction. amount;

Transaction.balance = workingBalance;

Transaction.status = complete;

PostChange = true;

break;

}

if (PostChange) {

if (Transaction.account == 1)

Customers[i]->AccountChecking = workingBalance;

else

Customers[i]->AccountSavings = workingBalance;

}

}

}

return Transaction;

}

private:

long BankNumber;

int count;

int UserCount;

struct _user{

long UserID;

double AccountChecking;

double AccountSavings;

};

_user * Customers[10];

};

BankServerImpl:BankServerImpl (const char *object_name = NULL):

_sk_BankServer (object_name)

{

BankNumber = 900;

count = 0;

UserCount = 0;

Customers[0] = new _user;

Customers[1] = new _user;

Customers[2] = new _user;

Customers[0]->UserID = 0; // «John»

Customers[0]->AccountChecking = 2000.00;

Customers[0]->AccountSavings = 90.00;

UserCount++;

Customers[1]->UserID = 1; // Bill;

Customers[1]->AccountChecking = 100.00;

Customers[1]->AccountSavings = 500.00;

UserCount++;

Customers[2]->UserID = 2; // Jim;

Customers[2]->AccountChecking = 1000.00;

Customers[2]->AccountSavings = 5000.00;

UserCount++;

}

//—————————————————————————————————————-

class ServerThread: public TThread

{

public:

__fastcall ServerThread (bool CS):TThread (CS){};

void __fastcall Execute ()

{

try {

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ОRB ΠΈ BOA

CORBA:ORB_var orb = CORBA: ORB_init (argC, argV);

CORBA:BOA_var boa = orb->BOA_init (argC, argV);

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сСрвСрного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

BankServerImpl BankServerBankOne»);

// Экспорт сСрвСроного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

boa->obj_is_ready(&BankServer);

BankOneForm->StatusBar1->SimpleText = «Π‘Π΅Ρ€Π²Π΅Ρ€ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½» ;

// ОТиданиС приходящих запросов

boa->impl_is_ready();

} catch (const CORBA: Exception& e) {

ShowMessage («* ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ CORBA-ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅!»);

}

}

};

ServerThread * ST;

//—————————————————————————————————————-

void __fastcall TBankOneForm: BitBtn1Click (TObject *Sender)

{ static bool Switch = false;

Switch = !Switch;

BitBtn1->Caption = «ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сСрвСра Π±Π°Π½ΠΊΠ°» ;

if (Switch) ST = new ServerThread (false);

else Close();

}

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ