ServiceOptions представляет собой компоненту для обработки опций командной строки стандартного CORBA сервера.
Что это означает: обычно CORBA сервер экспортирует в "мир" несколько объектов: т. н. "Корневые Объекты" (Root Objects) сервиса. К примеру, CollectionService экспортирует CollectionFactory и RACollectionFactory ; NamingService экспортирует RootNamingCotext .
Пользователи сервиса получают доступ к этим объектам с помощью механизмов, специфичных для каждой ORB.
Для стандартных CORBA сервисов это вызов ORB::resolve_initial_references(name); но процесс задания инициальных ссылок все равно требует знания объектных ссылок во время старта клиента.
Обычно, "корневые объекты" сервисов экспортируются с помощью:
Что делает Service Options: инкапсулирует всю эту работу и использование специфичных непортабельных механизмов ORB в одном вызове. Вы просто указываете в коде сервера сервант и его имя; после этого ваш сервант доступен для использования в corbaloc ior-ах и автоматически публикуется другими методами, в зависимости от опций командной строки.
ServiceOptions основан на ProgOptions
(www.gradsdoft.kiev.ua/rus/Products/ToolBox/ProgOptions/ProgGuide/ProgrammingGuide_rus.html)
Этот документ представляет собой неформальное описание,
полная спецификация пакета приводится в API reference
(www.gradsoft.kiev.ua/common/ToolBox/ServiceOptions/API/index.html).
Программист:
ServiceOptions::putServiceName
ServiceOptions::parse -
командная строка будет разобрана во внутренние структуры ServiceOptions,
при этом будут автоматически обработаны опции --help и --config <filename>
(детали смотри в руководстве пограммиста к пакету ProgOptions);
ServiceOptions::bindServiceObject
--with-naming - инициальные объекты сервисов отображаются в NameService
--ior-stdout - объектыне ссылки в виде строки печатаются на стандартном выводе программы.
--ior-file-<name> - поместить объектную ссылку сервиса с именем <name> в файл аргумента этой опции.
interface HelloWorlder
{
void hello_world();
};
#include <tao/CORBA.h> //
#include <tao/PortableServer/PortableServer.h> // Допустим, у нас TAO-1.2
#include <orbsvcs/CosNamingC.h> //
#include <HelloWorlderS.h> //
#include <iostream>
using namespace std;
#include <GradSoft/ServiceOptions.h> // не забудь
using namespace GradSoft; //
class HelloWorlder_impl:public POA_HelloWorlder // реализуем
{ // интерфейс
public: //
void hello_world() { cout << "Hello, world" << endl; } //
}; //
int main(int argc, char** argv)
{
ServiceOptions options;
options.putServiceName("HelloService"); // установить имя поддерживаемого сервиса
if (!options.parse(argc,argv)) return 1; // разобрать опции
// инициализация ORB: используем копию внутреннего
// (объединенного) вектора аргументов ServiceOptions,
// для того чтобы ORB_init() мог получить опции командной строки
// в конфигурационном файле формата ProgOptions:
ProgOptions::ArgsHolder argsHolder;
argsHolder.takeArgv(options);
CORBA::ORB_var orb = CORBA::ORB_init(argsHolder.argc,argsHolder.argv);
CORBA::Object_var poaObj = // стандартные
orb->resolve_initial_references("RootPOA"); // действия
PortableServer::POA_var poa = PortableServer::POA::_narrow(poaObj); //
PortableServer::POAManager_var poaManager = poa->the_POAManager(); //
poaManager->activate(); //
HelloWorlder_impl helloWorlder_impl; // создать объект
HelloWorlder_var helloWorlder = helloWorlder_impl._this();
options.bindServiceObject( // главный вызов
orb,
helloWorlder,
&helloWorlder_impl,
"HelloService",
true
);
orb->run();
orb->destroy();
return 0;
}
Эта программа будет обрабатывать:
--with-naming, --ior-stdout, --ior-file-myName
так как это было описано выше;
--help и --config
как было описано в Руководстве программиста к пакету ProgOptions;