datacommsserver/esockserver/ssock/ss_connprov.cpp
branchRCL_3
changeset 12 8b5d60ce1e94
parent 1 21d2ab05f085
--- 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));