www.pudn.com > autostart.rar > cl_autostart.cpp


#include 
#include 
#include "cl_autostart.h"

const TUid KUidemAclAutostart={0x09A770B5};

CclAutostart::CclAutostart()
:CApaDataRecognizerType(KUidemAclAutostart, CApaDataRecognizerType::ENormal)
{
	iCountDataTypes = 1;
}

TUint CclAutostart::PreferredBufSize()
{
	// no buffer recognition yet
	return 0;
}

TDataType CclAutostart::SupportedDataTypeL(TInt /*aIndex*/) const
{
	return TDataType();
}

void CclAutostart::DoRecognizeL(const TDesC& /*aName*/, const TDesC8&
			      /*aBuffer*/)
{
	// this function is never called
}

void CclAutostart::StartThread()
{
	TInt res = KErrNone;
	
	//create a new thread for starting our application
	RThread * startAppThread;
	startAppThread = new RThread();
	
	User::LeaveIfError( res = startAppThread->Create(
		_L("Autostart starter"),
		CclAutostart::StartAppThreadFunction,
		KDefaultStackSize,
		KMinHeapSize,
		KMinHeapSize,
		NULL,
		EOwnerThread) );
	
	startAppThread->SetPriority(EPriorityNormal/*EPriorityLess*/);
	
	startAppThread->Resume();
	
	startAppThread->Close();
}


TInt CclAutostart::StartAppThreadFunction(TAny* /*aParam*/)
{
	
	//wait 5 seconds...
	RTimer timer; // The asynchronous timer and ...
	TRequestStatus timerStatus; // ... its associated request status
	timer.CreateLocal(); // Always created for this thread.
	// get current time (microseconds since 0AD nominal Gregorian)
	TTime time;
	time.HomeTime();
	// add ten seconds to the time
	TTimeIntervalSeconds timeIntervalSeconds(45);
	time += timeIntervalSeconds;
	// issue and wait
	timer.At(timerStatus,time);
	User::WaitForRequest(timerStatus);
	
	
	// create a TRAP cleanup
	CTrapCleanup * cleanup = CTrapCleanup::New();
	TInt err;
	if( cleanup == NULL )
	{
		err = KErrNoMemory;
	}
	else
	{
		TRAP( err, StartAppThreadFunctionL() );
	}
	delete cleanup;
	 
	 
	if (err!=KErrNone) 
		User::Panic(_L("autostart"), err); 
	return err;
}

void CclAutostart::StartAppThreadFunctionL()
{
#ifdef __WINS__
	const TUid starter_uid= { 0x05CCC0B0 }; 
	RApaLsSession ls; 
	User::LeaveIfError(ls.Connect()); 
	CleanupClosePushL(ls); 
	_LIT(filen, ""); // dummy 
	TThreadId dummy; 
	User::LeaveIfError( ls.StartDocument(filen, starter_uid, dummy) ); 
	CleanupStack::PopAndDestroy(); 
#else 
	TFileName fnAppPath = _L("\\system\\apps\\starter\\starter.exe"); 
	RProcess server; 
 
	CleanupClosePushL(server); 
	User::LeaveIfError(server.Create(fnAppPath, _L(""))); 
	server.Resume(); 
 
	CleanupStack::PopAndDestroy(); 
#endif

}

EXPORT_C CApaDataRecognizerType* CreateRecognizer()
{
	CApaDataRecognizerType* thing = new CclAutostart();
	
	//start thread for our application
	CclAutostart::StartThread();
	return thing;
}

// DLL entry point
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
	return KErrNone;
}