mmshplugins/mmshaoplugin/src/mustsypropertymonitor.cpp
branchRCL_3
changeset 22 73a1feb507fb
parent 0 f0cf47e981f9
child 23 bc78a40cd63c
--- a/mmshplugins/mmshaoplugin/src/mustsypropertymonitor.cpp	Thu Aug 19 09:51:39 2010 +0300
+++ b/mmshplugins/mmshaoplugin/src/mustsypropertymonitor.cpp	Tue Aug 31 15:12:07 2010 +0300
@@ -19,11 +19,11 @@
 #include "mustsypropertymonitor.h"
 #include "muscallconferencemonitor.h"
 #include "muscallmonitor.h"
+#include "musvoipcallmonitor.h"
 #include "muslogger.h"
-#include "mussettings.h"
-#include "musclirmonitor.h"
+#include "musfactorysettings.h"
 
-#include <etel.h>
+
 #include <e32property.h>
 #include <mmtsy_names.h>
 #include <ctsydomainpskeys.h>
@@ -33,10 +33,11 @@
 // Symbian two-phase constructor.
 // -----------------------------------------------------------------------------
 //
-CMusTsyPropertyMonitor* CMusTsyPropertyMonitor::NewL( RMobilePhone& aPhone )
+CMusTsyPropertyMonitor* CMusTsyPropertyMonitor::NewL( RMobilePhone& aPhone, 
+                                    MMusCallStateObserver& aCallStateObserver )
     {
     MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::NewL" )
-    CMusTsyPropertyMonitor* self = new (ELeave) CMusTsyPropertyMonitor(aPhone);
+    CMusTsyPropertyMonitor* self = new (ELeave) CMusTsyPropertyMonitor( aPhone, aCallStateObserver );
     CleanupStack::PushL( self );
     self->ConstructL();
     CleanupStack::Pop( self );
@@ -53,9 +54,10 @@
     {
     MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::~CMusTsyPropertyMonitor" )    
     Cancel();
-    delete iConferenceMonitor;
-    delete iClirMonitor;
-    iCallMonitorArray.ResetAndDestroy();
+    delete iConferenceMonitor;    
+    iCallMonitorArray.ResetAndDestroy(); 
+    iCallMonitorArray.Close();
+    RemoveAllVoipCallMonitors();
     iLine.Close();
     MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::~CMusTsyPropertyMonitor" )
     }
@@ -70,13 +72,7 @@
     CActiveScheduler::Add(this);
     User::LeaveIfError( iLine.Open( iPhone, KMmTsyVoice1LineName() ) );
     iConferenceMonitor = CMusCallConferenceMonitor::NewL(
-                                                iPhone,iLine,iCallMonitorArray);
-    
-    if (MultimediaSharingSettings::PrivacySetting())
-        {
-        iClirMonitor = CMusClirMonitor::NewL();
-        }
-    
+                                                iPhone,iLine,iCallMonitorArray);    
     User::LeaveIfError( iPropertyEvent.Attach(
                                 KPSUidCtsyCallInformation,
                                 KCTsyCallState ) );
@@ -89,8 +85,8 @@
 // C++ constructor.
 // -----------------------------------------------------------------------------
 //
-CMusTsyPropertyMonitor::CMusTsyPropertyMonitor(RMobilePhone& aPhone)
-    : CActive( EPriorityNormal ),iPhone(aPhone)
+CMusTsyPropertyMonitor::CMusTsyPropertyMonitor(RMobilePhone& aPhone, MMusCallStateObserver& aCallStateObserver )
+    : CActive( EPriorityNormal ),iPhone(aPhone), iCallStateObserver ( aCallStateObserver )
     {
     }
 
@@ -106,24 +102,36 @@
     // subscribe , so that we dont miss any events.
     iPropertyEvent.Subscribe( iStatus );    
     SetActive();
