--- 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<CConnectionProviderBase*>(aConnProvider);
+ Messages::RNodeInterface* cntrProv = connProv->ControlProvider();
+ if(cntrProv != NULL)
+ {
+ connProv->RemoveClient(cntrProv->RecipientId());
+ }
+
+ // cast needed because CConnectionProviderBase destructor is protected
+ delete static_cast<CCommsProviderBase*>(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<CConnectionProviderBase*>(DoCreateObjectL(aQuery));
- CleanupStack::PushL(provider);
-
+ CleanupStack::PushL(TCleanupItem(RemoveClientAndDestroy, provider));
const TDefaultConnectionFactoryQuery& query = static_cast<const TDefaultConnectionFactoryQuery&>(aQuery);
provider->AddClientL(address_cast<TNodeId>(query.iMCprId), TClientType(TCFClientType::ECtrlProvider));