applaunchservices/aftermarketappstarter/amastartsrc/amastartexe.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applaunchservices/aftermarketappstarter/amastartsrc/amastartexe.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,87 @@
+// Copyright (c) 2008-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:
+// amastarterexe.cpp
+// 
+//
+
+
+#include <e32std.h>
+#include "amastartexe_patch.h"
+#include "amastart.h"
+
+LOCAL_C void AmaStarterL()
+	{
+	CActiveScheduler* sched = NULL;
+	sched = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(sched);
+	CleanupStack::PushL(sched);
+	
+	//The application should have capabilities at least what AMAStarter has (PowerMgmt, ReadDeviceData, ProtServ)
+	//to prevent a process being able to get AMAStarter to perform operations it doesn't have the capabilities for. 
+	//The application should also have SID as expected to ensure that AMAStarter.exe cannot be launched by a malicious process 
+	if(!User::CreatorHasCapability(ECapabilityPowerMgmt, ECapabilityProtServ) ||
+		!User::CreatorHasCapability(ECapabilityReadDeviceData)||
+		(User::CreatorSecureId() != KSysStartSID))
+		{
+		User::Leave(KErrPermissionDenied); // make sure we are being called by a trusted app for startup purposes
+		}	
+	
+	CAmaStart* const amaStart = CAmaStart::NewL();
+	CleanupStack::PushL(amaStart);
+
+	//default DSC
+	TUid id = TUid::Uid(KDefaultSymbianDsc);
+	const TInt commandSize=User::CommandLineLength();
+	if (commandSize >0)
+		{
+		RBuf command;
+		command.CreateL(commandSize);
+		CleanupClosePushL(command);
+
+		//get the command line argument
+		User::CommandLine(command);
+
+		TLex lex(command);
+		TUint dscId=0;
+		
+		//Parses the string to extract a TUint32, using hexadecimal
+		User::LeaveIfError(lex.Val(dscId, EHex));
+		id=TUid::Uid(dscId);
+	
+		CleanupStack::PopAndDestroy(&command);
+		}
+		
+	amaStart->StartL(id);
+	CleanupStack::PopAndDestroy(2);//amastart, sched
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK; // mark heap state
+
+	CTrapCleanup* theTrapCleanup=CTrapCleanup::New();
+	
+	TInt error=KErrNoMemory;
+
+	if (theTrapCleanup)
+		{
+		TRAP(error, AmaStarterL());		
+		delete theTrapCleanup;
+		}
+	
+	__UHEAP_MARKEND; // check no memory leak
+
+	return(error);
+	}