telephonyserverplugins/multimodetsy/test/Te_Misc/Te_Misc.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:41:59 +0200
changeset 0 3553901f7fa8
permissions -rw-r--r--
Revision: 201005 Kit: 201005

// 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:
// This file contains the main methods that test the Misc
// Functionality of the MMTSY
// 
//

/**
 @file
*/

#include "Te_Misc.h"

const TInt KOneSecond=1000000;		// Used in a time out function, 1 second (in microSeconds)


/*-- Server info Test -----------------------------------------------------------------*/

CServerInfo::CServerInfo()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("ServerInfo"));
	}

TVerdict CServerInfo::doTestStepL( void )
/**
 * This function retrieves the number of phones supported by the loaded ETel Tsy
 * Modules. Also gets information associated with the phone and queries the Tsy
 * about its supported functionality.
 */
	{
	TInt numOfPhones;
	TESTL(iTelServer.EnumeratePhones(numOfPhones)==KErrNone);
	INFO_PRINTF2(_L("No. of phones supported by loaded ETel modules = %d"), numOfPhones);

	// Phone information
	RTelServer::TPhoneInfo phoneInfo;
	TEST_CHECKL(iTelServer.GetPhoneInfo(numOfPhones-1, phoneInfo),KErrNone, _L("Failed GetPhoneInfo()"));

	// Get the Network Type
	const TText* type=_S("Unknown");
	switch(phoneInfo.iNetworkType)
		{
		case RTelServer::ENetworkTypeWiredAnalog:				
			type=_S("Wired Analog Network"); break;
		case RTelServer::ENetworkTypeWiredDigital:
			type=_S("Wired Digital Network"); break;
		case RTelServer::ENetworkTypeMobileAnalog:
			type=_S("Mobile Analog Network"); break;
		case RTelServer::ENetworkTypeMobileDigital:
			type=_S("Mobile Digital Network"); break;
		default:
			type=_S("Unknown Network Type"); break;
		}

	INFO_PRINTF2(_L("Network Type : %s"), type);
	INFO_PRINTF2(_L("Phone's name : %S"), &phoneInfo.iName);
	INFO_PRINTF2(_L("No. of lines supported by the phone : %d"), phoneInfo.iNumberOfLines);
	INFO_PRINTF2(_L("Extensions supported by Tsy Module : %d"), phoneInfo.iExtensions);
	

	// Query TSY about supported functionality
	TBool result;
	TInt mixin=1; // same value used by etel\tetel\t_hyres1.cpp

	TBuf<10> tsyName;
	tsyName = KMmtsyName;

	TESTL(iTelServer.IsSupportedByModule(tsyName, mixin, result)==KErrNone);
	INFO_PRINTF1(_L("Querying TSY about supported functionality is Successful"));

	return TestStepResult();
	}




/*-- Signal And Battery Strength Test -------------------------------------------------*/

CSignalAndBatteryStrengthTest::CSignalAndBatteryStrengthTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("SignalAndBatteryStrengthTest"));
	}

TVerdict CSignalAndBatteryStrengthTest::doTestStepL( void )	
/** 
 * This method retrieves a phone's Signal and Battery Strength Information.
 */
	{
	INFO_PRINTF1(_L("Get Signal And Battery Strength Information"));

	// Test Getting Battery caps
	INFO_PRINTF1(_L("Calling RMobilePhone::GetBatteryCaps()"));
	TUint32 aCaps;
	TEST_CHECKL(iPhone.GetBatteryCaps(aCaps), KErrNone, _L("Failed RMobilePhone::GetBatteryCaps()")) ;

	//Print Capabilities
	if(aCaps & RMobilePhone::KCapsGetBatteryInfo)
		{
		INFO_PRINTF1(_L("Phone supports requests to get the current battery info"));
		}
	if(aCaps & RMobilePhone::KCapsNotifyBatteryInfoChange)
		{
		INFO_PRINTF1(_L("Phone supports requests for notification of change in battery information."));
		}


	//Test Getting Signal caps
	INFO_PRINTF1(_L("Calling RMobilePhone::GetSignalCaps()"));
	TEST_CHECKL(iPhone.GetSignalCaps(aCaps), KErrNone, _L("Failed RMobilePhone::GetSignalCaps()"));

	//Print Capabilities
	if(aCaps & RMobilePhone::KCapsGetSignalStrength)
		{
		INFO_PRINTF1(_L("Phone supports requests to get the current signal strength"));
		}
	if(aCaps & RMobilePhone::KCapsNotifySignalStrengthChange)
		{
		INFO_PRINTF1(_L("Phone supports requests for notification of change in signal strength"));
		}


	//Test Getting Battery Info
	INFO_PRINTF1(_L("Calling RMobilePhone::GetBatteryInfo()"));
	RMobilePhone::TMobilePhoneBatteryInfoV1 battery;
	iPhone.GetBatteryInfo(iStatus, battery);
	User::WaitForRequest(iStatus);
	if (iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Battery status : %d")), battery.iStatus);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Battery charge level : %d")), battery.iChargeLevel);
		}
	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Battery charge, Error %d returned.")), iStatus.Int());
		SetTestStepResult(EFail);
		}


	//Get Signal Strength
	TInt32 signalStrength;
	TInt8 bars;

	INFO_PRINTF1(_L("Calling RMobilePhone::GetSignalStrength()"));
	iPhone.GetSignalStrength(iStatus, signalStrength, bars);
	User::WaitForRequest(iStatus);
	if (iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Signal strength (in dBm) : %d")), signalStrength);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Signal strength (in display bars) : %d")), bars);
		}

	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Signal strength, Error %d returned.")), iStatus.Int());
		SetTestStepResult(EFail);
		}


	//Test Cancelling requests
	INFO_PRINTF1(_L("Performing Cancel Requests for the above functions"));

	iPhone.GetBatteryInfo(iStatus, battery);
	iPhone.CancelAsyncRequest(EMobilePhoneGetBatteryInfo);
	User::WaitForRequest(iStatus);
	INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetBatteryInfo Cancel status = %d")), iStatus.Int());
	User::After(1000000); //Wait for phone to produce response and for TSY to reject it

	iPhone.GetSignalStrength(iStatus, signalStrength, bars);
	iPhone.CancelAsyncRequest(EMobilePhoneGetSignalStrength);
	User::WaitForRequest(iStatus);
	INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetSignalStrength Cancel status = %d")), iStatus.Int());
	User::After(1000000); //Wait for phone to produce response and for TSY to reject it

	return TestStepResult();
	}


/*-- Manufacturer Info Test -----------------------------------------------------------*/
CManufacturerInfoTest::CManufacturerInfoTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("ManufacturerInfoTest"));
	}

TVerdict CManufacturerInfoTest::doTestStepL( void )	
/** 
 * This method retrieves a phone's Signal and Battery Strength Information.
 */
	{
	INFO_PRINTF1(_L("Get Manufacturer ID, Model ID, Revision ID and Serial Number"));

	//Test Getting Phone Identity Caps
	INFO_PRINTF1(_L("Calling RMobilePhone::GetIdentityCaps()"));
	TUint32 aCaps;
	TInt ret = iPhone.GetIdentityCaps(aCaps);
	if(ret) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetIdentityCaps() returned %d"), ret);
		SetTestStepResult(EFail);
		}

	if(aCaps & RMobilePhone::KCapsGetManufacturer)
		{
		INFO_PRINTF1(_L("Phone can return the identity of its manufacturer"));
		}
	if(aCaps & RMobilePhone::KCapsGetModel)
		{
		INFO_PRINTF1(_L("Phone can return the identity of its model"));
		}
	if(aCaps & RMobilePhone::KCapsGetRevision)
		{
		INFO_PRINTF1(_L("Phone can return the identity of its revision"));
		}
	if(aCaps & RMobilePhone::KCapsGetSerialNumber)
		{
		INFO_PRINTF1(_L("Phone can return the identity of its serial number"));
		}
	if(aCaps & RMobilePhone::KCapsGetSubscriberId)
		{	
		INFO_PRINTF1(_L("Phone can return the identity of its subscriber"));
		}


	INFO_PRINTF1(_L("Calling RMobilePhone::GetPhoneId()"));
	RMobilePhone::TMobilePhoneIdentityV1 phoneId;
	iPhone.GetPhoneId(iStatus, phoneId);
	User::WaitForRequest(iStatus);

	if (iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Manufacturer ID : %S")), &phoneId.iManufacturer);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Model ID : %S")), &phoneId.iModel);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Revision ID : %S")), &phoneId.iRevision);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Serial number : %S")), &phoneId.iSerialNumber);
		}
	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Error RMobilePhone::GetPhoneId() returned %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}
		
	return TestStepResult();	
	}

/*-- Subscriber ID Test -----------------------------------------------------------*/
CSubscriberIdTest::CSubscriberIdTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("SubscriberIdTest"));
	}

TVerdict CSubscriberIdTest::doTestStepL( void )	
/** 
 * This method retrieves a phone's subscriber ID
 */
	{
	INFO_PRINTF1(_L("Get Subscriber ID"));

	// Get subscriber ID test
	INFO_PRINTF1(_L("Calling RMobilePhone::GetSubscriberId()"));
	RMobilePhone::TMobilePhoneSubscriberId subId;
	iPhone.GetSubscriberId(iStatus, subId);
	User::WaitForRequest(iStatus);
	
	// Do not consider KErrNotSupported return code as a test failure
	if(iStatus==KErrNotSupported)
		{	
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else if(iStatus!=KErrNone)
		{
		// Log that and error occurred
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetSubscriberId failed with status %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}

	if(iStatus==KErrNone)
		{
		// Log the Subscriber ID returned
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("SubscriberId: %S")), &subId);
		}
							
	
	// Get subscriber ID and then cancel test
	iPhone.GetSubscriberId(iStatus, subId);
	iPhone.CancelAsyncRequest(EMobilePhoneGetSubscriberId);
	User::WaitForRequest(iStatus);
	INFO_PRINTF2(TRefByValue<const TDesC>(_L("RMobilePhone::GetSubscriberIdCancel status = %d")), iStatus.Int());

	return TestStepResult();
	}



/*-- Phone Store Test -----------------------------------------------------------------*/

CPhoneStoreTest::CPhoneStoreTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("PhoneStoreTest"));
	}

TVerdict CPhoneStoreTest::doTestStepL( void )	
/** 
 * This method retrieves various phone store information
 */	

	{
	// Get phone store info for various phonebook
	INFO_PRINTF1(_L("Test the Phone Stores"));

	//Get phone store info for IccAdnPhoneBook
	INFO_PRINTF1(_L("Calling RMobilePhone::GetPhoneStoreInfo() for KETelIccAdnPhoneBook"));
	RMobilePhoneStore::TMobilePhoneStoreInfoV1 info;
	RMobilePhoneStore::TMobilePhoneStoreInfoV1Pckg infoPckg(info);
	iPhone.GetPhoneStoreInfo(iStatus, infoPckg, KETelIccAdnPhoneBook);
	User::WaitForRequest(iStatus);

	if(iStatus==KErrNone)
		{	
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Name: %S")), &info.iName);
		TESTL(info.iType==RMobilePhoneStore::EPhoneBookStore);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of used entries: %d")), info.iUsedEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of total entries: %d")), info.iTotalEntries);
		}
	else if (iStatus==KErrNotSupported)
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else 
		{
		// Log that and error occurred
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetPhoneStoreInfo failed with status %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}

	//Get phonebook store info for MeAdnPhoneBook
	INFO_PRINTF1(_L("Calling RMobilePhone::GetPhoneStoreInfo() for KETelMeAdnPhoneBook"));
	RMobilePhoneBookStore::TMobilePhoneBookInfoV1 phbkInfo;
	RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg phbkInfoPckg(phbkInfo);
	iPhone.GetPhoneStoreInfo(iStatus, phbkInfoPckg, KETelMeAdnPhoneBook);
	User::WaitForRequest(iStatus);

	if(iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Name: %S")), &phbkInfo.iName);
		TESTL(phbkInfo.iType==RMobilePhoneStore::EPhoneBookStore);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of used entries: %d")), phbkInfo.iUsedEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of total entries: %d")), phbkInfo.iTotalEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max text length: %d")), phbkInfo.iMaxTextLength);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max number length: %d")), phbkInfo.iMaxNumLength);
		}
	else if(iStatus==KErrNotSupported)
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetPhoneStoreInfo failed with status %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}

	// Get phone store info for KETelOwnNumberStore
	INFO_PRINTF1(_L("Calling RMobilePhone::GetPhoneStoreInfo() for KETelOwnNumberStore"));
	iPhone.GetPhoneStoreInfo(iStatus, infoPckg, KETelOwnNumberStore);
	User::WaitForRequest(iStatus);

	if(iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Name: %S")), &info.iName);
		TESTL(info.iType==RMobilePhoneStore::EOwnNumberStore);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of used entries: %d")), info.iUsedEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of total entries: %d")), info.iTotalEntries);
		}
	else if(iStatus==KErrNotSupported)
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetPhoneStoreInfo failed with status %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}

	//Get own number store information
	INFO_PRINTF1(_L("Calling RMobilePhone::GetPhoneStoreInfo() for KETelOwnNumberStore..."));
	INFO_PRINTF1(_L("...but this time passing in a TMobileONStoreInfoV1Pckg"));
	RMobileONStore::TMobileONStoreInfoV1 onInfo;
	RMobileONStore::TMobileONStoreInfoV1Pckg onInfoPckg(onInfo);
	iPhone.GetPhoneStoreInfo(iStatus, onInfoPckg, KETelOwnNumberStore);
	User::WaitForRequest(iStatus);	

	if(iStatus==KErrNone)
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Name: %S")), &onInfo.iName);
		TESTL(onInfo.iType==RMobilePhoneStore::EOwnNumberStore);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of used entries: %d")), onInfo.iUsedEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of total entries: %d")), onInfo.iTotalEntries);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max text length: %d")), onInfo.iTextLen);
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max number length: %d")), onInfo.iNumberLen);
		}
	else if(iStatus==KErrNotSupported)
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else
		{
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetPhoneStoreInfo failed with status %d")), iStatus.Int());
		SetTestStepResult(EFail);
		}

	return TestStepResult();
	}


/*-- Own Number Test ------------------------------------------------------------------*/

COwnNumberTest::COwnNumberTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("OwnNumberTest"));
	}

