telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp
branchopencode
changeset 77 930a53cdc2d3
parent 24 6638e7f4bd8f
child 78 d4cfc65049ba
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp	Fri Jun 04 13:03:15 2010 +0100
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmsms/cmmussdtsy.cpp	Thu Oct 07 19:32:01 2010 +0300
@@ -60,6 +60,7 @@
 
     // Initialize boolean flag
     iUssdNoFdnCheckFlag =  EUssdNoFdnCheckUnknown;
+    iSendToDefaultHandler = EFalse;
     }
 
 CMmUssdTsy* CMmUssdTsy::NewL( 
@@ -189,13 +190,23 @@
         case EMobileUssdMessagingSendMessage:
             {
             iUssdNoFdnCheckFlag = EUssdNoFdnCheckNotUsed;
+            iSendToDefaultHandler = EFalse;
             ret = SendMessageL( 
                 aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
             }
             break;
+        case EMobileUssdMessagingSendMessageDefaultHandler: 
+			{
+			iUssdNoFdnCheckFlag = EUssdNoFdnCheckNotUsed;
+			iSendToDefaultHandler = ETrue;
+			ret = SendMessageL( 
+				aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );
+			}
+			break;
         case EMobileUssdMessagingSendMessageNoFdnCheck:
             {
             iUssdNoFdnCheckFlag = EUssdNoFdnCheckUsed;
+            iSendToDefaultHandler = EFalse;
             ret = SendMessageL( 
                 aTsyReqHandle, aPackage.Des1n(), aPackage.Des2n() );                
             }
@@ -252,6 +263,10 @@
             SendMessageCancel( aTsyReqHandle );
             ret = KErrNone;
             break;
+        case EMobileUssdMessagingSendMessageDefaultHandler: 
+        	SendMessageCancelDefaultHandler( aTsyReqHandle );
+        	ret = KErrNone;
+        	break;
         case EMobileUssdMessagingSendMessageNoFdnCheck:
             SendMessageNoFdnCheckCancel( aTsyReqHandle );
             ret = KErrNone;
@@ -298,17 +313,19 @@
                 KReqModeMultipleCompletionWithInterestLevel;
             break;
         // Services handled by TSY
-        case EMobileUssdMessagingSendMessage:
+        case EMobileUssdMessagingSendMessageDefaultHandler: 
+        	ret = KReqModeSessionBased | KReqModeTransferToDefaultHandler;
+        	break;
+        case EMobileUssdMessagingSendMessage:        
         case EMobileUssdMessagingSendMessageNoFdnCheck:
         case EMobileUssdMessagingSendRelease:
-            //ret = KReqModeSessionBased;
-            ret = 0;
+            ret = KReqModeSessionBased;
             break;
         case EMobileUssdMessagingNotifyNetworkRelease:
             // Multiple completion because the clients don't have to own the
             // session in order to be notified that the session has been
             // released.
-            ret = KReqModeMultipleCompletionEnabled;
+            ret = KReqModeRePostImmediately | KReqModeMultipleCompletionEnabled;
             break;
         default:
             User::Leave( KErrNotSupported );
@@ -471,7 +488,6 @@
     	}
 
     ReqCompleted( aTsyReqHandle, ret );
-
     return KErrNone;
     }
 
@@ -536,13 +552,10 @@
     TInt aError, 
 	CMmDataPackage* aDataPackage )
     {
-    // TODO if a session is in progress and this is a notification then we need to send back
-    // a USSD busy code.
-    
 TFLOGSTRING("TSY: CMmUssdTsy::CompleteReceiveMessage.\n" );
     TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
         EMultimodeUssdReceiveMessage );
