Commit 9674dd51 authored by Pavel Vainerman's avatar Pavel Vainerman Committed by Pavel Vainerman

make style

parent 1d66bfef
...@@ -30,259 +30,259 @@ ...@@ -30,259 +30,259 @@
namespace uniset namespace uniset
{ {
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
std::string strTypeOfMessage( int type ) std::string strTypeOfMessage( int type )
{ {
if( type == Message::SensorInfo ) if( type == Message::SensorInfo )
return "SensorInfo"; return "SensorInfo";
if( type == Message::SysCommand ) if( type == Message::SysCommand )
return "SysCommand"; return "SysCommand";
if( type == Message::Confirm ) if( type == Message::Confirm )
return "Confirm"; return "Confirm";
if( type == Message::Timer ) if( type == Message::Timer )
return "Timer"; return "Timer";
if( type == Message::TextMessage ) if( type == Message::TextMessage )
return "TextMessage"; return "TextMessage";
if( type == Message::Unused ) if( type == Message::Unused )
return "Unused"; return "Unused";
return "Unkown"; return "Unkown";
} }
std::ostream& operator<<( std::ostream& os, const Message::TypeOfMessage& t ) std::ostream& operator<<( std::ostream& os, const Message::TypeOfMessage& t )
{ {
return os << strTypeOfMessage(t); return os << strTypeOfMessage(t);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
Message::Message() noexcept: Message::Message() noexcept:
type(Unused), priority(Medium), type(Unused), priority(Medium),
node( uniset::uniset_conf() ? uniset::uniset_conf()->getLocalNode() : DefaultObjectId ), node( uniset::uniset_conf() ? uniset::uniset_conf()->getLocalNode() : DefaultObjectId ),
supplier(DefaultObjectId), supplier(DefaultObjectId),
consumer(DefaultObjectId) consumer(DefaultObjectId)
{ {
tm = uniset::now_to_timespec(); tm = uniset::now_to_timespec();
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
VoidMessage::VoidMessage( const TransportMessage& tm ) noexcept: VoidMessage::VoidMessage( const TransportMessage& tm ) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{ {
assert(sizeof(VoidMessage) >= sizeof(uniset::RawDataOfTransportMessage)); assert(sizeof(VoidMessage) >= sizeof(uniset::RawDataOfTransportMessage));
memcpy(this, &tm.data, sizeof(tm.data)); memcpy(this, &tm.data, sizeof(tm.data));
consumer = tm.consumer; consumer = tm.consumer;
} }
VoidMessage::VoidMessage() noexcept VoidMessage::VoidMessage() noexcept
{ {
assert(sizeof(VoidMessage) >= sizeof(uniset::RawDataOfTransportMessage)); assert(sizeof(VoidMessage) >= sizeof(uniset::RawDataOfTransportMessage));
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
SensorMessage::SensorMessage() noexcept: SensorMessage::SensorMessage() noexcept:
id(DefaultObjectId), id(DefaultObjectId),
value(0), value(0),
undefined(false), undefined(false),
sensor_type(UniversalIO::DI), sensor_type(UniversalIO::DI),
threshold(false), threshold(false),
tid(uniset::DefaultThresholdId) tid(uniset::DefaultThresholdId)
{ {
type = Message::SensorInfo; type = Message::SensorInfo;
sm_tv = tm; // или инициализировать нулём ? sm_tv = tm; // или инициализировать нулём ?
ci.minRaw = 0; ci.minRaw = 0;
ci.maxRaw = 0; ci.maxRaw = 0;
ci.minCal = 0; ci.minCal = 0;
ci.maxCal = 0; ci.maxCal = 0;
ci.precision = 0; ci.precision = 0;
} }
SensorMessage::SensorMessage(ObjectId id, long value, const IOController_i::CalibrateInfo& ci, SensorMessage::SensorMessage(ObjectId id, long value, const IOController_i::CalibrateInfo& ci,
Priority priority, Priority priority,
UniversalIO::IOType st, ObjectId consumer) noexcept: UniversalIO::IOType st, ObjectId consumer) noexcept:
id(id), id(id),
value(value), value(value),
undefined(false), undefined(false),
sensor_type(st), sensor_type(st),
ci(ci), ci(ci),
threshold(false), threshold(false),
tid(uniset::DefaultThresholdId) tid(uniset::DefaultThresholdId)
{ {
type = Message::SensorInfo; type = Message::SensorInfo;
this->priority = priority; this->priority = priority;
this->consumer = consumer; this->consumer = consumer;
sm_tv = tm; sm_tv = tm;
} }
SensorMessage::SensorMessage( int dummy ) noexcept: SensorMessage::SensorMessage( int dummy ) noexcept:
Message(1), // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1), // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
ci(IOController_i::CalibrateInfo()) ci(IOController_i::CalibrateInfo())
{ {
type = Message::SensorInfo; type = Message::SensorInfo;
} }
SensorMessage::SensorMessage(const VoidMessage* msg) noexcept: SensorMessage::SensorMessage(const VoidMessage* msg) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{ {
memcpy(this, msg, sizeof(*this)); memcpy(this, msg, sizeof(*this));
assert(this->type == Message::SensorInfo); assert(this->type == Message::SensorInfo);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
SystemMessage::SystemMessage() noexcept: SystemMessage::SystemMessage() noexcept:
command(SystemMessage::Unknown) command(SystemMessage::Unknown)
{ {
memset(data, 0, sizeof(data)); memset(data, 0, sizeof(data));
type = Message::SysCommand; type = Message::SysCommand;
} }
SystemMessage::SystemMessage(Command command, Priority priority, ObjectId consumer) noexcept: SystemMessage::SystemMessage(Command command, Priority priority, ObjectId consumer) noexcept:
command(command) command(command)
{ {
type = Message::SysCommand; type = Message::SysCommand;
this->priority = priority; this->priority = priority;
this->consumer = consumer; this->consumer = consumer;
memset(data, 0, sizeof(data)); memset(data, 0, sizeof(data));
} }
SystemMessage::SystemMessage(const VoidMessage* msg) noexcept: SystemMessage::SystemMessage(const VoidMessage* msg) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{ {
memcpy(this, msg, sizeof(*this)); memcpy(this, msg, sizeof(*this));
assert(this->type == Message::SysCommand); assert(this->type == Message::SysCommand);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, const SystemMessage::Command& c ) std::ostream& operator<<( std::ostream& os, const SystemMessage::Command& c )
{ {
if( c == SystemMessage::Unknown ) if( c == SystemMessage::Unknown )
return os << "Unknown"; return os << "Unknown";
if( c == SystemMessage::StartUp ) if( c == SystemMessage::StartUp )
return os << "StartUp"; return os << "StartUp";
if( c == SystemMessage::FoldUp ) if( c == SystemMessage::FoldUp )
return os << "FoldUp"; return os << "FoldUp";
if( c == SystemMessage::Finish ) if( c == SystemMessage::Finish )
return os << "Finish"; return os << "Finish";
if( c == SystemMessage::WatchDog ) if( c == SystemMessage::WatchDog )
return os << "WatchDog"; return os << "WatchDog";
if( c == SystemMessage::ReConfiguration ) if( c == SystemMessage::ReConfiguration )
return os << "ReConfiguration"; return os << "ReConfiguration";
if( c == SystemMessage::NetworkInfo ) if( c == SystemMessage::NetworkInfo )
return os << "NetworkInfo"; return os << "NetworkInfo";
if( c == SystemMessage::LogRotate ) if( c == SystemMessage::LogRotate )
return os << "LogRotate"; return os << "LogRotate";
return os; return os;
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
TimerMessage::TimerMessage(): TimerMessage::TimerMessage():
id(uniset::DefaultTimerId) id(uniset::DefaultTimerId)
{ {
type = Message::Timer; type = Message::Timer;
} }
TimerMessage::TimerMessage(uniset::TimerId id, Priority prior, ObjectId cons): TimerMessage::TimerMessage(uniset::TimerId id, Priority prior, ObjectId cons):
id(id) id(id)
{ {
type = Message::Timer; type = Message::Timer;
this->consumer = cons; this->consumer = cons;
} }
TimerMessage::TimerMessage(const VoidMessage* msg) noexcept: TimerMessage::TimerMessage(const VoidMessage* msg) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{ {
memcpy(this, msg, sizeof(*this)); memcpy(this, msg, sizeof(*this));
assert(this->type == Message::Timer); assert(this->type == Message::Timer);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
ConfirmMessage::ConfirmMessage( const VoidMessage* msg ) noexcept: ConfirmMessage::ConfirmMessage( const VoidMessage* msg ) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
{ {
memcpy(this, msg, sizeof(*this)); memcpy(this, msg, sizeof(*this));
assert(this->type == Message::Confirm); assert(this->type == Message::Confirm);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
ConfirmMessage::ConfirmMessage(uniset::ObjectId in_sensor_id, ConfirmMessage::ConfirmMessage(uniset::ObjectId in_sensor_id,
const double& in_sensor_value, const double& in_sensor_value,
const timespec& in_sensor_time, const timespec& in_sensor_time,
const timespec& in_confirm_time, const timespec& in_confirm_time,
Priority in_priority ) noexcept: Priority in_priority ) noexcept:
sensor_id(in_sensor_id), sensor_id(in_sensor_id),
sensor_value(in_sensor_value), sensor_value(in_sensor_value),
sensor_time(in_sensor_time), sensor_time(in_sensor_time),
confirm_time(in_confirm_time), confirm_time(in_confirm_time),
broadcast(false), broadcast(false),
forward(false) forward(false)
{ {
type = Message::Confirm; type = Message::Confirm;
priority = in_priority; priority = in_priority;
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
TextMessage::TextMessage( const VoidMessage* vmsg ) noexcept TextMessage::TextMessage( const VoidMessage* vmsg ) noexcept
: VoidMessage(1) // dummy constructor : VoidMessage(1) // dummy constructor
{ {
assert(vmsg->type == Message::TextMessage); assert(vmsg->type == Message::TextMessage);
auto m = static_cast<const TextMessage*>(vmsg); auto m = static_cast<const TextMessage*>(vmsg);
if( m ) if( m )
{ {
type = m->type; type = m->type;
priority = m->priority; priority = m->priority;
node = m->node; node = m->node;
tm = m->tm; tm = m->tm;
consumer = m->consumer; consumer = m->consumer;
supplier = m->supplier; supplier = m->supplier;
mtype = m->mtype; mtype = m->mtype;
txt = m->txt; txt = m->txt;
} }
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
TextMessage::TextMessage() noexcept TextMessage::TextMessage() noexcept
{ {
type = Message::TextMessage; type = Message::TextMessage;
} }
TextMessage::TextMessage(const char* msg, TextMessage::TextMessage(const char* msg,
int _mtype, int _mtype,
const uniset::Timespec& tm, const uniset::Timespec& tm,
const ::uniset::ProducerInfo& pi, const ::uniset::ProducerInfo& pi,
Priority prior, Priority prior,
ObjectId cons) noexcept ObjectId cons) noexcept
{ {
type = Message::TextMessage; type = Message::TextMessage;
this->node = pi.node; this->node = pi.node;
this->supplier = pi.id; this->supplier = pi.id;
this->priority = prior; this->priority = prior;
this->consumer = cons; this->consumer = cons;
this->tm.tv_sec = tm.sec; this->tm.tv_sec = tm.sec;
this->tm.tv_nsec = tm.nsec; this->tm.tv_nsec = tm.nsec;
this->txt = std::string(msg); this->txt = std::string(msg);
this->mtype = _mtype; this->mtype = _mtype;
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
std::shared_ptr<VoidMessage> TextMessage::toLocalVoidMessage() const std::shared_ptr<VoidMessage> TextMessage::toLocalVoidMessage() const
{ {
uniset::ProducerInfo pi; uniset::ProducerInfo pi;
pi.id = supplier; pi.id = supplier;
pi.node = node; pi.node = node;
uniset::Timespec ts; uniset::Timespec ts;
ts.sec = tm.tv_sec; ts.sec = tm.tv_sec;
ts.nsec = tm.tv_nsec; ts.nsec = tm.tv_nsec;
auto tmsg = std::make_shared<TextMessage>(txt.c_str(), mtype, ts, pi, priority, consumer); auto tmsg = std::make_shared<TextMessage>(txt.c_str(), mtype, ts, pi, priority, consumer);
return std::static_pointer_cast<VoidMessage>(tmsg); return std::static_pointer_cast<VoidMessage>(tmsg);
} }
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
} // end of namespace uniset } // end of namespace uniset
//-------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -56,416 +56,416 @@ static const int TERMINATE_TIMEOUT_SEC = 15; // время, отведённо ...@@ -56,416 +56,416 @@ static const int TERMINATE_TIMEOUT_SEC = 15; // время, отведённо
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
struct ORBThreadDeleter struct ORBThreadDeleter
{ {
void operator()( OmniThreadCreator<UniSetActivator>* p ) const void operator()( OmniThreadCreator<UniSetActivator>* p ) const
{ {
// не удаляем.. // не удаляем..
} }
}; };
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
namespace uniset namespace uniset
{ {
UniSetActivatorPtr UniSetActivator::inst; UniSetActivatorPtr UniSetActivator::inst;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
UniSetActivatorPtr UniSetActivator::Instance() UniSetActivatorPtr UniSetActivator::Instance()
{ {
if( inst == nullptr ) if( inst == nullptr )
inst = shared_ptr<UniSetActivator>( new UniSetActivator() ); inst = shared_ptr<UniSetActivator>( new UniSetActivator() );
return inst; return inst;
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
UniSetActivator::UniSetActivator(): UniSetActivator::UniSetActivator():
UniSetManager(uniset::DefaultObjectId) UniSetManager(uniset::DefaultObjectId)
{ {
UniSetActivator::init(); UniSetActivator::init();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::init() void UniSetActivator::init()
{ {
if( getId() == DefaultObjectId ) if( getId() == DefaultObjectId )
myname = "UniSetActivator"; myname = "UniSetActivator";
auto conf = uniset_conf(); auto conf = uniset_conf();
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
if( findArgParam("--activator-run-httpserver", conf->getArgc(), conf->getArgv()) != -1 ) if( findArgParam("--activator-run-httpserver", conf->getArgc(), conf->getArgv()) != -1 )
{ {
httpHost = conf->getArgParam("--activator-httpserver-host", "localhost"); httpHost = conf->getArgParam("--activator-httpserver-host", "localhost");
ostringstream s; ostringstream s;
s << (getId() == DefaultObjectId ? 8080 : getId() ); s << (getId() == DefaultObjectId ? 8080 : getId() );
httpPort = conf->getArgInt("--activator-httpserver-port", s.str()); httpPort = conf->getArgInt("--activator-httpserver-port", s.str());
ulog1 << myname << "(init): http server parameters " << httpHost << ":" << httpPort << endl; ulog1 << myname << "(init): http server parameters " << httpHost << ":" << httpPort << endl;
httpCORS_allow = conf->getArgParam("--activator-httpserver-cors-allow", "*"); httpCORS_allow = conf->getArgParam("--activator-httpserver-cors-allow", "*");
} }
#endif #endif
orb = conf->getORB(); orb = conf->getORB();
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj); PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj);
pman = root_poa->the_POAManager(); pman = root_poa->the_POAManager();
const CORBA::PolicyList pl = conf->getPolicy(); const CORBA::PolicyList pl = conf->getPolicy();
poa = root_poa->create_POA("my poa", pman, pl); poa = root_poa->create_POA("my poa", pman, pl);
if( CORBA::is_nil(poa) ) if( CORBA::is_nil(poa) )
{ {
ucrit << myname << "(init): init poa failed!!!" << endl; ucrit << myname << "(init): init poa failed!!!" << endl;
std::terminate(); std::terminate();
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetActivator::~UniSetActivator() UniSetActivator::~UniSetActivator()
{ {
if( active ) if( active )
{ {
try try
{ {
shutdown(); shutdown();
} }
catch(...) catch(...)
{ {
std::exception_ptr p = std::current_exception(); std::exception_ptr p = std::current_exception();
cerr << (p ? p.__cxa_exception_type()->name() : "null") << std::endl; cerr << (p ? p.__cxa_exception_type()->name() : "null") << std::endl;
} }
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::run( bool thread, bool terminate_control ) void UniSetActivator::run( bool thread, bool terminate_control )
{ {
ulogsys << myname << "(run): создаю менеджер " << endl; ulogsys << myname << "(run): создаю менеджер " << endl;
termControl = terminate_control; termControl = terminate_control;
auto aptr = std::static_pointer_cast<UniSetActivator>(get_ptr()); auto aptr = std::static_pointer_cast<UniSetActivator>(get_ptr());
UniSetManager::initPOA(aptr); UniSetManager::initPOA(aptr);
if( getId() == uniset::DefaultObjectId ) if( getId() == uniset::DefaultObjectId )
offThread(); // отключение потока обработки сообщений, раз не задан ObjectId offThread(); // отключение потока обработки сообщений, раз не задан ObjectId
UniSetManager::activate(); // а там вызывается активация всех подчиненных объектов и менеджеров UniSetManager::activate(); // а там вызывается активация всех подчиненных объектов и менеджеров
active = true; active = true;
ulogsys << myname << "(run): активизируем менеджер" << endl; ulogsys << myname << "(run): активизируем менеджер" << endl;
pman->activate(); pman->activate();
msleep(50); msleep(50);
if( termControl ) if( termControl )
set_signals(true); set_signals(true);
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
if( !httpHost.empty() ) if( !httpHost.empty() )
{ {
try try
{ {
auto reg = dynamic_pointer_cast<UHttp::IHttpRequestRegistry>(shared_from_this()); auto reg = dynamic_pointer_cast<UHttp::IHttpRequestRegistry>(shared_from_this());
httpserv = make_shared<UHttp::UHttpServer>(reg, httpHost, httpPort); httpserv = make_shared<UHttp::UHttpServer>(reg, httpHost, httpPort);
httpserv->setCORS_allow(httpCORS_allow); httpserv->setCORS_allow(httpCORS_allow);
httpserv->start(); httpserv->start();
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
uwarn << myname << "(run): init http server error: " << ex.what() << endl; uwarn << myname << "(run): init http server error: " << ex.what() << endl;
} }
} }
#endif #endif
if( thread ) if( thread )
{ {
uinfo << myname << "(run): запускаемся с созданием отдельного потока... " << endl; uinfo << myname << "(run): запускаемся с созданием отдельного потока... " << endl;
orbthr = std::shared_ptr<OmniThreadCreator<UniSetActivator>>(new OmniThreadCreator<UniSetActivator>(aptr, &UniSetActivator::mainWork), ORBThreadDeleter()); orbthr = std::shared_ptr<OmniThreadCreator<UniSetActivator>>(new OmniThreadCreator<UniSetActivator>(aptr, &UniSetActivator::mainWork), ORBThreadDeleter());
orbthr->start(); orbthr->start();
} }
else else
{ {
uinfo << myname << "(run): запускаемся без создания отдельного потока... " << endl; uinfo << myname << "(run): запускаемся без создания отдельного потока... " << endl;
mainWork(); mainWork();
shutdown(); shutdown();
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
* Функция останавливает работу orb и завершает поток, а также удаляет ссылку из репозитория. * Функция останавливает работу orb и завершает поток, а также удаляет ссылку из репозитория.
* \note Объект становится недоступен другим процессам * \note Объект становится недоступен другим процессам
*/ */
void UniSetActivator::shutdown() void UniSetActivator::shutdown()
{ {
if( !active ) if( !active )
return; return;
active = false; active = false;
if( termControl ) if( termControl )
{ {
set_signals(false); set_signals(false);
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
g_done = false; g_done = false;
g_finish_guard_thread = make_shared<std::thread>(on_finish_timeout); g_finish_guard_thread = make_shared<std::thread>(on_finish_timeout);
} }
} }
ulogsys << myname << "(shutdown): deactivate... " << endl; ulogsys << myname << "(shutdown): deactivate... " << endl;
deactivate(); deactivate();
ulogsys << myname << "(shutdown): deactivate ok. " << endl; ulogsys << myname << "(shutdown): deactivate ok. " << endl;
ulogsys << myname << "(shutdown): discard request..." << endl; ulogsys << myname << "(shutdown): discard request..." << endl;
pman->discard_requests(true); pman->discard_requests(true);
ulogsys << myname << "(shutdown): discard request ok." << endl; ulogsys << myname << "(shutdown): discard request ok." << endl;
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
if( httpserv ) if( httpserv )
httpserv->stop(); httpserv->stop();
#endif #endif
ulogsys << myname << "(shutdown): pman deactivate... " << endl; ulogsys << myname << "(shutdown): pman deactivate... " << endl;
pman->deactivate(false, true); pman->deactivate(false, true);
ulogsys << myname << "(shutdown): pman deactivate ok. " << endl; ulogsys << myname << "(shutdown): pman deactivate ok. " << endl;
try try
{ {
ulogsys << myname << "(shutdown): shutdown orb... " << endl; ulogsys << myname << "(shutdown): shutdown orb... " << endl;
if( orb ) if( orb )
orb->shutdown(true); orb->shutdown(true);
ulogsys << myname << "(shutdown): shutdown ok." << endl; ulogsys << myname << "(shutdown): shutdown ok." << endl;
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ucrit << myname << "(shutdown): : поймали omniORB::fatalException:" << endl; ucrit << myname << "(shutdown): : поймали omniORB::fatalException:" << endl;
ucrit << myname << "(shutdown): file: " << fe.file() << endl; ucrit << myname << "(shutdown): file: " << fe.file() << endl;
ucrit << myname << "(shutdown): line: " << fe.line() << endl; ucrit << myname << "(shutdown): line: " << fe.line() << endl;
ucrit << myname << "(shutdown): mesg: " << fe.errmsg() << endl; ucrit << myname << "(shutdown): mesg: " << fe.errmsg() << endl;
} }
catch( const std::exception& ex ) catch( const std::exception& ex )
{ {
ucrit << myname << "(shutdown): " << ex.what() << endl; ucrit << myname << "(shutdown): " << ex.what() << endl;
} }
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
g_done = true; g_done = true;
} }
g_doneevent.notify_all(); g_doneevent.notify_all();
if( g_finish_guard_thread ) if( g_finish_guard_thread )
g_finish_guard_thread->join(); g_finish_guard_thread->join();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::join() void UniSetActivator::join()
{ {
if( g_done ) if( g_done )
return; return;
ulogsys << myname << "(join): ..." << endl; ulogsys << myname << "(join): ..." << endl;
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
g_doneevent.wait(lk, []() g_doneevent.wait(lk, []()
{ {
return (g_done == true); return (g_done == true);
} ); } );
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::terminate() void UniSetActivator::terminate()
{ {
ulogsys << myname << "(terminate): ..." << endl; ulogsys << myname << "(terminate): ..." << endl;
kill(getpid(), SIGTERM); kill(getpid(), SIGTERM);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
static void activator_terminate( int signo ) static void activator_terminate( int signo )
{ {
auto act = UniSetActivator::Instance(); auto act = UniSetActivator::Instance();
act->shutdown(); act->shutdown();
ulogsys << "******** activator_terminate finished **** " << endl; ulogsys << "******** activator_terminate finished **** " << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::on_finish_timeout() void UniSetActivator::on_finish_timeout()
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
if( g_done ) if( g_done )
return; return;
ulogsys << "(FINISH GUARD THREAD): wait " << TERMINATE_TIMEOUT_SEC << " sec.." << endl << flush; ulogsys << "(FINISH GUARD THREAD): wait " << TERMINATE_TIMEOUT_SEC << " sec.." << endl << flush;
g_doneevent.wait_for(lk, std::chrono::milliseconds(TERMINATE_TIMEOUT_SEC * 1000), []() g_doneevent.wait_for(lk, std::chrono::milliseconds(TERMINATE_TIMEOUT_SEC * 1000), []()
{ {
return (g_done == true); return (g_done == true);
} ); } );
if( !g_done ) if( !g_done )
{ {
ulogsys << "(FINISH GUARD THREAD): WAIT TIMEOUT " ulogsys << "(FINISH GUARD THREAD): WAIT TIMEOUT "
<< TERMINATE_TIMEOUT_SEC << " sec..KILL *******" << endl << flush; << TERMINATE_TIMEOUT_SEC << " sec..KILL *******" << endl << flush;
set_signals(false); set_signals(false);
std::abort(); std::abort();
return; return;
} }
ulogsys << "(FINISH GUARD THREAD): [OK]..bye.." << endl; ulogsys << "(FINISH GUARD THREAD): [OK]..bye.." << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::set_signals( bool ask ) void UniSetActivator::set_signals( bool ask )
{ {
struct sigaction act; // = { { 0 } }; struct sigaction act; // = { { 0 } };
struct sigaction oact; // = { { 0 } }; struct sigaction oact; // = { { 0 } };
memset(&act, 0, sizeof(act)); memset(&act, 0, sizeof(act));
memset(&act, 0, sizeof(oact)); memset(&act, 0, sizeof(oact));
sigemptyset(&act.sa_mask); sigemptyset(&act.sa_mask);
sigemptyset(&oact.sa_mask); sigemptyset(&oact.sa_mask);
// добавляем сигналы, которые будут игнорироваться // добавляем сигналы, которые будут игнорироваться
// при обработке сигнала // при обработке сигнала
sigaddset(&act.sa_mask, SIGINT); sigaddset(&act.sa_mask, SIGINT);
sigaddset(&act.sa_mask, SIGTERM); sigaddset(&act.sa_mask, SIGTERM);
sigaddset(&act.sa_mask, SIGABRT ); sigaddset(&act.sa_mask, SIGABRT );
sigaddset(&act.sa_mask, SIGQUIT); sigaddset(&act.sa_mask, SIGQUIT);
if(ask) if(ask)
act.sa_handler = activator_terminate; act.sa_handler = activator_terminate;
else else
act.sa_handler = SIG_DFL; act.sa_handler = SIG_DFL;
sigaction(SIGINT, &act, &oact); sigaction(SIGINT, &act, &oact);
sigaction(SIGTERM, &act, &oact); sigaction(SIGTERM, &act, &oact);
sigaction(SIGABRT, &act, &oact); sigaction(SIGABRT, &act, &oact);
sigaction(SIGQUIT, &act, &oact); sigaction(SIGQUIT, &act, &oact);
// SIGSEGV отдельно // SIGSEGV отдельно
sigemptyset(&act.sa_mask); sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGSEGV); sigaddset(&act.sa_mask, SIGSEGV);
act.sa_flags = 0; act.sa_flags = 0;
// act.sa_flags |= SA_RESTART; // act.sa_flags |= SA_RESTART;
act.sa_flags |= SA_RESETHAND; act.sa_flags |= SA_RESETHAND;
#if 0 #if 0
g_sigseg_stack.ss_sp = g_stack_body; g_sigseg_stack.ss_sp = g_stack_body;
g_sigseg_stack.ss_flags = SS_ONSTACK; g_sigseg_stack.ss_flags = SS_ONSTACK;
g_sigseg_stack.ss_size = sizeof(g_stack_body); g_sigseg_stack.ss_size = sizeof(g_stack_body);
assert(!sigaltstack(&g_sigseg_stack, nullptr)); assert(!sigaltstack(&g_sigseg_stack, nullptr));
act.sa_flags |= SA_ONSTACK; act.sa_flags |= SA_ONSTACK;
#endif #endif
// if(ask) // if(ask)
// act.sa_handler = activator_terminate_with_calltrace; // act.sa_handler = activator_terminate_with_calltrace;
// else // else
// act.sa_handler = SIG_DFL; // act.sa_handler = SIG_DFL;
// sigaction(SIGSEGV, &act, &oact); // sigaction(SIGSEGV, &act, &oact);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::mainWork() void UniSetActivator::mainWork()
{ {
ulogsys << myname << "(work): запускаем orb на обработку запросов..." << endl; ulogsys << myname << "(work): запускаем orb на обработку запросов..." << endl;
try try
{ {
omniORB::setMainThread(); omniORB::setMainThread();
orb->run(); orb->run();
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
ucrit << myname << "(work): поймали CORBA::SystemException: " << ex.NP_minorString() << endl; ucrit << myname << "(work): поймали CORBA::SystemException: " << ex.NP_minorString() << endl;
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
ucrit << myname << "(work): поймали CORBA::Exception." << endl; ucrit << myname << "(work): поймали CORBA::Exception." << endl;
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ucrit << myname << "(work): : поймали omniORB::fatalException:" << endl; ucrit << myname << "(work): : поймали omniORB::fatalException:" << endl;
ucrit << myname << "(work): file: " << fe.file() << endl; ucrit << myname << "(work): file: " << fe.file() << endl;
ucrit << myname << "(work): line: " << fe.line() << endl; ucrit << myname << "(work): line: " << fe.line() << endl;
ucrit << myname << "(work): mesg: " << fe.errmsg() << endl; ucrit << myname << "(work): mesg: " << fe.errmsg() << endl;
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
ucrit << myname << "(work): catch: " << ex.what() << endl; ucrit << myname << "(work): catch: " << ex.what() << endl;
} }
ulogsys << myname << "(work): orb thread stopped!" << endl << flush; ulogsys << myname << "(work): orb thread stopped!" << endl << flush;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
Poco::JSON::Object::Ptr UniSetActivator::httpGetByName( const string& name, const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetActivator::httpGetByName( const string& name, const Poco::URI::QueryParameters& p )
{ {
if( name == myname ) if( name == myname )
return httpGet(p); return httpGet(p);
auto obj = deepFindObject(name); auto obj = deepFindObject(name);
if( obj ) if( obj )
return obj->httpGet(p); return obj->httpGet(p);
ostringstream err; ostringstream err;
err << "Object '" << name << "' not found"; err << "Object '" << name << "' not found";
throw uniset::NameNotFound(err.str()); throw uniset::NameNotFound(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Array::Ptr UniSetActivator::httpGetObjectsList( const Poco::URI::QueryParameters& p ) Poco::JSON::Array::Ptr UniSetActivator::httpGetObjectsList( const Poco::URI::QueryParameters& p )
{ {
Poco::JSON::Array::Ptr jdata = new Poco::JSON::Array(); Poco::JSON::Array::Ptr jdata = new Poco::JSON::Array();
std::vector<std::shared_ptr<UniSetObject>> vec; std::vector<std::shared_ptr<UniSetObject>> vec;
vec.reserve(objectsCount()); vec.reserve(objectsCount());
//! \todo Доделать обработку параметров beg,lim на случай большого количества объектов (и частичных запросов) //! \todo Доделать обработку параметров beg,lim на случай большого количества объектов (и частичных запросов)
size_t lim = 1000; size_t lim = 1000;
getAllObjectsList(vec, lim); getAllObjectsList(vec, lim);
for( const auto& o : vec ) for( const auto& o : vec )
jdata->add(o->getName()); jdata->add(o->getName());
return jdata; return jdata;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetActivator::httpHelpByName( const string& name, const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetActivator::httpHelpByName( const string& name, const Poco::URI::QueryParameters& p )
{ {
if( name == myname ) if( name == myname )
return httpHelp(p); return httpHelp(p);
auto obj = deepFindObject(name); auto obj = deepFindObject(name);
if( obj ) if( obj )
return obj->httpHelp(p); return obj->httpHelp(p);
ostringstream err; ostringstream err;
err << "Object '" << name << "' not found"; err << "Object '" << name << "' not found";
throw uniset::NameNotFound(err.str()); throw uniset::NameNotFound(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetActivator::httpRequestByName( const string& name, const std::string& req, const Poco::URI::QueryParameters& p) Poco::JSON::Object::Ptr UniSetActivator::httpRequestByName( const string& name, const std::string& req, const Poco::URI::QueryParameters& p)
{ {
if( name == myname ) if( name == myname )
return httpRequest(req, p); return httpRequest(req, p);
// а вдруг встретится объект с именем "conf" а мы перекрываем имя?! // а вдруг встретится объект с именем "conf" а мы перекрываем имя?!
// (пока считаем что такого не будет) // (пока считаем что такого не будет)
if( name == "configure" ) if( name == "configure" )
return request_configure(req, p); return request_configure(req, p);
auto obj = deepFindObject(name); auto obj = deepFindObject(name);
if( obj ) if( obj )
return obj->httpRequest(req, p); return obj->httpRequest(req, p);
ostringstream err; ostringstream err;
err << "Object '" << name << "' not found"; err << "Object '" << name << "' not found";
throw uniset::NameNotFound(err.str()); throw uniset::NameNotFound(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#endif // #ifndef DISABLE_REST_API #endif // #ifndef DISABLE_REST_API
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
} // end of namespace uniset } // end of namespace uniset
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -39,202 +39,202 @@ using namespace std; ...@@ -39,202 +39,202 @@ using namespace std;
// объект-функция для посылки сообщения менеджеру // объект-функция для посылки сообщения менеджеру
class MPush: public unary_function< const std::shared_ptr<uniset::UniSetManager>&, bool> class MPush: public unary_function< const std::shared_ptr<uniset::UniSetManager>&, bool>
{ {
public: public:
explicit MPush(const uniset::TransportMessage& msg): msg(msg) {} explicit MPush(const uniset::TransportMessage& msg): msg(msg) {}
bool operator()( const std::shared_ptr<uniset::UniSetManager>& m ) const bool operator()( const std::shared_ptr<uniset::UniSetManager>& m ) const
{ {
try try
{ {
if( m ) if( m )
{ {
m->push( msg ); m->push( msg );
m->broadcast( msg ); m->broadcast( msg );
} }
return true; return true;
} }
catch(...) {} catch(...) {}
return false; return false;
} }
private: private:
const uniset::TransportMessage& msg; const uniset::TransportMessage& msg;
}; };
// объект-функция для посылки сообщения объекту // объект-функция для посылки сообщения объекту
class OPush: public unary_function< const std::shared_ptr<uniset::UniSetObject>&, bool> class OPush: public unary_function< const std::shared_ptr<uniset::UniSetObject>&, bool>
{ {
public: public:
explicit OPush(const uniset::TransportMessage& msg): msg(msg) {} explicit OPush(const uniset::TransportMessage& msg): msg(msg) {}
bool operator()( const std::shared_ptr<uniset::UniSetObject>& o ) const bool operator()( const std::shared_ptr<uniset::UniSetObject>& o ) const
{ {
try try
{ {
if( o ) if( o )
{ {
o->push( msg ); o->push( msg );
return true; return true;
} }
} }
catch(...) {} catch(...) {}
return false; return false;
} }
private: private:
const uniset::TransportMessage& msg; const uniset::TransportMessage& msg;
}; };
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetManager::UniSetManager(): UniSetManager::UniSetManager():
UniSetObject(uniset::DefaultObjectId), UniSetObject(uniset::DefaultObjectId),
olistMutex("UniSetManager_olistMutex"), olistMutex("UniSetManager_olistMutex"),
mlistMutex("UniSetManager_mlistMutex") mlistMutex("UniSetManager_mlistMutex")
{ {
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetManager::UniSetManager( ObjectId id ): UniSetManager::UniSetManager( ObjectId id ):
UniSetObject(id) UniSetObject(id)
{ {
olistMutex.setName(myname + "_olistMutex"); olistMutex.setName(myname + "_olistMutex");
mlistMutex.setName(myname + "_mlistMutex"); mlistMutex.setName(myname + "_mlistMutex");
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetManager::UniSetManager(const string& name, const string& section): UniSetManager::UniSetManager(const string& name, const string& section):
UniSetObject(name, section) UniSetObject(name, section)
{ {
olistMutex.setName(myname + "_olistMutex"); olistMutex.setName(myname + "_olistMutex");
mlistMutex.setName(myname + "_mlistMutex"); mlistMutex.setName(myname + "_mlistMutex");
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetManager::~UniSetManager() UniSetManager::~UniSetManager()
{ {
olist.clear(); olist.clear();
mlist.clear(); mlist.clear();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
std::shared_ptr<UniSetManager> UniSetManager::get_mptr() std::shared_ptr<UniSetManager> UniSetManager::get_mptr()
{ {
return std::dynamic_pointer_cast<UniSetManager>(get_ptr()); return std::dynamic_pointer_cast<UniSetManager>(get_ptr());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetManager::initPOA( const std::weak_ptr<UniSetManager>& rmngr ) void UniSetManager::initPOA( const std::weak_ptr<UniSetManager>& rmngr )
{ {
auto m = rmngr.lock(); auto m = rmngr.lock();
if( !m ) if( !m )
{ {
ostringstream err; ostringstream err;
err << myname << "(initPOA): failed weak_ptr !!"; err << myname << "(initPOA): failed weak_ptr !!";
ucrit << err.str() << endl; ucrit << err.str() << endl;
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
if( CORBA::is_nil(pman) ) if( CORBA::is_nil(pman) )
this->pman = m->getPOAManager(); this->pman = m->getPOAManager();
PortableServer::POA_var rpoa = m->getPOA(); PortableServer::POA_var rpoa = m->getPOA();
if( rpoa != poa ) if( rpoa != poa )
poa = m->getPOA(); poa = m->getPOA();
if( CORBA::is_nil(poa) ) if( CORBA::is_nil(poa) )
{ {
ostringstream err; ostringstream err;
err << myname << "(initPOA): failed init poa "; err << myname << "(initPOA): failed init poa ";
ucrit << err.str() << endl; ucrit << err.str() << endl;
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// Инициализация самого менеджера и его подобъектов // Инициализация самого менеджера и его подобъектов
UniSetObject::init(rmngr); UniSetObject::init(rmngr);
objects(initial); objects(initial);
managers(initial); managers(initial);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::add( const std::shared_ptr<UniSetObject>& obj ) bool UniSetManager::add( const std::shared_ptr<UniSetObject>& obj )
{ {
auto m = std::dynamic_pointer_cast<UniSetManager>(obj); auto m = std::dynamic_pointer_cast<UniSetManager>(obj);
if( m ) if( m )
return addManager(m); return addManager(m);
return addObject(obj); return addObject(obj);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::remove( const std::shared_ptr<UniSetObject>& obj ) bool UniSetManager::remove( const std::shared_ptr<UniSetObject>& obj )
{ {
auto m = std::dynamic_pointer_cast<UniSetManager>(obj); auto m = std::dynamic_pointer_cast<UniSetManager>(obj);
if( m ) if( m )
return removeManager(m); return removeManager(m);
return removeObject(obj); return removeObject(obj);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::addObject( const std::shared_ptr<UniSetObject>& obj ) bool UniSetManager::addObject( const std::shared_ptr<UniSetObject>& obj )
{ {
{ {
//lock //lock
uniset_rwmutex_wrlock lock(olistMutex); uniset_rwmutex_wrlock lock(olistMutex);
auto li = find(olist.begin(), olist.end(), obj); auto li = find(olist.begin(), olist.end(), obj);
if( li == olist.end() ) if( li == olist.end() )
{ {
uinfo << myname << "(activator): добавляем объект " << obj->getName() << endl; uinfo << myname << "(activator): добавляем объект " << obj->getName() << endl;
olist.push_back(obj); olist.push_back(obj);
} }
} // unlock } // unlock
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj ) bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj )
{ {
{ {
//lock //lock
uniset_rwmutex_wrlock lock(olistMutex); uniset_rwmutex_wrlock lock(olistMutex);
auto li = find(olist.begin(), olist.end(), obj); auto li = find(olist.begin(), olist.end(), obj);
if( li != olist.end() ) if( li != olist.end() )
{ {
uinfo << myname << "(activator): удаляем объект " << obj->getName() << endl; uinfo << myname << "(activator): удаляем объект " << obj->getName() << endl;
try try
{ {
if( obj ) if( obj )
obj->deactivate(); obj->deactivate();
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
uwarn << myname << "(removeObject): поймали CORBA::SystemException: " << ex.NP_minorString() << endl; uwarn << myname << "(removeObject): поймали CORBA::SystemException: " << ex.NP_minorString() << endl;
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
uwarn << myname << "(removeObject): CORBA::Exception" << endl; uwarn << myname << "(removeObject): CORBA::Exception" << endl;
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ucrit << myname << "(managers): Caught omniORB::fatalException:" << endl; ucrit << myname << "(managers): Caught omniORB::fatalException:" << endl;
ucrit << myname << "(managers): file: " << fe.file() ucrit << myname << "(managers): file: " << fe.file()
<< " line: " << fe.line() << " line: " << fe.line()
<< " mesg: " << fe.errmsg() << endl; << " mesg: " << fe.errmsg() << endl;
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
uwarn << myname << "(removeObject): " << ex << endl; uwarn << myname << "(removeObject): " << ex << endl;
} }
catch(...) {} catch(...) {}
olist.erase(li); olist.erase(li);
} }
} // unlock } // unlock
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -243,97 +243,97 @@ bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj ) ...@@ -243,97 +243,97 @@ bool UniSetManager::removeObject( const std::shared_ptr<UniSetObject>& obj )
*/ */
void UniSetManager::managers( OManagerCommand cmd ) void UniSetManager::managers( OManagerCommand cmd )
{ {
uinfo << myname << "(managers): mlist.size=" << mlist.size() << " cmd=" << cmd << endl; uinfo << myname << "(managers): mlist.size=" << mlist.size() << " cmd=" << cmd << endl;
{ {
//lock //lock
uniset_rwmutex_rlock lock(mlistMutex); uniset_rwmutex_rlock lock(mlistMutex);
for( const auto& li : mlist ) for( const auto& li : mlist )
{ {
if( !li ) if( !li )
continue; continue;
try try
{ {
switch(cmd) switch(cmd)
{ {
case initial: case initial:
li->initPOA( get_mptr() ); li->initPOA( get_mptr() );
break; break;
case activ: case activ:
li->activate(); li->activate();
break; break;
case deactiv: case deactiv:
li->deactivate(); li->deactivate();
break; break;
default: default:
break; break;
} }
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(managers): поймали CORBA::SystemException:" << ex.NP_minorString(); err << myname << "(managers): поймали CORBA::SystemException:" << ex.NP_minorString();
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(managers): Caught CORBA::Exception. " err << myname << "(managers): Caught CORBA::Exception. "
<< ex._name() << ex._name()
<< " (" << li->getName() << ")"; << " (" << li->getName() << ")";
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ostringstream err; ostringstream err;
err << myname << "(managers): Caught omniORB::fatalException:" << endl err << myname << "(managers): Caught omniORB::fatalException:" << endl
<< myname << "(managers): file: " << fe.file() << myname << "(managers): file: " << fe.file()
<< " line: " << fe.line() << " line: " << fe.line()
<< " mesg: " << fe.errmsg(); << " mesg: " << fe.errmsg();
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(managers): " << ex << endl err << myname << "(managers): " << ex << endl
<< " Не смог зарегистрировать (разрегистрировать) объект -->" << " Не смог зарегистрировать (разрегистрировать) объект -->"
<< li->getName(); << li->getName();
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
} }
} // unlock } // unlock
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
...@@ -341,97 +341,97 @@ void UniSetManager::managers( OManagerCommand cmd ) ...@@ -341,97 +341,97 @@ void UniSetManager::managers( OManagerCommand cmd )
*/ */
void UniSetManager::objects(OManagerCommand cmd) void UniSetManager::objects(OManagerCommand cmd)
{ {
uinfo << myname << "(objects): olist.size=" uinfo << myname << "(objects): olist.size="
<< olist.size() << " cmd=" << cmd << endl; << olist.size() << " cmd=" << cmd << endl;
{ {
//lock //lock
uniset_rwmutex_rlock lock(olistMutex); uniset_rwmutex_rlock lock(olistMutex);
for( const auto& li : olist ) for( const auto& li : olist )
{ {
if( !li ) if( !li )
continue; continue;
try try
{ {
switch(cmd) switch(cmd)
{ {
case initial: case initial:
li->init(get_mptr()); li->init(get_mptr());
break; break;
case activ: case activ:
li->activate(); li->activate();
break; break;
case deactiv: case deactiv:
li->deactivate(); li->deactivate();
break; break;
default: default:
break; break;
} }
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(objects): поймали CORBA::SystemException:" << ex.NP_minorString(); err << myname << "(objects): поймали CORBA::SystemException:" << ex.NP_minorString();
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(objects): Caught CORBA::Exception. " err << myname << "(objects): Caught CORBA::Exception. "
<< ex._name() << ex._name()
<< " (" << li->getName() << ")"; << " (" << li->getName() << ")";
ucrit << err.str() << endl; ucrit << err.str() << endl;
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ostringstream err; ostringstream err;
err << myname << "(objects): Caught omniORB::fatalException:" << endl; err << myname << "(objects): Caught omniORB::fatalException:" << endl;
err << myname << "(objects): file: " << fe.file() err << myname << "(objects): file: " << fe.file()
<< " line: " << fe.line() << " line: " << fe.line()
<< " mesg: " << fe.errmsg() << endl; << " mesg: " << fe.errmsg() << endl;
ucrit << err.str(); ucrit << err.str();
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ostringstream err; ostringstream err;
err << myname << "(objects): " << ex << endl; err << myname << "(objects): " << ex << endl;
err << myname << "(objects): не смог зарегистрировать (разрегистрировать) объект -->" << li->getName() << endl; err << myname << "(objects): не смог зарегистрировать (разрегистрировать) объект -->" << li->getName() << endl;
ucrit << err.str(); ucrit << err.str();
if( cmd == activ ) if( cmd == activ )
{ {
cerr << err.str(); cerr << err.str();
std::terminate(); std::terminate();
} }
} }
} }
} // unlock } // unlock
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
...@@ -440,11 +440,11 @@ void UniSetManager::objects(OManagerCommand cmd) ...@@ -440,11 +440,11 @@ void UniSetManager::objects(OManagerCommand cmd)
*/ */
bool UniSetManager::activateObject() bool UniSetManager::activateObject()
{ {
uinfo << myname << "(activateObjects): активизирую объекты" << endl; uinfo << myname << "(activateObjects): активизирую объекты" << endl;
UniSetObject::activateObject(); UniSetObject::activateObject();
managers(activ); managers(activ);
objects(activ); objects(activ);
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
...@@ -453,261 +453,261 @@ bool UniSetManager::activateObject() ...@@ -453,261 +453,261 @@ bool UniSetManager::activateObject()
*/ */
bool UniSetManager::deactivateObject() bool UniSetManager::deactivateObject()
{ {
uinfo << myname << "(deactivateObjects): деактивизирую объекты" << endl; uinfo << myname << "(deactivateObjects): деактивизирую объекты" << endl;
// именно в такой последовательности! // именно в такой последовательности!
objects(deactiv); objects(deactiv);
managers(deactiv); managers(deactiv);
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const std::shared_ptr<UniSetObject> UniSetManager::findObject( const string& name ) const const std::shared_ptr<UniSetObject> UniSetManager::findObject( const string& name ) const
{ {
uniset_rwmutex_rlock lock(olistMutex); uniset_rwmutex_rlock lock(olistMutex);
for( auto&& o : olist ) for( auto&& o : olist )
{ {
if( o->getName() == name ) if( o->getName() == name )
return o; return o;
} }
return nullptr; return nullptr;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const std::shared_ptr<UniSetManager> UniSetManager::findManager( const string& name ) const const std::shared_ptr<UniSetManager> UniSetManager::findManager( const string& name ) const
{ {
uniset_rwmutex_rlock lock(mlistMutex); uniset_rwmutex_rlock lock(mlistMutex);
for( auto&& m : mlist ) for( auto&& m : mlist )
{ {
if( m->getName() == name ) if( m->getName() == name )
return m; return m;
} }
return nullptr; return nullptr;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const std::shared_ptr<UniSetObject> UniSetManager::deepFindObject( const string& name ) const const std::shared_ptr<UniSetObject> UniSetManager::deepFindObject( const string& name ) const
{ {
{ {
auto obj = findObject(name); auto obj = findObject(name);
if( obj ) if( obj )
return obj; return obj;
} }
auto man = findManager(name); auto man = findManager(name);
if( man ) if( man )
{ {
auto obj = dynamic_pointer_cast<UniSetObject>(man); auto obj = dynamic_pointer_cast<UniSetObject>(man);
return obj; return obj;
} }
// ищем в глубину у каждого менеджера // ищем в глубину у каждого менеджера
for( const auto& m : mlist ) for( const auto& m : mlist )
{ {
auto obj = m->deepFindObject(name); auto obj = m->deepFindObject(name);
if( obj ) if( obj )
return obj; return obj;
} }
return nullptr; return nullptr;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetManager::getAllObjectsList( std::vector<std::shared_ptr<UniSetObject> >& vec, size_t lim ) void UniSetManager::getAllObjectsList( std::vector<std::shared_ptr<UniSetObject> >& vec, size_t lim )
{ {
// добавить себя // добавить себя
vec.push_back(get_ptr()); vec.push_back(get_ptr());
// добавить подчинённые объекты // добавить подчинённые объекты
for( const auto& o : olist ) for( const auto& o : olist )
{ {
vec.push_back(o); vec.push_back(o);
if( lim > 0 && vec.size() >= lim ) if( lim > 0 && vec.size() >= lim )
return; return;
} }
// добавить рекурсивно по менеджерам // добавить рекурсивно по менеджерам
for( const auto& m : mlist ) for( const auto& m : mlist )
{ {
// вызываем рекурсивно // вызываем рекурсивно
m->getAllObjectsList(vec, lim); m->getAllObjectsList(vec, lim);
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetManager::broadcast(const TransportMessage& msg) void UniSetManager::broadcast(const TransportMessage& msg)
{ {
// себя не забыть... // себя не забыть...
// push(msg); // push(msg);
// Всем объектам... // Всем объектам...
{ {
//lock //lock
uniset_rwmutex_rlock lock(olistMutex); uniset_rwmutex_rlock lock(olistMutex);
for_each(olist.begin(), olist.end(), OPush(msg)); // STL метод for_each(olist.begin(), olist.end(), OPush(msg)); // STL метод
} // unlock } // unlock
// Всем менеджерам.... // Всем менеджерам....
{ {
//lock //lock
uniset_rwmutex_rlock lock(mlistMutex); uniset_rwmutex_rlock lock(mlistMutex);
for_each(mlist.begin(), mlist.end(), MPush(msg)); // STL метод for_each(mlist.begin(), mlist.end(), MPush(msg)); // STL метод
} // unlock } // unlock
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::addManager( const std::shared_ptr<UniSetManager>& child ) bool UniSetManager::addManager( const std::shared_ptr<UniSetManager>& child )
{ {
{ {
//lock //lock
uniset_rwmutex_wrlock lock(mlistMutex); uniset_rwmutex_wrlock lock(mlistMutex);
// Проверка на совпадение // Проверка на совпадение
auto it = find(mlist.begin(), mlist.end(), child); auto it = find(mlist.begin(), mlist.end(), child);
if(it == mlist.end() ) if(it == mlist.end() )
{ {
mlist.push_back( child ); mlist.push_back( child );
uinfo << myname << ": добавляем менеджер " << child->getName() << endl; uinfo << myname << ": добавляем менеджер " << child->getName() << endl;
} }
else else
uwarn << myname << ": попытка повторного добавления объекта " << child->getName() << endl; uwarn << myname << ": попытка повторного добавления объекта " << child->getName() << endl;
} // unlock } // unlock
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetManager::removeManager( const std::shared_ptr<UniSetManager>& child ) bool UniSetManager::removeManager( const std::shared_ptr<UniSetManager>& child )
{ {
{ {
//lock //lock
uniset_rwmutex_wrlock lock(mlistMutex); uniset_rwmutex_wrlock lock(mlistMutex);
mlist.remove(child); mlist.remove(child);
} // unlock } // unlock
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
int UniSetManager::getObjectsInfo( const std::shared_ptr<UniSetManager>& mngr, SimpleInfoSeq* seq, int UniSetManager::getObjectsInfo( const std::shared_ptr<UniSetManager>& mngr, SimpleInfoSeq* seq,
int begin, const long uplimit, const char* userparam ) int begin, const long uplimit, const char* userparam )
{ {
auto ind = begin; auto ind = begin;
// получаем у самого менеджера // получаем у самого менеджера
SimpleInfo_var msi = mngr->getInfo(userparam); SimpleInfo_var msi = mngr->getInfo(userparam);
(*seq)[ind] = msi; (*seq)[ind] = msi;
ind++; ind++;
if( ind > uplimit ) if( ind > uplimit )
return ind; return ind;
for( const auto& o : olist ) for( const auto& o : olist )
{ {
try try
{ {
SimpleInfo_var si = o->getInfo(userparam); SimpleInfo_var si = o->getInfo(userparam);
(*seq)[ind] = si; (*seq)[ind] = si;
ind++; ind++;
if( ind > uplimit ) if( ind > uplimit )
break; break;
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
uwarn << myname << "(getObjectsInfo): CORBA::Exception" << endl; uwarn << myname << "(getObjectsInfo): CORBA::Exception" << endl;
} }
catch(...) catch(...)
{ {
uwarn << myname << "(getObjectsInfo): не смог получить у объекта " uwarn << myname << "(getObjectsInfo): не смог получить у объекта "
<< uniset_conf()->oind->getNameById( o->getId() ) << " информацию" << endl; << uniset_conf()->oind->getNameById( o->getId() ) << " информацию" << endl;
} }
} }
if( ind > uplimit ) if( ind > uplimit )
return ind; return ind;
// а далее у его менеджеров (рекурсивно) // а далее у его менеджеров (рекурсивно)
for( const auto& m : mlist ) for( const auto& m : mlist )
{ {
ind = getObjectsInfo(m, seq, ind, uplimit, userparam ); ind = getObjectsInfo(m, seq, ind, uplimit, userparam );
if( ind > uplimit ) if( ind > uplimit )
break; break;
} }
return ind; return ind;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
SimpleInfoSeq* UniSetManager::getObjectsInfo(CORBA::Long maxlength, const char* userparam ) SimpleInfoSeq* UniSetManager::getObjectsInfo(CORBA::Long maxlength, const char* userparam )
{ {
SimpleInfoSeq* res = new SimpleInfoSeq(); // ЗА ОСВОБОЖДЕНИЕ ПАМЯТИ ОТВЕЧАЕТ КЛИЕНТ!!!!!! SimpleInfoSeq* res = new SimpleInfoSeq(); // ЗА ОСВОБОЖДЕНИЕ ПАМЯТИ ОТВЕЧАЕТ КЛИЕНТ!!!!!!
// поэтому ему лучше пользоваться при получении _var-классом // поэтому ему лучше пользоваться при получении _var-классом
int length = objectsCount() + 1; int length = objectsCount() + 1;
if( length >= maxlength ) if( length >= maxlength )
length = maxlength; length = maxlength;
res->length(length); res->length(length);
// используем рекурсивную функцию // используем рекурсивную функцию
int ind = 0; int ind = 0;
const int limit = length; const int limit = length;
(void)getObjectsInfo( get_mptr(), res, ind, limit, userparam ); (void)getObjectsInfo( get_mptr(), res, ind, limit, userparam );
return res; return res;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetManager::apply_for_objects( OFunction f ) void UniSetManager::apply_for_objects( OFunction f )
{ {
for( const auto& o : olist ) for( const auto& o : olist )
f(o); f(o);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetManager::apply_for_managers(UniSetManager::MFunction f) void UniSetManager::apply_for_managers(UniSetManager::MFunction f)
{ {
for( const auto& m : mlist ) for( const auto& m : mlist )
f(m); f(m);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
size_t UniSetManager::objectsCount() const size_t UniSetManager::objectsCount() const
{ {
size_t res = olist.size() + mlist.size(); size_t res = olist.size() + mlist.size();
for( const auto& i : mlist ) for( const auto& i : mlist )
res += i->objectsCount(); res += i->objectsCount();
return res; return res;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
PortableServer::POA_ptr UniSetManager::getPOA() PortableServer::POA_ptr UniSetManager::getPOA()
{ {
return PortableServer::POA::_duplicate(poa); return PortableServer::POA::_duplicate(poa);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
PortableServer::POAManager_ptr UniSetManager::getPOAManager() PortableServer::POAManager_ptr UniSetManager::getPOAManager()
{ {
return PortableServer::POAManager::_duplicate(pman); return PortableServer::POAManager::_duplicate(pman);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
std::ostream& uniset::operator<<(std::ostream& os, uniset::UniSetManager::OManagerCommand& cmd ) std::ostream& uniset::operator<<(std::ostream& os, uniset::UniSetManager::OManagerCommand& cmd )
{ {
// { deactiv, activ, initial, term }; // { deactiv, activ, initial, term };
if( cmd == uniset::UniSetManager::deactiv ) if( cmd == uniset::UniSetManager::deactiv )
return os << "deactivate"; return os << "deactivate";
if( cmd == uniset::UniSetManager::activ ) if( cmd == uniset::UniSetManager::activ )
return os << "activate"; return os << "activate";
if( cmd == uniset::UniSetManager::initial ) if( cmd == uniset::UniSetManager::initial )
return os << "init"; return os << "init";
return os << "unkwnown"; return os << "unkwnown";
} }
...@@ -45,1090 +45,1090 @@ namespace uniset ...@@ -45,1090 +45,1090 @@ namespace uniset
{ {
#define CREATE_TIMER unisetstd::make_unique<PassiveCondTimer>(); #define CREATE_TIMER unisetstd::make_unique<PassiveCondTimer>();
// new PassiveSysTimer(); // new PassiveSysTimer();
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetObject::UniSetObject(): UniSetObject::UniSetObject():
msgpid(0), msgpid(0),
regOK(false), regOK(false),
active(0), active(0),
threadcreate(false), threadcreate(false),
myid(uniset::DefaultObjectId), myid(uniset::DefaultObjectId),
oref(0) oref(0)
{ {
ui = make_shared<UInterface>(uniset::DefaultObjectId); ui = make_shared<UInterface>(uniset::DefaultObjectId);
tmr = CREATE_TIMER; tmr = CREATE_TIMER;
myname = "noname"; myname = "noname";
initObject(); initObject();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetObject::UniSetObject( ObjectId id ): UniSetObject::UniSetObject( ObjectId id ):
msgpid(0), msgpid(0),
regOK(false), regOK(false),
active(0), active(0),
threadcreate(true), threadcreate(true),
myid(id), myid(id),
oref(0) oref(0)
{ {
ui = make_shared<UInterface>(id); ui = make_shared<UInterface>(id);
tmr = CREATE_TIMER; tmr = CREATE_TIMER;
if( myid != DefaultObjectId ) if( myid != DefaultObjectId )
setID(id); setID(id);
else else
{ {
threadcreate = false; threadcreate = false;
myname = "UnknownUniSetObject"; myname = "UnknownUniSetObject";
} }
initObject(); initObject();
} }
UniSetObject::UniSetObject( const string& name, const string& section ): UniSetObject::UniSetObject( const string& name, const string& section ):
msgpid(0), msgpid(0),
regOK(false), regOK(false),
active(0), active(0),
threadcreate(true), threadcreate(true),
myid(uniset::DefaultObjectId), myid(uniset::DefaultObjectId),
oref(0) oref(0)
{ {
ui = make_shared<UInterface>(uniset::DefaultObjectId); ui = make_shared<UInterface>(uniset::DefaultObjectId);
/*! \warning UniversalInterface не инициализируется идентификатором объекта */ /*! \warning UniversalInterface не инициализируется идентификатором объекта */
tmr = CREATE_TIMER; tmr = CREATE_TIMER;
myname = section + "/" + name; myname = section + "/" + name;
myid = ui->getIdByName(myname); myid = ui->getIdByName(myname);
setID(myid); setID(myid);
initObject(); initObject();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetObject::~UniSetObject() UniSetObject::~UniSetObject()
{ {
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
std::shared_ptr<UniSetObject> UniSetObject::get_ptr() std::shared_ptr<UniSetObject> UniSetObject::get_ptr()
{ {
return shared_from_this(); return shared_from_this();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::initObject() void UniSetObject::initObject()
{ {
// a_working = ATOMIC_VAR_INIT(0); // a_working = ATOMIC_VAR_INIT(0);
active = ATOMIC_VAR_INIT(0); active = ATOMIC_VAR_INIT(0);
refmutex.setName(myname + "_refmutex"); refmutex.setName(myname + "_refmutex");
auto conf = uniset_conf(); auto conf = uniset_conf();
if( !conf ) if( !conf )
{ {
ostringstream err; ostringstream err;
err << myname << "(initObject): Unknown configuration!!"; err << myname << "(initObject): Unknown configuration!!";
throw SystemError(err.str()); throw SystemError(err.str());
} }
int sz = conf->getArgPInt("--uniset-object-size-message-queue", conf->getField("SizeOfMessageQueue"), 1000); int sz = conf->getArgPInt("--uniset-object-size-message-queue", conf->getField("SizeOfMessageQueue"), 1000);
if( sz > 0 ) if( sz > 0 )
setMaxSizeOfMessageQueue(sz); setMaxSizeOfMessageQueue(sz);
uinfo << myname << "(init): SizeOfMessageQueue=" << getMaxSizeOfMessageQueue() << endl; uinfo << myname << "(init): SizeOfMessageQueue=" << getMaxSizeOfMessageQueue() << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
* \param om - указатель на менеджер, управляющий объектом * \param om - указатель на менеджер, управляющий объектом
* \return Возвращает \a true если инициализация прошла успешно, и \a false если нет * \return Возвращает \a true если инициализация прошла успешно, и \a false если нет
*/ */
bool UniSetObject::init( const std::weak_ptr<UniSetManager>& om ) bool UniSetObject::init( const std::weak_ptr<UniSetManager>& om )
{ {
uinfo << myname << ": init..." << endl; uinfo << myname << ": init..." << endl;
this->mymngr = om; this->mymngr = om;
uinfo << myname << ": init ok..." << endl; uinfo << myname << ": init ok..." << endl;
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::setID( uniset::ObjectId id ) void UniSetObject::setID( uniset::ObjectId id )
{ {
if( isActive() ) if( isActive() )
throw ObjectNameAlready("Set ID error: ObjectId is active.."); throw ObjectNameAlready("Set ID error: ObjectId is active..");
string myfullname = ui->getNameById(id); string myfullname = ui->getNameById(id);
myname = ORepHelpers::getShortName(myfullname); myname = ORepHelpers::getShortName(myfullname);
myid = id; myid = id;
ui->initBackId(myid); ui->initBackId(myid);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::setMaxSizeOfMessageQueue( size_t s ) void UniSetObject::setMaxSizeOfMessageQueue( size_t s )
{ {
mqueueMedium.setMaxSizeOfMessageQueue(s); mqueueMedium.setMaxSizeOfMessageQueue(s);
mqueueLow.setMaxSizeOfMessageQueue(s); mqueueLow.setMaxSizeOfMessageQueue(s);
mqueueHi.setMaxSizeOfMessageQueue(s); mqueueHi.setMaxSizeOfMessageQueue(s);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
size_t UniSetObject::getMaxSizeOfMessageQueue() const size_t UniSetObject::getMaxSizeOfMessageQueue() const
{ {
return mqueueMedium.getMaxSizeOfMessageQueue(); return mqueueMedium.getMaxSizeOfMessageQueue();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetObject::isActive() const bool UniSetObject::isActive() const
{ {
return active; return active;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::setActive(bool set) void UniSetObject::setActive(bool set)
{ {
active = set; active = set;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! /*!
* \param vm - указатель на структуру, которая заполняется, если есть сообщение * \param vm - указатель на структуру, которая заполняется, если есть сообщение
* \return Возвращает указатель VoidMessagePtr если сообщение есть, и shared_ptr(nullptr) если нет * \return Возвращает указатель VoidMessagePtr если сообщение есть, и shared_ptr(nullptr) если нет
*/ */
VoidMessagePtr UniSetObject::receiveMessage() VoidMessagePtr UniSetObject::receiveMessage()
{ {
if( !mqueueHi.empty() ) if( !mqueueHi.empty() )
return mqueueHi.top(); return mqueueHi.top();
if( !mqueueMedium.empty() ) if( !mqueueMedium.empty() )
return mqueueMedium.top(); return mqueueMedium.top();
return mqueueLow.top(); return mqueueLow.top();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
VoidMessagePtr UniSetObject::waitMessage( timeout_t timeMS ) VoidMessagePtr UniSetObject::waitMessage( timeout_t timeMS )
{ {
auto m = receiveMessage(); auto m = receiveMessage();
if( m ) if( m )
return m; return m;
tmr->wait(timeMS); tmr->wait(timeMS);
return receiveMessage(); return receiveMessage();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::registration() void UniSetObject::registration()
{ {
ulogrep << myname << ": registration..." << endl; ulogrep << myname << ": registration..." << endl;
if( myid == uniset::DefaultObjectId ) if( myid == uniset::DefaultObjectId )
{ {
ulogrep << myname << "(registration): Don`t registration. myid=DefaultObjectId \n"; ulogrep << myname << "(registration): Don`t registration. myid=DefaultObjectId \n";
return; return;
} }
auto m = mymngr.lock(); auto m = mymngr.lock();
if( !m ) if( !m )
{ {
uwarn << myname << "(registration): unknown my manager" << endl; uwarn << myname << "(registration): unknown my manager" << endl;
string err(myname + ": unknown my manager"); string err(myname + ": unknown my manager");
throw ORepFailed(err); throw ORepFailed(err);
} }
{ {
uniset::uniset_rwmutex_rlock lock(refmutex); uniset::uniset_rwmutex_rlock lock(refmutex);
if( !oref ) if( !oref )
{ {
uwarn << myname << "(registration): oref is NULL!..." << endl; uwarn << myname << "(registration): oref is NULL!..." << endl;
return; return;
} }
} }
auto conf = uniset_conf(); auto conf = uniset_conf();
regOK = false; regOK = false;
for( size_t i = 0; i < conf->getRepeatCount(); i++ ) for( size_t i = 0; i < conf->getRepeatCount(); i++ )
{ {
try try
{ {
ui->registered(myid, getRef(), true); ui->registered(myid, getRef(), true);
regOK = true; regOK = true;
break; break;
} }
catch( ObjectNameAlready& al ) catch( ObjectNameAlready& al )
{ {
/*! /*!
\warning По умолчанию объекты должны быть уникальны! Поэтому если идёт попытка повторной регистрации. \warning По умолчанию объекты должны быть уникальны! Поэтому если идёт попытка повторной регистрации.
Мы чистим существующую ссылку и заменяем её на новую. Мы чистим существующую ссылку и заменяем её на новую.
Это сделано для более надёжной работы, иначе может получится, что если объект перед завершением Это сделано для более надёжной работы, иначе может получится, что если объект перед завершением
не очистил за собой ссылку (не разрегистрировался), то больше он никогда не сможет вновь зарегистрироваться. не очистил за собой ссылку (не разрегистрировался), то больше он никогда не сможет вновь зарегистрироваться.
Т.к. \b надёжной функции проверки "жив" ли объект пока нет... Т.к. \b надёжной функции проверки "жив" ли объект пока нет...
(так бы можно было проверить и если "не жив", то смело заменять ссылку на новую). Но существует обратная сторона: (так бы можно было проверить и если "не жив", то смело заменять ссылку на новую). Но существует обратная сторона:
если заменяемый объект "жив" и завершит свою работу, то он может почистить за собой ссылку и это тогда наш (новый) если заменяемый объект "жив" и завершит свою работу, то он может почистить за собой ссылку и это тогда наш (новый)
объект станет недоступен другим, а знать об этом не будет!!! объект станет недоступен другим, а знать об этом не будет!!!
*/ */
uwarn << myname << "(registration): replace object (ObjectNameAlready)" << endl; uwarn << myname << "(registration): replace object (ObjectNameAlready)" << endl;
unregistration(); unregistration();
} }
catch( const uniset::ORepFailed& ex ) catch( const uniset::ORepFailed& ex )
{ {
uwarn << myname << "(registration): don`t registration in object reposotory " << endl; uwarn << myname << "(registration): don`t registration in object reposotory " << endl;
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
uwarn << myname << "(registration): " << ex << endl; uwarn << myname << "(registration): " << ex << endl;
} }
msleep(conf->getRepeatTimeout()); msleep(conf->getRepeatTimeout());
} }
if( !regOK ) if( !regOK )
{ {
string err(myname + "(registration): don`t registration in object reposotory"); string err(myname + "(registration): don`t registration in object reposotory");
ucrit << err << endl; ucrit << err << endl;
throw ORepFailed(err); throw ORepFailed(err);
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::unregistration() void UniSetObject::unregistration()
{ {
if( myid < 0 ) // || !reg ) if( myid < 0 ) // || !reg )
{ {
regOK = false; regOK = false;
return; return;
} }
if( myid == uniset::DefaultObjectId ) // -V547 if( myid == uniset::DefaultObjectId ) // -V547
{ {
uinfo << myname << "(unregister): myid=DefaultObjectId \n"; uinfo << myname << "(unregister): myid=DefaultObjectId \n";
regOK = false; regOK = false;
return; return;
} }
{ {
uniset::uniset_rwmutex_rlock lock(refmutex); uniset::uniset_rwmutex_rlock lock(refmutex);
if( !oref ) if( !oref )
{ {
uwarn << myname << "(unregister): oref NULL!" << endl; uwarn << myname << "(unregister): oref NULL!" << endl;
regOK = false; regOK = false;
return; return;
} }
} }
try try
{ {
uinfo << myname << ": unregister " << endl; uinfo << myname << ": unregister " << endl;
ui->unregister(myid); ui->unregister(myid);
uinfo << myname << ": unregister ok. " << endl; uinfo << myname << ": unregister ok. " << endl;
} }
catch(...) catch(...)
{ {
std::exception_ptr p = std::current_exception(); std::exception_ptr p = std::current_exception();
uwarn << myname << ": don`t registration in object repository" uwarn << myname << ": don`t registration in object repository"
<< " err: " << (p ? p.__cxa_exception_type()->name() : "unknown") << " err: " << (p ? p.__cxa_exception_type()->name() : "unknown")
<< endl; << endl;
} }
regOK = false; regOK = false;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::waitFinish() void UniSetObject::waitFinish()
{ {
// поток завершаем в конце, после пользовательских deactivateObject() // поток завершаем в конце, после пользовательских deactivateObject()
if( !thr ) if( !thr )
return; return;
std::unique_lock<std::mutex> lk(m_working); std::unique_lock<std::mutex> lk(m_working);
// cv_working.wait_for(lk, std::chrono::milliseconds(workingTerminateTimeout), [&](){ return (a_working == false); } ); // cv_working.wait_for(lk, std::chrono::milliseconds(workingTerminateTimeout), [&](){ return (a_working == false); } );
cv_working.wait(lk, [ = ]() cv_working.wait(lk, [ = ]()
{ {
return a_working == false; return a_working == false;
}); });
if( thr->isRunning() ) if( thr->isRunning() )
thr->join(); thr->join();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
CORBA::Boolean UniSetObject::exist() CORBA::Boolean UniSetObject::exist()
{ {
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
ObjectId UniSetObject::getId() ObjectId UniSetObject::getId()
{ {
return myid; return myid;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const ObjectId UniSetObject::getId() const const ObjectId UniSetObject::getId() const
{ {
return myid; return myid;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
string UniSetObject::getName() const string UniSetObject::getName() const
{ {
return myname; return myname;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
const string UniSetObject::getStrType() const string UniSetObject::getStrType()
{ {
return CORBA::string_dup(getType()); return CORBA::string_dup(getType());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::termWaiting() void UniSetObject::termWaiting()
{ {
if( tmr ) if( tmr )
tmr->terminate(); tmr->terminate();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::setThreadPriority( Poco::Thread::Priority p ) void UniSetObject::setThreadPriority( Poco::Thread::Priority p )
{ {
if( thr ) if( thr )
thr->setPriority(p); thr->setPriority(p);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::push( const TransportMessage& tm ) void UniSetObject::push( const TransportMessage& tm )
{ {
auto vm = make_shared<VoidMessage>(tm); auto vm = make_shared<VoidMessage>(tm);
if( vm->priority == Message::Medium ) if( vm->priority == Message::Medium )
mqueueMedium.push(vm); mqueueMedium.push(vm);
else if( vm->priority == Message::High ) else if( vm->priority == Message::High )
mqueueHi.push(vm); mqueueHi.push(vm);
else if( vm->priority == Message::Low ) else if( vm->priority == Message::Low )
mqueueLow.push(vm); mqueueLow.push(vm);
else // на всякий по умолчанию medium else // на всякий по умолчанию medium
mqueueMedium.push(vm); mqueueMedium.push(vm);
termWaiting(); termWaiting();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::pushMessage(const char* msg, void UniSetObject::pushMessage(const char* msg,
::CORBA::Long mtype, ::CORBA::Long mtype,
const ::uniset::Timespec& tm, const ::uniset::Timespec& tm,
const ::uniset::ProducerInfo& pi, const ::uniset::ProducerInfo& pi,
::CORBA::Long priority, ::CORBA::Long priority,
::CORBA::Long consumer ) ::CORBA::Long consumer )
{ {
uniset::TextMessage tmsg(msg, mtype, tm, pi, (uniset::Message::Priority)priority, consumer); uniset::TextMessage tmsg(msg, mtype, tm, pi, (uniset::Message::Priority)priority, consumer);
auto vm = tmsg.toLocalVoidMessage(); auto vm = tmsg.toLocalVoidMessage();
if( vm->priority == Message::Medium ) if( vm->priority == Message::Medium )
mqueueMedium.push(vm); mqueueMedium.push(vm);
else if( vm->priority == Message::High ) else if( vm->priority == Message::High )
mqueueHi.push(vm); mqueueHi.push(vm);
else if( vm->priority == Message::Low ) else if( vm->priority == Message::Low )
mqueueLow.push(vm); mqueueLow.push(vm);
else // на всякий по умолчанию medium else // на всякий по умолчанию medium
mqueueMedium.push(vm); mqueueMedium.push(vm);
termWaiting(); termWaiting();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
Poco::JSON::Object::Ptr UniSetObject::httpGet( const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::httpGet( const Poco::URI::QueryParameters& p )
{ {
Poco::JSON::Object::Ptr jret = new Poco::JSON::Object(); Poco::JSON::Object::Ptr jret = new Poco::JSON::Object();
httpGetMyInfo(jret); httpGetMyInfo(jret);
return jret; return jret;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetObject::httpHelp( const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::httpHelp( const Poco::URI::QueryParameters& p )
{ {
uniset::json::help::object myhelp(myname); uniset::json::help::object myhelp(myname);
{ {
uniset::json::help::item cmd("params/get", "get value for parameter"); uniset::json::help::item cmd("params/get", "get value for parameter");
cmd.param("param1,param2,...", "paremeter names. Default: all"); cmd.param("param1,param2,...", "paremeter names. Default: all");
myhelp.add(cmd); myhelp.add(cmd);
} }
{ {
uniset::json::help::item cmd("params/set", "set value for parameter"); uniset::json::help::item cmd("params/set", "set value for parameter");
cmd.param("param1=val1,param2=val2,...", "paremeters"); cmd.param("param1=val1,param2=val2,...", "paremeters");
myhelp.add(cmd); myhelp.add(cmd);
} }
return myhelp; return myhelp;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetObject::httpGetMyInfo( Poco::JSON::Object::Ptr root ) Poco::JSON::Object::Ptr UniSetObject::httpGetMyInfo( Poco::JSON::Object::Ptr root )
{ {
Poco::JSON::Object::Ptr my = uniset::json::make_child(root, "object"); Poco::JSON::Object::Ptr my = uniset::json::make_child(root, "object");
my->set("name", myname); my->set("name", myname);
my->set("id", getId()); my->set("id", getId());
my->set("msgCount", countMessages()); my->set("msgCount", countMessages());
my->set("lostMessages", getCountOfLostMessages()); my->set("lostMessages", getCountOfLostMessages());
my->set("maxSizeOfMessageQueue", getMaxSizeOfMessageQueue()); my->set("maxSizeOfMessageQueue", getMaxSizeOfMessageQueue());
my->set("isActive", isActive()); my->set("isActive", isActive());
my->set("objectType", getStrType()); my->set("objectType", getStrType());
return my; return my;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /configure/xxxx // обработка запроса вида: /configure/xxxx
Poco::JSON::Object::Ptr UniSetObject::request_configure( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UniSetObject::request_configure( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
if( req == "get" ) if( req == "get" )
return request_configure_get(req, params); return request_configure_get(req, params);
ostringstream err; ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown command.."; err << "(request_conf): BAD REQUEST: Unknown command..";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /params/xxxx // обработка запроса вида: /params/xxxx
Poco::JSON::Object::Ptr UniSetObject::request_params( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UniSetObject::request_params( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
if( req == "get" ) if( req == "get" )
return request_params_get(req, params); return request_params_get(req, params);
if( req == "set" ) if( req == "set" )
return request_params_set(req, params); return request_params_set(req, params);
ostringstream err; ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown command.."; err << "(request_conf): BAD REQUEST: Unknown command..";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /configure/get?[ID|NAME]&props=testname,name] from configure.xml // обработка запроса вида: /configure/get?[ID|NAME]&props=testname,name] from configure.xml
Poco::JSON::Object::Ptr UniSetObject::request_configure_get( const std::string& req, const Poco::URI::QueryParameters& params ) Poco::JSON::Object::Ptr UniSetObject::request_configure_get( const std::string& req, const Poco::URI::QueryParameters& params )
{ {
Poco::JSON::Object::Ptr json = new Poco::JSON::Object(); Poco::JSON::Object::Ptr json = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jdata = uniset::json::make_child_array(json, "conf"); Poco::JSON::Array::Ptr jdata = uniset::json::make_child_array(json, "conf");
auto my = httpGetMyInfo(json); auto my = httpGetMyInfo(json);
if( params.empty() ) if( params.empty() )
{ {
ostringstream err; ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown id or name..."; err << "(request_conf): BAD REQUEST: Unknown id or name...";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
auto idlist = uniset::explode_str(params[0].first, ','); auto idlist = uniset::explode_str(params[0].first, ',');
if( idlist.empty() ) if( idlist.empty() )
{ {
ostringstream err; ostringstream err;
err << "(request_conf): BAD REQUEST: Unknown id or name in '" << params[0].first << "'"; err << "(request_conf): BAD REQUEST: Unknown id or name in '" << params[0].first << "'";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
string props = {""}; string props = {""};
for( const auto& p : params ) for( const auto& p : params )
{ {
if( p.first == "props" ) if( p.first == "props" )
{ {
props = p.second; props = p.second;
break; break;
} }
} }
for( const auto& id : idlist ) for( const auto& id : idlist )
{ {
Poco::JSON::Object::Ptr j = request_configure_by_name(id, props); Poco::JSON::Object::Ptr j = request_configure_by_name(id, props);
if( j ) if( j )
jdata->add(j); jdata->add(j);
} }
return json; return json;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
Poco::JSON::Object::Ptr UniSetObject::request_configure_by_name( const string& name, const std::string& props ) Poco::JSON::Object::Ptr UniSetObject::request_configure_by_name( const string& name, const std::string& props )
{ {
Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object(); Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object();
auto conf = uniset_conf(); auto conf = uniset_conf();
ObjectId id = conf->getAnyID(name); ObjectId id = conf->getAnyID(name);
if( id == DefaultObjectId ) if( id == DefaultObjectId )
{ {
ostringstream err; ostringstream err;
err << name << " not found.."; err << name << " not found..";
jdata->set(name, ""); jdata->set(name, "");
jdata->set("error", err.str()); jdata->set("error", err.str());
return jdata; return jdata;
} }
xmlNode* xmlnode = conf->getXMLObjectNode(id); xmlNode* xmlnode = conf->getXMLObjectNode(id);
if( !xmlnode ) if( !xmlnode )
{ {
ostringstream err; ostringstream err;
err << name << " not found confnode.."; err << name << " not found confnode..";
jdata->set(name, ""); jdata->set(name, "");
jdata->set("error", err.str()); jdata->set("error", err.str());
return jdata; return jdata;
} }
UniXML::iterator it(xmlnode); UniXML::iterator it(xmlnode);
jdata->set("name", it.getProp("name")); jdata->set("name", it.getProp("name"));
jdata->set("id", it.getProp("id")); jdata->set("id", it.getProp("id"));
if( !props.empty() ) if( !props.empty() )
{ {
auto lst = uniset::explode_str(props, ','); auto lst = uniset::explode_str(props, ',');
for( const auto& p : lst ) for( const auto& p : lst )
jdata->set(p, it.getProp(p)); jdata->set(p, it.getProp(p));
} }
else else
{ {
auto lst = it.getPropList(); auto lst = it.getPropList();
for( const auto& p : lst ) for( const auto& p : lst )
jdata->set(p.first, p.second); jdata->set(p.first, p.second);
} }
return jdata; return jdata;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/set?prop1=val1&prop2=val2 // обработка запроса вида: /conf/set?prop1=val1&prop2=val2
Poco::JSON::Object::Ptr UniSetObject::request_params_set( const std::string& req, const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::request_params_set( const std::string& req, const Poco::URI::QueryParameters& p )
{ {
ostringstream err; ostringstream err;
err << "(request_params): 'set' not realized yet"; err << "(request_params): 'set' not realized yet";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// обработка запроса вида: /conf/get?prop1&prop2&prop3 // обработка запроса вида: /conf/get?prop1&prop2&prop3
Poco::JSON::Object::Ptr UniSetObject::request_params_get( const std::string& req, const Poco::URI::QueryParameters& p ) Poco::JSON::Object::Ptr UniSetObject::request_params_get( const std::string& req, const Poco::URI::QueryParameters& p )
{ {
ostringstream err; ostringstream err;
err << "(request_params): 'get' not realized yet"; err << "(request_params): 'get' not realized yet";
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#endif #endif
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
ObjectPtr UniSetObject::getRef() const ObjectPtr UniSetObject::getRef() const
{ {
uniset::uniset_rwmutex_rlock lock(refmutex); uniset::uniset_rwmutex_rlock lock(refmutex);
return (uniset::ObjectPtr)CORBA::Object::_duplicate(oref); return (uniset::ObjectPtr)CORBA::Object::_duplicate(oref);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
size_t UniSetObject::countMessages() size_t UniSetObject::countMessages()
{ {
return (mqueueMedium.size() + mqueueLow.size() + mqueueHi.size()); return (mqueueMedium.size() + mqueueLow.size() + mqueueHi.size());
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
size_t UniSetObject::getCountOfLostMessages() const size_t UniSetObject::getCountOfLostMessages() const
{ {
return (mqueueMedium.getCountOfLostMessages() + return (mqueueMedium.getCountOfLostMessages() +
mqueueLow.getCountOfLostMessages() + mqueueLow.getCountOfLostMessages() +
mqueueHi.getCountOfLostMessages() ); mqueueHi.getCountOfLostMessages() );
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetObject::activateObject() bool UniSetObject::activateObject()
{ {
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetObject::deactivateObject() bool UniSetObject::deactivateObject()
{ {
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::uterminate() void UniSetObject::uterminate()
{ {
// setActive(false); // setActive(false);
auto act = UniSetActivator::Instance(); auto act = UniSetActivator::Instance();
act->terminate(); act->terminate();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::thread(bool create) void UniSetObject::thread(bool create)
{ {
threadcreate = create; threadcreate = create;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::offThread() void UniSetObject::offThread()
{ {
threadcreate = false; threadcreate = false;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::onThread() void UniSetObject::onThread()
{ {
threadcreate = true; threadcreate = true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetObject::deactivate() bool UniSetObject::deactivate()
{ {
if( !isActive() ) if( !isActive() )
{ {
try try
{ {
deactivateObject(); deactivateObject();
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
uwarn << myname << "(deactivate): " << ex.what() << endl; uwarn << myname << "(deactivate): " << ex.what() << endl;
} }
return true; return true;
} }
setActive(false); // завершаем поток обработки сообщений setActive(false); // завершаем поток обработки сообщений
if( tmr ) if( tmr )
tmr->terminate(); tmr->terminate();
try try
{ {
uinfo << myname << "(deactivate): ..." << endl; uinfo << myname << "(deactivate): ..." << endl;
auto m = mymngr.lock(); auto m = mymngr.lock();
if( m ) if( m )
{ {
PortableServer::POA_var poamngr = m->getPOA(); PortableServer::POA_var poamngr = m->getPOA();
if( !PortableServer::POA_Helper::is_nil(poamngr) ) if( !PortableServer::POA_Helper::is_nil(poamngr) )
{ {
try try
{ {
deactivateObject(); deactivateObject();
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
uwarn << myname << "(deactivate): " << ex.what() << endl; uwarn << myname << "(deactivate): " << ex.what() << endl;
} }
unregistration(); unregistration();
PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this)); PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this));
poamngr->deactivate_object(oid); poamngr->deactivate_object(oid);
uinfo << myname << "(deactivate): finished..." << endl; uinfo << myname << "(deactivate): finished..." << endl;
waitFinish(); waitFinish();
return true; return true;
} }
} }
uwarn << myname << "(deactivate): manager already destroyed.." << endl; uwarn << myname << "(deactivate): manager already destroyed.." << endl;
} }
catch( const CORBA::TRANSIENT& ) catch( const CORBA::TRANSIENT& )
{ {
uwarn << myname << "(deactivate): isExist: нет связи..." << endl; uwarn << myname << "(deactivate): isExist: нет связи..." << endl;
} }
catch( CORBA::SystemException& ex ) catch( CORBA::SystemException& ex )
{ {
uwarn << myname << "(deactivate): " << "поймали CORBA::SystemException: " << ex.NP_minorString() << endl; uwarn << myname << "(deactivate): " << "поймали CORBA::SystemException: " << ex.NP_minorString() << endl;
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
uwarn << myname << "(deactivate): " << "поймали CORBA::Exception." << endl; uwarn << myname << "(deactivate): " << "поймали CORBA::Exception." << endl;
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
uwarn << myname << "(deactivate): " << ex << endl; uwarn << myname << "(deactivate): " << ex << endl;
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
uwarn << myname << "(deactivate): " << ex.what() << endl; uwarn << myname << "(deactivate): " << ex.what() << endl;
} }
return false; return false;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool UniSetObject::activate() bool UniSetObject::activate()
{ {
uinfo << myname << ": activate..." << endl; uinfo << myname << ": activate..." << endl;
auto m = mymngr.lock(); auto m = mymngr.lock();
if( !m ) if( !m )
{ {
ostringstream err; ostringstream err;
err << myname << "(activate): mymngr=NULL!!! activate failure..."; err << myname << "(activate): mymngr=NULL!!! activate failure...";
ucrit << err.str() << endl; ucrit << err.str() << endl;
throw SystemError(err.str()); throw SystemError(err.str());
} }
PortableServer::POA_var poa = m->getPOA(); PortableServer::POA_var poa = m->getPOA();
if( poa == NULL || CORBA::is_nil(poa) ) if( poa == NULL || CORBA::is_nil(poa) )
{ {
string err(myname + ": не задан менеджер"); string err(myname + ": не задан менеджер");
throw ORepFailed(err); throw ORepFailed(err);
} }
bool actOK = false; bool actOK = false;
auto conf = uniset_conf(); auto conf = uniset_conf();
for( size_t i = 0; i < conf->getRepeatCount(); i++ ) for( size_t i = 0; i < conf->getRepeatCount(); i++ )
{ {
try try
{ {
if( conf->isTransientIOR() ) if( conf->isTransientIOR() )
{ {
// activate witch generate id // activate witch generate id
poa->activate_object(static_cast<PortableServer::ServantBase*>(this)); poa->activate_object(static_cast<PortableServer::ServantBase*>(this));
actOK = true; actOK = true;
break; break;
} }
else else
{ {
// А если myid==uniset::DefaultObjectId // А если myid==uniset::DefaultObjectId
// то myname = noname. ВСЕГДА! // то myname = noname. ВСЕГДА!
if( myid == uniset::DefaultObjectId ) if( myid == uniset::DefaultObjectId )
{ {
uwarn << myname << "(activate): Не задан ID!!! IGNORE ACTIVATE..." << endl; uwarn << myname << "(activate): Не задан ID!!! IGNORE ACTIVATE..." << endl;
// вызываем на случай если она переопределена в дочерних классах // вызываем на случай если она переопределена в дочерних классах
// Например в UniSetManager, если здесь не вызвать, то не будут инициализированы подчинённые объекты. // Например в UniSetManager, если здесь не вызвать, то не будут инициализированы подчинённые объекты.
// (см. UniSetManager::activateObject) // (см. UniSetManager::activateObject)
activateObject(); activateObject();
return false; return false;
} }
// Always use the same object id. // Always use the same object id.
PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId(myname.c_str()); PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId(myname.c_str());
// Activate object... // Activate object...
poa->activate_object_with_id(oid, this); poa->activate_object_with_id(oid, this);
actOK = true; actOK = true;
break; break;
} }
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
if( string(ex._name()) != "ObjectAlreadyActive" ) if( string(ex._name()) != "ObjectAlreadyActive" )
{ {
ostringstream err; ostringstream err;
err << myname << "(activate): ACTIVATE ERROR: " << ex._name(); err << myname << "(activate): ACTIVATE ERROR: " << ex._name();
ucrit << myname << "(activate): " << err.str() << endl; ucrit << myname << "(activate): " << err.str() << endl;
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
uwarn << myname << "(activate): IGNORE.. catch " << ex._name() << endl; uwarn << myname << "(activate): IGNORE.. catch " << ex._name() << endl;
} }
msleep( conf->getRepeatTimeout() ); msleep( conf->getRepeatTimeout() );
} }
if( !actOK ) if( !actOK )
{ {
ostringstream err; ostringstream err;
err << myname << "(activate): DON`T ACTIVATE.."; err << myname << "(activate): DON`T ACTIVATE..";
ucrit << myname << "(activate): " << err.str() << endl; ucrit << myname << "(activate): " << err.str() << endl;
throw uniset::SystemError(err.str()); throw uniset::SystemError(err.str());
} }
{ {
uniset::uniset_rwmutex_wrlock lock(refmutex); uniset::uniset_rwmutex_wrlock lock(refmutex);
oref = poa->servant_to_reference(static_cast<PortableServer::ServantBase*>(this) ); oref = poa->servant_to_reference(static_cast<PortableServer::ServantBase*>(this) );
} }
registration(); registration();
// Запускаем поток обработки сообщений // Запускаем поток обработки сообщений
setActive(true); setActive(true);
if( myid != uniset::DefaultObjectId && threadcreate ) if( myid != uniset::DefaultObjectId && threadcreate )
{ {
thr = unisetstd::make_unique< ThreadCreator<UniSetObject> >(this, &UniSetObject::work); thr = unisetstd::make_unique< ThreadCreator<UniSetObject> >(this, &UniSetObject::work);
//thr->setCancel(ost::Thread::cancelDeferred); //thr->setCancel(ost::Thread::cancelDeferred);
std::unique_lock<std::mutex> locker(m_working); std::unique_lock<std::mutex> locker(m_working);
a_working = true; a_working = true;
thr->start(); thr->start();
} }
else else
{ {
// выдаём предупреждение только если поток не отключён, но при этом не задан ID // выдаём предупреждение только если поток не отключён, но при этом не задан ID
if( threadcreate ) if( threadcreate )
{ {
uinfo << myname << ": ?? не задан ObjectId...(" uinfo << myname << ": ?? не задан ObjectId...("
<< "myid=" << myid << " threadcreate=" << threadcreate << "myid=" << myid << " threadcreate=" << threadcreate
<< ")" << endl; << ")" << endl;
} }
thread(false); thread(false);
} }
activateObject(); activateObject();
uinfo << myname << ": activate ok." << endl; uinfo << myname << ": activate ok." << endl;
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::work() void UniSetObject::work()
{ {
uinfo << myname << ": thread processing messages running..." << endl; uinfo << myname << ": thread processing messages running..." << endl;
msgpid = thr ? thr->getTID() : Poco::Process::id(); msgpid = thr ? thr->getTID() : Poco::Process::id();
{ {
std::unique_lock<std::mutex> locker(m_working); std::unique_lock<std::mutex> locker(m_working);
a_working = true; a_working = true;
} }
while( isActive() ) while( isActive() )
callback(); callback();
uinfo << myname << ": thread processing messages stopped..." << endl; uinfo << myname << ": thread processing messages stopped..." << endl;
{ {
std::unique_lock<std::mutex> locker(m_working); std::unique_lock<std::mutex> locker(m_working);
a_working = false; a_working = false;
} }
cv_working.notify_all(); cv_working.notify_all();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::callback() void UniSetObject::callback()
{ {
// При реализации с использованием waitMessage() каждый раз при вызове askTimer() необходимо // При реализации с использованием waitMessage() каждый раз при вызове askTimer() необходимо
// проверять возвращаемое значение на UniSetTimers::WaitUpTime и вызывать termWaiting(), // проверять возвращаемое значение на UniSetTimers::WaitUpTime и вызывать termWaiting(),
// чтобы избежать ситуации, когда процесс до заказа таймера 'спал'(в функции waitMessage()) и после // чтобы избежать ситуации, когда процесс до заказа таймера 'спал'(в функции waitMessage()) и после
// заказа продолжит спать(т.е. обработчик вызван не будет)... // заказа продолжит спать(т.е. обработчик вызван не будет)...
try try
{ {
auto m = waitMessage(sleepTime); auto m = waitMessage(sleepTime);
if( m ) if( m )
processingMessage(m.get()); processingMessage(m.get());
if( !isActive() ) if( !isActive() )
return; return;
sleepTime = checkTimers(this); sleepTime = checkTimers(this);
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ucrit << myname << "(callback): " << ex << endl; ucrit << myname << "(callback): " << ex << endl;
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::processingMessage( const uniset::VoidMessage* msg ) void UniSetObject::processingMessage( const uniset::VoidMessage* msg )
{ {
try try
{ {
switch( msg->type ) switch( msg->type )
{ {
case Message::SensorInfo: case Message::SensorInfo:
sensorInfo( reinterpret_cast<const SensorMessage*>(msg) ); sensorInfo( reinterpret_cast<const SensorMessage*>(msg) );
break; break;
case Message::Timer: case Message::Timer:
timerInfo( reinterpret_cast<const TimerMessage*>(msg) ); timerInfo( reinterpret_cast<const TimerMessage*>(msg) );
break; break;
case Message::SysCommand: case Message::SysCommand:
sysCommand( reinterpret_cast<const SystemMessage*>(msg) ); sysCommand( reinterpret_cast<const SystemMessage*>(msg) );
break; break;
case Message::TextMessage: case Message::TextMessage:
{ {
TextMessage tm(msg); TextMessage tm(msg);
onTextMessage( &tm ); onTextMessage( &tm );
break; break;
} }
default: default:
break; break;
} }
} }
catch( const CORBA::SystemException& ex ) catch( const CORBA::SystemException& ex )
{ {
ucrit << myname << "(processingMessage): CORBA::SystemException: " << ex.NP_minorString() << endl; ucrit << myname << "(processingMessage): CORBA::SystemException: " << ex.NP_minorString() << endl;
} }
catch( const CORBA::Exception& ex ) catch( const CORBA::Exception& ex )
{ {
uwarn << myname << "(processingMessage): CORBA::Exception: " << ex._name() << endl; uwarn << myname << "(processingMessage): CORBA::Exception: " << ex._name() << endl;
} }
catch( omniORB::fatalException& fe ) catch( omniORB::fatalException& fe )
{ {
if( ulog()->is_crit() ) if( ulog()->is_crit() )
{ {
ulog()->crit() << myname << "(processingMessage): Caught omniORB::fatalException:" << endl; ulog()->crit() << myname << "(processingMessage): Caught omniORB::fatalException:" << endl;
ulog()->crit() << myname << "(processingMessage): file: " << fe.file() ulog()->crit() << myname << "(processingMessage): file: " << fe.file()
<< " line: " << fe.line() << " line: " << fe.line()
<< " mesg: " << fe.errmsg() << endl; << " mesg: " << fe.errmsg() << endl;
} }
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ucrit << myname << "(processingMessage): " << ex << endl; ucrit << myname << "(processingMessage): " << ex << endl;
} }
catch( const std::exception& ex ) catch( const std::exception& ex )
{ {
ucrit << myname << "(processingMessage): " << ex.what() << endl; ucrit << myname << "(processingMessage): " << ex.what() << endl;
} }
/* /*
catch( ... ) catch( ... )
{ {
std::exception_ptr p = std::current_exception(); std::exception_ptr p = std::current_exception();
ucrit <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl; ucrit <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
} }
*/ */
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
timeout_t UniSetObject::askTimer( TimerId timerid, timeout_t timeMS, clock_t ticks, Message::Priority p ) timeout_t UniSetObject::askTimer( TimerId timerid, timeout_t timeMS, clock_t ticks, Message::Priority p )
{ {
timeout_t tsleep = LT_Object::askTimer(timerid, timeMS, ticks, p); timeout_t tsleep = LT_Object::askTimer(timerid, timeMS, ticks, p);
if( tsleep != UniSetTimer::WaitUpTime ) if( tsleep != UniSetTimer::WaitUpTime )
termWaiting(); termWaiting();
return tsleep; return tsleep;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
uniset::SimpleInfo* UniSetObject::getInfo( const char* userparam ) uniset::SimpleInfo* UniSetObject::getInfo( const char* userparam )
{ {
ostringstream info; ostringstream info;
info.setf(ios::left, ios::adjustfield); info.setf(ios::left, ios::adjustfield);
info << "(" << myid << ")" << setw(40) << myname info << "(" << myid << ")" << setw(40) << myname
<< " date: " << uniset::dateToString() << " date: " << uniset::dateToString()
<< " time: " << uniset::timeToString() << " time: " << uniset::timeToString()
<< "\n===============================================================================\n" << "\n===============================================================================\n"
<< "pid=" << setw(10) << Poco::Process::id() << "pid=" << setw(10) << Poco::Process::id()
<< " tid=" << setw(10); << " tid=" << setw(10);
if( threadcreate ) if( threadcreate )
{ {
if(thr) if(thr)
{ {
msgpid = thr->getTID(); // заодно(на всякий) обновим и внутреннюю информацию msgpid = thr->getTID(); // заодно(на всякий) обновим и внутреннюю информацию
info << msgpid; info << msgpid;
} }
else else
info << "не запущен"; info << "не запущен";
} }
else else
info << "откл."; info << "откл.";
info << "\tcount=" << countMessages() info << "\tcount=" << countMessages()
<< "\t medium: " << "\t medium: "
<< " maxMsg=" << mqueueMedium.getMaxQueueMessages() << " maxMsg=" << mqueueMedium.getMaxQueueMessages()
<< " qFull(" << mqueueMedium.getMaxSizeOfMessageQueue() << ")=" << mqueueMedium.getCountOfLostMessages() << " qFull(" << mqueueMedium.getMaxSizeOfMessageQueue() << ")=" << mqueueMedium.getCountOfLostMessages()
<< "\t hi: " << "\t hi: "
<< " maxMsg=" << mqueueHi.getMaxQueueMessages() << " maxMsg=" << mqueueHi.getMaxQueueMessages()
<< " qFull(" << mqueueHi.getMaxSizeOfMessageQueue() << ")=" << mqueueHi.getCountOfLostMessages() << " qFull(" << mqueueHi.getMaxSizeOfMessageQueue() << ")=" << mqueueHi.getCountOfLostMessages()
<< "\t low: " << "\t low: "
<< " maxMsg=" << mqueueLow.getMaxQueueMessages() << " maxMsg=" << mqueueLow.getMaxQueueMessages()
<< " qFull(" << mqueueLow.getMaxSizeOfMessageQueue() << ")=" << mqueueLow.getCountOfLostMessages(); << " qFull(" << mqueueLow.getMaxSizeOfMessageQueue() << ")=" << mqueueLow.getCountOfLostMessages();
SimpleInfo* res = new SimpleInfo(); SimpleInfo* res = new SimpleInfo();
res->info = info.str().c_str(); // CORBA::string_dup(info.str().c_str()); res->info = info.str().c_str(); // CORBA::string_dup(info.str().c_str());
res->id = myid; res->id = myid;
return res; // ._retn(); return res; // ._retn();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
SimpleInfo* UniSetObject::apiRequest( const char* request ) SimpleInfo* UniSetObject::apiRequest( const char* request )
{ {
#ifdef DISABLE_REST_API #ifdef DISABLE_REST_API
return getInfo(request); return getInfo(request);
#else #else
SimpleInfo* ret = new SimpleInfo(); SimpleInfo* ret = new SimpleInfo();
ret->id = getId(); ret->id = getId();
ostringstream err; ostringstream err;
try try
{ {
Poco::URI uri(request); Poco::URI uri(request);
if( ulog()->is_level9() ) if( ulog()->is_level9() )
ulog()->level9() << myname << "(apiRequest): request: " << request << endl; ulog()->level9() << myname << "(apiRequest): request: " << request << endl;
ostringstream out; ostringstream out;
std::string query = ""; std::string query = "";
// Пока не будем требовать обязательно использовать формат /api/vesion/query.. // Пока не будем требовать обязательно использовать формат /api/vesion/query..
// но если указан, то проверяем.. // но если указан, то проверяем..
std::vector<std::string> seg; std::vector<std::string> seg;
uri.getPathSegments(seg); uri.getPathSegments(seg);
size_t qind = 0; size_t qind = 0;
if( seg.size() > 0 && seg[0] == "api" ) if( seg.size() > 0 && seg[0] == "api" )
{ {
// проверка: /api/version/query[?params].. // проверка: /api/version/query[?params]..
if( seg.size() < 2 || seg[1] != UHttp::UHTTP_API_VERSION ) if( seg.size() < 2 || seg[1] != UHttp::UHTTP_API_VERSION )
{ {
Poco::JSON::Object jdata; Poco::JSON::Object jdata;
jdata.set("error", Poco::Net::HTTPServerResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_BAD_REQUEST)); jdata.set("error", Poco::Net::HTTPServerResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_BAD_REQUEST));
jdata.set("ecode", (int)Poco::Net::HTTPResponse::HTTP_BAD_REQUEST); jdata.set("ecode", (int)Poco::Net::HTTPResponse::HTTP_BAD_REQUEST);
jdata.set("message", "BAD REQUEST STRUCTURE"); jdata.set("message", "BAD REQUEST STRUCTURE");
jdata.stringify(out); jdata.stringify(out);
ret->info = out.str().c_str(); // CORBA::string_dup(..) ret->info = out.str().c_str(); // CORBA::string_dup(..)
return ret; return ret;
} }
if( seg.size() > 2 ) if( seg.size() > 2 )
qind = 2; qind = 2;
} }
else if( seg.size() == 1 ) else if( seg.size() == 1 )
qind = 0; qind = 0;
query = seg.empty() ? "" : seg[qind]; query = seg.empty() ? "" : seg[qind];
// обработка запроса.. // обработка запроса..
if( query == "help" ) if( query == "help" )
{ {
// запрос вида: /help?params // запрос вида: /help?params
auto reply = httpHelp(uri.getQueryParameters()); auto reply = httpHelp(uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else if( query == "configure" ) else if( query == "configure" )
{ {
// запрос вида: /configure/query?params // запрос вида: /configure/query?params
string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : ""; string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : "";
auto reply = request_configure(qconf, uri.getQueryParameters()); auto reply = request_configure(qconf, uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else if( query == "params" ) else if( query == "params" )
{ {
// запрос вида: /params/query?params // запрос вида: /params/query?params
string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : ""; string qconf = ( seg.size() > (qind + 1) ) ? seg[qind + 1] : "";
auto reply = request_params(qconf, uri.getQueryParameters()); auto reply = request_params(qconf, uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else if( !query.empty() ) else if( !query.empty() )
{ {
// запрос вида: /cmd?params // запрос вида: /cmd?params
auto reply = httpRequest(query, uri.getQueryParameters()); auto reply = httpRequest(query, uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
else else
{ {
// запрос без команды /?params // запрос без команды /?params
auto reply = httpGet(uri.getQueryParameters()); auto reply = httpGet(uri.getQueryParameters());
reply->stringify(out); reply->stringify(out);
} }
ret->info = out.str().c_str(); // CORBA::string_dup(..) ret->info = out.str().c_str(); // CORBA::string_dup(..)
return ret; return ret;
} }
catch( Poco::SyntaxException& ex ) catch( Poco::SyntaxException& ex )
{ {
err << ex.displayText(); err << ex.displayText();
} }
catch( uniset::SystemError& ex ) catch( uniset::SystemError& ex )
{ {
err << ex; err << ex;
} }
catch( std::exception& ex ) catch( std::exception& ex )
{ {
err << ex.what(); err << ex.what();
} }
Poco::JSON::Object jdata; Poco::JSON::Object jdata;
jdata.set("error", err.str()); jdata.set("error", err.str());
jdata.set("ecode", (int)Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); jdata.set("ecode", (int)Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR);
// jdata.set("ename", Poco::Net::HTTPResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR)); // jdata.set("ename", Poco::Net::HTTPResponse::getReasonForStatus(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR));
ostringstream out; ostringstream out;
jdata.stringify(out); jdata.stringify(out);
ret->info = out.str().c_str(); // CORBA::string_dup(..) ret->info = out.str().c_str(); // CORBA::string_dup(..)
return ret; return ret;
#endif #endif
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
ostream& operator<<(ostream& os, UniSetObject& obj ) ostream& operator<<(ostream& os, UniSetObject& obj )
{ {
SimpleInfo_var si = obj.getInfo(); SimpleInfo_var si = obj.getInfo();
return os << si->info; return os << si->info;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
#undef CREATE_TIMER #undef CREATE_TIMER
} // end of namespace uniset } // end of namespace uniset
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment