telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdatalinetsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdatalinetsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmdatalinetsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,497 +1,497 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
-
-
-
-//INCLUDE FILES
-#include "cmmdatalinetsy.h"
-#include "cmmphonetsy.h"
-#include "cmmdatacalltsy.h"
-#include "cmmcallextinterface.h"
-#include "cmmlinelist.h"
-#include "cmmcalllist.h"
-#include "cmmtsyreqhandlestore.h"
-#include "cmmmessagemanagerbase.h"
-#include "CMmCommonStaticUtility.h"
-#include <ctsy/pluginapi/cmmdatapackage.h>
-
-
-// ======== MEMBER FUNCTIONS ========
-
-CMmDataLineTsy::CMmDataLineTsy()
-    {
-    }
-
-
-void CMmDataLineTsy::ConstructL()
-    {
-TFLOGSTRING("TSY: CMmDataLineTsy::ConstructL");
-
-    CMmLineTsy::ConstructL();
-    }
-
-CMmDataLineTsy* CMmDataLineTsy::NewL(
-    CMmPhoneTsy* aMmPhone,
-    RMobilePhone::TMobileService aMode,
-    const TDesC& aName,
-    CMmMessageManagerBase* aMessageManager )
-    {
-TFLOGSTRING2("TSY: CMmDataLineTsy::NewL - Data line %S created", &aName);
-    CMmDataLineTsy* mmLineTsy = NULL;
-
-    if ( NULL != aMmPhone && RMobilePhone::ECircuitDataService == aMode )
-        {
-        mmLineTsy = new ( ELeave ) CMmDataLineTsy();
- 
-        CleanupClosePushL( *mmLineTsy );
-        mmLineTsy->iMmPhone  = aMmPhone;    
-        mmLineTsy->iLineName = aName;
-        mmLineTsy->iLineMode = aMode;
-        mmLineTsy->iMessageManager = aMessageManager;
-        mmLineTsy->ConstructL();
-        CleanupStack::Pop();
-        }
-
-    return mmLineTsy;
-    }
-
-CMmDataLineTsy::~CMmDataLineTsy()
-    {
-TFLOGSTRING2("TSY: CMmDataLineTsy::~CMmDataLineTsy - Line name: %S",
-    &iLineName);
-
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::OpenNewObjectL
-// This method creates a new name for a call and opens a new  call. This  
-// method is called when the client uses RCall::OpenNewCall method. Currently 
-// the maximum number of opened calls from tsy is 20.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmDataLineTsy::OpenNewObjectL(
-    TDes& aNewName )
-    {
-    CMmDataCallTsy* mmCall = NULL;
-
-    //Logic here to prevent creation of unlimited amount of call objects
-    //by clients. The proposed maximum amount of call objects is 20:
-    //
-    //  - 2 voice call object (1 for each line for incoming calls
-    //  - 1 data call object (for incoming data call)
-    //  - 1 emergency call object
-    //  - 1+7 call objects for Confence call (max number of CC participants)
-    //  - phonebook 1
-    //  - javaphone 1
-    //  - WTA 1
-    //  - voice mail box 1
-    //  - csd 1
-    //  - fax 1
-    //  - 3rd party 2
-    //
-
-    //Incoming calls can not be created if the maximum number is exceeded!
-    if ( KMaxNumberOfCallObjectsFromTsy 
-            > iMmPhone->CallList()->GetNumberOfObjects() )
-        {
-        CreateNewCallName( aNewName );
-        mmCall = CMmDataCallTsy::NewL( iMmPhone, this, iLineMode, aNewName,
-            iMessageManager );
-        iNameOfLastCallAdded = aNewName;
-
-        // Add the new call to the list of calls
-        TInt ret = iMmPhone->CallList()->AddObject( mmCall );
-        if ( KErrNone != ret )
-            {
-            //If call cannot be added to CallList -> leave with KErrNoMemory
-            //CallList has to have information about every call.
-            mmCall->Close();
-            mmCall = NULL;
-            User::Leave( KErrNoMemory );
-            }
-        else
-            {
-            CompleteNotifyCallAdded( aNewName );
-            }
-        }
-    else
-        {
-        User::Leave( KErrAccessDenied );
-        }
-
-    return mmCall;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::InitInternalAttributesL
-// Initialises miscellaneous internal attributes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmDataLineTsy::InitInternalAttributesL()
-    {
-    CMmLineTsy::InitInternalAttributesL();
-
-    // The line supports data connections.
-    iLineCaps.iFlags = RLine::KCapsData | RLine::KCapsEventIncomingCall;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::CreateCallObjectForIncomingCall
-// This function creates and stores a Call object that is used for a incoming 
-// call.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmDataLineTsy::CreateCallObjectForIncomingCall()
-    {
-    TInt trapError( KErrNone );
-    TInt result( CMmPhoneTsy::EMultimodePhoneOutOfMemory );
-
-    if ( !iCallForIncomingCall )
-        {
-        TName newName;
-        CreateNewCallName( newName );
-
-        TRAP( trapError,
-            iCallForIncomingCall = CMmDataCallTsy::NewL(
-                iMmPhone, this, iLineMode, newName, iMessageManager );
-            );
-
-        if ( KErrNone == trapError ) 
-            {
-            iNameOfLastCallAdded = newName;
-            // Don't add the new call to the list of calls yet. Will be
-            // Added when incoming call has been received...
-            result = KErrNone;
-            }
-        }
-
-    return result;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::CreateGhostCallObject
-// This method creates a Call object for the Ghost call. A ghost call is a  
-// call that has been initiated bypassing the ETel.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmCallTsy* CMmDataLineTsy::CreateGhostCallObject(
-    TInt aCallId,
-    RMobilePhone::TMobileService,
-    RMobileCall::TMobileCallStatus aCallStatus )
-    {
-    TInt trapError( KErrNone );
-    TName newName;
-    CreateNewCallName( newName );
-    CMmDataCallTsy* mmCall = NULL;
-
-    TRAP( trapError,
-        mmCall = CMmDataCallTsy::NewL(
-            iMmPhone, this, iLineMode, newName, iMessageManager );
-        );
-
-    if ( KErrNone == trapError && NULL != mmCall )
-        {
-        //set call ID
-        mmCall->SetCallId( aCallId );
-        //set call status
-        if( aCallStatus >= RMobileCall::EStatusDialling )
-            {
-            //Status is allways set to dialing. If call is alredy
-            //e.g. connecting, missed status changes are simulated.
-            mmCall->SetCallStatus(
-                RCall::EStatusDialling, RMobileCall::EStatusDialling );
-            }
-        //set call caps
-        mmCall->SetCallCaps( RCall::KCapsData | RCall::KCapsHangUp );
-        //set call direction to MO call
-        mmCall->SetCallDirection( RMobileCall::EMobileOriginated );
-        //set flag indicating that this is a ghost call
-        mmCall->SetGhostCall( ETrue );
-        //save name of the last added call
-        iNameOfLastCallAdded = mmCall->CallName();
-        }
-
-    return mmCall;
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::CompleteNotifyIncomingCall
-// This method notifies clients about incoming call. Basic information: one 
-// Call object is allocated in the boot-up for incoming call. When an incoming 
-// call occurs the call object will be given to the client that answers the
-// call. Therefore TSY creates a new call object for the next incoming call.
-// In case of out of memory situation, the next incoming call cannot be
-// received! General error message about OutOfMemory situation is sent to the
-// client. 
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmDataLineTsy::CompleteNotifyIncomingCall(
-    CMmDataPackage* aDataPackage )
-    {
-    TInt callId( -1 );
-    RMobilePhone::TMobileService callMode( RMobilePhone::EVoiceService );
-
-    CCallDataPackage* callDataPackage =
-        reinterpret_cast<CCallDataPackage*>(aDataPackage);
-    callDataPackage->GetCallIdAndMode( callId, callMode ); 
-
-TFLOGSTRING3("TSY: CMmDataLineTsy::CompleteNotifyIncomingCall - \
-    Line name: %S, Call id: %d", &iLineName, callId );
-
-    //reset req handle. Returns the deleted req handle
-    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
-        EMultimodeLineNotifyIncomingCall );
-
-    CMmDataCallTsy* mmCall = NULL;
-    // First check if the incoming call is for Call Back functionality.
-    // E.g. client has dialled server, which calls back to save user
-    // the data call charging.
-    mmCall = reinterpret_cast<CMmDataCallTsy*>(
-        iMmPhone->WaitingCallForData() );
-    if ( mmCall )
-        {
-        // If call object is valid, then there is already a call object and
-        // client waiting for this incoming call!
-        // Set new call id
-        mmCall->SetCallId( callId );
-        // Set call status
-        mmCall->SetCallStatus(
-            RCall::EStatusRinging, RMobileCall::EStatusRinging );        
-        // Set call direction to EMobileTerminated
-        mmCall->SetCallDirection( RMobileCall::EMobileTerminated );
-        // Remove dial capability from existing call capabilities
-        TUint32 callCaps = mmCall->CallCaps();
-        callCaps &= ~RCall::KCapsDial;
-        mmCall->SetCallCaps( callCaps );
-
-        mmCall->ActiveCallExtension()->RemoveGSMCallCaps(
-            RCall::KCapsDial );
-        mmCall->CompleteNotifyMobileCallCapsChange( KErrNone );
-
-        iNameOfCallForAnswering = mmCall->CallName();
-        
-        *iRetIncomingCallName = mmCall->CallName(); 
-        iCallForIncomingCall = NULL;
-
-        // Used to pass information for call object's GetMobileCallInfo.
-        // Set data to gsm extension
-        //( direction added because not uppdated in messagehandler)
-        mmCall->ActiveCallExtension()->SetMobileCallData(
-            aDataPackage, RMobileCall::EMobileTerminated );
-        // Data caps are changed
-        RMobileCall::TMobileCallDataCapsV1 caps;
-
-        mmCall->ActiveCallExtension()->GetMobileDataCallCapsV1( caps );
-           
-        caps.iSpeedCaps = RMobileCall::KCapsSpeedAutobauding;
-        caps.iProtocolCaps = 0x00;
-        caps.iServiceCaps = 0x00;
-        caps.iQoSCaps = 0x00;
-        caps.iHscsdSupport = EFalse;
-        caps.iMaxRxTimeSlots = 0x00;
-        caps.iMaxTxTimeSlots = 0x00;
-        caps.iCodingCaps = 0x00;
-        caps.iAsymmetryCaps = 0x00;
-        caps.iUserInitUpgrade = EFalse;
-        caps.iRLPVersionCaps = 0x00;
-        caps.iV42bisCaps = 0x00;
-        mmCall->ActiveCallExtension()->ReceivedMobileDataCallCaps( &caps );
-        mmCall->CompleteNotifyMobileDataCallCapsChange();
-
-        // If notification is requested, complete it here!
-        if ( EMultimodeLineReqHandleUnknown != reqHandle )
-            {
-            ReqCompleted( reqHandle, KErrNone );
-            }
-        mmCall = NULL;
-        }
-    // Check if notification is requested
-    else if ( EMultimodeLineReqHandleUnknown != reqHandle )
-        {
-        mmCall = reinterpret_cast<CMmDataCallTsy*>(
-            CallObjectForIncomingCall() );
-
-        if ( mmCall )
-            {
-            // Add the new call to the list of calls
-            TInt ret = iMmPhone->CallList()->AddObject( mmCall );
-
-            if ( KErrNone == ret )
-                {
-                // Set flag indicating that this is a unowned incoming call
-                mmCall->SetUnownedCallObjectFlag( ETrue );
-                // Set call ID
-                mmCall->SetCallId( callId );
-                // Set call status
-                mmCall->SetCallStatus(
-                    RCall::EStatusRinging, RMobileCall::EStatusRinging );                
-                // Set call direction to EMobileTerminated
-                mmCall->SetCallDirection( RMobileCall::EMobileTerminated );
-
-                // Remove dial capability from existing call capabilities
-                TUint32 callCaps = mmCall->CallCaps();
-                callCaps &= ~RCall::KCapsDial;
-                mmCall->SetCallCaps( callCaps );
-
-                mmCall->ActiveCallExtension()->RemoveGSMCallCaps(
-                    RCall::KCapsDial );
-                mmCall->CompleteNotifyMobileCallCapsChange( KErrNone );
-
-                // Set data to gsm extension
-                //( direction added because not uppdated in messagehandler)
-                mmCall->ActiveCallExtension()->SetMobileCallData(
-                    aDataPackage, RMobileCall::EMobileTerminated );
-
-                iNameOfCallForAnswering = mmCall->CallName();
-
-                *iRetIncomingCallName = mmCall->CallName(); 
-                iCallForIncomingCall = NULL;
-				iNumCalls++;
-
-                ReqCompleted( reqHandle, KErrNone );
-
-                // Data caps are changed
-                RMobileCall::TMobileCallDataCapsV1 caps;
-      
-                mmCall->ActiveCallExtension()->GetMobileDataCallCapsV1( caps );                   
-          
-                caps.iSpeedCaps = RMobileCall::KCapsSpeedAutobauding;
-                caps.iProtocolCaps = 0x00;
-                caps.iServiceCaps = 0x00;
-                caps.iQoSCaps = 0x00;
-                caps.iHscsdSupport = EFalse;
-                caps.iMaxRxTimeSlots = 0x00;
-                caps.iMaxTxTimeSlots = 0x00;
-                caps.iCodingCaps = 0x00;
-                caps.iAsymmetryCaps = 0x00;
-                caps.iUserInitUpgrade = EFalse;
-                caps.iRLPVersionCaps = 0x00;
-                caps.iV42bisCaps = 0x00;
-                mmCall->ActiveCallExtension()->
-                    ReceivedMobileDataCallCaps( &caps );
-                mmCall->CompleteNotifyMobileDataCallCapsChange();
-
-                // Create and store a new Call Object for incoming call.
-                CreateCallObjectForIncomingCall();
-                }
-            else
-                {
-                //call object could not be added to the call list. Incoming 
-                //call cannot be received.
-                ReqCompleted( reqHandle, KErrNoMemory );
-                }
-            }
-        else
-            {
-            //call object could not be get. Incoming call cannot be received.
-            //General error message about OutOfMemory situation has been sent
-            //to the client.
-            ReqCompleted( reqHandle, KErrNoMemory );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMmDataLineTsy::CompleteNotifyDiallingStatus
-// This method notifies line that a call has entered Dialling state. It means
-// that Call ID should be saved and in case of ghost call a new call object
-// should be created.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmDataLineTsy::CompleteNotifyDiallingStatus(
-    CMmDataPackage* aDataPackage )
-    {
-TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus");
-
-    TInt callId( -1 );
-    TBool ghostCall( EFalse );
-    RMobilePhone::TMobileService callMode( 
-                                      RMobilePhone::ECircuitDataService );
-
-    CCallDataPackage* callData =
-        reinterpret_cast<CCallDataPackage*>( aDataPackage );
-
-    callData->GetCallIdAndMode( callId, callMode );
-
-    CMmDataCallTsy* mmCall = reinterpret_cast<CMmDataCallTsy*>(
-        iMmPhone->CallList()->GetMmCallByMode( callMode ) );
-
-    if ( NULL == mmCall )
-        {
-        TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - \
-            GhostCall");
-        ghostCall = ETrue;
-        }
-    else
-        {
-        TBool result( EFalse );
-        TBool resultNoFdnCheck( EFalse );
-
-        //now we have to check, if this is a ghost call
-        result = mmCall->IsServiceLocallyRequested(
-            CMmCallTsy::EMultimodeCallDial );
-
-        //now we have to check, if this is a ghost call
-        resultNoFdnCheck = mmCall->IsServiceLocallyRequested( 
-            CMmCallTsy::EMultimodeCallDialNoFdnCheck );
-
-TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - IsDial: %d", result );  
-TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - IsDialNoFdnCheck: %d", resultNoFdnCheck );  
-
-        if ( result || resultNoFdnCheck )
-            {
-            for ( TInt i = 0; i < iMmPhone->CallList()->
-                                                GetNumberOfObjects(); i++ )
-                {    
-                mmCall = reinterpret_cast<CMmDataCallTsy*>(
-                    iMmPhone->CallList()->GetMmCallByIndex(i) );
-                    
-                if ( ( mmCall->ServiceRequested(
-                        CMmCallTsy::EMultimodeCallDial ) )
-                    || ( mmCall->ServiceRequested(
-                        CMmCallTsy::EMultimodeCallDialNoFdnCheck ) ) )
-                    {
-                    mmCall->SetCallId( callId );
-TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - mmCall SetCallId: %d", callId);                           
-                    mmCall->CompleteNotifyMobileCallInfoChange( 
-                                aDataPackage );
-                    break;
-                    }
-                }
-            }
-        else
-            {
-TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - Dial not found");
-            ghostCall = ETrue;
-            }
-        }
-    //Ghost call handling starts here
-    if ( ghostCall )
-        {
-TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus -> CompleteNotifyAddBypassingCall");        
-        //complete call added notification directly from here
-        CompleteNotifyAddBypassingCall( aDataPackage ); 
-        }
-    }
-
-
-
-//  End of File
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+
+//INCLUDE FILES
+#include "cmmdatalinetsy.h"
+#include "cmmphonetsy.h"
+#include "cmmdatacalltsy.h"
+#include "cmmcallextinterface.h"
+#include "cmmlinelist.h"
+#include "cmmcalllist.h"
+#include "cmmtsyreqhandlestore.h"
+#include "cmmmessagemanagerbase.h"
+#include "CMmCommonStaticUtility.h"
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmDataLineTsy::CMmDataLineTsy()
+    {
+    }
+
+
+void CMmDataLineTsy::ConstructL()
+    {
+TFLOGSTRING("TSY: CMmDataLineTsy::ConstructL");
+
+    CMmLineTsy::ConstructL();
+    }
+
+CMmDataLineTsy* CMmDataLineTsy::NewL(
+    CMmPhoneTsy* aMmPhone,
+    RMobilePhone::TMobileService aMode,
+    const TDesC& aName,
+    CMmMessageManagerBase* aMessageManager )
+    {
+TFLOGSTRING2("TSY: CMmDataLineTsy::NewL - Data line %S created", &aName);
+    CMmDataLineTsy* mmLineTsy = NULL;
+
+    if ( NULL != aMmPhone && RMobilePhone::ECircuitDataService == aMode )
+        {
+        mmLineTsy = new ( ELeave ) CMmDataLineTsy();
+ 
+        CleanupClosePushL( *mmLineTsy );
+        mmLineTsy->iMmPhone  = aMmPhone;    
+        mmLineTsy->iLineName = aName;
+        mmLineTsy->iLineMode = aMode;
+        mmLineTsy->iMessageManager = aMessageManager;
+        mmLineTsy->ConstructL();
+        CleanupStack::Pop();
+        }
+
+    return mmLineTsy;
+    }
+
+CMmDataLineTsy::~CMmDataLineTsy()
+    {
+TFLOGSTRING2("TSY: CMmDataLineTsy::~CMmDataLineTsy - Line name: %S",
+    &iLineName);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::OpenNewObjectL
+// This method creates a new name for a call and opens a new  call. This  
+// method is called when the client uses RCall::OpenNewCall method. Currently 
+// the maximum number of opened calls from tsy is 20.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmDataLineTsy::OpenNewObjectL(
+    TDes& aNewName )
+    {
+    CMmDataCallTsy* mmCall = NULL;
+
+    //Logic here to prevent creation of unlimited amount of call objects
+    //by clients. The proposed maximum amount of call objects is 20:
+    //
+    //  - 2 voice call object (1 for each line for incoming calls
+    //  - 1 data call object (for incoming data call)
+    //  - 1 emergency call object
+    //  - 1+7 call objects for Confence call (max number of CC participants)
+    //  - phonebook 1
+    //  - javaphone 1
+    //  - WTA 1
+    //  - voice mail box 1
+    //  - csd 1
+    //  - fax 1
+    //  - 3rd party 2
+    //
+
+    //Incoming calls can not be created if the maximum number is exceeded!
+    if ( KMaxNumberOfCallObjectsFromTsy 
+            > iMmPhone->CallList()->GetNumberOfObjects() )
+        {
+        CreateNewCallName( aNewName );
+        mmCall = CMmDataCallTsy::NewL( iMmPhone, this, iLineMode, aNewName,
+            iMessageManager );
+        iNameOfLastCallAdded = aNewName;
+
+        // Add the new call to the list of calls
+        TInt ret = iMmPhone->CallList()->AddObject( mmCall );
+        if ( KErrNone != ret )
+            {
+            //If call cannot be added to CallList -> leave with KErrNoMemory
+            //CallList has to have information about every call.
+            mmCall->Close();
+            mmCall = NULL;
+            User::Leave( KErrNoMemory );
+            }
+        else
+            {
+            CompleteNotifyCallAdded( aNewName );
+            }
+        }
+    else
+        {
+        User::Leave( KErrAccessDenied );
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::InitInternalAttributesL
+// Initialises miscellaneous internal attributes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmDataLineTsy::InitInternalAttributesL()
+    {
+    CMmLineTsy::InitInternalAttributesL();
+
+    // The line supports data connections.
+    iLineCaps.iFlags = RLine::KCapsData | RLine::KCapsEventIncomingCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::CreateCallObjectForIncomingCall
+// This function creates and stores a Call object that is used for a incoming 
+// call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmDataLineTsy::CreateCallObjectForIncomingCall()
+    {
+    TInt trapError( KErrNone );
+    TInt result( CMmPhoneTsy::EMultimodePhoneOutOfMemory );
+
+    if ( !iCallForIncomingCall )
+        {
+        TName newName;
+        CreateNewCallName( newName );
+
+        TRAP( trapError,
+            iCallForIncomingCall = CMmDataCallTsy::NewL(
+                iMmPhone, this, iLineMode, newName, iMessageManager );
+            );
+
+        if ( KErrNone == trapError ) 
+            {
+            iNameOfLastCallAdded = newName;
+            // Don't add the new call to the list of calls yet. Will be
+            // Added when incoming call has been received...
+            result = KErrNone;
+            }
+        }
+
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::CreateGhostCallObject
+// This method creates a Call object for the Ghost call. A ghost call is a  
+// call that has been initiated bypassing the ETel.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmCallTsy* CMmDataLineTsy::CreateGhostCallObject(
+    TInt aCallId,
+    RMobilePhone::TMobileService,
+    RMobileCall::TMobileCallStatus aCallStatus )
+    {
+    TInt trapError( KErrNone );
+    TName newName;
+    CreateNewCallName( newName );
+    CMmDataCallTsy* mmCall = NULL;
+
+    TRAP( trapError,
+        mmCall = CMmDataCallTsy::NewL(
+            iMmPhone, this, iLineMode, newName, iMessageManager );
+        );
+
+    if ( KErrNone == trapError && NULL != mmCall )
+        {
+        //set call ID
+        mmCall->SetCallId( aCallId );
+        //set call status
+        if( aCallStatus >= RMobileCall::EStatusDialling )
+            {
+            //Status is allways set to dialing. If call is alredy
+            //e.g. connecting, missed status changes are simulated.
+            mmCall->SetCallStatus(
+                RCall::EStatusDialling, RMobileCall::EStatusDialling );
+            }
+        //set call caps
+        mmCall->SetCallCaps( RCall::KCapsData | RCall::KCapsHangUp );
+        //set call direction to MO call
+        mmCall->SetCallDirection( RMobileCall::EMobileOriginated );
+        //set flag indicating that this is a ghost call
+        mmCall->SetGhostCall( ETrue );
+        //save name of the last added call
+        iNameOfLastCallAdded = mmCall->CallName();
+        }
+
+    return mmCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::CompleteNotifyIncomingCall
+// This method notifies clients about incoming call. Basic information: one 
+// Call object is allocated in the boot-up for incoming call. When an incoming 
+// call occurs the call object will be given to the client that answers the
+// call. Therefore TSY creates a new call object for the next incoming call.
+// In case of out of memory situation, the next incoming call cannot be
+// received! General error message about OutOfMemory situation is sent to the
+// client. 
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmDataLineTsy::CompleteNotifyIncomingCall(
+    CMmDataPackage* aDataPackage )
+    {
+    TInt callId( -1 );
+    RMobilePhone::TMobileService callMode( RMobilePhone::EVoiceService );
+
+    CCallDataPackage* callDataPackage =
+        reinterpret_cast<CCallDataPackage*>(aDataPackage);
+    callDataPackage->GetCallIdAndMode( callId, callMode ); 
+
+TFLOGSTRING3("TSY: CMmDataLineTsy::CompleteNotifyIncomingCall - \
+    Line name: %S, Call id: %d", &iLineName, callId );
+
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( 
+        EMultimodeLineNotifyIncomingCall );
+
+    CMmDataCallTsy* mmCall = NULL;
+    // First check if the incoming call is for Call Back functionality.
+    // E.g. client has dialled server, which calls back to save user
+    // the data call charging.
+    mmCall = reinterpret_cast<CMmDataCallTsy*>(
+        iMmPhone->WaitingCallForData() );
+    if ( mmCall )
+        {
+        // If call object is valid, then there is already a call object and
+        // client waiting for this incoming call!
+        // Set new call id
+        mmCall->SetCallId( callId );
+        // Set call status
+        mmCall->SetCallStatus(
+            RCall::EStatusRinging, RMobileCall::EStatusRinging );        
+        // Set call direction to EMobileTerminated
+        mmCall->SetCallDirection( RMobileCall::EMobileTerminated );
+        // Remove dial capability from existing call capabilities
+        TUint32 callCaps = mmCall->CallCaps();
+        callCaps &= ~RCall::KCapsDial;
+        mmCall->SetCallCaps( callCaps );
+
+        mmCall->ActiveCallExtension()->RemoveGSMCallCaps(
+            RCall::KCapsDial );
+        mmCall->CompleteNotifyMobileCallCapsChange( KErrNone );
+
+        iNameOfCallForAnswering = mmCall->CallName();
+        
+        *iRetIncomingCallName = mmCall->CallName(); 
+        iCallForIncomingCall = NULL;
+
+        // Used to pass information for call object's GetMobileCallInfo.
+        // Set data to gsm extension
+        //( direction added because not uppdated in messagehandler)
+        mmCall->ActiveCallExtension()->SetMobileCallData(
+            aDataPackage, RMobileCall::EMobileTerminated );
+        // Data caps are changed
+        RMobileCall::TMobileCallDataCapsV1 caps;
+
+        mmCall->ActiveCallExtension()->GetMobileDataCallCapsV1( caps );
+           
+        caps.iSpeedCaps = RMobileCall::KCapsSpeedAutobauding;
+        caps.iProtocolCaps = 0x00;
+        caps.iServiceCaps = 0x00;
+        caps.iQoSCaps = 0x00;
+        caps.iHscsdSupport = EFalse;
+        caps.iMaxRxTimeSlots = 0x00;
+        caps.iMaxTxTimeSlots = 0x00;
+        caps.iCodingCaps = 0x00;
+        caps.iAsymmetryCaps = 0x00;
+        caps.iUserInitUpgrade = EFalse;
+        caps.iRLPVersionCaps = 0x00;
+        caps.iV42bisCaps = 0x00;
+        mmCall->ActiveCallExtension()->ReceivedMobileDataCallCaps( &caps );
+        mmCall->CompleteNotifyMobileDataCallCapsChange();
+
+        // If notification is requested, complete it here!
+        if ( EMultimodeLineReqHandleUnknown != reqHandle )
+            {
+            ReqCompleted( reqHandle, KErrNone );
+            }
+        mmCall = NULL;
+        }
+    // Check if notification is requested
+    else if ( EMultimodeLineReqHandleUnknown != reqHandle )
+        {
+        mmCall = reinterpret_cast<CMmDataCallTsy*>(
+            CallObjectForIncomingCall() );
+
+        if ( mmCall )
+            {
+            // Add the new call to the list of calls
+            TInt ret = iMmPhone->CallList()->AddObject( mmCall );
+
+            if ( KErrNone == ret )
+                {
+                // Set flag indicating that this is a unowned incoming call
+                mmCall->SetUnownedCallObjectFlag( ETrue );
+                // Set call ID
+                mmCall->SetCallId( callId );
+                // Set call status
+                mmCall->SetCallStatus(
+                    RCall::EStatusRinging, RMobileCall::EStatusRinging );                
+                // Set call direction to EMobileTerminated
+                mmCall->SetCallDirection( RMobileCall::EMobileTerminated );
+
+                // Remove dial capability from existing call capabilities
+                TUint32 callCaps = mmCall->CallCaps();
+                callCaps &= ~RCall::KCapsDial;
+                mmCall->SetCallCaps( callCaps );
+
+                mmCall->ActiveCallExtension()->RemoveGSMCallCaps(
+                    RCall::KCapsDial );
+                mmCall->CompleteNotifyMobileCallCapsChange( KErrNone );
+
+                // Set data to gsm extension
+                //( direction added because not uppdated in messagehandler)
+                mmCall->ActiveCallExtension()->SetMobileCallData(
+                    aDataPackage, RMobileCall::EMobileTerminated );
+
+                iNameOfCallForAnswering = mmCall->CallName();
+
+                *iRetIncomingCallName = mmCall->CallName(); 
+                iCallForIncomingCall = NULL;
+				iNumCalls++;
+
+                ReqCompleted( reqHandle, KErrNone );
+
+                // Data caps are changed
+                RMobileCall::TMobileCallDataCapsV1 caps;
+      
+                mmCall->ActiveCallExtension()->GetMobileDataCallCapsV1( caps );                   
+          
+                caps.iSpeedCaps = RMobileCall::KCapsSpeedAutobauding;
+                caps.iProtocolCaps = 0x00;
+                caps.iServiceCaps = 0x00;
+                caps.iQoSCaps = 0x00;
+                caps.iHscsdSupport = EFalse;
+                caps.iMaxRxTimeSlots = 0x00;
+                caps.iMaxTxTimeSlots = 0x00;
+                caps.iCodingCaps = 0x00;
+                caps.iAsymmetryCaps = 0x00;
+                caps.iUserInitUpgrade = EFalse;
+                caps.iRLPVersionCaps = 0x00;
+                caps.iV42bisCaps = 0x00;
+                mmCall->ActiveCallExtension()->
+                    ReceivedMobileDataCallCaps( &caps );
+                mmCall->CompleteNotifyMobileDataCallCapsChange();
+
+                // Create and store a new Call Object for incoming call.
+                CreateCallObjectForIncomingCall();
+                }
+            else
+                {
+                //call object could not be added to the call list. Incoming 
+                //call cannot be received.
+                ReqCompleted( reqHandle, KErrNoMemory );
+                }
+            }
+        else
+            {
+            //call object could not be get. Incoming call cannot be received.
+            //General error message about OutOfMemory situation has been sent
+            //to the client.
+            ReqCompleted( reqHandle, KErrNoMemory );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmDataLineTsy::CompleteNotifyDiallingStatus
+// This method notifies line that a call has entered Dialling state. It means
+// that Call ID should be saved and in case of ghost call a new call object
+// should be created.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmDataLineTsy::CompleteNotifyDiallingStatus(
+    CMmDataPackage* aDataPackage )
+    {
+TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus");
+
+    TInt callId( -1 );
+    TBool ghostCall( EFalse );
+    RMobilePhone::TMobileService callMode( 
+                                      RMobilePhone::ECircuitDataService );
+
+    CCallDataPackage* callData =
+        reinterpret_cast<CCallDataPackage*>( aDataPackage );
+
+    callData->GetCallIdAndMode( callId, callMode );
+
+    CMmDataCallTsy* mmCall = reinterpret_cast<CMmDataCallTsy*>(
+        iMmPhone->CallList()->GetMmCallByMode( callMode ) );
+
+    if ( NULL == mmCall )
+        {
+        TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - \
+            GhostCall");
+        ghostCall = ETrue;
+        }
+    else
+        {
+        TBool result( EFalse );
+        TBool resultNoFdnCheck( EFalse );
+
+        //now we have to check, if this is a ghost call
+        result = mmCall->IsServiceLocallyRequested(
+            CMmCallTsy::EMultimodeCallDial );
+
+        //now we have to check, if this is a ghost call
+        resultNoFdnCheck = mmCall->IsServiceLocallyRequested( 
+            CMmCallTsy::EMultimodeCallDialNoFdnCheck );
+
+TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - IsDial: %d", result );  
+TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - IsDialNoFdnCheck: %d", resultNoFdnCheck );  
+
+        if ( result || resultNoFdnCheck )
+            {
+            for ( TInt i = 0; i < iMmPhone->CallList()->
+                                                GetNumberOfObjects(); i++ )
+                {    
+                mmCall = reinterpret_cast<CMmDataCallTsy*>(
+                    iMmPhone->CallList()->GetMmCallByIndex(i) );
+                    
+                if ( ( mmCall->ServiceRequested(
+                        CMmCallTsy::EMultimodeCallDial ) )
+                    || ( mmCall->ServiceRequested(
+                        CMmCallTsy::EMultimodeCallDialNoFdnCheck ) ) )
+                    {
+                    mmCall->SetCallId( callId );
+TFLOGSTRING2("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - mmCall SetCallId: %d", callId);                           
+                    mmCall->CompleteNotifyMobileCallInfoChange( 
+                                aDataPackage );
+                    break;
+                    }
+                }
+            }
+        else
+            {
+TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus - Dial not found");
+            ghostCall = ETrue;
+            }
+        }
+    //Ghost call handling starts here
+    if ( ghostCall )
+        {
+TFLOGSTRING("TSY: CMmDataLineTsy::CompleteNotifyDiallingStatus -> CompleteNotifyAddBypassingCall");        
+        //complete call added notification directly from here
+        CompleteNotifyAddBypassingCall( aDataPackage ); 
+        }
+    }
+
+
+
+//  End of File