183 // CCcSrv::DropSession |
184 // CCcSrv::DropSession |
184 // ----------------------------------------------------------------------------- |
185 // ----------------------------------------------------------------------------- |
185 // |
186 // |
186 void CCcSrv::DropSession( CCcSrvSession* aSession ) |
187 void CCcSrv::DropSession( CCcSrvSession* aSession ) |
187 { |
188 { |
|
189 // Remove possible provider |
|
190 for ( TUint32 i = 0; i < iProviders.Count(); i++ ) |
|
191 { |
|
192 if ( iProviders[ i ].iSession->Id() == aSession->Id() ) |
|
193 { |
|
194 iProviders.Remove( i ); |
|
195 break; |
|
196 } |
|
197 } |
|
198 // Unregister possible observations and remove observer |
|
199 for ( TUint32 i = 0; i < iObservers.Count(); ) |
|
200 { |
|
201 if ( iObservers[ i ].iObserver == aSession->Id() ) |
|
202 { |
|
203 for ( TUint32 j = 0; j < iProviders.Count(); j++ ) |
|
204 { |
|
205 if ( iObservers[ i ].iProviderId == iProviders[ j ].iId ) |
|
206 { |
|
207 TRAP_IGNORE( iProviders[ j ].iSession-> |
|
208 UnregisterObserverSessionL( aSession->Id() ) ); |
|
209 } |
|
210 } |
|
211 iObservers.Remove( i ); |
|
212 } |
|
213 else |
|
214 { |
|
215 // Get next observer |
|
216 i++; |
|
217 } |
|
218 } |
|
219 // Remove session |
188 for ( TUint32 i = 0; i < iSessions.Count(); i++ ) |
220 for ( TUint32 i = 0; i < iSessions.Count(); i++ ) |
189 { |
221 { |
190 if ( iSessions[ i ]->Id() == aSession->Id() ) |
222 if ( iSessions[ i ]->Id() == aSession->Id() ) |
191 { |
223 { |
192 iSessions.Remove( i ); |
224 iSessions.Remove( i ); |
193 break; |
225 break; |
194 } |
226 } |
195 } |
227 } |
196 // Unregister possible observations |
|
197 for ( TUint32 i = 0; i < iProviders.Count(); i++ ) |
|
198 { |
|
199 TRAP_IGNORE( iProviders[ i ].iSession-> |
|
200 UnregisterObserverSessionL( aSession->Id() ) ); |
|
201 } |
|
202 |
228 |
203 // Remove possible provider |
|
204 for ( TUint32 i = 0; i < iProviders.Count(); i++ ) |
|
205 { |
|
206 if ( iProviders[ i ].iId == aSession->Id() ) |
|
207 { |
|
208 iProviders.Remove( i ); |
|
209 break; |
|
210 } |
|
211 } |
|
212 if ( iSessions.Count() == 0 ) |
229 if ( iSessions.Count() == 0 ) |
213 { |
230 { |
214 // Last session dropped -> stop server |
231 // Last session dropped -> stop server |
215 CActiveScheduler::Stop(); |
232 CActiveScheduler::Stop(); |
216 } |
233 } |
234 CCcSrv::TCcProvider provider; |
251 CCcSrv::TCcProvider provider; |
235 provider.iId = aProvider; |
252 provider.iId = aProvider; |
236 provider.iSession = aSession; |
253 provider.iSession = aSession; |
237 iProviders.Append( provider ); |
254 iProviders.Append( provider ); |
238 |
255 |
|
256 // Register possible active observers |
|
257 for ( TUint32 i = 0; i < iObservers.Count(); i++ ) |
|
258 { |
|
259 if ( iObservers[ i ].iProviderId == aProvider ) |
|
260 { |
|
261 provider.iSession->RegisterObserverSessionL( iObservers[ i ].iObserver ); |
|
262 } |
|
263 } |
|
264 |
239 } |
265 } |
240 |
266 |
241 // ----------------------------------------------------------------------------- |
267 // ----------------------------------------------------------------------------- |
242 // CCcSrv::RegisterObserverL |
268 // CCcSrv::RegisterObserverL |
243 // ----------------------------------------------------------------------------- |
269 // ----------------------------------------------------------------------------- |
244 // |
270 // |
245 void CCcSrv::RegisterObserverL( |
271 void CCcSrv::RegisterObserverL( |
246 TUint32 aProvider, |
272 TUint32 aProvider, |
247 CCcSrvSession* aSession ) |
273 CCcSrvSession* aSession ) |
248 { |
274 { |
249 TBool found( EFalse ); |
275 for ( TUint32 i = 0; i < iProviders.Count(); i++ ) |
250 for ( TUint32 i = 0; i < iProviders.Count() && !found; i++ ) |
|
251 { |
276 { |
252 if ( iProviders[ i ].iId == aProvider ) |
277 if ( iProviders[ i ].iId == aProvider ) |
253 { |
278 { |
254 iProviders[ i ].iSession->RegisterObserverSessionL( aSession->Id() ); |
279 iProviders[ i ].iSession->RegisterObserverSessionL( aSession->Id() ); |
255 found = ETrue; |
280 break; |
256 } |
281 } |
257 } |
282 } |
258 if ( !found ) |
283 CCcSrv::TCcObserver observer; |
259 { |
284 observer.iProviderId = aProvider; |
260 User::Leave( KErrNotFound ); |
285 observer.iObserver = aSession->Id(); |
261 } |
286 iObservers.Append( observer ); |
262 } |
287 } |
263 |
288 |
264 // ----------------------------------------------------------------------------- |
289 // ----------------------------------------------------------------------------- |
265 // CCcSrv::ResolveProviderAddressL |
290 // CCcSrv::ResolveProviderAddressL |
266 // ----------------------------------------------------------------------------- |
291 // ----------------------------------------------------------------------------- |