commands/sysinfo/sysinfo.cpp
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Sat, 31 Jul 2010 19:07:57 +0100
changeset 23 092bcc217d9d
parent 0 7f656887cf89
permissions -rw-r--r--
Tidied iocli exports, build macro tweaks. Removed 4 overloads of CCommandBase::RunCommand[L] that are no longer used at all, and changed one more to not be exported as it's only used internally to iocli.dll. fixed builds on platforms that don't support btrace or any form of tracing.

// sysinfo.cpp
// 
// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the "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:
// Accenture - Initial contribution
//

//
// CCmdSysInfo.
//
#include "u32std.h"
#include <ETELMM.H>
#include "sysinfo.h"
#include <fshell/common.mmh>
#include <fshell/ltkhal.h>
#include <fshell/ltkutils.h>
#ifdef FSHELL_CORE_SUPPORT_SYSINFO_WLAN
#include <wlansdkpskeys.h>	//for WLAN info
#endif
#include <e32rom.h>

	
CCommandBase* CCmdSysInfo::NewLC()
	{
	CCmdSysInfo* self = new (ELeave) CCmdSysInfo();
	CleanupStack::PushL(self);
	self->BaseConstructL();
	return self;
	}

CCmdSysInfo::~CCmdSysInfo()
	{
	}

CCmdSysInfo::CCmdSysInfo()
	: CCommandBase(EReportAllErrors)
	{
	}

void CCmdSysInfo::PrintHalL(HALData::TAttribute aHalAttribute)
	{
	LtkUtils::CHalAttribute* attrib = LtkUtils::GetHalInfoL(aHalAttribute);
	if (attrib->iError)
		{
		PrintWarning(_L("Unable to read %S: %S (%d)"), &attrib->iAttributeName, Stringify::Error(attrib->iError), attrib->iError);
		}
	else
		{
		Printf(_L("%S: %S\r\n"), &attrib->iAttributeName, attrib->iDescription);
		}
	delete attrib;
	}

void CCmdSysInfo::PrintWlanL()
	{
#ifdef FSHELL_CORE_SUPPORT_SYSINFO_WLAN
    //result format 00:18:0f:1e:96:a2.
    TBuf8<KPSWlanMacAddressLength> DesC8AddrText;
    TBuf<50> formatedMacAddress;
    LeaveIfErr(RProperty::Get(KPSUidWlan,KPSWlanMacAddress,DesC8AddrText), _L("Unable to get MAC address"));
    for ( TInt i=0; i < (TInt)KPSWlanMacAddressLength; i++ )
        {
        // Set separator
        if( i > 0 )
            formatedMacAddress.Append(':');
 
        // Set data
        TBuf<10> FormatText;
        FormatText.Format(_L("%02x"), DesC8AddrText[i]);
        formatedMacAddress.Append(FormatText);
        }
    Printf(_L("WLAN MAC Address: %S\r\n"), &formatedMacAddress);
#endif
	}

void CCmdSysInfo::PrintPhoneIdL()
	{
#ifdef FSHELL_TELEPHONY_SUPPORT
	TRequestStatus status;

	RTelServer telSvr;
	LeaveIfErr(telSvr.Connect(), _L("Unable to connect to telephony server"));
	CleanupClosePushL(telSvr);

	RMobilePhone mobilePhone;
	LeaveIfErr(mobilePhone.Open(telSvr, _L("DefaultPhone")), _L("Unable to open default mobile phone"));
	CleanupClosePushL(mobilePhone);
		
	TUint32 identCap;
	mobilePhone.GetIdentityCaps(identCap);
		
	RMobilePhone::TMobilePhoneIdentityV1 Id;
	mobilePhone.GetPhoneId(status, Id);
	User::WaitForRequest(status);

	LeaveIfErr(status.Int(), _L("Unable to retrieve phone identity"));
	if (identCap & RMobilePhone::KCapsGetManufacturer)
		Printf(_L("Manufacturer (from TSY): %S\r\n"), &(Id.iManufacturer) );

	if (identCap & RMobilePhone::KCapsGetModel)
		Printf(_L("Model (from TSY): %S\r\n"), &(Id.iModel) );
		
	if (identCap & RMobilePhone::KCapsGetRevision)
		Printf(_L("Revision (from TSY): %S\r\n"), &(Id.iRevision) );
		
	if (identCap & RMobilePhone::KCapsGetSerialNumber)
		Printf(_L("SerialNumber (IMEI): %S\r\n"), &(Id.iSerialNumber) );
	
	//query subscriber id
	if (identCap & RMobilePhone::KCapsGetSubscriberId)
		{
		RMobilePhone::TMobilePhoneSubscriberId subsId;
		mobilePhone.GetSubscriberId(status, subsId);
		User::WaitForRequest(status);

		LeaveIfErr(status.Int(), _L("Unable to query subscriber id"));
		Printf(_L("SubscriberId (IMSI): %S\r\n"), &(subsId) );
		}

	TPckgBuf<RMobilePhone::TMobilePhoneNetworkInfoV1> info;
	RMobilePhone::TMobilePhoneLocationAreaV1 loc;
	mobilePhone.GetCurrentNetwork(status, info, loc);
	User::WaitForRequest(status);
	LeaveIfErr(status.Int(), _L("Unable to get current network info"));
	Printf(_L8("Network id: %S "), &info().iNetworkId);
	Printf(_L("shortName: %S longName: %S displayTag: %S"), &info().iShortName, &info().iLongName, &info().iDisplayTag);

	CleanupStack::PopAndDestroy();	//mobilePhone
	CleanupStack::PopAndDestroy();	//telSvr
#endif	
	}	

