telephonyserverplugins/simtsy/src/CSimVoiceLine.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "CSimPhone.h"
       
    17 #include "CSimVoiceCall.h"
       
    18 #include "Simlog.h"
       
    19 #include "et_struct.h"
       
    20 
       
    21 _LIT(KCommonCallName,"VoiceCall%d");	// < Voice call name template.
       
    22 const TInt KVoiceCallGranularity=2;		// < Granularity of voice call list array.
       
    23 
       
    24 /**
       
    25 * @file
       
    26 *
       
    27 * This file contains the implementation of the Similator TSY Voice line functionality.  
       
    28 * The line classes process the line-based requests made by ETel clients 
       
    29 * and passed down to the TSY by the ETel Server.
       
    30 */
       
    31 
       
    32 CSimVoiceLine* CSimVoiceLine::NewL(CSimPhone* aPhone,const TDesC& aName)
       
    33 /**
       
    34 * Standard two phase constructor.
       
    35 *
       
    36 * @param aPhone pointer to the phone object.
       
    37 * @param aName name of the line to be constructed
       
    38 * @return CSimVoiceLine  pointer to the voice line object created
       
    39 * @leave Leaves if no memory or object is not created for any reason
       
    40 */
       
    41 	{
       
    42 	CSimVoiceLine* voiceLine=new(ELeave) CSimVoiceLine(aPhone);
       
    43 	TCleanupItem newLineVoiceClose(CloseLine,voiceLine);
       
    44 	CleanupStack::PushL(newLineVoiceClose);
       
    45 	voiceLine->ConstructL(aName);
       
    46 	CleanupStack::Pop();
       
    47 	return voiceLine;
       
    48 	}
       
    49 
       
    50 CSimVoiceLine::CSimVoiceLine(CSimPhone* aPhone)
       
    51 	:CSimLine(aPhone)
       
    52 /**
       
    53 *	Trivial constructor. Calls CSimLine to initialise its members
       
    54 */
       
    55 	{
       
    56 	iICProperty.iCategory = KUidPSSimTsyCategory;
       
    57 	iICProperty.iKey = KPSSimTsyIncomingVoiceCall;
       
    58 	iICProperty.iType = KPSSimTsyIncomingVoiceCallKeyType;
       
    59 
       
    60 	iRHProperty.iCategory = KUidPSSimTsyCategory;
       
    61 	iRHProperty.iKey = KPSSimTsyRemoteHangup;
       
    62 	iRHProperty.iType = KPSSimTsyRemoteHangupKeyType;
       
    63 	}
       
    64 
       
    65 void CSimVoiceLine::ConstructL(const TName& aName)
       
    66 /**
       
    67 * Pre-allocate a pool of voice calls and allocate one to be the default to
       
    68 * contain information about an incoming call.
       
    69 *
       
    70 * @param aName name of the voice line to be constructed
       
    71 */
       
    72 	{
       
    73 	iCaps=Caps();
       
    74 	CSimLine::ConstructL(aName);
       
    75 	iCalls=new(ELeave) CArrayFixFlat<CSimCall*>(KVoiceCallGranularity);
       
    76 	TName callName;
       
    77 	iSpareCall=CreateNewCallL(callName,ECallTypeSpareCall);
       
    78 	iAnswerNextIncomingCall=iSpareCall;
       
    79 	}
       
    80 
       
    81 CSimVoiceLine::~CSimVoiceLine()
       
    82 /**
       
    83 * Destroy the spare call - all the others will be closed by the client (or server).
       
    84 */
       
    85 	{
       
    86 	if ((iAnswerNextIncomingCall!=iSpareCall) && (iAnswerNextIncomingCall))
       
    87 		{
       
    88 		iAnswerNextIncomingCall->Close();
       
    89 		}
       
    90 	if(iSpareCall)
       
    91 		{
       
    92 		iSpareCall->Close();
       
    93 		}
       
    94 	if(iCalls)
       
    95 		{
       
    96 		iCalls->Delete(0,iCalls->Count());
       
    97 		delete iCalls;
       
    98 		}
       
    99 	}
       
   100 
       
   101 CTelObject* CSimVoiceLine::OpenNewObjectByNameL(const TDesC& aName)
       
   102 /**
       
   103 * Opens a voice call by name. 
       
   104 * This will be called if the user opens a pre-alloc'ed call by name.
       
   105 *
       
   106 * @param aName name of call to be opened
       
   107 * @return CTelObject pointer to the object opened by name
       
   108 * @leave Leaves if name given does not match the required name
       
   109 */
       
   110 	{
       
   111 	LOGVOICE1(">>CSimVoiceLine::OpenNewObjectByNameL");
       
   112 	TInt i;
       
   113 	TInt count=iCalls->Count();
       
   114 
       
   115 	for(i=0;i<count;i++)
       
   116 		{
       
   117 		LOGVOICE2(">>CSimVoiceLine::OpenNewObjectByNameL %s",&(iCalls->At(i)->iName));
       
   118 		if(iCalls->At(i)->iName.MatchF(aName)==0)
       
   119 			{
       
   120 			iCalls->At(i)->Open();			
       
   121 			return iCalls->At(i);
       
   122 			}
       
   123 		}
       
   124 
       
   125 	LOGVOICE1("<<CSimVoiceLine::OpenNewObjectByNameL");
       
   126 	User::Leave(KErrNotFound);
       
   127 	return NULL;
       
   128 	}
       
   129 
       
   130 CTelObject* CSimVoiceLine::OpenNewObjectL(TDes& aNewName)
       
   131 /**
       
   132 * Open a voice call and return a name. 
       
   133 * This function creates a new call object and returns its pointer.
       
   134 *
       
   135 * @param aNewName name of call to be opened
       
   136 * @return CTelObject pointer to the object allocated
       
   137 * @leave Leaves if no memory available
       
   138 */
       
   139 	{
       
   140 	return CreateNewCallL(aNewName,ECallTypeNormalCall);
       
   141 	}
       
   142 
       
   143 CSimCall* CSimVoiceLine::CreateNewCallL(TDes& aNewName,TCallType aCallType)
       
   144 	{
       
   145 	aNewName.Format(KCommonCallName,iCallCnt++);
       
   146 	CSimVoiceCall* newCall=CSimVoiceCall::NewL(this,aNewName,iPhone);	
       
   147 	CleanupStack::PushL(newCall);
       
   148 	iCalls->AppendL(newCall);
       
   149 	if(aCallType!=ECallTypeSpareCall)
       
   150 		{
       
   151 		HandleNewCallAddedNotification(aNewName);
       
   152 		}
       
   153 	LOGVOICE2(">>CSimVoiceLine::CreateNewCallL 0x%08x",newCall);
       
   154 	CleanupStack::Pop(newCall);
       
   155 	return newCall;
       
   156 	}
       
   157 
       
   158 TInt CSimVoiceLine::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage)
       
   159 /**
       
   160 * ExtFunc is called by the server when it has a "extended", i.e. non-core ETel request 
       
   161 * for the TSY to process
       
   162 * A request handle, request type and request data are passed to the TSY
       
   163 *
       
   164 * @param aTsyReqHandle
       
   165 * @param aIpc IPc number representing the request
       
   166 * @param aPackage data for the request
       
   167 * @return KErrNone
       
   168 */
       
   169 	{
       
   170 
       
   171 	TAny* dataPtr=aPackage.Ptr1();
       
   172 
       
   173 	// The request data has to extracted from TDataPackage and the TAny* pointers have to
       
   174 	// be "cast" to the expected request data type
       
   175 
       
   176 	switch (aIpc)
       
   177 		{
       
   178 //
       
   179 // No Flow Control OR Multiple Completion
       
   180 //
       
   181 	case EMobileLineGetMobileLineStatus:
       
   182 		return GetMobileLineStatus(aTsyReqHandle,
       
   183 			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*,dataPtr));
       
   184 
       
   185 //
       
   186 // Multiple Completion Services with Immediate Server Repost
       
   187 // (Usually Notifications)
       
   188 //
       
   189 	case EMobileLineNotifyMobileLineStatusChange:
       
   190 		return NotifyMobileLineStatusChange(aTsyReqHandle,
       
   191 			REINTERPRET_CAST(RMobileCall::TMobileCallStatus*, dataPtr));
       
   192 
       
   193 	default:
       
   194 		return KErrNotSupported;
       
   195 		}
       
   196 	}
       
   197 
       
   198 TInt CSimVoiceLine::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
       
   199 /**
       
   200  * Cancel an outstanding request.
       
   201  * @param aIpc The IPC number of the request that must be cancelled.  Note: this is not the
       
   202  *             IPC number of the cancel request itself.
       
   203  * @param aTsyReqHandle The TSY Request Handle of the request to be cancelled.
       
   204  */
       
   205 	{
       
   206 	switch(aIpc)
       
   207 		{
       
   208 	case EEtelLineNotifyStatusChange:
       
   209 		// Always returns KErrNone
       
   210 		(void)NotifyStatusChangeCancel(aTsyReqHandle);
       
   211 		return KErrNone;
       
   212 
       
   213 	case EEtelLineNotifyIncomingCall:
       
   214 		// Always returns KErrNone
       
   215 		(void)NotifyIncomingCallCancel(aTsyReqHandle);
       
   216 		return KErrNone;
       
   217 
       
   218 	case EEtelLineNotifyHookChange:
       
   219 		// Always returns KErrNone
       
   220 		(void)NotifyHookChangeCancel(aTsyReqHandle);
       
   221 		return KErrNone;
       
   222 
       
   223 	case EEtelLineNotifyCallAdded:
       
   224 		// Always returns KErrNone
       
   225 		(void)NotifyCallAddedCancel(aTsyReqHandle);
       
   226 		return KErrNone;
       
   227 
       
   228 	case EMobileLineNotifyMobileLineStatusChange:
       
   229 		// Always returns KErrNone
       
   230 		(void)NotifyMobileLineStatusChangeCancel(aTsyReqHandle);
       
   231 		return KErrNone;
       
   232 
       
   233 	default:
       
   234 		break;
       
   235 		}
       
   236 
       
   237 	return CLineBase::CancelService(aIpc,aTsyReqHandle);
       
   238 	}
       
   239 
       
   240 TInt CSimVoiceLine::EnumerateCall(const TTsyReqHandle aTsyReqHandle,TInt* aParams)
       
   241 /**
       
   242 * Count and return the number of voice calls used.
       
   243 *
       
   244 * @param aTsyReqHandle
       
   245 * @return KErrNone
       
   246 * @param aParams pointer to the number of calls used
       
   247 */
       
   248 	{
       
   249 	*aParams=iCalls->Count();
       
   250 	ReqCompleted(aTsyReqHandle,KErrNone);
       
   251 	return KErrNone;
       
   252 	}
       
   253 
       
   254 TInt CSimVoiceLine::GetCallInfo(const TTsyReqHandle aTsyReqHandle,TCallInfoIndex* aCallInfoIndex)
       
   255 /**
       
   256 * Retrieve the Call Information relevant to the numbered call.
       
   257 * Returns the name, the current call status and the call capabilities
       
   258 * TCallInfoIndex specifies which call info is requested.
       
   259 *
       
   260 * @param aTsyReqHandle
       
   261 * @param aCallInfoIndex pointer to the call info
       
   262 * @return KErrNone
       
   263 */
       
   264 	{
       
   265 	TInt& i=aCallInfoIndex->iIndex;
       
   266 	aCallInfoIndex->iInfo.iCallName.Copy(iCalls->At(i)->iName);
       
   267 	aCallInfoIndex->iInfo.iStatus=(RCall::TStatus)iCalls->At(i)->iState;
       
   268 	aCallInfoIndex->iInfo.iCallCapsFlags=iCalls->At(i)->Caps();
       
   269 	ReqCompleted(aTsyReqHandle,KErrNone);
       
   270 	return KErrNone;
       
   271 	}
       
   272 
       
   273 TInt CSimVoiceLine::FindActiveVoiceCall(CSimVoiceCall*& aCall)
       
   274 /**
       
   275  * Find an active voice call.  Return KErrNotFound if no voice calls active.
       
   276  * @param aCall		Pointer to active voice call.
       
   277  * @return TInt		Standard return error.
       
   278  */
       
   279 	{
       
   280 	TInt i;
       
   281 	for(i=0;i<iCalls->Count();i++)
       
   282 		{
       
   283 		if(iCalls->At(i)->iState==RMobileCall::EStatusConnected)
       
   284 			{
       
   285 			aCall=(CSimVoiceCall*)iCalls->At(i);
       
   286 			return KErrNone;
       
   287 			}
       
   288 		}
       
   289 	return KErrNotFound;
       
   290 	}
       
   291 
       
   292 TInt CSimVoiceLine::FindActiveCall(CSimCall*& aCall)
       
   293 /**
       
   294  * Find an active voice call.  Return KErrNotFound if no voice calls active.
       
   295  * @param aCall		Pointer to active voice call.
       
   296  * @return TInt		Standard return error.
       
   297  */
       
   298 	{
       
   299 	TInt i;
       
   300 	for(i=0;i<iCalls->Count();i++)
       
   301 		{
       
   302 		if(iCalls->At(i)->iState==RMobileCall::EStatusConnected)
       
   303 			{
       
   304 			aCall=(CSimVoiceCall*)iCalls->At(i);
       
   305 			return KErrNone;
       
   306 			}
       
   307 		}
       
   308 	return KErrNotFound;
       
   309 	}
       
   310 
       
   311 TUint CSimVoiceLine::Caps()
       
   312 /**
       
   313  * Return the current capabilities of this line.
       
   314  * @return TUint	Current line capabilities.
       
   315  */
       
   316 	{
       
   317 	TUint caps=RLine::KCapsVoice;
       
   318 	if(iState==RMobileCall::EStatusIdle)
       
   319 		caps|=RLine::KCapsEventIncomingCall;
       
   320 	return caps;
       
   321 	}