diff -r 98a7181d2ce7 -r 8b5d60ce1e94 datacommsserver/esockserver/ssock/ss_connprov.cpp --- a/datacommsserver/esockserver/ssock/ss_connprov.cpp Fri Mar 12 15:49:41 2010 +0200 +++ b/datacommsserver/esockserver/ssock/ss_connprov.cpp Mon Mar 15 12:45:15 2010 +0200 @@ -143,6 +143,18 @@ return provider ? provider : CreateL(aQuery); } +LOCAL_C void RemoveClientAndDestroy(TAny* aConnProvider) + { + CConnectionProviderBase* connProv = static_cast(aConnProvider); + Messages::RNodeInterface* cntrProv = connProv->ControlProvider(); + if(cntrProv != NULL) + { + connProv->RemoveClient(cntrProv->RecipientId()); + } + + // cast needed because CConnectionProviderBase destructor is protected + delete static_cast(aConnProvider); + } EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::CreateL(TFactoryQueryBase& aQuery) /** Create a new instance of connection provider @@ -150,8 +162,7 @@ @return Pointer to the created connection provider or NULL if there's a failure */ { CConnectionProviderBase* provider = static_cast(DoCreateObjectL(aQuery)); - CleanupStack::PushL(provider); - + CleanupStack::PushL(TCleanupItem(RemoveClientAndDestroy, provider)); const TDefaultConnectionFactoryQuery& query = static_cast(aQuery); provider->AddClientL(address_cast(query.iMCprId), TClientType(TCFClientType::ECtrlProvider));