141 { |
141 { |
142 ACommsFactoryNodeId* provider = static_cast<ACommsFactoryNodeId*>(FindObject(aQuery)); |
142 ACommsFactoryNodeId* provider = static_cast<ACommsFactoryNodeId*>(FindObject(aQuery)); |
143 return provider ? provider : CreateL(aQuery); |
143 return provider ? provider : CreateL(aQuery); |
144 } |
144 } |
145 |
145 |
|
146 LOCAL_C void RemoveClientAndDestroy(TAny* aConnProvider) |
|
147 { |
|
148 CConnectionProviderBase* connProv = static_cast<CConnectionProviderBase*>(aConnProvider); |
|
149 Messages::RNodeInterface* cntrProv = connProv->ControlProvider(); |
|
150 if(cntrProv != NULL) |
|
151 { |
|
152 connProv->RemoveClient(cntrProv->RecipientId()); |
|
153 } |
|
154 |
|
155 // cast needed because CConnectionProviderBase destructor is protected |
|
156 delete static_cast<CCommsProviderBase*>(aConnProvider); |
|
157 } |
146 |
158 |
147 EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::CreateL(TFactoryQueryBase& aQuery) |
159 EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::CreateL(TFactoryQueryBase& aQuery) |
148 /** Create a new instance of connection provider |
160 /** Create a new instance of connection provider |
149 |
161 |
150 @return Pointer to the created connection provider or NULL if there's a failure */ |
162 @return Pointer to the created connection provider or NULL if there's a failure */ |
151 { |
163 { |
152 CConnectionProviderBase* provider = static_cast<CConnectionProviderBase*>(DoCreateObjectL(aQuery)); |
164 CConnectionProviderBase* provider = static_cast<CConnectionProviderBase*>(DoCreateObjectL(aQuery)); |
153 CleanupStack::PushL(provider); |
165 CleanupStack::PushL(TCleanupItem(RemoveClientAndDestroy, provider)); |
154 |
|
155 const TDefaultConnectionFactoryQuery& query = static_cast<const TDefaultConnectionFactoryQuery&>(aQuery); |
166 const TDefaultConnectionFactoryQuery& query = static_cast<const TDefaultConnectionFactoryQuery&>(aQuery); |
156 provider->AddClientL(address_cast<TNodeId>(query.iMCprId), TClientType(TCFClientType::ECtrlProvider)); |
167 provider->AddClientL(address_cast<TNodeId>(query.iMCprId), TClientType(TCFClientType::ECtrlProvider)); |
157 |
168 |
158 // Add the connectionProvider to it's factory |
169 // Add the connectionProvider to it's factory |
159 AddManagedObjectL(*provider); |
170 AddManagedObjectL(*provider); |