Skip to content

Corba заморочка #1

@midenok

Description

@midenok

Корба это пипец. Корба это заморочка.

Пытался получить 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_;

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions