bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallactive.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallactive.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2005 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:  General Active Object offering asynchronous service
+*
+*/
+
+
+#include "btmccallactive.h"
+#include "debug.h"
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::NewL
+// -----------------------------------------------------------------------------
+CBtmcCallActive* CBtmcCallActive::NewL(
+    MBtmcActiveObserver& aObserver, 
+    CActive::TPriority aPriority,
+    TInt aServiceId,
+    RMobileLine& aLine,
+    const TName& aName)
+    {
+    CBtmcCallActive* self = CBtmcCallActive::NewLC(aObserver, aPriority, aServiceId, aLine, aName);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::NewLC
+// -----------------------------------------------------------------------------
+CBtmcCallActive* CBtmcCallActive::NewLC(
+    MBtmcActiveObserver& aObserver, 
+    CActive::TPriority aPriority, 
+    TInt aServiceId,
+    RMobileLine& aLine,
+    const TName& aName)
+    {
+    CBtmcCallActive* self = new (ELeave) CBtmcCallActive(aObserver, aPriority, aServiceId, aLine, aName);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::~CBtmcCallActive
+// -----------------------------------------------------------------------------
+CBtmcCallActive::~CBtmcCallActive()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    iCall.Close();
+    TRACE_FUNC_EXIT
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcCallActive::GoActive
+// -------------------------------------------------------------------------------
+void CBtmcCallActive::GoActive()
+    {
+    TRACE_ASSERT(!IsActive(), KErrGeneral);
+    iCall.NotifyMobileCallStatusChange(iStatus, iCallStatus);
+    SetActive();
+    TRACE_FUNC
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::CallName
+//
+// Gets call name.
+// -----------------------------------------------------------------------------
+//
+const TDesC& CBtmcCallActive::CallName() const
+    {
+    return iName;
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::RemotePartyNumber
+//
+// Get caller's phone number.
+// -----------------------------------------------------------------------------
+//
+const TDesC& CBtmcCallActive::RemotePartyNumber() const
+    {
+    return iRemoteNumber;
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::CallStatus
+//
+// -----------------------------------------------------------------------------
+//
+RMobileCall::TMobileCallStatus CBtmcCallActive::CallStatus() const
+    {
+    return iCallStatus;
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcCallActive::RunL
+// -------------------------------------------------------------------------------
+void CBtmcCallActive::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_INFO((_L("ao status %d"), iStatus.Int()))
+    TRACE_INFO((_L("name '%S' new status %d, old status %d"), &iName, iCallStatus, iPrevCallStatus))
+    
+    if(iCallStatus != iPrevCallStatus)
+        {
+        iPrevCallStatus = iCallStatus;
+    	if( iCallStatus != RMobileCall::EStatusIdle &&
+    		!iEmergency )
+    		{
+    		RMobileCall::TMobileCallInfoV1 myInfo;
+    		GetCallInfo( myInfo );
+    		if ( myInfo.iValid & RMobileCall::KCallEmergency &&
+    			 myInfo.iEmergency )
+    			{
+    			TRACE_INFO((_L("Emergency call object detected")))
+            	iEmergency = ETrue;
+            	}
+    		}
+
+        Observer().RequestCompletedL(*this, iStatus.Int());
+        }
+    else if( iCallStatus == RMobileCall::EStatusIdle )
+        {
+        Observer().RequestCompletedL(*this, iStatus.Int());    
+        }
+    else
+        {
+        GoActive();
+        }
+        
+    TRACE_FUNC_EXIT
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcCallActive::DoCancel
+// -------------------------------------------------------------------------------
+void CBtmcCallActive::DoCancel()
+    {
+    iCall.CancelAsyncRequest(EMobileCallNotifyMobileCallStatusChange);
+    TRACE_FUNC
+    }
+
+// -------------------------------------------------------------------------------
+// CBtmcCallActive::RunError
+// -------------------------------------------------------------------------------
+TInt CBtmcCallActive::RunError(TInt /*aErr*/)
+    {
+    Cancel();
+    iCall.Close();
+    TRACE_FUNC
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CBtmcCallActive::CBtmcCallActive
+// -----------------------------------------------------------------------------
+CBtmcCallActive::CBtmcCallActive(
+    MBtmcActiveObserver& aObserver,
+    CActive::TPriority aPriority,
+    TInt aServiceId,
+    RMobileLine& aLine,
+    const TName& aName)
+    : CBtmcActive(aObserver, aPriority, aServiceId), iLine(aLine)
+    {
+    iName.Copy(aName);
+    }
+
+void CBtmcCallActive::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    LEAVE_IF_ERROR(iCall.OpenExistingCall(iLine, iName))
+    LEAVE_IF_ERROR(iCall.GetMobileCallStatus(iCallStatus))
+    iPrevCallStatus = iCallStatus;
+    TRACE_INFO((_L("name '%S' status %d"), &iName, iCallStatus))
+
+    RMobileCall::TMobileCallInfoV1 info;
+    RMobileCall::TMobileCallInfoV1Pckg package(info);
+    LEAVE_IF_ERROR(iCall.GetMobileCallInfo(package))
+    iCall.GetMobileCallInfo(package);
+    if ((info.iValid & RMobileCall::KCallRemoteParty) && 
+        info.iRemoteParty.iRemoteIdStatus == RMobileCall::ERemoteIdentityAvailable)
+        {
+        iRemoteNumber.Copy(info.iRemoteParty.iRemoteNumber.iTelNumber);
+        }
+	else if (info.iValid & RMobileCall::KCallDialledParty)
+		{
+		//number for outgoing call
+		iRemoteNumber.Copy(info.iDialledParty.iTelNumber);
+		}
+
+    TRACE_INFO((_L("remote party '%S' "), &iRemoteNumber))
+ 
+    TRACE_FUNC_EXIT
+    }
+
+// -----------------------------------------------------------------------------
+// CBTMonoCallActive::GetCallInfo
+// -----------------------------------------------------------------------------
+void CBtmcCallActive::GetCallInfo(RMobileCall::TMobileCallInfoV1& info)
+    {
+    RMobileCall::TMobileCallInfoV1Pckg package(info);
+    iCall.GetMobileCallInfo(package);
+    }
+
+// -----------------------------------------------------------------------------
+// CBTMonoCallActive::IsEmergencyCall
+// -----------------------------------------------------------------------------
+TBool CBtmcCallActive::IsEmergencyCall() const
+		{
+		return iEmergency;
+		}
+
+// End of File