void CCmdSysInfo::DoRunL()
	{
	if (iMachineUIDOnly)
		{
		// sysinfo command-line configured to return only the machine uid value & nothing else
		TInt value;
		TInt err = HAL::Get(HALData::EMachineUid, value);
		if (err)
			{
			PrintWarning(_L("Unable to read Machine UID %S (%d)"), Stringify::Error(err), err);
			}
		else
			{
			TBuf<10> buf;
			buf.Format(_L("%d"), value);
			Write(buf);
			}
		}
	else
		{
		// sys info command-line configured to return all information, including HAL field description
		PrintHalL(HALData::EManufacturer);
		PrintHalL(HALData::EManufacturerHardwareRev);
		PrintHalL(HALData::EManufacturerSoftwareRev);
		PrintHalL(HALData::EManufacturerSoftwareBuild);
		PrintHalL(HALData::EModel);
		PrintHalL(HALData::EMachineUid);
		PrintHalL(HALData::ECPUSpeed);
		PrintHalL(HALData::ESystemStartupReason);
		PrintHalL(HALData::ESystemTickPeriod);
		PrintHalL(HALData::ENanoTickPeriod);
		PrintHalL(HALData::EFastCounterFrequency);
		PrintHalL(HALData::EFastCounterCountsUp);
		PrintHalL(HALData::ESystemException);
		PrintHalL(HALData::EDisplayXPixels);
		PrintHalL(HALData::EDisplayYPixels);
		PrintHalL(HALData::EDisplayXTwips);
		PrintHalL(HALData::EDisplayYTwips);
		PrintHalL(HALData::EDisplayColors);
		PrintKernelHalStuff();
		PrintRomVersion();
		TRAP_IGNORE(PrintWlanL());
		TRAP_IGNORE(PrintPhoneIdL());
		}
	}
	
const TDesC& CCmdSysInfo::Name() const
	{
	_LIT(KName, "sysinfo");
	return KName;
	}

void CCmdSysInfo::OptionsL(RCommandOptionList& aOptions)
	{
	_LIT(KOptUid, "machine-uid");
	aOptions.AppendBoolL(iMachineUIDOnly, KOptUid);
	}

EXE_BOILER_PLATE(CCmdSysInfo)