TVerdict COwnNumberTest::doTestStepL( void )	
/** 
 * This method test own number storage
 */	
	{
	INFO_PRINTF1(_L("Own number tests"));
	
	RMobileONStore iOwnNumberStore;

	// Check that TSY supports Own Number Store
	TBool supported;
	TInt ret;
	
	ret = iTelServer.IsSupportedByModule(KMmtsyName, KETelFuncMobileOwnNumberStore, supported);

	if ((ret==KErrNone) && (supported))
		{
		// Open RMobileONStore
		ret=iOwnNumberStore.Open(iPhone);

		if (ret!=KErrNone)
			{
			INFO_PRINTF2(_L("Failed to open Own Number store (%d)"), ret);
			return EFail;
			}

		// Get Own Number Information
		RMobileONStore::TMobileONStoreInfoV1 ownNumberInfo;
		RMobileONStore::TMobileONStoreInfoV1Pckg ownNumberInfoPckg(ownNumberInfo);
	
		iOwnNumberStore.GetInfo(iStatus, ownNumberInfoPckg);
		User::WaitForRequest(iStatus);
	
		if ((iStatus==KErrNone) && (ownNumberInfo.iType==RMobilePhoneStore::EOwnNumberStore))
			{
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Name: %S")), &ownNumberInfo.iName);
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Store Caps: %d")), ownNumberInfo.iCaps);
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number of Entries: %d")), ownNumberInfo.iUsedEntries);
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Maximum no. of entries: %d")), ownNumberInfo.iTotalEntries);
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max. length of tel.no: %d")), ownNumberInfo.iNumberLen);
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Max. length of text: %d")), ownNumberInfo.iTextLen);
			}
		else if (iStatus==KErrNotSupported)
			{
			INFO_PRINTF1(TRefByValue<const TDesC>(_L("GetOwnNumberInfo not supported by this phone")));
			}
		else
			{
			INFO_PRINTF3(TRefByValue<const TDesC>(_L("GetOwnNumberInfo failed - status: %d, store type: %d")), iStatus.Int(), ownNumberInfo.iType);
			SetTestStepResult(EFail);
			}

		// Own Number Entry
		RMobileONStore::TMobileONEntryV1 ownNumberEntry;
		RMobileONStore::TMobileONEntryV1Pckg ownNumberEntryPckg(ownNumberEntry);

		for (TInt i=1; i<=ownNumberInfo.iTotalEntries; i++)
			{
			ownNumberEntry.iIndex = i;
	
			iOwnNumberStore.Read(iStatus, ownNumberEntryPckg);
			User::WaitForRequest(iStatus);
		
			if (iStatus==KErrNone)
				{	
				INFO_PRINTF2(_L("GetOwnNumberEntry (%d) was successful"),i);
				INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number: %S")), &ownNumberEntry.iNumber.iTelNumber);
				}
			else if (iStatus==KErrNotFound)
				{
				INFO_PRINTF2(_L("No Own Number Entry (%d) was found."),i);
				}
			else if (iStatus==KErrNotSupported)
				{
				INFO_PRINTF1(TRefByValue<const TDesC>(_L("GetOwnNumberEntry not supported by this phone")));
				}
			else
				{	
				INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetOwnNumberEntry status %d")), iStatus.Int());
				}
			}

		// Close and reopen store to test read before getinfo request
		iOwnNumberStore.Close();
		ret=iOwnNumberStore.Open(iPhone);
		if (ret!=KErrNone)
			{
			INFO_PRINTF2(_L("Failed to open Own Number store (%d)"), ret);
			SetTestStepResult(EFail);
			}

		// Own Number Entry
		RMobileONStore::TMobileONEntryV1 ownNumberEntry2;
		ownNumberEntry2.iIndex = 2;
	
		RMobileONStore::TMobileONEntryV1Pckg ownNumberEntryPckg2(ownNumberEntry2);
	
		iOwnNumberStore.Read(iStatus, ownNumberEntryPckg2);
		User::WaitForRequest(iStatus);
		
		if (iStatus==KErrNone)
			{	
			INFO_PRINTF1(_L("GetOwnNumberEntry (2) was successful"));
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("Number: %S")), &ownNumberEntry2.iNumber.iTelNumber);
			}
		else if (iStatus==KErrNotFound)
			{
			INFO_PRINTF1(_L("No Own Number Entry (2) was found."));
			}
		else if (iStatus==KErrNotSupported)
			{
			INFO_PRINTF1(TRefByValue<const TDesC>(_L("GetOwnNumberEntry not supported by this phone")));
			}
		else
			{
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("GetOwnNumberEntry (index 2) status %d")), iStatus.Int());			
			}


		//Test Cancel Requests
		INFO_PRINTF1(_L("Performing Cancel Requests for the above functions"));
		iOwnNumberStore.GetInfo(iStatus, ownNumberInfoPckg);
		iOwnNumberStore.CancelAsyncRequest(EMobilePhoneStoreGetInfo);
		User::WaitForRequest(iStatus);
		if (iStatus!=KErrNotSupported)
			{
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("RMobileONStore::GetInfoCancel status = %d")), iStatus.Int());
			}

		ownNumberEntry2.iIndex = 1;	
		iOwnNumberStore.Read(iStatus, ownNumberEntryPckg2);
		iOwnNumberStore.CancelAsyncRequest(EMobilePhoneStoreRead);
		User::WaitForRequest(iStatus);
		if (iStatus!=KErrNotSupported)
			{
			INFO_PRINTF2(TRefByValue<const TDesC>(_L("RMobileONStore::ReadCancel status = %d")), iStatus.Int());
			}

		iOwnNumberStore.Close();
		}
	else
		{
		INFO_PRINTF1(_L("TSY does not support Own Number store"));
		}

	return TestStepResult();
	}


/*-- Get Caps Test --------------------------------------------------------------------*/

CGetCaps::CGetCaps()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetCaps"));
	}

