| "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"
No related wiki articles found