-    TInt value = EPSCTsyCallStateUninitialized;
-    User::LeaveIfError(iPropertyEvent.Get( value )); 
-    MUS_LOG1( "mus: [MUSAO]  iTsyCallMonitor->CallState = %d",value )        
-    switch(value)
+    TPSCTsyCallState callState = EPSCTsyCallStateUninitialized;
+    User::LeaveIfError(iPropertyEvent.Get( (TInt&)callState ));
+    TPSCTsyCallType callType = EPSCTsyCallTypeUninitialized;
+    User::LeaveIfError(RProperty::Get(KPSUidCtsyCallInformation,KCTsyCallType,
+                                     (TInt&)callType));
+    MUS_LOG1( "mus: [MUSAO]  iTsyCallMonitor->CallState = %d",callState )        
+    switch(callState)
         {   
-            case EPSCTsyCallStateNone:                 
+            case EPSCTsyCallStateNone:
+                 MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateNone" )
                  SetStateL(NMusSessionInformationApi::ENoCall);
                  // Sometimes disconnected call goes stright to this state
                  // so we have to call this function to remove call monitors.
-                 RemoveAllCallMonitor();
-                 break;                
-            case EPSCTsyCallStateDisconnecting:                 
-            case EPSCTsyCallStateAnswering:                 
-            case EPSCTsyCallStateConnected:                                             
-            case EPSCTsyCallStateHold:                                    
-                  // in all above states if multible call exist then 
-                 // we have to find all the calls state and do accordingly.
-                 MonitorCallL(); 
+                 MonitorCallL( callState,callType); 
+                 break;
+            case EPSCTsyCallStateDisconnecting:
+                 MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateDisconnecting" )                                
+                 MonitorCallL( callState,callType);                        
+                 break;
+            case EPSCTsyCallStateAnswering:
+                 MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateAnswering" )
+                 MonitorCallL( callState,callType);                      
+                 break;
+            case EPSCTsyCallStateConnected:                                 
+                 MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateConnected" )
+                 MonitorCallL( callState,callType);                       
+                 break;
+            case EPSCTsyCallStateHold:
+                 MUS_LOG( "mus: [MUSAO]  EPSCTsyCallStateHold" )
+                 SetStateL(NMusSessionInformationApi::ECallHold);
                  break;
             default:
                  MUS_LOG( "mus: [MUSAO]  Undesired CallState " )   
@@ -179,19 +187,13 @@
         }
     MUS_LOG1( "mus: [MUSAO]  Call Exist = %d ",isCallExist )
     if( !isCallExist ) 
-        {
-        if ( iClirMonitor )
-            {
-            //Start async reading of CLIR from phone settings
-            iClirMonitor->ReadClir();
-            }
-        
+        {                
         CMusCallMonitor* callMonitor = CMusCallMonitor::NewL( aCallName,
                                                               IsPttCallExist() );   
         CleanupStack::PushL( callMonitor );
         iCallMonitorArray.AppendL( callMonitor );
         CleanupStack::Pop( callMonitor );
-             callMonitor->StartMonitorL(iLine, *this);       
+        callMonitor->StartMonitorL(iLine, *this, iCallStateObserver );       
         }
     MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::AddCallMonitorL" )
     }
@@ -320,13 +322,52 @@
     MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::SetStateL" )    
     }
 
-
 // -----------------------------------------------------------------------------
 // CMusTsyPropertyMonitor::MonitorCallL() 
-// Monitors the call and if needed adds/removes  call monitor.
+// Decides which call monitor (CS,VOIP etc ) has to be called.
 // -----------------------------------------------------------------------------
 //
-void CMusTsyPropertyMonitor::MonitorCallL()
+void CMusTsyPropertyMonitor::MonitorCallL( const TPSCTsyCallState& aCallState,
+                                           const TPSCTsyCallType& aCallType)
+    {
+    MUS_LOG( "mus: [MUSAO]  -> CCMusTsyPropertyMonitor::MonitorCallL" )
+    switch( aCallType )
+        {
+        case EPSCTsyCallTypeUninitialized:
+        case EPSCTsyCallTypeNone:
+        case EPSCTsyCallTypeFax:            
+        case EPSCTsyCallTypeData:
+        case EPSCTsyCallTypeHSCSD:
+        case EPSCTsyCallTypeH324Multimedia:
+            break;// dont care
+        case EPSCTsyCallTypeCSVoice:           
+            MonitorCSCallL();
+            break;
+        case EPSCTsyCallTypeVoIP:
+            {
+            // if error occured when reading factory setting key 
+            // behave default ie all calls supported.
+            TBool supported = ETrue;
+            TRAP_IGNORE( supported = MusFactorySettings::IsSupportedL( aCallType ) )
+            if( supported)
+                {
+                MonitorVoipCallL( aCallState );                                   
+                }      
+            break;           
+            }
+        default:
+            break;
+        }
+    // Check now for multimediasharing call criteria.
+    CheckCallCriteriaL();
+    MUS_LOG( "mus: [MUSAO]  <- CCMusTsyPropertyMonitor::MonitorCallL" )
+    }
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::MonitorCSCallL() 
+// Monitors the CS call and if needed adds/removes  call monitor.
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::MonitorCSCallL()
     {
     MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::MonitorCallL")
     TInt callCount;
@@ -349,22 +390,173 @@
             {
             AddCallMonitorL(callInfo.iCallName); 
             }                                  
-        }
-    // Sometimes when call get disconnected then call object disappears.So
-    // check the call state or open the call , if there is an error or undesired
-    // call state , remove that callmonitor from array. 
-    RemoveUnUsedCallMonitors();    
+        }    
+    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::MonitorCallL")
+    }
 
