commands/sysinfo/sysinfo.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/sysinfo/sysinfo.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,354 @@
+// 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();
+		}
+	}