telephonyserverplugins/simtsy/src/CSimPhoneUSimApp.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/simtsy/src/CSimPhoneUSimApp.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,702 @@
+// Copyright (c) 2002-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:
+// Implements the Phone USim applications' manipulation code.
+// 
+//
+
+/**
+ @file
+*/
+
+#include "CSimPhone.h"
+#include "Simlog.h"
+#include <testconfigfileparser.h>
+
+/**
+Standard factory method for two phase construction of a USim
+applications object.  The USim applications object simulates the
+possible operations for manipulating applications residing on the UICC.
+
+@param aPhone The phone object from which the Phone USim
+              applications was opened.
+@return A pointer to a new USim applications object.
+*/
+CSimPhoneUSimApp* CSimPhoneUSimApp::NewL(CSimPhone* aPhone)
+	{
+	CSimPhoneUSimApp* obj=new(ELeave) CSimPhoneUSimApp(aPhone);
+	CleanupStack::PushL(obj);
+	obj->ConstructL();
+	CleanupStack::Pop();
+	return obj;
+	}
+
+/**
+Trivial first phase constructor.
+
+@param aPhone The phone object from which this Phone USimApp was opened.
+*/
+CSimPhoneUSimApp::CSimPhoneUSimApp(CSimPhone* aPhone)
+: iPhone(aPhone), iCurrentSelection(RMobilePhone::EUSimSelectionAutomatic),
+	iFoundUSimAppTags(EFalse)
+/**
+ * Trivial first phase constructor.
+ * @param aPhone	The phone object from which this Phone USimApp was opened.
+ */
+	{}
+
+void CSimPhoneUSimApp::Init()
+	{
+	}
+
+/**
+Second phase constructor for allocating memory to the USim applications
+specified in the SimTsy configuration file.
+*/
+void CSimPhoneUSimApp::ConstructL()
+	{
+	LOGPHONE1("Starting to parse PhoneUSim applications additional config parameters...");
+	
+	const CTestConfigItem* item=NULL;
+	TInt ret=KErrNone;
+	TInt i;
+	TPtrC8 aid, label;
+	RMobilePhone::TUSimApplicationInfoV2 appInfo;
+
+	TRAP_IGNORE(iTimer=CSimTimer::NewL(iPhone));
+	iUSimAppInfo=new(ELeave) CArrayFixFlat<RMobilePhone::TUSimApplicationInfoV2>(KMaxUSimApps+1);
+	TInt count=CfgFile()->ItemCount(KUSIMAppInfo);
+	
+	LOGPHONE1("Starting to Load and Parse USim Application Info");
+
+	for(i=0;i<count;i++)
+		{
+		item=CfgFile()->Item(KUSIMAppInfo,i);
+		if(!item)
+			break;
+		
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0, aid);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("aid",ret,0,&KUSIMAppInfo);
+			continue;
+			}
+		else
+			{
+			appInfo.iAID.Copy(aid);
+			if(i==0)
+				iActiveAID.Copy(aid);
+			}
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1, label);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("label",ret,1,&KUSIMAppInfo);
+			continue;
+			}
+		else 
+			appInfo.iLabel.Copy(label);
+
+		iUSimAppInfo->AppendL(appInfo);
+		iFoundUSimAppTags = ETrue;
+		}
+	
+	iUSimAppEventList=new(ELeave) CArrayFixFlat<TUSimAppEvent>(10);
+	TUSimAppEvent appEvent;
+	TInt duration;
+
+	count=CfgFile()->ItemCount(KUSIMAppSwitching);
+	
+	LOGPHONE1("Starting to Load and Parse USim Application Info");
+
+	for(i=0;i<count;i++)
+		{
+		item=CfgFile()->Item(KUSIMAppSwitching,i);
+		if(!item)
+			break;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,0, duration);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("duration",ret,0,&KUSIMAppSwitching);
+			continue;
+			}
+		else
+			appEvent.iDuration=duration;
+
+		ret=CTestConfig::GetElement(item->Value(),KStdDelimiter,1, aid);
+		if(ret!=KErrNone)
+			{
+			LOGPARSERR("aid",ret,1,&KUSIMAppSwitching);
+			continue;
+			}
+		else 
+			appEvent.iAid.Copy(aid);
+
+		iUSimAppEventList->AppendL(appEvent);
+		}
+	}
+
+/**
+Standard destructor.  Any objects created by the ::ConstructL() function
+will be destroyed here.
+*/
+CSimPhoneUSimApp::~CSimPhoneUSimApp()
+	{
+	delete iTimer;
+	if(iUSimAppEventList)
+		{
+		iUSimAppEventList->Delete(0, iUSimAppEventList->Count());
+		delete iUSimAppEventList;
+		}
+	if(iUSimAppInfo)
+		{
+		iUSimAppInfo->Delete(0, iUSimAppInfo->Count());
+		delete iUSimAppInfo;
+		}
+	}
+
+/**
+Dispatch function for all USim application requests.
+
+@param aReqHandle The TSY request handle for this request.
+@param aIpc The IPC number of this request.
+@param aPckg The parameter packaged data related to this request.
+@return A system wide error code indicating the status of the request.
+*/
+TInt CSimPhoneUSimApp::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc, const TDataPackage& aPckg)
+	{
+	TAny* dataPtr = aPckg.Ptr1();
+	TAny* dataPtr2 = aPckg.Ptr2();
+
+// The following requests can be completed even if the completion of another request is pending.
+	switch(aIpc)
+		{
+
+	case EMobilePhoneEnumerateUSimApplications:
+		return EnumerateUSimApplications(aTsyReqHandle, 
+			reinterpret_cast<TInt*> (dataPtr),
+			reinterpret_cast<RMobilePhone::TAID*> (dataPtr2));
+
+	case EMobilePhoneSetUSimApplicationStatus:
+		return SetUSimApplicationStatus(aTsyReqHandle,
+			reinterpret_cast<RMobilePhone::TAID*> (dataPtr),
+			reinterpret_cast<RMobilePhone::TUSimAppAction*> (dataPtr2));
+
+	case EMobilePhoneGetUSimApplicationsInfo:
+		return GetUSimApplicationInfo(aTsyReqHandle, 
+			reinterpret_cast<TInt*> (dataPtr),
+			aPckg.Des2n());
+
+	case EMobilePhoneNotifyUSimApplicationsInfoChange:
+		return NotifyUSimApplicationsInfoChange(aTsyReqHandle, 
+			reinterpret_cast<TInt*> (dataPtr),
+			reinterpret_cast<RMobilePhone::TAID*> (dataPtr2));
+
+	case EMobilePhoneGetUSimAppsSelectionMode:
+		return GetUSimAppsSelectionMode(aTsyReqHandle,
+			reinterpret_cast<RMobilePhone::TUSimSelectionMode*> (dataPtr));
+
+	case EMobilePhoneSetUSimAppsSelectionMode:
+		return SetUSimAppsSelectionMode(aTsyReqHandle,
+			reinterpret_cast<RMobilePhone::TUSimSelectionMode*> (dataPtr));
+
+	case EMobilePhoneNotifyUSimAppsSelectionModeChange:
+		return NotifyUSIMAppsSelectionModeChange(aTsyReqHandle, 
+			reinterpret_cast<RMobilePhone::TUSimSelectionMode*> (dataPtr));
+
+	default:
+		break;
+		}
+	return KErrNotSupported;
+	}
+
+/**
+The API does not support any objects that could be opened from this one.
+*/
+CTelObject* CSimPhoneUSimApp::OpenNewObjectByNameL(const TDesC& /*aName*/)
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+/**
+The API does not support any objects that could be opened from this one.
+*/
+CTelObject* CSimPhoneUSimApp::OpenNewObjectL(TDes&)
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+/**
+This function returns the Request Mode for the request with the passed
+IPC value.
+
+@param aIpc The IPC number of the request.
+@return TReqMode The request mode.
+*/
+CTelObject::TReqMode CSimPhoneUSimApp::ReqModeL(const TInt aIpc)
+	{
+	CTelObject::TReqMode ret=0;	
+
+	switch(aIpc)
+		{
+	case EMobilePhoneEnumerateUSimApplications:
+	case EMobilePhoneSetUSimApplicationStatus:
+	case EMobilePhoneGetUSimApplicationsInfo:
+	case EMobilePhoneGetUSimAppsSelectionMode:
+	case EMobilePhoneSetUSimAppsSelectionMode:
+		break;
+
+	case EMobilePhoneNotifyUSimAppsSelectionModeChange:
+	case EMobilePhoneNotifyUSimApplicationsInfoChange:
+		ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+		break;
+
+	default:
+		User::Leave(KErrNotSupported);
+		break;
+		}
+
+	return ret;
+	}
+
+/**
+The ETel Server calls this function when the first client makes a notification
+request.  If supported by the underlying protocol controlling the
+signalling stack, this can be used to start requesting updates for the relevant
+service.
+*/
+TInt CSimPhoneUSimApp::RegisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+/**
+The ETel Server calls this function when the last client that had previously
+made a notification request closes its ETel Server handle.  If supported by
+the underlying protocol controlling the	signalling stack, this can be used
+to stop requesting updates for the relevant service.
+*/
+TInt CSimPhoneUSimApp::DeregisterNotification(const TInt /*aIpc*/)
+	{
+	return KErrNone;
+	}
+
+/**
+Return the number of slots that the ETel Server should allocate for
+buffering requests of the given IPC number.
+*/
+TInt CSimPhoneUSimApp::NumberOfSlotsL(const TInt aIpc)
+	{
+	switch(aIpc)
+		{
+	case EMobilePhoneNotifyUSimAppsSelectionModeChange:
+	case EMobilePhoneNotifyUSimApplicationsInfoChange:
+		return KDefaultNumberOfSlots;
+
+	default:
+		LOGPHONE1("CSimPhoneUSimApp: Number of Slots error, unknown IPC");
+		User::Leave(KErrNotSupported);
+		break;
+		}
+	return KDefaultNumberOfSlots;
+	}
+
+/**
+Cancels an outstanding client request.
+
+@param aIpc The IPC number of the request that is to be cancelled.
+@param aTsyReqHandle The TSY request handle of the request that is to
+                     be cancelled.
+@return A system wide error code indicating the status of the request
+        on cancellation.
+*/
+TInt CSimPhoneUSimApp::CancelService(const TInt aIpc,const TTsyReqHandle aTsyReqHandle)
+	{
+	switch(aIpc)
+		{
+	case EMobilePhoneEnumerateUSimApplications:
+		return EnumerateUSimApplicationsCancel(aTsyReqHandle);
+
+	case EMobilePhoneSetUSimApplicationStatus:
+		return SetUSimApplicationStatusCancel(aTsyReqHandle);
+	
+	case EMobilePhoneGetUSimApplicationsInfo:
+		return GetUSimApplicationInfoCancel(aTsyReqHandle);
+
+	case EMobilePhoneNotifyUSimApplicationsInfoChange:
+		return NotifyUSimApplicationsInfoChangeCancel(aTsyReqHandle);
+	
+	case EMobilePhoneNotifyUSimAppsSelectionModeChange:
+		return NotifyUSIMAppsSelectionModeChangeCancel(aTsyReqHandle);
+
+	default:
+		break;
+		}
+	return KErrNone;
+	}
+
+/**
+Returns a pointer to the SimTsy configuration file section.
+
+@return A CTestConfigSection pointer, which contains a section of the
+        parsed information in the config file.
+*/
+const CTestConfigSection* CSimPhoneUSimApp::CfgFile()
+	{
+	LOGPHONE1(">>CSimPhoneUSimApp::CfgFile");
+	return iPhone->CfgFile();
+	}
+
+/**
+Timer callback function.  When the timer's delay ends, it will call
+back into this function for completion of the pending request.
+Currently, this call back is only used to complete a notify info change
+request on a specific application (NotifyUSimApplicationsInfoChange).
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aId an id identifying which timer callback is being called
+*/	
+void CSimPhoneUSimApp::TimerCallBack(TInt /*aId*/)
+	{
+	if(iNotifyInfo.iNotifyPending)
+		{
+		TUSimAppEvent event=iUSimAppEventList->At(iEventPointer);
+		*(RMobilePhone::TAID*)iNotifyInfo.iNotifyData=event.iAid;
+		*((TInt*)iNotifyInfo.iNotifyDataXtra)=iUSimAppInfo->Count();
+		iActiveAID.Copy(event.iAid);
+		iNotifyInfo.iNotifyPending=EFalse;
+		iEventPointer++;
+		iPhone->ReqCompleted(iNotifyInfo.iNotifyHandle,KErrNone);
+		}
+	}
+	
+TBool CSimPhoneUSimApp::FoundUSimAppTags()
+/**
+* Returns a value to indicate whether USim App tags were found in the Config file
+*
+*/
+	{
+	return iFoundUSimAppTags;
+	}
+
+/**
+Enumerates the number of USim applications in the UICC and returns the
+AID of the active application.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aCount Returns the number of USim applications.
+@param aActiveAID Returns the AID of the currently active application.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::EnumerateUSimApplications(TTsyReqHandle aTsyReqHandle, TInt* aCount, RMobilePhone::TAID* aActiveAID)
+	{
+	*aCount=iUSimAppInfo->Count();
+	aActiveAID->Copy(iActiveAID);
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Attempts to cancel a pending EnumerateUSimApplications request
+(unsuccesfully).
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+*/
+TInt CSimPhoneUSimApp::EnumerateUSimApplicationsCancel(TTsyReqHandle aTsyReqHandle)
+	{
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Retrieves information for a specified USim application
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aUSimAppIndex Used to specify the index of the application.
+@param aInfo Returns the information of the specified appplication.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::GetUSimApplicationInfo(TTsyReqHandle aTsyReqHandle, TInt* aUSimAppIndex, TDes8* aInfo)
+	{
+	if(*aUSimAppIndex>=iUSimAppInfo->Count())
+		{
+		iPhone->ReqCompleted(aTsyReqHandle, KErrNotFound);
+		return KErrNone;
+		}
+	else
+		{
+		TPckg<RMobilePhone::TUSimApplicationInfoV2>* infoPckg = (TPckg<RMobilePhone::TUSimApplicationInfoV2>*)aInfo;
+		RMobilePhone::TUSimApplicationInfoV2& info = (*infoPckg)();
+
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion(info);
+		if(err != KErrNone)
+			{
+			iPhone->ReqCompleted(aTsyReqHandle, err);
+			return KErrNone;
+			}
+
+		info=iUSimAppInfo->At(*aUSimAppIndex);
+		iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+		}
+	
+	return KErrNone;
+	}
+
+/**
+Attempts to cancel a pending GetUSimApplicationInfo request
+(unsuccesfully).
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+*/
+TInt CSimPhoneUSimApp::GetUSimApplicationInfoCancel(TTsyReqHandle aTsyReqHandle)
+	{
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Notifies the client when the specified USim application's information
+changes.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aCount Returns the total number of USim applications when the
+              request completes.
+@param aActiveAID The application's AID whose infromation change will
+                  be notified to the client.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::NotifyUSimApplicationsInfoChange(TTsyReqHandle aTsyReqHandle, TInt* aCount, RMobilePhone::TAID* aActiveAID)
+	{
+	__ASSERT_ALWAYS(!iNotifyInfo.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+
+	TInt count=iUSimAppEventList->Count();
+
+	iNotifyInfo.iNotifyPending=ETrue;
+	iNotifyInfo.iNotifyHandle=aTsyReqHandle;
+	iNotifyInfo.iNotifyData=aActiveAID;
+	iNotifyInfo.iNotifyDataXtra=aCount;
+
+	if(iEventPointer<count)
+		{
+		if(iTimerStarted)
+			{
+			delete iTimer;
+			iTimer = NULL;
+			TRAP_IGNORE(iTimer=CSimTimer::NewL(iPhone));
+			}
+
+		TUSimAppEvent event=iUSimAppEventList->At(iEventPointer);
+
+		if (iTimer != NULL)
+			{
+			iTimer->Start(event.iDuration,this);
+			iTimerStarted = ETrue;
+			}
+		}
+
+	return KErrNone;
+	}
+
+/**
+Attempts to cancel a pending NotifyUSimApplicationsInfoChange request.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+*/
+TInt CSimPhoneUSimApp::NotifyUSimApplicationsInfoChangeCancel(TTsyReqHandle aTsyReqHandle)
+	{
+	if(iNotifyInfo.iNotifyPending)
+		{
+		iNotifyInfo.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+/**
+Sets the Selection mode for USim applications.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aUSimSelectionMode Used to specify the new selection mode for
+                          applications.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::SetUSimAppsSelectionMode(TTsyReqHandle aTsyReqHandle, RMobilePhone::TUSimSelectionMode* aUSimSelectionMode)
+	{
+	iCurrentSelection=*aUSimSelectionMode;
+	if(iNotifyMode.iNotifyPending)
+		{
+		iNotifyMode.iNotifyPending=EFalse;
+		*(RMobilePhone::TUSimSelectionMode*)iNotifyMode.iNotifyData=iCurrentSelection;
+		iPhone->ReqCompleted(iNotifyMode.iNotifyHandle,KErrNone);
+		}
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Requests the selection mode of a particular USim applications.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aUSimSelectionMode Returns the selection mode for applications.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::GetUSimAppsSelectionMode(TTsyReqHandle aTsyReqHandle, RMobilePhone::TUSimSelectionMode* aUSimSelectionMode)
+	{
+	*aUSimSelectionMode=iCurrentSelection;
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Notifies the client on a selection mode change of USim applications.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aUSimSelectionMode Returns the new selection mode for applications.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::NotifyUSIMAppsSelectionModeChange(TTsyReqHandle aTsyReqHandle, RMobilePhone::TUSimSelectionMode* aUSimSelectionMode)
+	{
+	__ASSERT_ALWAYS(!iNotifyMode.iNotifyPending,SimPanic(ENotificationReqAlreadyOutstanding));
+	iNotifyMode.iNotifyPending=ETrue;
+	iNotifyMode.iNotifyHandle=aTsyReqHandle;
+	iNotifyMode.iNotifyData=aUSimSelectionMode;
+	return KErrNone;
+	}
+
+/**
+Attempts to cancel a pending NotifyUSIMAppsSelectionModeChange request.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+*/
+TInt CSimPhoneUSimApp::NotifyUSIMAppsSelectionModeChangeCancel(TTsyReqHandle aTsyReqHandle)
+	{
+	if(iNotifyMode.iNotifyPending)
+		{
+		iNotifyMode.iNotifyPending=EFalse;
+		iPhone->ReqCompleted(aTsyReqHandle,KErrCancel);
+		return KErrNone;
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+	return KErrNone;
+	}
+
+/**
+Attempts to set the status of a specific USim application.
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@param aAID The specific application's ID whose status is to be set.
+@param aUsimAppAction The status to apply to the application identified
+                      by aAID.
+@return KErrNone on completion of request, unless the aAID given is not
+        identifiable, in which case KErrArgument is returned.
+*/
+TInt CSimPhoneUSimApp::SetUSimApplicationStatus(TTsyReqHandle aTsyReqHandle, RMobilePhone::TAID* aAID, RMobilePhone::TUSimAppAction* aUsimAppAction)
+	{
+	TInt count=iUSimAppInfo->Count();
+	for(TInt i=0;i<count;i++)
+		{
+		RMobilePhone::TUSimApplicationInfoV2 info=iUSimAppInfo->At(i);
+
+		// Check that the data structure is supported by the simulated TSY version
+		TInt err = iPhone->CheckSimTsyVersion(info);
+		if(err != KErrNone)
+			{
+			iPhone->ReqCompleted(aTsyReqHandle, err);
+			return KErrNone;
+			}
+		
+			if(info.iAID.Compare(*aAID)==0)
+				{
+				if(*aUsimAppAction==RMobilePhone::EUSimActivate)
+					{
+					iActiveAID=*aAID;
+					if(iNotifyInfo.iNotifyPending)
+						{
+						iNotifyInfo.iNotifyPending=EFalse;
+						iNotifyInfo.iNotifyData=&iActiveAID;
+						*(TInt*)iNotifyInfo.iNotifyDataXtra=iUSimAppInfo->Count();
+						iPhone->ReqCompleted(iNotifyInfo.iNotifyHandle,KErrNone);
+						}
+					iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+					return KErrNone;
+					}
+				else if((*aUsimAppAction==RMobilePhone::EUSimTerminate) &&
+						(iActiveAID.Compare(*aAID)==0))
+					{
+						//if the active is the last one
+						if(i==KMaxUSimApps-1)
+							info=iUSimAppInfo->At(0);
+						else
+							info=iUSimAppInfo->At(i+1);
+						iActiveAID=info.iAID;
+
+						if(iNotifyInfo.iNotifyPending)
+						{
+						iNotifyInfo.iNotifyPending=EFalse;
+						iNotifyInfo.iNotifyData=&iActiveAID;
+						*(TInt*)iNotifyInfo.iNotifyDataXtra=iUSimAppInfo->Count();
+						iPhone->ReqCompleted(iNotifyInfo.iNotifyHandle,KErrNone);
+						}
+					iPhone->ReqCompleted(aTsyReqHandle,KErrNone);
+					return KErrNone;
+					}
+					else if((*aUsimAppAction==RMobilePhone::EUSimTerminate) &&
+					(iActiveAID.Compare(*aAID)!=0))
+						{
+						iPhone->ReqCompleted(aTsyReqHandle,KErrArgument);
+						return KErrArgument;
+						}
+				}
+		}
+	iPhone->ReqCompleted(aTsyReqHandle,KErrNotFound);
+	return KErrNone;
+	}
+
+/**
+Attempts to cancel a pending SetUSimApplicationStatus request
+(unsuccesfully).
+
+@param aTsyReqHandle A handle belonging to the client that created the
+                     session with this TSY server.
+@return KErrNone.
+*/
+TInt CSimPhoneUSimApp::SetUSimApplicationStatusCancel(TTsyReqHandle aTsyReqHandle)
+	{
+	iPhone->ReqCompleted(aTsyReqHandle, KErrNone);
+	return KErrNone;
+	}
+
+/**
+Returns the active application's aid (internally).
+*/
+RMobilePhone::TAID CSimPhoneUSimApp::GetActiveUSim()
+	{
+	return iActiveAID;
+	}