-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Корба это пипец. Корба это заморочка.
Пытался получить hostname из IOR, убил 2 часа, так и не нашёл... -1 В принципе, не сложно распарсить самому, но зачем парсить то, что и так парсится...
Почему такие сложности с корбой. Дело в том, что все объекты у неё спрятаны в базовый класс CORBA::Object. И чтобы получить доступ к конкретной функциональности, надо знать, какие интерфейсы может предоставлять конкретный объект. После чего ты делаешь resolve_initial_references() и получаешь уже более специализированный объект. Не зная того, как всё устроено и что во что можно превращать, ты никогда не догадаешься как что делать. Поэтому надо покупать толстую книжку от OCI и читать-читать-читать... Либо компилировать TAO с дебаг инфой и шагать-шагать-шагать. Но в том-то и дело, что в отладчике ковырять бесполезно, пока не знаешь какой объект во что можно превращать и какие интерфейсы в какой момент получать. Корба это пипец! Корба это заморочка! Корба это секта, в которой непосвященный ничего понять не сможет! До свиданья, Корба, 100 лет бы тебя не видел!
Попытка сделать это как написано здесь ни к чему не привела:
+ CORBA::Object_var vobj = orb->resolve_initial_references("TAO::Transport::IIOP::Current");
+ TAO::Transport::IIOP::Current_var v = TAO::Transport::IIOP::Current::_narrow(obj.in());
+
+ if (CORBA::is_nil(v.in())) {
+ throw Exception("_narrow() gives nil reference");
+ }
+
+ const char * remote_host = v->remote_host();
+ const char * local_host = v->local_host();
Вобщем, не сработал resolve_initial_references() от нашего орба. Получился пустой объект...
Хотя я вовсе не уверен, что Transport::IIOP::Current бы мне помог. Просто методом долгого блуждания по коду TAO наткнулся на то, что он умеет давать remote_host().
Пришлось морочить свою парсилку IOR-а:
if (!hostname_.empty())
return hostname_;
size_t ior_len = ior_.length();
if (ior_len < 7)
return hostname_;
size_t max = ior_len - 7;
size_t begin = ior_.find(':');
if (begin > max)
return hostname_;
++begin; ++max;
begin = ior_.find(':', begin);
if (begin > max)
return hostname_;
++begin; max += 2;
size_t end = ior_.find(':', begin);
if (end > max || end == begin)
return hostname_;
hostname_.assign(ior_.c_str() + begin, ior_.c_str() + end);
begin = hostname_.rfind('@');
if (begin != String::SubString::NPOS)
{
if (begin < hostname_.length() - 1)
{
hostname_.assign(hostname_.begin() + begin + 1, hostname_.end());
}
else
{
hostname_.clear();
}
}
return hostname_;