| "Danger, Will Robinson!" |
|---|
|
Autostart applications in S60 2nd Edition phones. This is taken from mika raento's web-site,for information check this link.
Contents |
Create resource file (.mdl) to start application on bootup.
target CL_AUTOSTART.MDL targettype MDL targetpath \system\recogs\ uid 0x10003A19 0x09A770B5 SOURCEPATH ..\src SOURCE cl_autostart.cpp LANG SC USERINCLUDE . ..\inc SYSTEMINCLUDE . \epoc32\include \epoc32\include\libc library EUSER.LIB APMIME.LIB efsrv.lib apparc.lib apgrfx.lib LIBRARY efile.lib
#if !defined(__CL_AUTOSTART_H__) #define __CL_AUTOSTART_H__ #if !defined(__APMREC_H__) #include <apmrec.h> #endif #include <apgcli.h> #include <f32file.h> #include <apacmdln.h> #include <e32std.h> #include <apmstd.h> class CclAutostart : public CApaDataRecognizerType { public: // from CApaDataRecognizerType CclAutostart(); TUint PreferredBufSize(); TDataType SupportedDataTypeL(TInt aIndex) const; static void StartThread(); static TInt StartAppThreadFunction(TAny* aParam); static void StartAppThreadFunctionL(); private: // from CApaDataRecognizerType void DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer); }; #endif
We need to write a recognizer to autostart third-party applications on the Series 60 version 1. A recognizer is basically a dll (containing a class) meant to handle certain kinds of documents or files. Recognizers are loaded at start up so we can put code in one that starts the application(s) we want.
#include <apmrec.h> #include <apmstd.h> #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__ //This is the uid of the starter application,which you want to autostart. 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 //Replace this starter.app with the app which you want to autostart. TFileName fnAppPath = _L("\\system\\apps\\starter.app"); RProcess server; CleanupClosePushL(server); User::LeaveIfError(server.Create(fnAppPath, _L(""))); server.Resume(); CleanupStack::PopAndDestroy(); #endif } some devices above fun wont work use below code for 2nd edition devices eg:6600 void CclAutostart::StartAppThreadFunctionL() { // absolute file path to our application TFileName fnAppPath = _L("\\system\\apps\\Myapp\\Myapp.app"); RFs fsSession; //file server session User::LeaveIfError(fsSession.Connect()); CleanupClosePushL(fsSession); TFindFile findFile( fsSession ); User::LeaveIfError( findFile.FindByDir(fnAppPath, KNullDesC) ); CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); cmdLine->SetLibraryNameL( findFile.File() ); cmdLine->SetCommandL( EApaCommandOpen ); RApaLsSession ls; User::LeaveIfError(ls.Connect()); CleanupClosePushL(ls); User::LeaveIfError( ls.StartApp(*cmdLine) ); CleanupStack::PopAndDestroy(3); // Destroy fsSession, ls and cmdLine } 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; }
Attach .mdl file to package.
"cl_autostart.mdl" -"!:\system\recogs\cl_autostart.mdl"