TVerdict CGetCaps::doTestStepL( void )	
/** 
 * This method test own number storage
 */	
	{
	INFO_PRINTF1(_L("Get Phone Capabilities"));
	
	TInt ret;

	// Get Caps and print them
	INFO_PRINTF1(_L("Calling RMobilePhone::GetCaps()"));
	RPhone::TCaps aCaps;
	ret = iPhone.GetCaps(aCaps);
	if(ret) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetCaps() returned: %d"), ret);
		SetTestStepResult(EFail);
		}
	if(aCaps.iFlags & RPhone::KCapsUnknown)
		{
		INFO_PRINTF1(_L("The capabilities of the phone are not currently known"));
		}
	if(aCaps.iFlags & RPhone::KCapsData)
		{
		INFO_PRINTF1(_L("The phone supports data calls"));
		}
	if(aCaps.iFlags & RPhone::KCapsFaxClassOne)
		{
		INFO_PRINTF1(_L("The phone supports the fax class 1 interface"));
		}
	if(aCaps.iFlags &	RPhone::KCapsFaxClassOnePointZero)
		{
		INFO_PRINTF1(_L("The phone supports the fax class 1.0 interface"));
		}
	if(aCaps.iFlags & RPhone::KCapsFaxClassTwo)
		{
		INFO_PRINTF1(_L("The phone supports the fax class 2 interface"));
		}
	if(aCaps.iFlags & RPhone::KCapsFaxClassTwoPointZero)
		{
		INFO_PRINTF1(_L("The phone supports the fax class 2.0 interface"));
		}
	if(aCaps.iFlags & RPhone::KCapsFaxClassTwoPointOne)
		{
		INFO_PRINTF1(_L("The phone supports the fax class 2.1 interface"));
		}
	if(aCaps.iFlags & RPhone::KCapsVoice)
		{
		INFO_PRINTF1(_L("The phone supports voice calls"));
		}
	if(aCaps.iFlags & RPhone::KCapsEventModemDetection)
		{
		INFO_PRINTF1(_L("The phone supports modem detection events"));
		}
	if(aCaps.iFlags & RPhone::KCapsStealCommPort)
		{
		INFO_PRINTF1(_L("The phone supports the ability to take the comms port"));
		}


	// Gets Status and prints info
	INFO_PRINTF1(_L("Calling RMobilePhone::GetStatus()"));	
	RPhone::TStatus phoneStatus;
	ret = iPhone.GetStatus(phoneStatus);
	if(ret) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetStatus() returned %d"), ret);
		SetTestStepResult(EFail);
		}

	switch(phoneStatus.iMode)
		{
		case RPhone::EModeUnknown:
			INFO_PRINTF1(_L("The phone is currently in an unknown state"));
			break;

		case RPhone::EModeIdle:
			INFO_PRINTF1(_L("The phone is currently idle"));
			break;

		case RPhone::EModeEstablishingLink:
			INFO_PRINTF1(_L("The phone is currently trying to establish a call"));
			break;

		case RPhone::EModeOnlineData:
			INFO_PRINTF1(_L("The phone is in the connected and \"on-line data\" state"));
			break;

		case RPhone::EModeOnlineCommand:
			INFO_PRINTF1(_L("The phone is in the connected and \"on-line command\" state"));
			break;

		}

	//Get and print info
	INFO_PRINTF1(_L("Calling RMobilePhone::GetInfo()"));
	RPhone::TPhoneInfo phoneInfo;
	ret = iPhone.GetInfo(phoneInfo);
	if(ret) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetInfo() returned %d"), ret);
		SetTestStepResult(EFail);
		}

	switch(phoneInfo.iDetection)
		{
		case RPhone::EDetectedPresent:
			INFO_PRINTF1(_L("The local modem is present"));
			break;

		case RPhone::EDetectedNotPresent:
			INFO_PRINTF1(_L("The local modem is not present"));
			break;

		case RPhone::EDetectedUnknown:
			INFO_PRINTF1(_L("Status of the local modem not detected"));
			break;
		}

	return TestStepResult();
	}


/*-- Get Lines Status Test ------------------------------------------------------------*/

CGetLinesStatus::CGetLinesStatus()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetLinesStatus"));
	}

TVerdict CGetLinesStatus::doTestStepL( void )	
/** 
 * This method tests getting the line status
 */	
	{
	INFO_PRINTF1(_L("Get Lines Status"));

	TInt aCount;
	TInt i;					// Loop counter
	RPhone::TLineInfo	lineInfo;

	//Test Enumeratting the lines
	INFO_PRINTF1(_L("Calling RPhone::EnumerateLines()"));
	TInt ret = iPhone.EnumerateLines(aCount);
	if(ret) 
		{
		INFO_PRINTF2(_L("RPhone::EnumerateLines() returned %d"), ret);
		SetTestStepResult(EFail);
		}
	
	INFO_PRINTF2(_L("There are %d lines on this phone"), aCount);

	INFO_PRINTF1(_L("Calling RPhone::GetLineInfo()"));
	for(i=0;i<aCount;i++)
		{
		ret = iPhone.GetLineInfo(i, lineInfo);
		if(ret) 
			{
			INFO_PRINTF2(_L("RPhone::GetLineInfo() returned %d"), ret);
			SetTestStepResult(EFail);
			}

		switch(lineInfo.iStatus)
			{
			case RCall::EStatusUnknown:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call status is not currently known"), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusIdle:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is idle"), i+1, &lineInfo.iName);
				break;
			
			case RCall::EStatusDialling:   
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is dialling."), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusRinging:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is ringing "), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusAnswering:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is being answered"), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusConnecting:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is connecting"), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusConnected:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is connected and active"), i+1, &lineInfo.iName);
				break;

			case RCall::EStatusHangingUp:
				INFO_PRINTF3(_L("Line index %d: %S, Status: The call is being terminated"), i+1, &lineInfo.iName);
				break;

			}

		// Waits a bit
		User::After( 3 * KOneSecond);

		if(lineInfo.iLineCapsFlags & RLine::KCapsData)
			{
			INFO_PRINTF1(_L("The line supports data connections"));
			}	
		if(lineInfo.iLineCapsFlags & RLine::KCapsFax)
			{
			INFO_PRINTF1(_L("The line supports fax connections"));
			}
		if(lineInfo.iLineCapsFlags & RLine::KCapsVoice)
			{
			INFO_PRINTF1(_L("The line supports voice connections"));
			}
		if(lineInfo.iLineCapsFlags & RLine::KCapsEventIncomingCall)
			{
			INFO_PRINTF1(_L("The line supports incoming call notification requests"));
			}
		}

	return TestStepResult();
	}

