fix crash on core destruction

This commit is contained in:
Benjamin Reis 2018-03-19 16:00:01 +01:00
parent 980b440e88
commit 63b08b7ebf
8 changed files with 45 additions and 21 deletions

View file

@ -218,11 +218,14 @@ RemoteConference(core, me->getAddress(), nullptr) {
dConference->eventHandler->setChatRoomId(chatRoomId);
dConference->eventHandler->setLastNotify(lastNotifyId);
getCore()->getPrivate()->remoteListEventHandler->addHandler(dConference->eventHandler);
getCore()->getPrivate()->remoteListEventHandler->addHandler(dConference->eventHandler.get());
}
ClientGroupChatRoom::~ClientGroupChatRoom () {
L_D();
L_D_T(RemoteConference, dConference);
getCore()->getPrivate()->remoteListEventHandler->removeHandler(dConference->eventHandler.get());
d->setCallSessionListener(nullptr);
}

View file

@ -149,16 +149,18 @@ ServerGroupChatRoom::ServerGroupChatRoom (
) : ChatRoom(*new ServerGroupChatRoomPrivate, core, ChatRoomId(peerAddress, peerAddress)),
LocalConference(core, peerAddress, nullptr) {}
ServerGroupChatRoom::~ServerGroupChatRoom () {};
ServerGroupChatRoom::CapabilitiesMask ServerGroupChatRoom::getCapabilities () const {
return 0;
}
void ServerGroupChatRoom::allowCpim (bool value) {
}
void ServerGroupChatRoom::allowMultipart (bool value) {
}
bool ServerGroupChatRoom::canHandleCpim () const {

View file

@ -45,6 +45,8 @@ public:
unsigned int lastNotifyId
);
~ServerGroupChatRoom ();
std::shared_ptr<Core> getCore () const;
void allowCpim (bool value) override;

View file

