Corba. Динамічні виклики 2006 Зміст


НазваCorba. Динамічні виклики 2006 Зміст
Дата конвертації23.03.2013
Розмір445 b.
ТипПрезентации


CORBA. Динамічні виклики

  • 2006


Зміст

  • Статичні та динамічні виклики.

  • Метадані та рефлексія у CORBA. Interface Repository.

  • Динамічні виклики з використанням C++Builder 6.

  • Тип Any.

  • Динамічні виклики з використанням Delphi 7.



Механізм Dynamic Invocation - DI (або DII - Dynamic Invocation Interface ) та динамічні виклики

  • DIIDynamic Invocation Interface (Інтерфейс Динамічних Викликів).

  • Зауваження 1. Як статичний, так і DII-клієнт можуть взаємодіяти з CORBA-об'єктом на боці сервера, при цьому сервер не “знає” (не відчуває різниці), який з двох механізмів викликів застосовується клієнтом.



Динамічні виклики та IOR

  • Зауваження 2. Як статичний, так і динамічний клієнти здатні взаємодіяти із серверним CORBA-об'єктом (шляхом викликів методів останнього), тільки отримавши (не істотно яким саме чином) інтероперабельне об'єктне посилання IOR.

  • Таке посилання можна, зокрема, отримувати з SIOR (Stringified IOR).

  • Крім того, наприклад, VisiBroker дозволяє отримати IOR (“приєднатись до придатного серверного CORBA-об'єкта”), використовуючи нестандартний метод ORB::bind() з RepositoryID у якості параметра.



Метадані та рефлексія у CORBA. Interface Repository

  • Interface Repository (IR) можна розглядати як realtime базу даних інтерфейсів CORBA.

  • При наявності занесеної до IR інформації про інтерфейс “дістатись до цього інтерфейсу” можна, відштовхуючись безпосередньо від CORBA-об'єкта (об'єктного посилання).

  • Приклад (VisiBroker):

  • CORBA_InterfaceDef_var intDef;

  • intDef = obj->_get_interface().

  • (Нагадаємо, що IOR можна отримати за RepositoryID).



Interface Repository. Деякі приклади використання (VisiBroker)

  • Приклад створення IR з іменем “MyIR” та одночасне занесення даних про інтерфейси з IDL-файлу “addit.idl” :

  • irep MyIR addit.idl

  • Приклад перегдяду IR з іменем “MyIR”:

  • ir2idl -irep MyIR (idl2ir – це утиліта VisiBroker, яка виступає у ролі клієнта irep, що також є утилітою VisiBroker).

  • Приклад здійснення замін в IR з іменем “MyIR”:

  • idl2ir -irep MyIR -replace addit.idl



Стандартні CORBA-інтерфейси для динамічних викликів





float _a1 = 11;

  • float _a1 = 11;

  • float _a2 = 22;

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

  • CORBA::Object_var mo = orb->bind ("IDL:sm:1.0");

  • CORBA::Request_var req = mo->_request("add");

  • CORBA::NVList_ptr args = req->arguments();

  • CORBA::Any param;

  • param <<= (CORBA::Float)_a1;

  • args->add_value ("a1", param, CORBA::ARG_IN);

  • param <<= (CORBA::Float)_a2;

  • args->add_value ("a2", param, CORBA::ARG_IN);

  • CORBA::NamedValue_ptr result = req->result();

  • CORBA::Any_ptr resultAny = result->value();

  • resultAny->replace (CORBA::_tc_float, &result);

  • req->invoke();

  • float r = *(CORBA::Float*)resultAny->value();

  • ShowMessage("Result -- "+FloatToStr(r));



float _a1 = 11;

  • float _a1 = 11;

  • float _a2 = 22;

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

  • CORBA::Object_var mo = orb->bind ("IDL:sm:1.0");

  • CORBA::Request_var req = mo->_request("add");

  • CORBA::NVList_ptr args = req->arguments();

  • CORBA::Any param;

  • param <<= (CORBA::Float)_a1;

  • args->add_value ("a1", param, CORBA::ARG_IN);

  • param <<= (CORBA::Float)_a2;

  • args->add_value ("a2", param, CORBA::ARG_IN);

  • CORBA::NamedValue_ptr result = req->result();

  • CORBA::Any_ptr resultAny = result->value();

  • resultAny->replace (CORBA::_tc_float, &result);

  • req->invoke();

  • float r = *(CORBA::Float*)resultAny->value();

  • ShowMessage("Result -- "+FloatToStr(r));