void CCmdSysInfo::PrintKernelHalStuff()
	{
	enum TKernelConfigFlagsNotIn91
		{
		EKernelConfigPlatSecLocked = 1<<7,
		EKernelConfigCrazyScheduling = 1<<8,

		EKernelConfigPagingPolicyNoPaging = 0,
		EKernelConfigPagingPolicyAlwaysPage = 1,
		EKernelConfigPagingPolicyDefaultUnpaged = 2,
		EKernelConfigPagingPolicyDefaultPaged = 3,

		EKernelConfigCodePagingPolicyShift			= 5,
		EKernelConfigCodePagingPolicyMask			= 3<<5,
		EKernelConfigCodePagingPolicyNoPaging		= EKernelConfigPagingPolicyNoPaging<<5,
		EKernelConfigCodePagingPolicyAlwaysPage		= EKernelConfigPagingPolicyAlwaysPage<<5,
		EKernelConfigCodePagingPolicyDefaultUnpaged	= EKernelConfigPagingPolicyDefaultUnpaged<<5,
		EKernelConfigCodePagingPolicyDefaultPaged	= EKernelConfigPagingPolicyDefaultPaged<<5,

		EKernelConfigDataPagingPolicyShift			= 9,
		EKernelConfigDataPagingPolicyMask			= 3<<9,
		};

	enum THalFunctionsNotIn91
		{
		EKernelHalSmpSupported = 15,
		EKernelHalNumLogicalCpus = 16,
		EKernelHalConfigFlags = 20,
		};

	// Memory model
	TUint memModelInfo = UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemModelInfo, 0, 0);
	Printf(_L("Memory model: "));
	const TInt EMemModelTypeFlexible = 4;
	switch (memModelInfo & EMemModelTypeMask)
		{
		case EMemModelTypeDirect:
			Printf(_L("Direct")); break;
		case EMemModelTypeMoving:
			Printf(_L("Moving")); break;
		case EMemModelTypeMultiple:
			Printf(_L("Multiple")); break;
		case EMemModelTypeEmul:
			Printf(_L("Emulator")); break;
		case EMemModelTypeFlexible:
			Printf(_L("Flexible")); break;
		default:
			Printf(_L("Unknown (%d)"), memModelInfo & EMemModelTypeMask);
			break;
		}
	Printf(_L("\r\n"));

	// Hal config
	TInt flags = UserSvr::HalFunction(EHalGroupKernel, EKernelHalConfigFlags, 0, 0); // Not the most documented of APIs but has been around since at least v9.1
	if (flags < 0)
		{
#ifdef __EPOC32__
		// The only things that are dynamically calculated are things that aren't supported on platforms that don't support the HalFunction, so this is a good compromise
		flags = ((const TRomHeader*)UserSvr::RomHeaderAddress())->iKernelConfigFlags;
#else
		return;
#endif
		}

	_LIT(KOn, "On");
	_LIT(KOff, "Off");
	Printf(_L("PlatSec Enforcement: %S\r\n"), (flags & EKernelConfigPlatSecEnforcement) ? &KOn : &KOff);
	Printf(_L("PlatSec Locked: %S\r\n"), (flags & EKernelConfigPlatSecLocked) ? &KOn : &KOff);
	Printf(_L("Crazy scheduling: %S\r\n"), (flags & EKernelConfigCrazyScheduling) ? &KOn : &KOff);

	Printf(_L("Code paging: "));
	PagingFormat((flags & EKernelConfigCodePagingPolicyMask) >> EKernelConfigCodePagingPolicyShift);
	Printf(_L("\r\nData paging: "));
	PagingFormat((flags & EKernelConfigDataPagingPolicyMask) >> EKernelConfigDataPagingPolicyShift);
	Printf(_L("\r\n"));

	// Num CPUs
	TBool smpEnabled = (UserSvr::HalFunction(EHalGroupKernel, EKernelHalSmpSupported, 0, 0) == KErrNone);
	if (smpEnabled)
		{
		TInt cpus = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
		Printf(_L("Num CPUs: %d\r\n"), cpus);
		}
	else
		{
		Printf(_L("Num CPUs: 1 (no SMP)\r\n"));
		}
	}

void CCmdSysInfo::PagingFormat(TUint aFlags)
	{
	enum TMoreFlagsNotIn91
		{
		EKernelConfigPagingPolicyNoPaging = 0,
		EKernelConfigPagingPolicyAlwaysPage = 1,
		EKernelConfigPagingPolicyDefaultUnpaged = 2,
		EKernelConfigPagingPolicyDefaultPaged = 3,
		};

	switch (aFlags)
		{
		case EKernelConfigPagingPolicyNoPaging:
			Printf(_L("No paging")); break;
		case EKernelConfigPagingPolicyAlwaysPage:
			Printf(_L("Always page")); break;
		case EKernelConfigPagingPolicyDefaultUnpaged:
			Printf(_L("Default unpaged")); break;
		case EKernelConfigPagingPolicyDefaultPaged:
			Printf(_L("Default paged")); break;
		default:
			break;
		}
	}

typedef TInt(*TSysUtilGetSWVersionFunction)(TDes&);
#ifdef __EPOC32__
const TInt KSysUtilOrdinal = 9;
#else
const TInt KSysUtilOrdinal = 6;
#endif

void CCmdSysInfo::PrintRomVersion()
	{
#ifdef __EPOC32__
	// Get checksum 
	TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress();
	if  (romHeader)
		{
		Printf(_L("Rom checksum: 0x%08x\r\n"), romHeader->iCheckSum);
		}
#endif

	// Platform version
	_LIT(KS60VersionDllName, "SysUtil.dll");
	RLibrary lib;
	if (lib.Load(KS60VersionDllName) == KErrNone)
		{
		// Get exported version function
		TLibraryFunction fn = lib.Lookup(KSysUtilOrdinal);
		if (fn != NULL)
			{
			TSysUtilGetSWVersionFunction sysUtilGetSWVersion = (TSysUtilGetSWVersionFunction) fn;
			TBuf<128> buf;
			TInt err = (*sysUtilGetSWVersion)(buf);
			if (err)
				{
				Printf(_L("Error returned from SysUtilGetSWVersionFunction: %d\r\n"), err);
				}
			else
				{
				LtkUtils::ReplaceText(buf, _L("\n"), _L(" "));
				Printf(_L("ROM version: %S\r\n"), &buf);
				}
			}
		lib.Close();
		}
	}