/*-- Get Multimode Caps Test ----------------------------------------------------------*/

CGetMultimodeCaps::CGetMultimodeCaps()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetMultimodeCaps"));
	}

TVerdict CGetMultimodeCaps::doTestStepL( void )	
/** 
 * This method tests getting the phone's multimode capabilities
 */	
	{
	INFO_PRINTF1(_L("Testing the phone's Multimode caps"));
	
	INFO_PRINTF1(_L("Calling RMobilePhone::GetMultimodeCaps()"));
	TUint32 aCaps;
	TInt ret = iPhone.GetMultimodeCaps(aCaps);
	if(ret) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetMultimodeCaps returned %d"), ret);
		return EFail;
		}

	if(aCaps & RMobilePhone::KCapsGsmSupported)
		{
		INFO_PRINTF1(_L("Phone can operate in GSM 900/1800/1900 mode"));
		}
	if(aCaps & RMobilePhone::KCapsGprsSupported)
		{
		INFO_PRINTF1(_L("Phone can operate in GPRS mode"));
		}
	if(aCaps & RMobilePhone::KCapsAmpsSupported)
		{
		INFO_PRINTF1(_L("Phone can operate in AMPS 800 mode"));
		}
	if(aCaps & RMobilePhone::KCapsCdma95Supported)
		{
		INFO_PRINTF1(_L("Phone can operate in CDMA95 800/1900 mode"));
		}
	if(aCaps & RMobilePhone::KCapsCdma2000Supported)
		{
		INFO_PRINTF1(_L("Phone can operate in CDMA2000 800/1900 mode"));
		}
	if(aCaps & RMobilePhone::KCapsWcdmaSupported)
		{
		INFO_PRINTF1(_L("Phone can operate in W-CDMA mode"));
		}

	return EPass;
	}


/*-- Get Network Caps Test ------------------------------------------------------------*/

CGetNetworkCaps::CGetNetworkCaps()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetNetworkCaps"));
	}

TVerdict CGetNetworkCaps::doTestStepL( void )	
/** 
 * This method tests getting Network Capabilities
 */	
	{
	INFO_PRINTF1(_L("Get Network Caps"));

	INFO_PRINTF1(_L("Calling RMobilePhone::GetNetworkCaps()"));
	TUint32 aCaps;
	TInt ret = iPhone.GetNetworkCaps(aCaps);
	if(ret==KErrNotSupported)	// Do not consider KErrNotSupported as a test failure
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else if(ret!=KErrNone) 
		{
		INFO_PRINTF2(_L("RMobilePhone::GetNetworkCaps() returned %d/n"), ret);
		return EFail;
		}

	if(aCaps & RMobilePhone::KCapsGetRegistrationStatus)
		{
		INFO_PRINTF1(_L("The phone supports retrieval of current registration status"));
		}
	if(aCaps & RMobilePhone::KCapsNotifyRegistrationStatus)
		{
		INFO_PRINTF1(_L("The phone supports notifications of change in registration status"));
		}
	if(aCaps & RMobilePhone::KCapsGetCurrentMode)
		{
		INFO_PRINTF1(_L("The phone supports retrieval of current mode"));
		}
	if(aCaps & RMobilePhone::KCapsNotifyMode)
		{
		INFO_PRINTF1(_L("The phone supports notification of change in mode"));
		}
	if(aCaps & RMobilePhone::KCapsGetCurrentNetwork)
		{
		INFO_PRINTF1(_L("phone supports retrieval of current network information"));
		}
	if(aCaps & RMobilePhone::KCapsNotifyCurrentNetwork)
		{
		INFO_PRINTF1(_L("The phone supports notification of change of current network"));
		}
	if(aCaps & RMobilePhone::KCapsGetHomeNetwork)
		{
		INFO_PRINTF1(_L("The phone supports retrieval of home network information"));
		}
	if(aCaps & RMobilePhone::KCapsGetDetectedNetworks)
		{
		INFO_PRINTF1(_L("The phone supports retrieval of a list of detected networks"));
		}
	if(aCaps & RMobilePhone::KCapsManualNetworkSelection)
		{
		INFO_PRINTF1(_L("The phone supports manual network selection mode"));
		}
	if(aCaps & RMobilePhone::KCapsGetNITZInfo)
		{
		INFO_PRINTF1(_L("The phone supports retrieval of time/date from the network"));
		}
	if(aCaps & RMobilePhone::KCapsNotifyNITZInfo)
		{	
		INFO_PRINTF1(_L("The phone supports notification of new updates of time/date from the network"));
		}


	return EPass;

	}