Тип CORBA::Any

  • Any-об'єкт містить дві складові стосовно поточного даного:

    • TypeCode (закодований тип даного; базовою основою коду є значення з enum TCKind);
    • значення поточного даного (у відповідності до його поточного типу – TypeCode).
  • Основи використання any-об'єктів:

    • об'єкт типу Any бере на себе управління пам'яттю для власних даних.
    • для запису і читання any передбачені стандартні (чи згенеровані компілятором idl2cpp) функції. Для зручного виконання цих функцій перевизначаються операції <<= та >>=.
    • метод type() дозволяє визначити поточний тип даного, що знаходиться в any: CORBA::TypeCode_var type_code = v->type();
    • TypeCode для заданого програмістом типу створюється компілятором idl2cpp автоматично за IDL-описом такого типу.


Деякі методи TypeCode. _tc_-константи

  • Основними методами інтерфейсу TypeCode є наступні:

  • kind() – повертає TCKind для TypeCode.

  • id() – повертає репозиторний ідентифікатор (Repository ID).

  • equal() – порівнює, чи є об'єкт типу TypeCode, для якого викликається цей метод, “еквівалентним” аргументу методу.

  • Для значень стандартних TypeCode IDL-типів, що не вимагають ніякої додаткової інформації, окрім TCKind, визначено константи (типу const CORBA:: TypeCode_ptr):

  • _tc_null _tc_void _tc_short _tc_long

  • _tc_ushort _tc_ulong _tc_float _tc_double

  • _tc_boolean _tc_char _tc_octet _tc_any

  • _tc_TypeCode _tc_Object _tc_string _tc_longlong

  • _tc_ulonglong _tc_longdouble _tc_wchar _tc_wstring

  • Для інших типів даних відповідні _tc_-константи генеруються безпосередньо компілятором idl2cpp.

  • IDL: typedef sequence LongSeq20;

  • C++: extern CORBA::TypeCode_ptr _tc_LongSeq20;



enum TCKind

  • enum TCKind

  • {

  • tk_null, tk_void, tk_short, tk_long,

  • tk_ushort, tk_ulong, tk_float, tk_double,

  • tk_boolean, tk_char, tk_octet, tk_any,

  • tk_TypeCode, tk_Principal, tk_objref, tk_struct,

  • tk_union, tk_enum, tk_string, tk_sequence,

  • tk_array, tk_alias, tk_except, tk_longlong,

  • tk_ulonglong, tk_longdouble, tk_wchar, tk_wstring,

  • tk_fixed, tk_value, tk_value_box, tk_native,

  • tk_abstract_interface

  • };



Значення CORBA::Any. Приклад (структура)

  • Any-об'єкт для структури

    • // TypeCode структури:
      • TCKind (= tk_struct): // Kind of TypeCode
      • Ім'я структури
      • Ім'я першого поля
      • // TypeCode першого поля
        • TCKind першого поля
        • . . .
      • Ім'я другого поля
      • // TypeCode другого поля
        • TCKind другого поля
        • . . .
      • RepositoryID
    • // Значення поточного даного (значення окремих полів структури) . . .






Динамічні виклики (Delphi 7)



Маршалізація та демаршалізація у стабі addit_c.pas (фрагменти)

  • TsmStub = class(CORBA.TCORBAObject, addit_i.sm)

  • public

  • function add ( const a1 : Single;

  • const a2 : Single): Single; virtual;

  • end;

  • function TsmStub.add ( const a1 : Single;

  • const a2 : Single): Single;

  • var

  • _Output: CORBA.OutputStream;

  • _Input : CORBA.InputStream;

  • begin

  • inherited _CreateRequest('add',True, _Output);

  • _Output.WriteFloat(a1);

  • _Output.WriteFloat(a2);

  • inherited _Invoke(_Output, _Input);

  • _Input.ReadFloat(Result);

  • end;



Динамічні виклики (Delphi 7). Приклад



Стаб для файлу test.idl



Рефлексія. Приклад

  • Створення IR з іменем “MyIR” та одночасне занесення до IR даних про інтерфейси з IDL-файлу “addit.idl” :

  • irep MyIR ar_d_.idl



Рефлексія. Приклад (фрагмент клієнтської програми)

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

  • CORBA::NVList_var operation_list;

  • CORBA::OperationDef_var odef;

  • CORBA_Repository_var ir = CORBA_Repository::_narrow(orb->

  • resolve_initial_references("InterfaceRepository"));

  • CORBA::InterfaceDef_var intdf =

  • CORBA_InterfaceDef::_narrow(ir->lookup("::I_Ar"));

  • CORBA_InterfaceDef::FullInterfaceDescription_var fullDesc =

  • intdf->describe_interface();

  • . . . fullDesc->operations.length();

  • . . . fullDesc->operations[i].name;

  • . . . fullDesc->attributes.length();

  • . . . fullDesc->attributes[i].name;

  • CORBA::Contained_var container = intdf->lookup("add");

  • odef = CORBA::OperationDef::_narrow(container);

  • orb->create_operation_list(odef, operation_list.out());

  • operation_list->count();