-
+        
     if ( ( EMultimodeUssdReqHandleUnknown != reqHandle ) )
         {
         // reset req handle. Returns the deleted req handle
@@ -553,7 +566,7 @@
             { 
             TDes8* unpackedReceiveUssdMessagePtr = NULL;
             RMobileUssdMessaging::TMobileUssdAttributesV1* unpackedReceiveUssdMessageAttributesPtr = NULL;            
-            aDataPackage->UnPackData (&unpackedReceiveUssdMessagePtr, &unpackedReceiveUssdMessageAttributesPtr);           
+            aDataPackage->UnPackData (&unpackedReceiveUssdMessagePtr, &unpackedReceiveUssdMessageAttributesPtr);
                                   
             if(iReceiveUssdMessagePtr->MaxLength() >= unpackedReceiveUssdMessagePtr->Length())
                	{             
@@ -584,6 +597,7 @@
 TFLOGSTRING2("TSY: CMmUssdTsy::SendMessageL: iUssdNoFdnCheckFlag: %d", iUssdNoFdnCheckFlag);  
     TInt ret = KErrNone;
 
+    
     if ( iSsTransactionOngoing )
 	    {
 	    ret = KErrServerBusy;
@@ -603,14 +617,23 @@
             ret = iMmPhone->MessageManager()->HandleRequestL( 
                 EMobileUssdMessagingSendMessageNoFdnCheck, &package );   
             }
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
+        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed )
             {
             // Send request to the Domestic OS layer.
-            ret = iMmPhone->MessageManager()->HandleRequestL( 
-                EMobileUssdMessagingSendMessage, &package );            
+        	if(EFalse == iSendToDefaultHandler)
+        		{
+        		ret = iMmPhone->MessageManager()->HandleRequestL( 
+        				EMobileUssdMessagingSendMessage, &package );
+        		}
+        	else //default handler 
+				{
+					ret = iMmPhone->MessageManager()->HandleRequestL( 
+						EMobileUssdMessagingSendMessageDefaultHandler, &package );            
+				}      	
             }
+        
             
-        iSsTransactionOngoing = ETrue;
+        iSsTransactionOngoing = ETrue;        
         }
 
     if ( KErrNone != ret )
@@ -621,7 +644,6 @@
         }
     else
     	{
-/* TODO
         if (!IsSessionInProgress())
             {
             // If a session isn't in progress then reserve the session to
@@ -633,7 +655,7 @@
             // affect the session or dialogue state.
             (void)ReserveSession();
             }
-*/    	
+   	
 #ifdef REQHANDLE_TIMER       
         // Check if NoFdnCheck is used or not
         if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
@@ -642,12 +664,20 @@
             SetTypeOfResponse( EMultimodeUssdSendMessageNoFdnCheck, 
                 aTsyReqHandle );     
             }
-        if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed ) 
+        if ( (iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed) &&
+        	(EFalse == iSendToDefaultHandler)) 
             {
             // Set timer for the request
             SetTypeOfResponse( EMultimodeUssdSendMessage, 
                 aTsyReqHandle );
-            }      
+            }  
+        if ( (iUssdNoFdnCheckFlag == EUssdNoFdnCheckNotUsed) && 
+			(EFalse != iSendToDefaultHandler)) //send to default hadnler 
+			   {
+			   // Set timer for the request
+			   SetTypeOfResponse( EMultimodeUssdSendMessageDefaultHandler, 
+				   aTsyReqHandle );
+			   }  
 #else
         // Check if NoFdnCheck is used or not
         if ( iUssdNoFdnCheckFlag == EUssdNoFdnCheckUsed )
@@ -680,8 +710,31 @@
     {
     // reset the req handle
     iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdSendMessage );
-
-//    CancelReserveSession(); TODO
+    
+    CancelReserveSession();
+    
+    // complete with cancel
+    ReqCompleted( aTsyReqHandle, KErrCancel );
+    iSsTransactionOngoing = EFalse;
+    
+    iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+    
+    return KErrNone;
+    }
+   
+// ---------------------------------------------------------------------------
+// CmmUssdTsy::SendMessageCancelDefaultHandler
+// Cancels cancelling of USSD session.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmUssdTsy::SendMessageCancelDefaultHandler(
+    const TTsyReqHandle aTsyReqHandle )
+    {
+    // reset the req handle
+    iTsyReqHandleStore->ResetTsyReqHandle( EMultimodeUssdSendMessageDefaultHandler );
+    
+    CancelReserveSession();
     
     // complete with cancel
     ReqCompleted( aTsyReqHandle, KErrCancel );
@@ -691,7 +744,45 @@
     
     return KErrNone;
     }
-    
+
+// ---------------------------------------------------------------------------
+// CMmUssdTsy::CompleteSendMessageDefaultHandler
+// Complete SendMessage 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmUssdTsy::CompleteSendMessageDefaultHandler(
+    TInt aError )
+    {
+TFLOGSTRING("TSY: CMmUssdTsy::CompleteSendMessage.\n" );
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle( 
+        /*EMultimodeUssdSendMessage*/EMultimodeUssdSendMessageDefaultHandler );
+	
+    if ( EMultimodeUssdReqHandleUnknown != reqHandle )
+        {
+        // reset req handle. Returns the deleted req handle
+        reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        		/*EMultimodeUssdSendMessage*/EMultimodeUssdSendMessageDefaultHandler );     
+        // If the session is already in progress then no session management
+        // action is required. Otherwise we either promote the reserved
+        // session to an open session or cancel the reservation.
+        if ( !IsSessionInProgress() && IsSessionReserved() )
+            {
+            if ( KErrNone == aError )
+                {
+                SetSessionOwnerByTsyHandle( reqHandle );
+                }
+            else
+                {
+                CancelReserveSession();
+                }
+            }
+       
+        ReqCompleted( reqHandle, aError );
+        iSsTransactionOngoing = EFalse;
+        iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
+        }
+    }
 // ---------------------------------------------------------------------------
 // CMmUssdTsy::CompleteSendMessage
 // Complete SendMessage 
@@ -709,8 +800,7 @@
         {
         // reset req handle. Returns the deleted req handle
         reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
-            EMultimodeUssdSendMessage );
-/* TODO        
+        		EMultimodeUssdSendMessage );     
         // If the session is already in progress then no session management
         // action is required. Otherwise we either promote the reserved
         // session to an open session or cancel the reservation.
@@ -725,7 +815,7 @@
                 CancelReserveSession();
                 }
             }
-*/        
+       
         ReqCompleted( reqHandle, aError );
         iSsTransactionOngoing = EFalse;
         iUssdNoFdnCheckFlag = EUssdNoFdnCheckUnknown;
@@ -742,34 +832,34 @@
     const TTsyReqHandle aTsyReqHandle, 
     TDes8* aReturnResult )
     {
-/* TODO
+	
+	//Check if there is a session in progress
     if ( !IsSessionInProgress() )
         {
         // You can't release a dialogue that isn't in progress.
         return KErrDisconnected;
         }
-*/    
+
     TTsyReqHandle sendReleaseHandle = 
         iTsyReqHandleStore->GetTsyReqHandle( EMultimodeUssdSendRelease );
-
+    
     if ( 0 < sendReleaseHandle )
         {
         // The request is already in processing because of previous request
         // Complete request with status value informing the client about 
         // the situation.
-TFLOGSTRING("LTSY: CMmUssdTsy::SendRelease - KErrServerBusy");
-        ReqCompleted( aTsyReqHandle, KErrServerBusy );
+TFLOGSTRING("LTSY: CMmUssdTsy::SendRelease - KErrAccessDenied");
+        ReqCompleted( aTsyReqHandle, KErrAccessDenied );
         }
     else
         {
 TFLOGSTRING("TSY: CMmUssdTsy::SendRelease called");
-
         TInt ret = KErrGeneral;
 
         TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
             reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
             ( aReturnResult );
-
+        
         if ( sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3) >
                 ussdSendSSRequestPckg->MaxLength() )
             {
@@ -786,7 +876,7 @@
             ret = iMmPhone->MessageManager()->HandleRequestL( 
                 EMobileUssdMessagingSendRelease );
             }
-
+       
         // If ret is not KErrNone
         if ( KErrNone != ret )
             {
@@ -796,6 +886,7 @@
         	{
 #ifdef REQHANDLE_TIMER
             // Set timer for the request
+			//If there is no session in progress this line lead to crash
             SetTypeOfResponse( EMultimodeUssdSendRelease, aTsyReqHandle );
 #else
             // Save SendMessage request handle, set timer
@@ -804,7 +895,6 @@
 #endif // REQHANDLE_TIMER
         	}
         }
-
     return KErrNone;
     }
 
@@ -829,7 +919,7 @@
             {
             aDataPackage->UnPackData ( *iReturnResultPtr );
             }
-//        EndSession();     TODO   
+        EndSession(); 
         ReqCompleted( reqHandle, aErrorCode );
         }  
     }
@@ -867,6 +957,14 @@
     TDes8* aMsgAttributes) // aMsgAttributes may be NULL
     {
 TFLOGSTRING("TSY: CMmUssdTsy::NotifyNetworkRelease" );
+/*
+	//Check if there is a session in progress
+	if ( !IsSessionInProgress() )
+    {
+    // You can't release a dialogue that isn't in progress.
+    return KErrDisconnected;
+    }
+*/
 
 	if (aMsgData->MaxLength() < sizeof(RMobilePhone::TMobilePhoneSendSSRequestV3Pckg))
 		{
@@ -874,6 +972,7 @@
 	    // Complete the request with appropiate error        
 	    return KErrArgument;		
 		}
+
 	if (aMsgAttributes && 
 		aMsgAttributes->MaxLength() < sizeof(RMobileUssdMessaging::TMobileUssdAttributesV1Pckg))
 		{
@@ -881,7 +980,7 @@
 	    // Complete the request with appropiate error        
 	    return KErrArgument;			
 		}
-
+	
 	TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* ussdSendSSRequestPckg =
             reinterpret_cast< TPckg<RMobilePhone::TMobilePhoneSendSSRequestV3>* > 
             ( aMsgData );
@@ -890,7 +989,6 @@
             ( *ussdSendSSRequestPckg )();
 
     iReturnNotifyPtr = &msgData;
-
     if (aMsgAttributes != NULL)
     	{
 	    RMobileUssdMessaging::TMobileUssdAttributesV1Pckg* ussdAttributesPckg = 
@@ -903,7 +1001,7 @@
     else
     	{
     	iReturnNotifyUssdMessageAttributesPtr = NULL;
-    	}
+    	}    
 #ifdef REQHANDLE_TIMER
     // Set timer for the request
     SetTypeOfResponse( EMultimodeUssdNotifyNetworkRelease, aTsyReqHandle );
@@ -926,7 +1024,7 @@
     TInt aErrorCode,
     CMmDataPackage* aDataPackage )
     {
-//    EndSession(); TODO
+    EndSession();
 
 TFLOGSTRING2("TSY: CMmUssdTsy::CompleteNotifyNetworkRelease. Error: %d", aErrorCode );
     // reset req handle. Returns the deleted req handle
@@ -1024,6 +1122,7 @@
     iReturnResultPtr = NULL;
     iReturnNotifyPtr = NULL;
     iReturnNotifyUssdMessageAttributesPtr = NULL;    
+    iSendToDefaultHandler = EFalse;
     }
 
 #ifdef REQHANDLE_TIMER
@@ -1044,6 +1143,7 @@
     switch ( aReqHandleType )
         {
         case EMultimodeUssdSendMessage:
+        case EMultimodeUssdSendMessageDefaultHandler: 
             timeOut = KMmUssdSendMessageTimeOut;
             break;
         case EMultimodeUssdSendMessageNoFdnCheck:
@@ -1089,7 +1189,10 @@
         // Cases handled with automatic completion
         case EMultimodeUssdSendMessage:
             CompleteSendMessage( aError );
-            break;
+            break; 
+        case EMultimodeUssdSendMessageDefaultHandler:
+             CompleteSendMessageDefaultHandler( aError );
+             break;
         case EMultimodeUssdSendMessageNoFdnCheck:
             CompleteSendMessageNoFdnCheck( aError );
             break;
@@ -1151,7 +1254,8 @@
 
     switch ( aIpc )
         {
-        case EMobileUssdMessagingSendMessage:      
+        case EMobileUssdMessagingSendMessage:     
+        case EMobileUssdMessagingSendMessageDefaultHandler: 
         case EMobileUssdMessagingSendMessageNoFdnCheck:
         case EMobileUssdMessagingSendRelease:
             isRequestPossible = EFalse;