/* * remote-conference-event-handler.cpp * Copyright (C) 2017 Belledonne Communications SARL * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "remote-conference-event-handler.h" #include "conference-info.hxx" #include "private.h" using namespace std; using namespace conference_info; using namespace LinphonePrivate; class Conference::RemoteConferenceEventHandlerPrivate : public ObjectPrivate { public: LinphoneCore *lc; ConferenceListener *listener; LinphoneAddress *confAddr; string confId; LinphoneEvent *lev; }; // -------- Conference::RemoteConferenceEventHandler public methods --------- Conference::RemoteConferenceEventHandler::RemoteConferenceEventHandler(LinphoneCore *lc, ConferenceListener *listener, LinphoneAddress *confAddr) : Object(*new RemoteConferenceEventHandlerPrivate) { L_D(RemoteConferenceEventHandler); xercesc::XMLPlatformUtils::Initialize(); d->lc = lc; d->listener = listener; d->confAddr = confAddr; linphone_address_ref(confAddr); d->lev = NULL; } Conference::RemoteConferenceEventHandler::~RemoteConferenceEventHandler() { L_D(RemoteConferenceEventHandler); xercesc::XMLPlatformUtils::Terminate(); linphone_address_unref(d->confAddr); if(d->lev) linphone_event_unref(d->lev); } void Conference::RemoteConferenceEventHandler::subscribe(string confId) { L_D(RemoteConferenceEventHandler); d->confId = confId; d->lev = linphone_core_create_subscribe(d->lc, d->confAddr, "Conference", 600); linphone_event_ref(d->lev); linphone_event_set_internal(d->lev, TRUE); linphone_event_set_user_data(d->lev, this); linphone_event_add_custom_header(d->lev, "Conf-id", d->confId.c_str()); // TODO : ??? linphone_event_send_subscribe(d->lev, NULL); } void Conference::RemoteConferenceEventHandler::unsubscribe() { L_D(RemoteConferenceEventHandler); linphone_event_terminate(d->lev); } void Conference::RemoteConferenceEventHandler::notifyReceived(const char *xmlBody) { L_D(RemoteConferenceEventHandler); istringstream data(xmlBody); unique_ptr confInfo = parseConference_info(data, xml_schema::Flags::dont_validate); if(strcmp(confInfo->getEntity().c_str(), linphone_address_as_string(d->confAddr)) == 0) { for (const auto &user : confInfo->getUsers()->getUser()) { LinphoneAddress *addr = linphone_core_interpret_url(d->lc, user.getEntity()->c_str()); if(user.getState() == "deleted") { d->listener->participantRemoved(addr); } else { bool isAdmin = false; if(user.getRoles()) { for (const auto &entry : user.getRoles()->getEntry()) { if (entry == "admin") { isAdmin = true; break; } } } if(user.getState() == "full") { d->listener->participantAdded(addr); } d->listener->participantSetAdmin(addr, isAdmin); } linphone_address_unref(addr); } } } string Conference::RemoteConferenceEventHandler::getConfId() { L_D(RemoteConferenceEventHandler); return d->confId; }