-    if(iCallMonitorArray.Count() > 1)
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::MonitorVoipCallL() 
+// Monitors the voip call and if needed adds/removes  call monitor.
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::MonitorVoipCallL( const TPSCTsyCallState& aCallState)
+    {
+    MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::MonitorVoipCallL")
+    // TODO : Call Name should be read from covergence api [CCE/CCH]
+    //        which is not available as of now 22-Dec-2008
+    TName callName(_L("Voip 1"));
+    switch(aCallState)
+       {   
+       case EPSCTsyCallStateDisconnecting:
+            MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateDisconnecting" )                                
+            RemoveVoipCallMonitor(callName);                       
+            break;
+       case EPSCTsyCallStateAnswering:
+       case EPSCTsyCallStateConnected:
+            MUS_LOG( "mus: [MUSAO] EPSCTsyCallStateAnswering/EPSCTsyCallStateConnected" )
+            AddVoipCallMonitorL(callName);                       
+            break;          
+       default:
+            break;              
+       }
+    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::MonitorVoipCallL")
+    }
+
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::AddVoipCallMonitorL( TName aCallName )
+// Adds new voip call monitor if the call is not monitored already.
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::AddVoipCallMonitorL(TName& aCallName) 
+    {
+    MUS_LOG_TDESC( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::AddCallMonitorL"\
+                                                                   ,aCallName )
+    TBool isCallExist =  EFalse;  
+    for ( TInt i = 0; i < iVoipCallMonitorArray.Count() && !isCallExist; i++ )
+        {             
+        if( iVoipCallMonitorArray[i]->IsEqual( aCallName ) )
+            {
+            isCallExist = ETrue;
+            }
+        }    
+    MUS_LOG1( "mus: [MUSAO]  Call Exist = %d ",isCallExist )
+    if( !isCallExist ) 
         {                
-        // it is already multicall so atleast one should be hold.
-        // so set the state first to hold
-        SetStateL(NMusSessionInformationApi::ECallHold);               
-        // still we dont know here about conference state so 
-        // let the conference call monitor decide .
-        iConferenceMonitor->SetStateL(); 
+        CMusVoipCallMonitor* callMonitor = 
+                    CMusVoipCallMonitor::NewL( aCallName, iCallStateObserver );   
+        CleanupStack::PushL( callMonitor );
+        iVoipCallMonitorArray.AppendL( callMonitor );
+        CleanupStack::Pop( callMonitor );
+        }
+    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::AddCallMonitorL" )
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::RemoveCallEventMonitorL( TName aCallName ) 
+// Remove the Call Monitor if it exist in array.
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::RemoveVoipCallMonitor( TName& aCallName ) 
+    {
+    MUS_LOG_TDESC( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::RemoveCallMonitor "
+                                                                 ,aCallName )
+    for ( TInt i = 0; i < iVoipCallMonitorArray.Count(); i++ )
+        {
+        if( iVoipCallMonitorArray[i]->IsEqual( aCallName ) )
+            {
+            delete iVoipCallMonitorArray[i];
+            iVoipCallMonitorArray.Remove(i);
+            break;
+           }
         }
-    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::MonitorCallL")
+    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::RemoveCallMonitor" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::RemoveAllVoipCallMonitors 
+// Remove all voip call monitors
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::RemoveAllVoipCallMonitors( ) 
+    {
+    MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::RemoveAllVoipCallMonitors ")
+    iVoipCallMonitorArray.ResetAndDestroy();
+    iVoipCallMonitorArray.Close();
+    MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::RemoveAllVoipCallMonitors" )
+    }
+
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::CheckCallCriteria 
+// Checks the Multimediasharing call criterias
+// -----------------------------------------------------------------------------
+//
+void CMusTsyPropertyMonitor::CheckCallCriteriaL()
+    {
+    TInt csCall = iCallMonitorArray.Count();
+    TInt voipCall = iVoipCallMonitorArray.Count();
+    switch( csCall )
+        {
+        case 0 : 
+            {
+            switch( voipCall )
+                {
+                /* No cs call or voip call */
+                case 0 : 
+                        {
+                        User::LeaveIfError(
+                         RProperty::Set( NMusSessionInformationApi::KCategoryUid,
+                                        NMusSessionInformationApi::KMusCallEvent,
+                                        0 ));   
+                        SetStateL(NMusSessionInformationApi::ENoCall);
+                        break;
+                        }                    
+                /* No cs call but one voip call */
+                case 1 : 
+                        {
+                        iVoipCallMonitorArray[0]->
+                            SetStateL(NMusSessionInformationApi::ECallConnected);
+                        break;
+                        }
+                /* No cs call but more than one voip call */    
+                default: SetStateL(NMusSessionInformationApi::ECallHold);
+                         break;
+                }
+            break;
+            }
+        case 1 : 
+            {
+            switch( voipCall )
+                {
+                /* One cs call but no voip call */
+                case 0  : break;// Will be handled by cs call monitors.
+                /* One cs call and one or more voip calls */
+                default : SetStateL(NMusSessionInformationApi::ECallHold);
+                         break;                
+                }
+            break;
+            }
+        default: // 2 or more CS calls
+            {
+            /* Sometimes when call get disconnected then call object disappears.So
+             * check the call state or open the call , if there is an error or undesired
+             * call state , remove that callmonitor from array.
+             */
+            RemoveUnUsedCallMonitors();    
+
+            /* It is already multicall so atleast one should be under hold.
+             * so set the state first to hold and then let the conference 
+             * monitor decide the conference state.
+             */
+            SetStateL(NMusSessionInformationApi::ECallHold);  
+            
+            /* Still we dont know here about conference state so 
+             * let the conference call monitor decide .
+             */
+            iConferenceMonitor->SetStateL();         
+            break;
+            }
+        }
     }
 
 
@@ -449,4 +641,41 @@
     
     MUS_LOG( "mus: [MUSAO]  <- CMusTsyPropertyMonitor::NotifyCallStateChanged" )
     }
+
+
+
+// -----------------------------------------------------------------------------
+// CMusTsyPropertyMonitor::IsDataReadyL 
+// -----------------------------------------------------------------------------
+//
+TBool CMusTsyPropertyMonitor::IsDataReadyL()
+    {
+    MUS_LOG( "mus: [MUSAO]  -> CMusTsyPropertyMonitor::IsDataReadyL" )
+
+    TBool dataReady = EFalse;
+    TInt csCall = iCallMonitorArray.Count();
+    TInt voipCall = iVoipCallMonitorArray.Count();
+    
+    // In case of Conference Notify that data is ready.
+    if ( iConferenceMonitor->GetConfStatus() !=  RMobileConferenceCall::EConferenceIdle )
+        {
+        MUS_LOG( "mus: [MUSAO]  Conference CASE" )
+        dataReady = ETrue;
+        }
+    else if ( csCall == 1 && !voipCall  )
+        {
+        MUS_LOG( "mus: [MUSAO]  CS CALL" )
+        dataReady = iCallMonitorArray[0]->IsDataReadyL();
+        }
+    else if ( voipCall == 1 && !csCall )
+        {
+        MUS_LOG( "mus: [MUSAO]  VOIP CALL" )
+        dataReady = iVoipCallMonitorArray[0]->IsDataReadyL();
+        }
+
+    MUS_LOG1( "mus: [MUSAO] <- CMusTsyPropertyMonitor::IsDataReadyL = %d",dataReady)
+    return dataReady;
+    }
+
 // End of file
+