Рефлексія. Код клієнтської програми

  • Приклад створення IR з іменем “MyIR”та одночасним занесенням даних про інтерфейси з IDL-файлу “addit.idl” :

  • irep MyIR addit.idl

  • Приклад перегдяду IR з іменем “MyIR”:

  • ir2idl -irep MyIR (idl2ir – це утиліта VisiBroker, яка виступає у ролі клієнта irep, що також є утилітою VisiBroker).

  • Приклад здійснення замін в IR з іменем “MyIR”:

  • idl2ir -irep MyIR -replace addit.idl

  • irep MyIR ar_d_.idl



Додаток



Class TORB



Interface OutputStream



CORBAObject

  • CORBAObject = interface

  • ['{B5467DDF-8003-11D2-AAF6-00C04FB16F42}']

  • function _Clone: CORBAObject;

  • procedure _CreateRequest(const Operation: string;

  • ResponseExpected: Boolean;

  • out Output: OutputStream);



CORBA_NamedValue, CORBA_NamedValue_ptr

  • class _VISEXPORT CORBA_NamedValue;

  • typedef CORBA_NamedValue* CORBA_NamedValue_ptr;

  • class _VISEXPORT CORBA_NamedValue : private VISResource

  • {

  • . . .

  • private:

  • CORBA::String_var _name;

  • CORBA_Any_var _value;

  • CORBA::Flags _flags;

  • . . .

  • public:

  • const char *name() const { return _name; }

  • CORBA_Any *value() { return _value; }

  • CORBA::Flags flags() const { return _flags; }



CORBA_NamedValue, CORBA_NamedValue_ptr (прод.)

  • . . .

  • // The return values should not be released.

  • CORBA_NamedValue_ptr add(CORBA::Flags);

  • CORBA_NamedValue_ptr add_item(const char *name,

  • CORBA::Flags flags);

  • CORBA_NamedValue_ptr add_value(const char *name,

  • const CORBA_Any& any,

  • CORBA::Flags flags);



Flags

  • typedef Long Flags;

  • static const Long ARG_IN;

  • static const Long ARG_OUT;

  • static const Long ARG_INOUT;



CORBA::Any. Запис і читання

  • CORBA::Any_var v;

  • v <<= (CORBA::Long)22;

  • CORBA::Long vl;

  • v >>= vl;

  • char* str = "String"; // AnsiString

  • v <<= str;

  • char * s_copy;

  • v >>= s_copy;

  • v <<= CORBA::string_dup ("Dynamic string");

  • v >>= s_copy;



Any. Метод replace

  • // Inprise Extension

  • void replace(CORBA_TypeCode_ptr,

  • const CORBA_MarshalOutBuffer&);



Поля class _VISEXPORT CORBA_Request_var

  • CORBA::MarshalOutBuffer_var _buf;

  • CORBA::Object_var _target;

  • CORBA::String_var _operation;

  • CORBA::NVList_var _arguments;

  • CORBA::NamedValue_var _result;

  • CORBA::Environment_var _env;

  • CORBA::Context_var _ctx;

  • CORBA::ContextList_var _ctxList;

  • CORBA::ExceptionList_var _excepList;

  • CORBA::Flags _flags;

  • CORBA::Boolean _out_args;



Схожі:

Corba. Динамічні виклики 2006 Зміст iconТехнологія com маршалінг. Динамічні виклики 2006 Зміст

Corba. Динамічні виклики 2006 Зміст iconCorba. Динамічні виклики 2005 addit idl
Зрозуміло, що перед викликом методів інтерфейсу має бути отримане (чи "сформоване") інтероперабельне об'єктне посилання
Corba. Динамічні виклики 2006 Зміст iconТехнологія com маршалінг. Динамічні виклики 2007 Зміст

Corba. Динамічні виклики 2006 Зміст iconТехнологія com. Маршалінг. Динамічні виклики 2003-2009 Зміст

Corba. Динамічні виклики 2006 Зміст iconТехнологія com маршалінг. Динамічні виклики 2004 Зміст
Проте доступ до інтерфейсних методів та забезпечення їх виконання може вимагати різних
Corba. Динамічні виклики 2006 Зміст iconCorba-об'єкти та їх особливості 2006 Зміст

Corba. Динамічні виклики 2006 Зміст iconТехнологія corba. Вступ 2006 Зміст

Corba. Динамічні виклики 2006 Зміст iconCorba orb. Об'єктні адаптери 2006 Зміст

Corba. Динамічні виклики 2006 Зміст iconЗміст: Зміст
Умови відео/мультимедіа конкурсу "црт: Наші виклики. Наша відповідальність" Критерії оцінювання, склад журі
Corba. Динамічні виклики 2006 Зміст iconРозробка corba-проектів. Використання Borland-“майстрів” 2006 “Статична” corba. Заглушки та скелетони
Заглушки та скелетони Заглушки та скелетони є основою того, що називають "статична"

Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка