diff -r 3553901f7fa8 -r 4047d69ee0e4 telephonyserverplugins/attestltsy/atcommand/callcontrol/src/atchld.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/attestltsy/atcommand/callcontrol/src/atchld.cpp Tue Feb 09 12:31:43 2010 +0000 @@ -0,0 +1,622 @@ +// Copyright (c) 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: +// @file atchld.cpp +// This contains CATChld which hold, resume, release, swap one call. +// + + +//sysmtem include + +//user include +#include "atchld.h" +#include "ltsycallinformationmanager.h" +#include "athangupcommandrecords.h" +#include "mslogger.h" + +//const define +const TInt KLtsyCHLDReadTimeout = 3; +const TInt KLtsyCHLDWaitForModemTime = 1000*250; // 0.25 seconds +_LIT8(KLtsyCHLDCommandFormat1, "AT+CHLD=%d\r"); +_LIT8(KLtsyCHLDCommandFormat2, "AT+CHLD=%d%d\r"); +_LIT8(KLtsyReleaseOutgoingCommand, "ATH1\r"); //Hang up outging call + + +// --------------------------------------------------------------------------- +// CATChld::NewL +// other items were commented in a header +// --------------------------------------------------------------------------- +CATChld* CATChld::NewL(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + { + CATChld* self = CATChld::NewLC(aGloblePhone, aCtsyDispatcherCallback); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CATChld::NewLC +// other items were commented in a header +// --------------------------------------------------------------------------- +CATChld* CATChld::NewLC(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + { + CATChld* self = new (ELeave) CATChld(aGloblePhone, aCtsyDispatcherCallback); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// CATChld::~CATChld +// other items were commented in a header +// --------------------------------------------------------------------------- +CATChld::~CATChld() + { + } + +// --------------------------------------------------------------------------- +// CATChld::CATChld +// other items were commented in a header +// --------------------------------------------------------------------------- +CATChld::CATChld(CGlobalPhonemanager& aGloblePhone, + CCtsyDispatcherCallback& aCtsyDispatcherCallback) + : CAtCommandBase(aGloblePhone, aCtsyDispatcherCallback) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::CATChld()")); + + //Set At type + iAtType = ELtsyAT_Call_CHLD; + + //Init variable + InitVariable(); + } + +// --------------------------------------------------------------------------- +// CATChld::InitVariable +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::InitVariable() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::InitVariable()")); + + iIOStatus = KErrNone; + iATResult = KErrNone; + iATStep = EATNotInProgress; + iIpcType = ELtsyReqCallHangup; + iChldType = ERleaseSpecificCall; + iCallId = KLtsyErrorCallId; + iConnectedCallId = KLtsyErrorCallId; + iHangupCause = -1; + } + +// --------------------------------------------------------------------------- +// CATChld::IsHoldCall +// other items were commented in a header +// --------------------------------------------------------------------------- +TBool CATChld::IsHoldCall(TInt aHoldCallId) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::IsHoldCall()")); + if (aHoldCallId >= KLtsyMinCallId && aHoldCallId <= KLtsyMaxCallId) + { + const TLtsyCallInformation& tCallInfo = iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(aHoldCallId); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo() && + TLtsyCallInformation::EHeldCall == tCallInfo.GetCallState()) + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// CATChld::IsActiveCall +// other items were commented in a header +// --------------------------------------------------------------------------- +TBool CATChld::IsActiveCall(TInt aActiveCallId) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::IsActiveCall()")); + + if (aActiveCallId >= KLtsyMinCallId && aActiveCallId <= KLtsyMaxCallId) + { + const TLtsyCallInformation& tCallInfo = iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(aActiveCallId); + if (TLtsyCallInformation::EUsed == tCallInfo.GetCallIdIsUsedInfo() && + TLtsyCallInformation::EActiveCall == tCallInfo.GetCallState()) + { + return ETrue; + } + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// CATChld::ConstructL +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::ConstructL() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ConstructL()")); + + //Invoke base class function + CAtCommandBase::ConstructL(); + + //Set read and write timeout + SetTimeOut(KLtsyDefaultWriteTimeOut, KLtsyCHLDReadTimeout); + } + +// --------------------------------------------------------------------------- +// CATChld::ExecuteCommand +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::ExecuteCommand() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ExecuteCommand()")); + + if (iChldType == EReleaseAllHeldCallOrUDUB || + iChldType == EReleaseAllActiveCallAndAcceptHeldWaiting || + iChldType == EHeldAllActiveCallAndAcceptHeldWaiting || + iChldType == EAddHeldCallToConversation || + iChldType == ECallTranster) + { + iTxBuffer.Format(KLtsyCHLDCommandFormat1, iChldType); + } + else + { + if (iChldType == ERleaseSpecificCall) //Release one call + { + + const TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(iCallId)); + + if (TLtsyCallInformation::EDialingCall == tCallInfo.GetCallState() || + TLtsyCallInformation::EAlertingCall == tCallInfo.GetCallState()) + { + //Hang up dialing or Alerting call(Outgoing call) + iTxBuffer.Copy(KLtsyReleaseOutgoingCommand); + } + else //Other call + { + iTxBuffer.Format(KLtsyCHLDCommandFormat2, EReleaseAllActiveCallAndAcceptHeldWaiting, iCallId); + } + } + else + { + iTxBuffer.Format(KLtsyCHLDCommandFormat2, EHeldAllActiveCallAndAcceptHeldWaiting, iCallId); + } + } + + LOGTEXT2(_L8("[Ltsy CallControl] CHLD Command = %S"), &iTxBuffer); + + //Setting waiting for modem time, when Command is too fast, Modem response error + if (iIpcType == ELtsyReqCallHold || + iIpcType == ELtsyReqCallResume || + iIpcType == ELtsyReqCallSwap) + { + User::After(KLtsyCHLDWaitForModemTime); + } + + Write(); + iATStep = EATWaitForWriteComplete; + } + +// --------------------------------------------------------------------------- +// CATChld::StartRequest +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::StartRequest() + { + ExecuteCommand(); + } + +// --------------------------------------------------------------------------- +// CATChld::SetIpcType +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::SetIpcType(TIpcType aIpcType) + { + iIpcType = aIpcType; + } + +// --------------------------------------------------------------------------- +// CATChld::SetChldType +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::SetChldType(TChldType aChldType) + { + iChldType = aChldType; + } + +// --------------------------------------------------------------------------- +// CATChld::SetCallId +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::SetCallId(TInt aCallId) + { + iCallId = aCallId; + } + +// --------------------------------------------------------------------------- +// CATChld::SetConnectedCallId +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::SetConnectedCallId(TInt aConnectedCallId) + { + iConnectedCallId = aConnectedCallId; + } + +// --------------------------------------------------------------------------- +// CATChld::SetHangupCase +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::SetHangupCase(TInt aHangupCase) + { + iHangupCause = aHangupCase; + } + +// --------------------------------------------------------------------------- +// CATChld::ParseResponseL +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::ParseResponseL(const TDesC8& aResponseBuf) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::ParseResponseL()")); + + if (aResponseBuf.Match(KLtsyOkString) == 0) + { + iATResult = KErrNone; + } + else if (aResponseBuf.Match(KLtsyErrorString) == 0) + { + iATResult = KErrArgument; + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleIOError +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleIOError() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleIOError()")); + + //Hangup + if (iIpcType == ELtsyReqCallHangup) + { + iCtsyDispatcherCallback.CallbackCallControlHangUpComp(iIOStatus, iCallId); + } + else if (iIpcType == ELtsyReqCallHold) //Hold call + { + iCtsyDispatcherCallback.CallbackCallControlHoldComp(iIOStatus, iCallId); + } + else if (iIpcType == ELtsyReqCallResume) //Resume call + { + iCtsyDispatcherCallback.CallbackCallControlResumeComp(iIOStatus, iCallId); + } + else if (iIpcType == ELtsyReqCallSwap) //Swap call + { + iCtsyDispatcherCallback.CallbackCallControlSwapComp(iIOStatus); + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleResponseError +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleResponseError() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleResponseError()")); + + //Hangup + if (iIpcType == ELtsyReqCallHangup) + { + iCtsyDispatcherCallback.CallbackCallControlHangUpComp(iATResult, iCallId); + } + else if (iIpcType == ELtsyReqCallHold) //Hold call + { + iCtsyDispatcherCallback.CallbackCallControlHoldComp(iATResult, iCallId); + } + else if (iIpcType == ELtsyReqCallResume) //Resume call + { + iCtsyDispatcherCallback.CallbackCallControlResumeComp(iATResult, iCallId); + } + else if (iIpcType == ELtsyReqCallSwap) //Swap call + { + iCtsyDispatcherCallback.CallbackCallControlSwapComp(iATResult); + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleCHLDComplete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleCHLDComplete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleCHLDComplete()")); + + //Hangup + if (iIpcType == ELtsyReqCallHangup) + { + HandleHangupComplete(); + } + else if (iIpcType == ELtsyReqCallHold) //Hold call + { + HandleHoldComplete(); + } + else if (iIpcType == ELtsyReqCallResume) //Resume call + { + HandleResumeComplete(); + } + else if (iIpcType == ELtsyReqCallSwap) //Swap call + { + HandleSwapComplete(); + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleHangupComplete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleHangupComplete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleHangupComplete()")); + + const TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(iCallId)); + + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed) + { + if (tCallInfo.GetCallState() == TLtsyCallInformation::EInComingCall || + tCallInfo.GetCallState() == TLtsyCallInformation::EWaitingCall ) + { + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCCallRejected, + iCallId, + RMobileCall::EStatusDisconnecting); + + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCCallRejected, + iCallId, + RMobileCall::EStatusIdle); + } + else + { + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, + iCallId, + RMobileCall::EStatusDisconnecting); + + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrGsmCCNormalCallClearing, + iCallId, + RMobileCall::EStatusIdle); + } + } + + //Call back + iCtsyDispatcherCallback.CallbackCallControlHangUpComp(KErrNone, iCallId); + //Setting all call id state unused + iPhoneGlobals.GetCallInfoManager().ResetCallInformationByCallId(iCallId); + } + + +// --------------------------------------------------------------------------- +// CATChld::HandleHoldComplete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleHoldComplete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleHoldComplete()")); + + iCtsyDispatcherCallback.CallbackCallControlHoldComp(KErrNone, iCallId); + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + iCallId, + RMobileCall::EStatusHold); + + //Notify CTSY Call id Idel + for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++) + { + TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n)); + if (n == iCallId) + { + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed) + { + //Setting my call state active + tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall); + } + } + else + { + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed) + { + //Setting my call state active + tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall); + + //Notify CTSY call state change + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + n, + RMobileCall::EStatusConnected); + } + } + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleResumeComplete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleResumeComplete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleResumeComplete()")); + + iCtsyDispatcherCallback.CallbackCallControlResumeComp(KErrNone, iCallId); + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + iCallId, + RMobileCall::EStatusConnected); + + //Notify CTSY Call id Idel + for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++) + { + TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n)); + if (n == iCallId) + { + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed) + { + //Setting my call state active + tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall); + } + } + else + { + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed) + { + //Setting my call state active + tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall); + + //Notify CTSY call state change + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + n, + RMobileCall::EStatusHold); + } + } + } + } + +// --------------------------------------------------------------------------- +// CATChld::HandleSwapComplete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::HandleSwapComplete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::HandleSwapComplete()")); + + iCtsyDispatcherCallback.CallbackCallControlSwapComp(KErrNone); + + //One call or two calls situation + for (TInt n = KLtsyMinCallId; n <= KLtsyMaxCallId; n++) + { + TLtsyCallInformation& tCallInfo(iPhoneGlobals.GetCallInfoManager().GetCallInformationByCallId(n)); + + if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed && + tCallInfo.GetCallState() == TLtsyCallInformation::EActiveCall) + { + tCallInfo.SetCallState(TLtsyCallInformation::EHeldCall); + //Notify CTSY call state change + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + n, + RMobileCall::EStatusHold); + } + else if (tCallInfo.GetCallIdIsUsedInfo() == TLtsyCallInformation::EUsed && + ((tCallInfo.GetCallState() == TLtsyCallInformation::EHeldCall) || + (tCallInfo.GetCallState() == TLtsyCallInformation::EWaitingCall) || + (tCallInfo.GetCallState() == TLtsyCallInformation::EInComingCall))) //???? + { + tCallInfo.SetCallState(TLtsyCallInformation::EActiveCall); + //Notify CTSY call state change + iCtsyDispatcherCallback.CallbackCallControlNotifyCallStatusChangeInd(KErrNone, + n, + RMobileCall::EStatusConnected); + } + } + } + +// --------------------------------------------------------------------------- +// CATChld::Complete +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::Complete() + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::Complete()")); + + //Check Hang up arrray + if ((iIpcType == ELtsyReqCallHangup) && iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().IsHaveRecords()) + { + InitVariable(); + + TATHanupCommandInfo tHangupInfo; + iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().GetFirstHangupCommandInfoAndRemoveIt(tHangupInfo); + + //Set hang up info + SetCallId(tHangupInfo.iCallId); + SetHangupCase(tHangupInfo.iHangupCause); + SetIpcType(CATChld::ELtsyReqCallHangup); + SetChldType(CATChld::ERleaseSpecificCall); + StartRequest(); + return; + } + + //Invoke base class complete + CAtCommandBase::Complete(); + + //Set hang up active + iPhoneGlobals.GetCallInfoManager().GetHangupCommandRecords().SetHangupActiveFlag(EFalse); + + //Let other command can use I/O port + iPhoneGlobals.iEventSignalActive = EFalse; + } + +// --------------------------------------------------------------------------- +// CATChld::EventSignal +// other items were commented in a header +// --------------------------------------------------------------------------- +void CATChld::EventSignal(TAtEventSource aEventSource, TInt aStatus) + { + LOGTEXT(_L8("[Ltsy CallControl] Starting CATChld::EventSignal()")); + if(aEventSource == EReadCompletion) + { + LOGTEXT(_L8("[Ltsy CallControl] The EventSource = EReadCompletion")); + } + else if(aEventSource == EWriteCompletion) + { + LOGTEXT(_L8("[Ltsy CallControl] The EventSource = EWriteCompletion")); + } + else if(aEventSource == ETimeoutCompletion) + { + LOGTEXT(_L8("[Ltsy CallControl] The EventSource = ETimeoutCompletion")); + } + else + { + LOGTEXT(_L8("[Ltsy CallControl] The EventSource = Unknown")); + } + + LOGTEXT2(_L8("[Ltsy CallControl]aStatus = %d"),aStatus); + + iIOStatus = aStatus; + + if (iIOStatus != KErrNone) + { + HandleIOError(); + Complete(); + return; + } + + switch (iATStep) + { + case EATWaitForWriteComplete: + iATStep = EATReadComplete; + break; + + case EATReadComplete: + ClearCurrentLine(); + if (iATResult == KErrNone) + { + HandleCHLDComplete(); + } + else + { + HandleResponseError(); + } + Complete(); + break; + + default: + break; + } + } + +//End of file