/* * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include #include #include #include namespace Swift { EventController::EventController() { } EventController::~EventController() { for (auto&& event : events_) { event->onConclusion.disconnect(boost::bind(&EventController::handleEventConcluded, this, event)); } } void EventController::handleIncomingEvent(std::shared_ptr sourceEvent) { std::shared_ptr messageEvent = std::dynamic_pointer_cast(sourceEvent); std::shared_ptr subscriptionEvent = std::dynamic_pointer_cast(sourceEvent); std::shared_ptr errorEvent = std::dynamic_pointer_cast(sourceEvent); std::shared_ptr mucInviteEvent = std::dynamic_pointer_cast(sourceEvent); std::shared_ptr incomingFileTransferEvent = std::dynamic_pointer_cast(sourceEvent); /* If it's a duplicate subscription request, remove the previous request first */ if (subscriptionEvent) { EventList existingEvents(events_); for (auto&& existingEvent : existingEvents) { std::shared_ptr existingSubscriptionEvent = std::dynamic_pointer_cast(existingEvent); if (existingSubscriptionEvent) { if (existingSubscriptionEvent->getJID() == subscriptionEvent->getJID()) { existingEvent->conclude(); } } } } if ((messageEvent && messageEvent->isReadable()) || subscriptionEvent || errorEvent || mucInviteEvent || incomingFileTransferEvent) { events_.push_back(sourceEvent); sourceEvent->onConclusion.connect(boost::bind(&EventController::handleEventConcluded, this, sourceEvent)); onEventQueueLengthChange(events_.size()); onEventQueueEventAdded(sourceEvent); if (sourceEvent->getConcluded()) { handleEventConcluded(sourceEvent); } } } void EventController::handleEventConcluded(std::shared_ptr event) { event->onConclusion.disconnect(boost::bind(&EventController::handleEventConcluded, this, event)); events_.erase(std::remove(events_.begin(), events_.end(), event), events_.end()); onEventQueueLengthChange(events_.size()); } void EventController::disconnectAll() { onEventQueueLengthChange.disconnect_all_slots(); onEventQueueEventAdded.disconnect_all_slots(); } void EventController::clear() { events_.clear(); onEventQueueLengthChange(0); } }