Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
midenok opened this issue Nov 6, 2013 · 0 comments
Open

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

midenok opened this issue Nov 6, 2013 · 0 comments
Labels

Comments

@midenok
Copy link
Member

midenok commented Nov 6, 2013

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

Пытался получить 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_;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant