diff --git a/lib/cppmyth/CMakeLists.txt b/lib/cppmyth/CMakeLists.txt index fa581057..52412ce1 100644 --- a/lib/cppmyth/CMakeLists.txt +++ b/lib/cppmyth/CMakeLists.txt @@ -17,7 +17,7 @@ endif () ############################################################################### # set lib version here -set (CPPMYTH_LIB_VERSION "2.12.6") +set (CPPMYTH_LIB_VERSION "2.12.7") set (CPPMYTH_LIB_SOVERSION "2") ############################################################################### diff --git a/lib/cppmyth/src/mytheventhandler.cpp b/lib/cppmyth/src/mytheventhandler.cpp index f1ce750b..a9506ada 100644 --- a/lib/cppmyth/src/mytheventhandler.cpp +++ b/lib/cppmyth/src/mytheventhandler.cpp @@ -62,7 +62,7 @@ namespace Myth virtual ~SubscriptionHandlerThread(); EventSubscriber *GetHandle() { return m_handle; } bool IsRunning() { return OS::CThread::IsRunning(); } - void PostMessage(const EventMessage& msg); + void PostMessage(const EventMessagePtr& msg); private: EventSubscriber *m_handle; @@ -118,11 +118,11 @@ void SubscriptionHandlerThread::Stop() } } -void SubscriptionHandlerThread::PostMessage(const EventMessage& msg) +void SubscriptionHandlerThread::PostMessage(const EventMessagePtr& msg) { // Critical section OS::CLockGuard lock(m_mutex); - m_msgQueue.push_back(EventMessagePtr(new EventMessage(msg))); + m_msgQueue.push_back(msg); m_queueContent.Signal(); } @@ -179,7 +179,7 @@ namespace Myth typedef std::map subscriptions_t; subscriptions_t m_subscriptions; - void DispatchEvent(const EventMessage& msg); + void DispatchEvent(const EventMessagePtr& msg); virtual void* Process(void); void AnnounceStatus(const char *status); void AnnounceTimer(); @@ -306,12 +306,12 @@ void BasicEventHandler::RevokeAllSubscriptions(EventSubscriber *sub) } } -void BasicEventHandler::DispatchEvent(const EventMessage& msg) +void BasicEventHandler::DispatchEvent(const EventMessagePtr& msg) { OS::CLockGuard lock(m_mutex); std::vector::iterator> revoked; - std::list::iterator it1 = m_subscriptionsByEvent[msg.event].begin(); - while (it1 != m_subscriptionsByEvent[msg.event].end()) + std::list::iterator it1 = m_subscriptionsByEvent[msg->event].begin(); + while (it1 != m_subscriptionsByEvent[msg->event].end()) { subscriptions_t::const_iterator it2 = m_subscriptions.find(*it1); if (it2 != m_subscriptions.end()) @@ -322,7 +322,7 @@ void BasicEventHandler::DispatchEvent(const EventMessage& msg) } std::vector::iterator>::const_iterator itr; for (itr = revoked.begin(); itr != revoked.end(); ++itr) - m_subscriptionsByEvent[msg.event].erase(*itr); + m_subscriptionsByEvent[msg->event].erase(*itr); } void *BasicEventHandler::Process() @@ -333,10 +333,10 @@ void *BasicEventHandler::Process() while (!OS::CThread::IsStopped()) { int r; - EventMessage msg; - r = m_event->RcvBackendMessage(EVENTHANDLER_TIMEOUT, msg); + EventMessage *msg = NULL; + r = m_event->RcvBackendMessage(EVENTHANDLER_TIMEOUT, &msg); if (r > 0) - DispatchEvent(msg); + DispatchEvent(EventMessagePtr(msg)); else if (r < 0) { AnnounceStatus(EVENTHANDLER_DISCONNECTED); @@ -363,19 +363,19 @@ void *BasicEventHandler::Process() void BasicEventHandler::AnnounceStatus(const char *status) { DBG(DBG_DEBUG, "%s: (%p) %s\n", __FUNCTION__, this, status); - EventMessage msg; - msg.event = EVENT_HANDLER_STATUS; - msg.subject.push_back(status); - msg.subject.push_back(m_server); - DispatchEvent(msg); + EventMessage *msg = new EventMessage(); + msg->event = EVENT_HANDLER_STATUS; + msg->subject.push_back(status); + msg->subject.push_back(m_server); + DispatchEvent(EventMessagePtr(msg)); } void BasicEventHandler::AnnounceTimer() { - EventMessage msg; - msg.event = EVENT_HANDLER_TIMER; - msg.subject.push_back(""); - DispatchEvent(msg); + EventMessage *msg = new EventMessage(); + msg->event = EVENT_HANDLER_TIMER; + msg->subject.push_back(""); + DispatchEvent(EventMessagePtr(msg)); } void BasicEventHandler::RetryConnect() diff --git a/lib/cppmyth/src/mythtypes.h b/lib/cppmyth/src/mythtypes.h index 4498f1c0..59486865 100644 --- a/lib/cppmyth/src/mythtypes.h +++ b/lib/cppmyth/src/mythtypes.h @@ -539,7 +539,7 @@ namespace Myth {} }; - typedef MYTH_SHARED_PTR EventMessagePtr; + typedef MYTH_SHARED_PTR EventMessagePtr; struct StorageGroupFile { diff --git a/lib/cppmyth/src/proto/mythprotoevent.cpp b/lib/cppmyth/src/proto/mythprotoevent.cpp index 94fe1cf0..cdad4861 100644 --- a/lib/cppmyth/src/proto/mythprotoevent.cpp +++ b/lib/cppmyth/src/proto/mythprotoevent.cpp @@ -128,7 +128,7 @@ SignalStatusPtr ProtoEvent::RcvSignalStatus() return signal; } -int ProtoEvent::RcvBackendMessage(unsigned timeout, EventMessage& msg) +int ProtoEvent::RcvBackendMessage(unsigned timeout, EventMessage **msg) { OS::CLockGuard lock(*m_mutex); struct timeval tv; @@ -138,58 +138,60 @@ int ProtoEvent::RcvBackendMessage(unsigned timeout, EventMessage& msg) if (r > 0) { std::string field; - msg.event = EVENT_UNKNOWN; - msg.subject.clear(); - msg.program.reset(); - msg.signal.reset(); + EventMessage *pmsg = new EventMessage(); + pmsg->event = EVENT_UNKNOWN; + pmsg->subject.clear(); + pmsg->program.reset(); + pmsg->signal.reset(); if (RcvMessageLength() && ReadField(field) && field == "BACKEND_MESSAGE") { unsigned n = 0; ReadField(field); // Tokenize the subject - __tokenize(field, " ", msg.subject, false); - n = (unsigned)msg.subject.size(); + __tokenize(field, " ", pmsg->subject, false); + n = (unsigned)pmsg->subject.size(); DBG(DBG_DEBUG, "%s: %s (%u)\n", __FUNCTION__, field.c_str(), n); - if (msg.subject[0] == "UPDATE_FILE_SIZE") - msg.event = EVENT_UPDATE_FILE_SIZE; - else if (msg.subject[0] == "DONE_RECORDING") - msg.event = EVENT_DONE_RECORDING; - else if (msg.subject[0] == "QUIT_LIVETV") - msg.event = EVENT_QUIT_LIVETV; - else if (msg.subject[0] == "LIVETV_WATCH") - msg.event = EVENT_LIVETV_WATCH; - else if (msg.subject[0] == "LIVETV_CHAIN") - msg.event = EVENT_LIVETV_CHAIN; - else if (msg.subject[0] == "SIGNAL") + if (pmsg->subject[0] == "UPDATE_FILE_SIZE") + pmsg->event = EVENT_UPDATE_FILE_SIZE; + else if (pmsg->subject[0] == "DONE_RECORDING") + pmsg->event = EVENT_DONE_RECORDING; + else if (pmsg->subject[0] == "QUIT_LIVETV") + pmsg->event = EVENT_QUIT_LIVETV; + else if (pmsg->subject[0] == "LIVETV_WATCH") + pmsg->event = EVENT_LIVETV_WATCH; + else if (pmsg->subject[0] == "LIVETV_CHAIN") + pmsg->event = EVENT_LIVETV_CHAIN; + else if (pmsg->subject[0] == "SIGNAL") { - msg.event = EVENT_SIGNAL; - msg.signal = RcvSignalStatus(); + pmsg->event = EVENT_SIGNAL; + pmsg->signal = RcvSignalStatus(); } - else if (msg.subject[0] == "RECORDING_LIST_CHANGE") + else if (pmsg->subject[0] == "RECORDING_LIST_CHANGE") { - msg.event = EVENT_RECORDING_LIST_CHANGE; - if (n > 1 && msg.subject[1] == "UPDATE") - msg.program = RcvProgramInfo(); + pmsg->event = EVENT_RECORDING_LIST_CHANGE; + if (n > 1 && pmsg->subject[1] == "UPDATE") + pmsg->program = RcvProgramInfo(); } - else if (msg.subject[0] == "SCHEDULE_CHANGE") - msg.event = EVENT_SCHEDULE_CHANGE; - else if (msg.subject[0] == "ASK_RECORDING") + else if (pmsg->subject[0] == "SCHEDULE_CHANGE") + pmsg->event = EVENT_SCHEDULE_CHANGE; + else if (pmsg->subject[0] == "ASK_RECORDING") { - msg.event = EVENT_ASK_RECORDING; - msg.program = RcvProgramInfo(); + pmsg->event = EVENT_ASK_RECORDING; + pmsg->program = RcvProgramInfo(); } - else if (msg.subject[0] == "CLEAR_SETTINGS_CACHE") - msg.event = EVENT_CLEAR_SETTINGS_CACHE; - else if (msg.subject[0] == "GENERATED_PIXMAP") - msg.event = EVENT_GENERATED_PIXMAP; - else if (msg.subject[0] == "SYSTEM_EVENT") - msg.event = EVENT_SYSTEM_EVENT; + else if (pmsg->subject[0] == "CLEAR_SETTINGS_CACHE") + pmsg->event = EVENT_CLEAR_SETTINGS_CACHE; + else if (pmsg->subject[0] == "GENERATED_PIXMAP") + pmsg->event = EVENT_GENERATED_PIXMAP; + else if (pmsg->subject[0] == "SYSTEM_EVENT") + pmsg->event = EVENT_SYSTEM_EVENT; else - msg.event = EVENT_UNKNOWN; + pmsg->event = EVENT_UNKNOWN; } FlushMessage(); + *msg = pmsg; return (m_hang ? -(ENOTCONN) : 1); } else if (r < 0) diff --git a/lib/cppmyth/src/proto/mythprotoevent.h b/lib/cppmyth/src/proto/mythprotoevent.h index 00dd42a6..d9ba3229 100644 --- a/lib/cppmyth/src/proto/mythprotoevent.h +++ b/lib/cppmyth/src/proto/mythprotoevent.h @@ -44,7 +44,7 @@ namespace Myth * @return success: 0 = No message, 1 = New message received * @return failure: -(errno) */ - int RcvBackendMessage(unsigned timeout, EventMessage& msg); + int RcvBackendMessage(unsigned timeout, EventMessage **msg); private: bool Announce75();