--- 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.