/*-- Get Current Mode Test ------------------------------------------------------------*/
CGetCurrentMode::CGetCurrentMode()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetCurrentMode"));
	}

TVerdict CGetCurrentMode::doTestStepL( void )	
/** 
 * This method tests getting the current mode that the phone is in
 */	
	{
	INFO_PRINTF1(_L("Testing the current mode and notification"));
	
	INFO_PRINTF1(_L("Calling RMobilePhone::GetCurrentMode()"));
	RMobilePhone::TMobilePhoneNetworkMode netMode;
	TInt ret = iPhone.GetCurrentMode(netMode);
	if(ret==KErrNotSupported)		// Do not consider KErrNotSupported as a test failure
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else if(ret!=KErrNone)
		{	
		// Log error code and return with error code so that AutoTest logs this as a test failure
		INFO_PRINTF2(_L("RMobilePhone::GetCurrentMode() returned %d"), ret);
		return EFail;
		}

	if(ret==KErrNone)
		{
		switch(netMode)
			{
		case RMobilePhone::	ENetworkModeUnregistered:
			INFO_PRINTF1(_L("ME is not registered."));
			break;
		case RMobilePhone::ENetworkModeGsm:
			INFO_PRINTF1(_L("GSM or DCS1800 network."));
			break;
		case RMobilePhone::ENetworkModeAmps:
			INFO_PRINTF1(_L("AMPS network"));
			break;
		case RMobilePhone::ENetworkModeCdma95:
			INFO_PRINTF1(_L("CDMA95 network."));
			break;
		case RMobilePhone::ENetworkModeCdma2000:
			INFO_PRINTF1(_L("CDMA2000 network."));
			break;
		case RMobilePhone::ENetworkModeWcdma:
			INFO_PRINTF1(_L("WCDMA network"));
		case RMobilePhone::ENetworkModeTdcdma:
			INFO_PRINTF1(_L("TD-CDMA network"));
		case RMobilePhone::ENetworkModeUnknown:
		default:
			INFO_PRINTF1(_L("Network mode is unknown"));
			break;
			}
		}
	
	return EPass;
	}


/*-- Async Network List Retrieval Test ------------------------------------------------*/

CGetAsyncNetList::CTestAsyncGetNetList* CGetAsyncNetList::CTestAsyncGetNetList::NewLC(RMobilePhone& aPhone)
	{
    CTestAsyncGetNetList* r=new(ELeave) CTestAsyncGetNetList(aPhone);
    CleanupStack::PushL(r);
    r->ConstructL();
    return r;
    }
      
CGetAsyncNetList::CTestAsyncGetNetList::CTestAsyncGetNetList(RMobilePhone& aPhone)
    : CActive(EPriorityNormal), iPhone(aPhone), iCompleteCode(KErrNone)
    {
	}
      
void CGetAsyncNetList::CTestAsyncGetNetList::ConstructL()
	{
	CActiveScheduler::Add(this);
	iRetrieve=CRetrieveMobilePhoneDetectedNetworks::NewL(iPhone);
    }
         
CGetAsyncNetList::CTestAsyncGetNetList::~CTestAsyncGetNetList()
    {
	delete iRetrieve;
	}
      
void CGetAsyncNetList::CTestAsyncGetNetList::Start()
    {
    iRetrieve->Start(iStatus);
    SetActive();
    }       

CMobilePhoneNetworkList* CGetAsyncNetList::CTestAsyncGetNetList::RetrieveList()
	{
	CMobilePhoneNetworkList* ptr=NULL;
	TRAP_IGNORE(ptr=iRetrieve->RetrieveListL()); // trap and ignore err
	return ptr;
	}
          
void CGetAsyncNetList::CTestAsyncGetNetList::RunL()
	{
	iCompleteCode=iStatus.Int();
	CActiveScheduler::Stop();
	}	


TInt CGetAsyncNetList::CTestAsyncGetNetList::CompleteCode()
	{
	return iCompleteCode;
	}

void CGetAsyncNetList::CTestAsyncGetNetList::DoCancel()
    {
    iRetrieve->Cancel();
    }

CGetAsyncNetList::CGetAsyncNetList()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("GetAsyncNetList"));
	}

