telephonyserver/etelserverandcore/SETEL/ET_PHONE.CPP
branchopencode
changeset 85 96b4f933d69a
parent 81 7f379d8ed02d
child 88 5e27cc612ac7
--- a/telephonyserver/etelserverandcore/SETEL/ET_PHONE.CPP	Tue Oct 19 18:11:09 2010 +0300
+++ b/telephonyserver/etelserverandcore/SETEL/ET_PHONE.CPP	Thu Nov 04 20:30:45 2010 +0200
@@ -1229,7 +1229,7 @@
 			
 		if (!nextPostedReqEntry)
 			// then we don't want to post any other client's requests in place of this one
-			{
+			{			
 			nextPostedReqEntry = PhoneOwner()->FindNonCancelledClientReq(updatedReqEntry->iSession,updatedReqEntry->iMessage.Int3(),ipc);
 			__ASSERT_DEBUG(updatedReqEntry!=nextPostedReqEntry, Fault(EEtelFaultCancelErrorWithoutCancelled));
 			if (nextPostedReqEntry==NULL && reqMode&KReqModeRePostImmediately)
@@ -1251,7 +1251,12 @@
 	if (reqMode & KReqModeRePostImmediately)
 		{
 		// this will destroy the reqEntry if an error occurred.
-		UpdateAndCompleteIfNecessary(updatedReqEntry,error);	
+		if(!IsSessionReserved())
+			//when there is an ongoing MO session we must ensure
+			//that the message is deliver only to the session owner
+			{
+			UpdateAndCompleteIfNecessary(updatedReqEntry,error);
+			}
 		}														
 	else
 		{
@@ -1299,7 +1304,6 @@
 		// Session in progress.
         return KErrPermissionDenied;
         }
-
 	return iDeliveryObject->DeliverReqL(PhoneOwner()->ReqActiveList(), aUpdatedReqEntry, aReqMode, aIpc, aError);
     }
 	
@@ -1307,23 +1311,50 @@
     {
 	CReqEntry* reqEntry;
 	TDblQueIter<CReqEntry> iter(PhoneOwner()->ReqActiveList());
-	while(reqEntry = iter++, reqEntry!=NULL)
+	if(!IsSessionReserved())//network initiated dialogue
 		{
-		if(reqEntry->iFunction==aIpc 
-			&& reqEntry->iTelObject==aUpdatedReqEntry->iTelObject 
-			&& reqEntry->iBuffer->Size()==aUpdatedReqEntry->iBuffer->Size()
-			/*&& IsSessionOwner(reqEntry)*/)    
+		while(reqEntry = iter++, reqEntry!=NULL)
 			{
-			if (aUpdatedReqEntry != reqEntry)
-				{
-				// Copy data from the 'placed' request to the one
-				// that is owned by the client.
-				PhoneOwner()->UpdateBuffer(aUpdatedReqEntry,reqEntry);
+				//loop through all interested clients which are not session owners
+			if(reqEntry->iFunction==aIpc 
+				&& reqEntry->iTelObject==aUpdatedReqEntry->iTelObject 
+				&& reqEntry->iBuffer->Size()==aUpdatedReqEntry->iBuffer->Size()
+				/*&& IsSessionOwner(reqEntry)*/)
+				{			
+				if (aUpdatedReqEntry != reqEntry)
+					{
+					// Copy data from the 'placed' request to the one
+					// that is owned by the client.				
+					PhoneOwner()->UpdateBuffer(aUpdatedReqEntry,reqEntry);
+					}
+				OfferToClient(reqEntry, aUpdatedReqEntry, aReqMode, aError);
+				RepostRequest(aUpdatedReqEntry, aError);
 				}
-			OfferToClient(reqEntry, aUpdatedReqEntry, aReqMode, aError);
-			RepostRequest(aUpdatedReqEntry, aError);
+			}		
+		}   	
+	else//mobile originated dialogue -> the session is reserved and message must be passed 
+		//only to the session owner		
+		{
+		while(reqEntry = iter++, reqEntry!=NULL)
+			{
+			if(reqEntry->iFunction==aIpc 
+				&& reqEntry->iTelObject==aUpdatedReqEntry->iTelObject 
+				&& reqEntry->iBuffer->Size()==aUpdatedReqEntry->iBuffer->Size()
+				&& IsSessionOwner(reqEntry))  
+				//TODO uncommented IsSessionOwner(reqEntry) to make sure
+				//request is delievered to the session owner(sometimes the default handler)
+				{			
+				if (aUpdatedReqEntry != reqEntry)
+					{
+					// Copy data from the 'placed' request to the one
+					// that is owned by the client.				
+					PhoneOwner()->UpdateBuffer(aUpdatedReqEntry,reqEntry);
+					}
+				OfferToClient(reqEntry, aUpdatedReqEntry, aReqMode, aError);
+				RepostRequest(aUpdatedReqEntry, aError);
+				}
 			}
-		}   
+		}
 	}
 	
 void CTelObject::OfferToClient(CReqEntry* aReqEntry,CReqEntry* aUpdatedReqEntry,const TReqMode aReqMode,const TInt aError)
@@ -1397,13 +1428,11 @@
 // Note that once a session has an owner the reserved state is irrelevant.
 EXPORT_C void CTelObject::SetSessionOwnerByTsyHandleAndIpc(const TTsyReqHandle aTsyReqHandle, TInt aIpc)
     {
-	
+	//these are used to fall back to original client if the default handler was not found
     TInt owningsession = PhoneOwner()->FindSessionByTsyHandle( aTsyReqHandle );
     TInt owningsubsession = PhoneOwner()->FindSubSessionByTsyHandle( aTsyReqHandle );
-    
         
-    if((NULL != aIpc) && 
-    (iDeliveryObject->GetReqMode() == (KReqModeSessionBased | KReqModeTransferToDefaultHandler)))
+    if((NULL != aIpc))
     // transfer to default handler
     	{
     	CReqEntry* reqEntry = PhoneOwner()->FindByIpcAndSecureId(aIpc, KUssdDefaultClientSid);
@@ -1413,7 +1442,7 @@
     		owningsubsession = reqEntry->iMessage.Int3();    		
     		}
     	}
-    iDeliveryObject->iSessionOwner = TPhoneClientId(owningsession, owningsubsession);
+    iDeliveryObject->iSessionOwner = TPhoneClientId(owningsession, owningsubsession);    
     }
 
 // Can be used by the TSY to set the session owner to the current request.