@ -86,7 +86,7 @@ void LocalConferenceListEventHandler::subscribeReceived (LinphoneEvent *lev, con
addr.removeUriParam("Last-Notify");
int notifyId = notifyIdStr.empty() ? 0 : Utils::stoi(notifyIdStr);
ChatRoomId chatRoomId(addr, addr);
shared_ptr<LocalConferenceEventHandler> handler = findHandler(chatRoomId);
LocalConferenceEventHandler *handler = findHandler(chatRoomId);
if (!handler)
continue;
@ -154,11 +154,17 @@ void LocalConferenceListEventHandler::subscribeReceived (LinphoneEvent *lev, con
// -----------------------------------------------------------------------------
void LocalConferenceListEventHandler::addHandler (shared_ptr<LocalConferenceEventHandler> handler) {
handlers.push_back(handler);
void LocalConferenceListEventHandler::addHandler (LocalConferenceEventHandler *handler) {
if (handler)
handlers.push_back(handler);
}
shared_ptr<LocalConferenceEventHandler> LocalConferenceListEventHandler::findHandler (const ChatRoomId &chatRoomId) const {
void LocalConferenceListEventHandler::removeHandler (LocalConferenceEventHandler *handler) {
if (handler)
handlers.remove(handler);
}
LocalConferenceEventHandler *LocalConferenceListEventHandler::findHandler (const ChatRoomId &chatRoomId) const {
for (const auto &handler : handlers) {
if (handler->getChatRoomId() == chatRoomId)
return handler;
@ -167,7 +173,7 @@ shared_ptr<LocalConferenceEventHandler> LocalConferenceListEventHandler::findHan
return nullptr;
}
const list<shared_ptr<LocalConferenceEventHandler>> &LocalConferenceListEventHandler::getHandlers () const {
const list<LocalConferenceEventHandler *> &LocalConferenceListEventHandler::getHandlers () const {
return handlers;
}

View file

@ -38,12 +38,13 @@ class LocalConferenceEventHandler;
class LocalConferenceListEventHandler {
public:
void subscribeReceived (LinphoneEvent *lev, const LinphoneContent *body);
void addHandler (std::shared_ptr<LocalConferenceEventHandler> handler);
std::shared_ptr<LocalConferenceEventHandler> findHandler (const ChatRoomId &chatRoomId) const;
const std::list<std::shared_ptr<LocalConferenceEventHandler>> &getHandlers () const;
void addHandler (LocalConferenceEventHandler *handler);
void removeHandler (LocalConferenceEventHandler *handler);
LocalConferenceEventHandler *findHandler (const ChatRoomId &chatRoomId) const;
const std::list<LocalConferenceEventHandler *> &getHandlers () const;
private:
std::list<std::shared_ptr<LocalConferenceEventHandler>> handlers;
std::list<LocalConferenceEventHandler *> handlers;
};

View file

@ -142,7 +142,7 @@ void RemoteConferenceListEventHandler::notifyReceived (Content *multipart) {
Address cid(value);
Address peer = addresses[cid];
ChatRoomId id(local, peer);
shared_ptr<RemoteConferenceEventHandler> handler = findHandler(id);
RemoteConferenceEventHandler *handler = findHandler(id);
if (!handler)
continue;
@ -155,7 +155,7 @@ void RemoteConferenceListEventHandler::notifyReceived (Content *multipart) {
// -----------------------------------------------------------------------------
shared_ptr<RemoteConferenceEventHandler> RemoteConferenceListEventHandler::findHandler (const ChatRoomId &chatRoomId) const {
RemoteConferenceEventHandler *RemoteConferenceListEventHandler::findHandler (const ChatRoomId &chatRoomId) const {
for (const auto &handler : handlers) {
if (handler->getChatRoomId() == chatRoomId)
return handler;
@ -164,12 +164,18 @@ shared_ptr<RemoteConferenceEventHandler> RemoteConferenceListEventHandler::findH
return nullptr;
}
const list<shared_ptr<RemoteConferenceEventHandler>> &RemoteConferenceListEventHandler::getHandlers () const {
const list<RemoteConferenceEventHandler *> &RemoteConferenceListEventHandler::getHandlers () const {
return handlers;
}
void RemoteConferenceListEventHandler::addHandler (std::shared_ptr<RemoteConferenceEventHandler> handler) {
handlers.push_back(handler);
void RemoteConferenceListEventHandler::addHandler (RemoteConferenceEventHandler *handler) {
if (handler)
handlers.push_back(handler);
}
void RemoteConferenceListEventHandler::removeHandler (RemoteConferenceEventHandler *handler) {
if (handler)
handlers.remove(handler);
}
map<Address, Address> RemoteConferenceListEventHandler::parseRlmi (const string &xmlBody) const {

View file

@ -47,12 +47,13 @@ public:
void subscribe ();
void unsubscribe ();
void notifyReceived (Content *multipart);
void addHandler (std::shared_ptr<RemoteConferenceEventHandler> handler);
std::shared_ptr<RemoteConferenceEventHandler> findHandler (const ChatRoomId &chatRoomId) const;
const std::list<std::shared_ptr<RemoteConferenceEventHandler>> &getHandlers () const;
void addHandler (RemoteConferenceEventHandler *handler);
void removeHandler (RemoteConferenceEventHandler *handler);
RemoteConferenceEventHandler *findHandler (const ChatRoomId &chatRoomId) const;
const std::list<RemoteConferenceEventHandler *> &getHandlers () const;
private:
std::list<std::shared_ptr<RemoteConferenceEventHandler>> handlers;
std::list<RemoteConferenceEventHandler *> handlers;
LinphoneEvent *lev = nullptr;
std::map<Address, Address> parseRlmi (const std::string &xmlBody) const;

View file

@ -87,6 +87,9 @@ void CorePrivate::uninit () {
chatRoomsById.clear();
noCreatedClientGroupChatRooms.clear();
remoteListEventHandler = nullptr;
localListEventHandler = nullptr;
AddressPrivate::clearSipAddressesCache();
}