sample/dll3/sample_dll.cpp

Пример DLL для работы с SO SysConf 2. Предназначен для использования в примере sample/app/main.cpp.

//
// Пример DLL.
//
// Псевдоним: sample_dll3.
//
// Содержит обработчики для коопераций: sample_dll3::coop_1,
// sample_dll3::coop_2, sample_dll3::coop_3,
// sample_dll3::coop_4, sample_dll3::coop_5.
//
// В каждую кооперацию входит один тестовый агент,
// который отображает сообщение о своем старте.
//
// Содержит фабрику коопераций sample_dll3::factory,
// которая создает кооперации из одного тестового агента.

#include <iostream>

#include <cpp_util_2/h/lexcast.hpp>

// Загружаем необходимые описания из SObjectizer.
#include <so_4/rt/h/rt.hpp>
#include <so_4/api/h/api.hpp>

// Загружаем необходимые описания из SO SysConf 2.
#include <so_sysconf_2/h/coop_handler.hpp>
#include <so_sysconf_2/h/coop_factory.hpp>

namespace sample_dll3
{

// Класс агента данного примера.
// Имеет только одно событие -- evt_start,
// срабатывающее на сообщение so_4::rt::msg_start.
class a_main_t :
  public so_4::rt::agent_t
{
  typedef so_4::rt::agent_t base_type_t;
  public :
    a_main_t(
      // Имя агента.
      const char * agent_name );
    virtual ~a_main_t();

    virtual const char *
    so_query_type() const;

    virtual void
    so_on_subscription();

    // Выдача сообщения о начале работы агента
    // в SObjectizer.
    void
    evt_start(
      const so_4::rt::event_data_t & data,
      const so_4::rt::msg_start * );
};

SOL4_CLASS_START( sample_dll3::a_main_t )

  SOL4_EVENT_WITH_INCIDENT_TYPE(
    evt_start,
    so_4::rt::msg_start )

  SOL4_STATE_START( st_initial )
    SOL4_STATE_EVENT( evt_start )
  SOL4_STATE_FINISH()

SOL4_CLASS_FINISH()

a_main_t::a_main_t( const char * agent_name )
  :
    base_type_t( agent_name )
{
}

a_main_t::~a_main_t()
{
}

void
a_main_t::so_on_subscription()
{
  SOL4_SUBSCR_EVENT_START( evt_start, 0 )
    SOL4_SUBSCR_EVENT_MSG(
      so_4::rt::sobjectizer_agent_name(),
      "msg_start" )
  SOL4_SUBSCR_EVENT_FINISH()
}

void
a_main_t::evt_start(
  const so_4::rt::event_data_t & data,
  const so_4::rt::msg_start * )
{
  std::cout << so_query_name() << ": evt_start" << std::endl;
}

// Обработчик коопераций данного примера.
class test_handler_t :
  public so_sysconf_2::coop_handler_t
{
  typedef so_sysconf_2::coop_handler_t  base_type_t;
  public :
    test_handler_t(
      // Имя кооперации.
      const char * coop_name );
    virtual ~test_handler_t();

    // Регистрация реальной кооперации.
    virtual bool
    reg(
      const std::string & cfg_file,
      std::string & error_msg )
    {
      so_4::rt::dyn_agent_coop_helper_t coop_helper(
        // Динамическая кооперация только с одним агентом.
        new so_4::rt::dyn_agent_coop_t(
          new a_main_t(
            // Имя кооперации является именем агента.
            query_coop_name().c_str() ) ) );
      if( coop_helper.result() )
      {
        // Не удалось зарегистрировать кооперацию.
        error_msg = "unable to register coop, error code: " +
            cpp_util_2::slexcast( coop_helper.result() );
        return false;
      }

      // Удалось зарегистрировать кооперацию.
      return true;
    }

    // Дерегистрация реальной кооперации.
    virtual void
    dereg()
    {
      so_4::api::deregister_coop( query_coop_name() );
    }
};

test_handler_t::test_handler_t(
  const char * coop_name )
  :
    base_type_t( "sample_dll3", coop_name )
{
}

test_handler_t::~test_handler_t()
{
}

//
// Кооперации, которые должны существовать в этой DLL.
//

test_handler_t  g_coop_1( "sample_dll3::coop_1" );
test_handler_t  g_coop_2( "sample_dll3::coop_2" );
test_handler_t  g_coop_3( "sample_dll3::coop_3" );
test_handler_t  g_coop_4( "sample_dll3::coop_4" );
test_handler_t  g_coop_5( "sample_dll3::coop_5" );

// Фабрика коопераций.
class test_factory_t :
  public so_sysconf_2::coop_factory_t
{
  typedef so_sysconf_2::coop_factory_t  base_type_t;
  public :
    test_factory_t(
      // Имя фабрики.
      const std::string & factory_name )
    :
      base_type_t(
        // Псевдоним DLL.
        // Одинаковый для всех фабрик в данной DLL.
        "sample_dll3",
        factory_name )
    {}

    virtual ~test_factory_t()
    {}

    virtual bool
    reg(
      const std::string & coop_name,
      const std::string & cfg_file,
      std::string & error_msg )
    {
      so_4::rt::dyn_agent_coop_helper_t coop_helper(
        // Динамическая кооперация только с одним агентом.
        new so_4::rt::dyn_agent_coop_t(
          new a_main_t(
            // Имя кооперации является именем агента.
            coop_name.c_str() ) ) );
      if( coop_helper.result() )
      {
        // Не удалось зарегистрировать кооперацию.
        error_msg = "unable to register coop, error code: " +
            cpp_util_2::slexcast( coop_helper.result() );
        return false;
      }

      // Удалось зарегистрировать кооперацию.
      return true;
    }
};

//
// Фабрики, которые должны существовать в этой DLL.
//

test_factory_t  g_factory_1( "sample_dll3::factory" );

} /* namespace sample_dll3 */

Документация по so_sysconf_2 v.2.4.0. Последние изменения: Wed Oct 31 18:55:07 2007. Создано системой  doxygen1.5.4 Intervale SourceForge.net Logo