/* * ALMA - Atacama Large Millimiter Array * (c) European Southern Observatory, 2003 * *This library is free software; you can redistribute it and/or *modify it under the terms of the GNU Lesser General Public *License as published by the Free Software Foundation; either *version 2.1 of the License, or (at your option) any later version. * *This library is distributed in the hope that it will be useful, *but WITHOUT ANY WARRANTY; without even the implied warranty of *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *Lesser General Public License for more details. * *You should have received a copy of the GNU Lesser General Public *License along with this library; if not, write to the Free Software *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ template baci::Monitor::Monitor(ACE_CString name, const ACS::TimeInterval& minTriggerTime, const baci::BACIValue& minTriggerValue, BACIProperty* property) : initialization_m(1), monitor_mp(0), reference_mp(CORBA::Object::_nil()) { ACS_TRACE("baci::Monitor<>::Monitor"); const char* state = BACIRecoveryManager::getInstance()->getObjectState(name.c_str()); setObjectState(state, minTriggerTime, minTriggerValue, property); delete[] state; initialization_m = CORBA::is_nil(reference_mp); } template baci::Monitor::Monitor(ACE_CString name_, Callback_ptr callback_p, const CBDescIn& inDesc, const ACS::TimeInterval& triggerTime, const baci::BACIValue& triggerValue, const ACS::TimeInterval& minTriggerTime, const baci::BACIValue& minTriggerValue, BACIProperty* property, const ACS::TimeInterval& transmitTime, const BACIMonitor::UpdateMode& updateMode) : initialization_m(1), monitor_mp(0), reference_mp(CORBA::Object::_nil()) { ACS_TRACE("baci::Monitor<>::Monitor"); char* cname_p = BACIRecoveryManager::getInstance()->generateObjectName(name_.c_str()); ACE_CString name(cname_p); delete[] cname_p; ACS_LOG(LM_RUNTIME_CONTEXT, "baci::Monitor<>::Monitor", (static_cast(LM_DELOUSE), "Name is: '%s'", name.c_str())); int callbackID = property->getComponent()->registerCallback(TBACIValuetype, callback_p, inDesc); if (!callbackID) return; monitor_mp = new BACIMonitor(name, callbackID, this, triggerTime, triggerValue, minTriggerTime, minTriggerValue, property, transmitTime, updateMode); if (monitor_mp==0) { property->getComponent()->removeCallback(callbackID); return; } reference_mp = BACI_CORBA::ActivateCORBAObject(this, name.c_str()); if (CORBA::is_nil(reference_mp)==true) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::Monitor<>::Monitor", (LM_ERROR, "Failed to activate CORBA object '%s'", name.c_str())); monitor_mp->destroy(); monitor_mp = 0; return; } else this->_remove_ref(); BACIRecoveryManager::getInstance()->addRecoverableObject(this); initialization_m = 0; } template baci::Monitor::~Monitor() { ACS_TRACE("BACI::Monitor<>::~Monitor"); } template int baci::Monitor::getId(void) { ACS_TRACE("baci::Monitor<>::getId"); return -1; } template const char* baci::Monitor::getName(void) { ACS_TRACE("baci::Monitor<>::getName"); return monitor_mp->getName(); } template const char* baci::Monitor::getObjectState(void) { ACS_TRACE("baci::Monitor<>::getObjectState"); ACE_TCHAR *buffer_p; ACE_NEW_RETURN (buffer_p, ACE_TCHAR[MAX_RECORD_SIZE], 0); try { BACICallback* bcb_p = monitor_mp->getProperty()->getComponent()->getCallback(monitor_mp->getCallbackID()); if (bcb_p==0) return 0; CORBA::String_var ior = BACI_CORBA::getORB()->object_to_string(bcb_p->getCallback() ); unsigned long tag = bcb_p->getDescIn().id_tag; ACE_CString valueTrigger; monitor_mp->getTriggerValue().toString(valueTrigger); if (ACE_OS::strlen(valueTrigger.c_str())==0) valueTrigger = "0"; HEADER_PRINT_GET_OBJECT_STATE return buffer_p; } catch(...) { ACS_SHORT_LOG((LM_ERROR, "baci::Monitor<>::getObjectState")); } return 0; } template void baci::Monitor::setObjectState(const char* state) { ACS_TRACE("baci::Monitor<>::setObjectState"); ACE_UNUSED_ARG(state); } template void baci::Monitor::setObjectState(const char* state, const ACS::TimeInterval& minTriggerTime, const baci::BACIValue& minTriggerValue, BACIProperty *property) { ACS_TRACE("baci::Monitor<>::setObjectState"); ACE_TCHAR cname[MAX_NAME_LENGTH]; ACE_TCHAR ior[MAX_IOR_LENGTH]; CBDescIn descIn; unsigned long tag; ACS::TimeInterval timeTrigger; ACS::TimeInterval transmitTime; ACE_TCHAR valueTrigger[MAX_VALUE_LENGTH]; int mode; unsigned int triggerOnValue, isSuspended; HEADER_SCAN_SET_OBJECT_STATE descIn.id_tag = tag; ACE_CString name(cname); try { CORBA::Object_var obj = BACI_CORBA::getORB()->string_to_object(ior); if (CORBA::is_nil(obj.in())==true) { return; } ACS_DEBUG_PARAM("baci::Monitor<>::setObjectState", "Got obj for: '%s'", name.c_str()); TCB * cb_p = TCB::_narrow(obj.in()); ACS_DEBUG_PARAM("baci::Monitor<>::setObjectState", "Narrow OK: '%p'", (void *)cb_p); if (cb_p ==TCB::_nil()) { CORBA::release(cb_p); return; } ACS_DEBUG_PARAM("baci::Monitor<>::setObjectState", "Narrow OK and not nil for: '%s'", name.c_str()); int callbackID = property->getComponent()->registerCallback(TBACIValuetype, cb_p, descIn); ACS_DEBUG_PARAM("baci::Monitor<>::setObjectState", "Recovering: '%s'", name.c_str()); baci::BACIValue value(minTriggerValue); if (value.fromString(valueTrigger)==false) { triggerOnValue = false; } ACS_NEW_RETURN(monitor_mp, BACIMonitor(name.c_str(), callbackID, this, timeTrigger, value, minTriggerTime, minTriggerValue, property, transmitTime, BACIMonitor::UpdateMode(mode), isSuspended), ); monitor_mp->setTriggerOnValue(triggerOnValue); reference_mp = BACI_CORBA::ActivateCORBAObject(this, name.c_str()); if (CORBA::is_nil(reference_mp)==true) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::Monitor<>::setObjectState", (LM_ERROR, "Failed to activate CORBA object '%s'", name.c_str())); monitor_mp->destroy(); monitor_mp = 0; CORBA::release(cb_p); return; } else this->_remove_ref(); CORBA::release(cb_p); } catch(...) { ACS_SHORT_LOG((LM_ERROR, "baci::Monitor<>::setObjectState")); } } template void baci::Monitor::monitorDestroyed() { ACS_TRACE("baci::Monitor<>::monitorDestroyed"); destroy(); } template void baci::Monitor::monitorStateChanged() { ACS_TRACE("baci::Monitor<>::monitorStateChanged"); BACIRecoveryManager::getInstance()->updateRecoverableObject(this); } template void baci::Monitor::suspend () { ACS_TRACE("baci::Monitor<>::suspend"); monitor_mp->suspend(); } template void baci::Monitor::resume () { ACS_TRACE("baci::Monitor<>::resume"); monitor_mp->resume(); } template void baci::Monitor::destroy () { ACS_TRACE("BACI::Monitor<>::destroy"); BACIRecoveryManager::getInstance()->removeRecoverableObject(this); if (monitor_mp!=0) { monitor_mp->destroy(); monitor_mp = 0; } if (CORBA::is_nil(reference_mp)==false) { if (BACI_CORBA::DestroyCORBAObject(reference_mp)==false) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::Monitor<>::destroy", (LM_ERROR, "Failed to destroy CORBA object")); } else { CORBA::release(reference_mp); } } } template void baci::Monitor::set_timer_trigger (ACS::TimeInterval timer) { ACS_TRACE("baci::Monitor<>::set_timer_trigger"); monitor_mp->setTriggerTime(timer); } template void baci::Monitor::get_timer_trigger (ACS::TimeInterval_out timer) { ACS_TRACE("baci::Monitor<>::get_timer_trigger"); timer = monitor_mp->getTriggerTime(); } template void baci::Monitor::set_value_trigger (TCORBA delta, CORBA::Boolean enable ) { ACS_TRACE("baci::Monitor<>::set_value_trigger"); if (enable==false) monitor_mp->setTriggerOnValue(false); else { monitor_mp->setTriggerValue(baci::BACIValue(delta)); monitor_mp->setTriggerOnValue(true); } } template void baci::Monitor::get_value_trigger (TCORBA_out delta, CORBA::Boolean_out enable ) { ACS_TRACE("baci::Monitor<>::get_value_trigger"); delta = monitor_mp->getTriggerValue().getValue(static_cast(0)); enable = monitor_mp->getTriggerOnValue(); } template void baci::Monitor::set_value_percent_trigger (CORBA::Double delta, CORBA::Boolean enable) { ACS_TRACE("baci::Monitor<>::set_value_percent_trigger"); if(enable == false) monitor_mp->setTriggerOnValuePercent(false); else { monitor_mp->setTriggerValuePercent(baci::BACIValue(delta)); monitor_mp->setTriggerOnValuePercent(true); } } template void baci::Monitor::get_value_percent_trigger (CORBA::Double_out delta, CORBA::Boolean_out enable) { ACS_TRACE("baci::Monitor<>::get_value_percent_trigger"); delta = monitor_mp->getTriggerValuePercent().getValue(static_cast(0)); enable = monitor_mp->getTriggerOnValuePercent(); } template ACS::Time baci::Monitor::start_time () { ACS_TRACE("baci::Monitor<>::start_time"); return monitor_mp->getTransmitTime(); } template baci::MonitorBasic::MonitorBasic(ACE_CString name, const ACS::TimeInterval& minTriggerTime, const baci::BACIValue& minTriggerValue, BACIProperty* property) : initialization_m(1), monitor_mp(0), reference_mp(CORBA::Object::_nil()) { ACE_UNUSED_ARG(minTriggerValue); ACS_TRACE("baci::MonitorBasic<>::MonitorBasic"); const char* state_p = BACIRecoveryManager::getInstance()->getObjectState(name.c_str()); setObjectState(state_p, minTriggerTime, property); delete[] state_p; initialization_m = CORBA::is_nil(reference_mp); } template baci::MonitorBasic::MonitorBasic(ACE_CString name_, Callback_ptr callback_p, const CBDescIn& inDesc, const ACS::TimeInterval& triggerTime, const baci::BACIValue& triggerValue, const ACS::TimeInterval& minTriggerTime, const baci::BACIValue& minTriggerValue, BACIProperty* property, const ACS::TimeInterval& transmitTime, const BACIMonitor::UpdateMode& updateMode) : initialization_m(1), monitor_mp(0), reference_mp(CORBA::Object::_nil()) { ACE_UNUSED_ARG(triggerValue); ACE_UNUSED_ARG(minTriggerValue); ACS_TRACE("baci::MonitorBasic<>::MonitorBasic"); char* cname_p = BACIRecoveryManager::getInstance()->generateObjectName(name_.c_str()); ACE_CString name(cname_p); delete[] cname_p; ACS_DEBUG_PARAM("baci::MonitorBasic<>::MonitorBasic", "Name is: '%s'", name.c_str()); int callbackID = property->getComponent()->registerCallback(TBACIValuetype, callback_p, inDesc); if (callbackID==0) { return; } monitor_mp = new BACIMonitor(name, callbackID, this, triggerTime, baci::BACIValue::NullValue, minTriggerTime, baci::BACIValue::NullValue, property, transmitTime, updateMode); if (monitor_mp==0) { property->getComponent()->removeCallback(callbackID); return; } reference_mp = BACI_CORBA::ActivateCORBAObject(this, name.c_str()); if (CORBA::is_nil(reference_mp)==true) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::MonitorBasic<>::MonitorBasic", (LM_ERROR, "Failed to activate CORBA object '%s'", name.c_str())); monitor_mp->destroy(); monitor_mp = 0; return; } else this->_remove_ref(); BACIRecoveryManager::getInstance()->addRecoverableObject(this); initialization_m = 0; } template baci::MonitorBasic::~MonitorBasic() { ACS_TRACE("BACI::MonitorBasic<>::~MonitorBasic<>"); } template int baci::MonitorBasic::getId(void) { ACS_TRACE("baci::MonitorBasic<>::getId"); return -1; } template const char* baci::MonitorBasic::getName(void) { ACS_TRACE("baci::MonitorBasic<>::getName"); return monitor_mp->getName(); } template const char* baci::MonitorBasic::getObjectState(void) { ACS_TRACE("baci::MonitorBasic<>::getObjectState"); ACE_TCHAR *buffer_p = 0; ACE_NEW_RETURN (buffer_p, ACE_TCHAR[MAX_RECORD_SIZE], 0); try { BACICallback* bcb_p = monitor_mp->getProperty()->getComponent()->getCallback(monitor_mp->getCallbackID()); if (bcb_p==0) return 0; CORBA::String_var ior = BACI_CORBA::getORB()->object_to_string(bcb_p->getCallback() ); unsigned long tag = bcb_p->getDescIn().id_tag; IMPL_PRINT_GET_OBJECT_STATE return buffer_p; } catch(...) { ACS_SHORT_LOG((LM_ERROR, "baci::MonitorBasic<>::getObjectState")); } return 0; } template void baci::MonitorBasic::setObjectState(const char* state) { ACS_TRACE("baci::MonitorBasic<>::setObjectState"); ACE_UNUSED_ARG(state); } template void baci::MonitorBasic::setObjectState(const char* state, const ACS::TimeInterval& minTriggerTime, BACIProperty *property) { ACS_TRACE("baci::MonitorBasic<>::setObjectState"); ACE_TCHAR cname[MAX_NAME_LENGTH]; ACE_TCHAR ior[MAX_IOR_LENGTH]; CBDescIn descIn; unsigned long tag; ACS::TimeInterval timeTrigger; ACS::TimeInterval transmitTime; int mode; unsigned int isSuspended; IMPL_SCAN_SET_OBJECT_STATE descIn.id_tag = tag; ACE_CString name(cname); try { CORBA::Object_var obj = BACI_CORBA::getORB()->string_to_object(ior); if (CORBA::is_nil(obj.in())==true) { return; } TCB * cb_p = TCB::_narrow(obj.in()); if (cb_p == TCB::_nil()) { CORBA::release(cb_p); return; } int callbackID = property->getComponent()->registerCallback(TBACIValuetype, cb_p, descIn); ACS_DEBUG_PARAM("baci::MonitorBasic<>::setObjectState", "Recovering: '%s'", name.c_str()); ACS_NEW_RETURN(monitor_mp, BACIMonitor(name.c_str(), callbackID, this, timeTrigger, baci::BACIValue::NullValue, minTriggerTime, baci::BACIValue::NullValue, property, transmitTime, BACIMonitor::UpdateMode(mode), isSuspended), ); reference_mp = BACI_CORBA::ActivateCORBAObject(this, name.c_str()); if (CORBA::is_nil(reference_mp)==true) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::MonitorBasic<>::setObjectState", (LM_ERROR, "Failed to activate CORBA object '%s'", name.c_str())); monitor_mp->destroy(); monitor_mp = 0; CORBA::release(cb_p); return; } else this->_remove_ref(); CORBA::release(cb_p); } catch(...) { ACS_SHORT_LOG((LM_ERROR, "baci::MonitorBasic<>::getObjectState")); } } template void baci::MonitorBasic::monitorDestroyed() { ACS_TRACE("baci::MonitorBasic<>::monitorDestroyed"); destroy(); } template void baci::MonitorBasic::monitorStateChanged() { ACS_TRACE("baci::MonitorBasic<>::monitorStateChanged"); BACIRecoveryManager::getInstance()->updateRecoverableObject(this); } template void baci::MonitorBasic::suspend () { ACS_TRACE("baci::MonitorBasic<>::suspend"); monitor_mp->suspend(); } template void baci::MonitorBasic::resume () { ACS_TRACE("baci::MonitorBasic<>::resume"); monitor_mp->resume(); } template void baci::MonitorBasic::destroy () { ACS_TRACE("BACI::MonitorBasic<>::destroy"); BACIRecoveryManager::getInstance()->removeRecoverableObject(this); if (monitor_mp != 0) { monitor_mp->destroy(); monitor_mp = 0; } if (CORBA::is_nil(reference_mp)==false) { if (BACI_CORBA::DestroyCORBAObject(reference_mp)==false) { ACS_LOG(LM_RUNTIME_CONTEXT, "baci::MonitorBasic<>::destroy", (LM_ERROR, "Failed to destroy CORBA object")); } else { CORBA::release(reference_mp); } } } template void baci::MonitorBasic::set_timer_trigger (ACS::TimeInterval timer) { ACS_TRACE("baci::MonitorBasic<>::set_timer_trigger"); monitor_mp->setTriggerTime(timer); } template void baci::MonitorBasic::get_timer_trigger (ACS::TimeInterval_out timer) { ACS_TRACE("baci::MonitorBasic<>::get_timer_trigger"); timer = monitor_mp->getTriggerTime(); } template ACS::Time baci::MonitorBasic::start_time () { ACS_TRACE("baci::MonitorBasic<>::start_time"); return monitor_mp->getTransmitTime(); }