telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmfaxlinetsy.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmtsy/cmmfaxlinetsy.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,421 @@
+// 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:
+//
+
+
+
+//INCLUDES
+#include "cmmfaxlinetsy.h"
+#include "cmmphonetsy.h"
+#include "cmmfaxcalltsy.h"
+#include "cmmcallextinterface.h"
+#include "cmmlinelist.h"
+#include "cmmcalllist.h"
+#include "cmmtsyreqhandlestore.h"
+#include "cmmmessagemanagerbase.h"
+#include <ctsy/tflogger.h>
+#include <ctsy/pluginapi/cmmdatapackage.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+CMmFaxLineTsy::CMmFaxLineTsy()
+    {
+    }
+
+
+CMmFaxLineTsy* CMmFaxLineTsy::NewL(
+    CMmPhoneTsy* aMmPhone,
+    RMobilePhone::TMobileService aMode,
+    const TDesC& aName,
+    CMmMessageManagerBase* aMessageManager )
+    {
+    CMmFaxLineTsy* mmLineTsy = NULL;
+
+    if ( aMmPhone != NULL && aMode == RMobilePhone::EFaxService )
+        {
+        mmLineTsy = new ( ELeave ) CMmFaxLineTsy();
+ 
+        CleanupClosePushL( *mmLineTsy );
+        mmLineTsy->iMmPhone  = aMmPhone;    
+        mmLineTsy->iLineName = aName;
+        mmLineTsy->iLineMode = aMode;
+        mmLineTsy->iMessageManager = aMessageManager;
+        mmLineTsy->ConstructL();
+        CleanupStack::Pop();
+        }
+
+    return mmLineTsy;
+    }
+
+CMmFaxLineTsy::~CMmFaxLineTsy()
+    {
+    TFLOGSTRING2("TSY: CMmFaxLineTsy::~CMmFaxLineTsy. Line name: %S",
+        &iLineName);
+
+    iLastIncomingFaxCall = NULL;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::OpenNewObjectL
+// This method creates a new name for a call and opens a new  call. This  
+// methodis 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* CMmFaxLineTsy::OpenNewObjectL(
+    TDes& aNewName )
+    {
+    CMmFaxCallTsy* mmCall = NULL;
+
+    // mmfax: Fax client expects that it get's the existing call object,
+    // not the new one..
+    if ( iLastIncomingFaxCall )
+        {
+        aNewName.Copy(iLastIncomingFaxCall->CallName());
+        iLastIncomingFaxCall = NULL;
+        mmCall = reinterpret_cast<CMmFaxCallTsy*>(
+            OpenNewObjectByNameL(aNewName) );
+        return mmCall;
+        }
+
+    //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 = CMmFaxCallTsy::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;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::InitInternalAttributesL
+// Initialises miscellaneous internal attributes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmFaxLineTsy::InitInternalAttributesL()
+    {
+    CMmLineTsy::InitInternalAttributesL();
+
+    // The line supports data connections.
+    iLineCaps.iFlags = RLine::KCapsFax | RLine::KCapsEventIncomingCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::CreateCallObjectForIncomingCall
+// This function creates and stores a Call object that is used for a incoming 
+// call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmFaxLineTsy::CreateCallObjectForIncomingCall()
+    {
+    TInt trapError( KErrNone );
+    TInt result = CMmPhoneTsy::EMultimodePhoneOutOfMemory;
+
+    if ( !iCallForIncomingCall )
+        {
+        TName newName;
+        CreateNewCallName( newName );
+
+        TRAP( trapError,
+            iCallForIncomingCall = CMmFaxCallTsy::NewL(
+                iMmPhone, this, iLineMode, newName, iMessageManager );
+            );
+
+        if ( trapError == KErrNone ) 
+            {
+            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;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::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* CMmFaxLineTsy::CreateGhostCallObject(
+    TInt aCallId,
+    RMobilePhone::TMobileService,
+    RMobileCall::TMobileCallStatus aCallStatus )
+    {
+    TInt trapError( KErrNone );
+
+    TName newName;
+    CreateNewCallName( newName );
+    CMmFaxCallTsy* mmCall = NULL;
+
+    TRAP( trapError,
+        mmCall = CMmFaxCallTsy::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::KCapsFax | 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;
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::CompleteNotifyIncomingCall
+// This method is used to notify to the client about the 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 we have to create a new call object for 
+// the next incoming call. In case that we are out of memory, 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 CMmFaxLineTsy::CompleteNotifyIncomingCall(
+    CMmDataPackage* aDataPackage )
+    {
+    TInt callId( -1 );
+    RMobilePhone::TMobileService callMode( RMobilePhone::EVoiceService );
+
+    CCallDataPackage* callDataPackage =
+        reinterpret_cast<CCallDataPackage*>(aDataPackage);
+
+    callDataPackage->GetCallIdAndMode( callId, callMode ); 
+
+    TFLOGSTRING3("TSY: CMmFaxLineTsy::CompleteNotifyIncomingCall - \
+        Line name: %S, Call id: %d", &iLineName, callId );
+
+    //reset req handle. Returns the deleted req handle
+    TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+        EMultimodeLineNotifyIncomingCall );
+
+    CMmFaxCallTsy* mmCall = NULL;
+
+    // Check if notification is requested
+    if ( EMultimodeLineReqHandleUnknown != reqHandle )
+        {
+        mmCall = reinterpret_cast<CMmFaxCallTsy*>(
+            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 direction to EMobileTerminated
+                mmCall->SetCallDirection( RMobileCall::EMobileTerminated );
+
+                // Add answer capability and remove dial capability to
+                // existing call capabilities
+                TUint32 callCaps = mmCall->CallCaps();
+                callCaps |= RCall::KCapsAnswer; 
+                callCaps &= ~RCall::KCapsDial;
+                mmCall->SetCallCaps( callCaps );
+
+                //set data to gsm extension
+                //( direction added because not uppdated in messagehandler)
+                mmCall->ActiveCallExtension()->SetMobileCallData(
+                    aDataPackage, RMobileCall::EMobileTerminated );
+
+                // mmfax: Save ptr to last incoming fax call, so that
+                // it can be used to open right call object for fax.
+                iLastIncomingFaxCall = mmCall;
+
+                iNameOfCallForAnswering = mmCall->CallName();
+
+                *iRetIncomingCallName = mmCall->CallName(); 
+                iCallForIncomingCall = NULL;
+                iNumCalls++;
+                
+                ReqCompleted( reqHandle, KErrNone );
+
+                // Create and store a new Call Object for incoming call.
+                CreateCallObjectForIncomingCall();
+
+                RMobileCall::TMobileCallStatus status(
+                    RMobileCall::EStatusRinging );
+                CCallDataPackage dataPackage;
+                dataPackage.SetCallIdAndMode( callId, callMode );
+                dataPackage.PackData( &status );
+                }
+            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 );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::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 CMmFaxLineTsy::CompleteNotifyDiallingStatus(
+    CMmDataPackage* aDataPackage )
+    {
+    TFLOGSTRING("TSY: CMmFaxLineTsy::CompleteNotifyDiallingStatus");
+    TInt callId( -1 );
+    TBool ghostCall( EFalse );
+    RMobilePhone::TMobileService callMode( RMobilePhone::EFaxService );
+    
+    CCallDataPackage* callData 
+        = reinterpret_cast<CCallDataPackage*>(aDataPackage);
+
+    callData->GetCallIdAndMode( callId, callMode );
+
+    CMmFaxCallTsy* mmCall = reinterpret_cast<CMmFaxCallTsy*>(
+        iMmPhone->CallList()->GetMmCallByMode( callMode ) );
+
+    if ( NULL == mmCall )
+        {
+        TFLOGSTRING("TSY: CMmFaxLineTsy::CompleteNotifyDiallingStatus - \
+            GhostCall");
+        ghostCall = ETrue;
+        }
+    else
+        {
+        TBool result( EFalse );
+
+        //now we have to check, if this is a ghost call
+        result = mmCall->IsServiceLocallyRequested(
+            CMmCallTsy::EMultimodeCallDial );
+
+        if ( result )
+            {
+            for ( TInt i = 0; i < iMmPhone->CallList()->GetNumberOfObjects(); 
+                i++ )
+                {    
+                mmCall = reinterpret_cast<CMmFaxCallTsy*>(
+                    iMmPhone->CallList()->GetMmCallByIndex(i) );
+                if ( mmCall->ServiceRequested(
+                        CMmCallTsy::EMultimodeCallDial ) )
+                    {
+                    mmCall->SetCallId( callId );
+                    mmCall->CompleteNotifyMobileCallInfoChange( 
+                        aDataPackage );
+                    break;   
+                    }
+                }
+            }
+        else
+            {
+            TFLOGSTRING("TSY: CMmFaxLineTsy::CompleteNotifyDiallingStatus - \
+                Dial not found");
+            ghostCall = ETrue;
+            }
+        }
+    //Ghost call handling starts here
+    if ( ghostCall )
+        {
+        //complete call added notification directly from here
+        CompleteNotifyAddBypassingCall( aDataPackage ); 
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMmFaxLineTsy::ResetLastIncomingCall
+// This method sets iLastIncomingFaxCall to NULL
+// ---------------------------------------------------------------------------
+//
+void CMmFaxLineTsy::ResetLastIncomingCall()
+    {
+    TFLOGSTRING("TSY: CMmFaxLineTsy::ResetLastIncomingCall");
+    iLastIncomingFaxCall = NULL;
+    }
+    
+//  End of File