TVerdict CGetAsyncNetList::doTestStepL()
/** 
 * This method tests asynchronously getting a list of detected networks
 */	
	{
	INFO_PRINTF1(_L("Testing Async retrieval of Network list"));

	iTestScheduler = new (ELeave) CActiveScheduler;
	CActiveScheduler::Install(iTestScheduler);

	CTestAsyncGetNetList* netRetrieveList = CTestAsyncGetNetList::NewLC(iPhone);	
	
	INFO_PRINTF1(_L("Starting ActiveObject CRetrieveMobilePhoneDetectedNetworks"));
	netRetrieveList->Start();
	CActiveScheduler::Start();


	// Get completion code from netRetrieveList
	const TInt completeCode = netRetrieveList->CompleteCode();
	if(completeCode==KErrNotSupported)		// Do not consider KErrNotSupported a test failure
		{
		INFO_PRINTF1(_L("***Phone returned KErrNotSupported***"));
		}
	else if(completeCode!=KErrNone)
		{
		// Log that and error occurred
		INFO_PRINTF2(TRefByValue<const TDesC>(_L("Failed with error code %d")),completeCode);
		return EFail;
		}


	TInt i;			// Loop counter
	CMobilePhoneNetworkList* retList=NULL;
	RMobilePhone::TMobilePhoneNetworkInfoV1 anEntry;

	if(completeCode==KErrNone)
		{
		retList = netRetrieveList->RetrieveList();
		const TInt count = retList->Enumerate();
		INFO_PRINTF2(_L("%d networks detected"), count);

		for(i=0; i<count; i++)
			{
			anEntry = retList->GetEntryL(i);	
			INFO_PRINTF3(_L("Network %d: %S"), i+1, &anEntry.iLongName);
			INFO_PRINTF1(_L("Mode of the network: "));
		
			switch(anEntry.iMode)
				{
			case RMobilePhone::ENetworkModeUnregistered:
				INFO_PRINTF1(_L("ME is not registered."));
				break;
			case RMobilePhone::ENetworkModeGsm:
				INFO_PRINTF1(_L("GSM or DCS1800 network."));
				break;
			case RMobilePhone::ENetworkModeAmps:
				INFO_PRINTF1(_L("	AMPS network"));
				break;
			case RMobilePhone::ENetworkModeCdma95:
				INFO_PRINTF1(_L("CDMA95 network"));
				break;
			case RMobilePhone::ENetworkModeCdma2000:
				INFO_PRINTF1(_L("CDMA2000 network"));
				break;
			case RMobilePhone::ENetworkModeWcdma:
				INFO_PRINTF1(_L("WCDMA network."));
				break;
			case RMobilePhone::ENetworkModeTdcdma:
				INFO_PRINTF1(_L("TD-CDMA network."));
				break;
			case RMobilePhone::ENetworkModeUnknown:
			default:
				INFO_PRINTF1(_L("Network mode is unknown."));
				break;
				}
	
			INFO_PRINTF1(_L("Status of the network: "));
			switch(anEntry.iStatus)
				{
			case RMobilePhone::ENetworkStatusUnknown:
				INFO_PRINTF1(_L("Status is unknown"));
				break;
			case RMobilePhone::ENetworkStatusAvailable:
				INFO_PRINTF1(_L("A network that the ME is allowed to register to"));
				break;
			case RMobilePhone::ENetworkStatusCurrent:
				INFO_PRINTF1(_L("The currently registered network."));
				break;
			case RMobilePhone::ENetworkStatusForbidden:
				INFO_PRINTF1(_L("A network that the ME is not allowed to register to"));
				break;
				}

			INFO_PRINTF2(_L("Country code: %S"), &anEntry.iCountryCode);
			INFO_PRINTF2(_L("The system identity (SID) of the CDMA network: %S"), &anEntry.iCdmaSID);
			INFO_PRINTF2(_L("The system identity (SID) of the AMPS network: %S"), &anEntry.iAnalogSID);
			INFO_PRINTF2(_L("The network identity (NID in CDMA and MNC in GSM): %S"), &anEntry.iNetworkId);
			INFO_PRINTF2(_L("The alpha-tag displayed when this is the serving network: %S"), &anEntry.iDisplayTag);
			INFO_PRINTF2(_L("The short name (up to 8 characters) of the network operator: %S"), &anEntry.iShortName);
			INFO_PRINTF2(_L("The long name (up to 16 characters) of the network operator.: %S"), &anEntry.iLongName);
			}

		}
	CleanupStack::PopAndDestroy(); // netRetrieveList;
	delete retList;
	delete iTestScheduler;
	return EPass;
	}


/*-- Functional Unit Support Test -----------------------------------------------------*/
CIsSupportedByModuleTest::CIsSupportedByModuleTest()
/** Each test step initialises it's own name
*/
	{
	// store the name of this test case
	// this is the name that is used by the script file
	SetTestStepName(_L("IsSupportedByModuleTest"));
	}


TBool CIsSupportedByModuleTest::doIsSupportedByModuleTest(TInt aMixin)
	{
	TBool isSupported(EFalse);
	TInt ret=iTelServer.IsSupportedByModule(KMmtsyName,aMixin,isSupported);
	if(ret==KErrNone)
		{
		INFO_PRINTF2(_L("%d functional unit is supported!"), aMixin);
		return ETrue;		
		}		
	else
		{
		INFO_PRINTF2(_L("%d functional unit is NOT supported"), aMixin);
		return EFalse;
		}
	}

TVerdict CIsSupportedByModuleTest::doTestStepL( void )	
/** 
 * This method tests is certain Functional Units are supported
 */	
	{
	TBool isSupported(EFalse);
	
	isSupported = doIsSupportedByModuleTest(KETelFuncMobileNetwork);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobileIdentity);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobilePower);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobileSignal);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobileDataCall);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobileSmsMessaging);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}

	isSupported = doIsSupportedByModuleTest(KETelFuncMobilePhonebook);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}
	isSupported = doIsSupportedByModuleTest(KETelFuncMobileSmsStore);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}
	isSupported = doIsSupportedByModuleTest(KETelFuncMobileOwnNumberStore);
	if(!isSupported)
		{
		SetTestStepResult(EFail);
		}
	return TestStepResult();
	}