picodrive/platform/s60/Picodriveapps60.cpp
notaz cc68a136aa initial import
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@2 be3aeb3a-fb24-0410-a615-afba39da0efa
2006-12-19 20:53:21 +00:00

178 lines
3.1 KiB
C++

#include "PicoDriveAppS60.h"
#include <picodrives60.rsg>
#include <apgcli.h>
#include <eikdll.h>
EXPORT_C CApaApplication* NewApplication()
{
return (new CPicoDrive);
}
CPicoDrive::CPicoDrive()
{
}
CPicoDrive::~CPicoDrive()
{
}
CApaDocument* CPicoDrive::CreateDocumentL()
{
return new (ELeave) CPicoDriveDoc(*this);
}
TUid CPicoDrive::AppDllUid() const
{
return TUid::Uid(0x101F9B49);
}
CPicoDriveDoc::CPicoDriveDoc(CEikApplication& aApp):CAknDocument(aApp)
{
}
CPicoDriveDoc::~CPicoDriveDoc()
{
}
CEikAppUi* CPicoDriveDoc::CreateAppUiL()
{
return new (ELeave) CPicoDriveUi;
}
void CPicoDriveUi::HandleForegroundEventL(TBool aForeground)
{
if(aForeground)
{
BringUpEmulatorL();
}
}
CPicoDriveUi::CPicoDriveUi()
{
}
CPicoDriveUi::~CPicoDriveUi()
{
RemoveFromViewStack(*iView,iView);
DeregisterViewAndRemoveStack(*iView);
delete iView;
if(iWatcher)
{
iThreadWatch.LogonCancel(iWatcher->iStatus);
iWatcher->Cancel();
}
delete iWatcher;
iThreadWatch.Close();
}
void CPicoDriveUi::ConstructL()
{
BaseConstructL();
iView = new(ELeave)CPicoView;
iView->SetMopParent(this);
iView->ConstructL();
RegisterViewAndAddStackL(*iView);
AddToViewStackL(*iView,iView);
SetDefaultViewL(*iView);
TBuf<128> startFile;
startFile = iEikonEnv->EikAppUi()->Application()->AppFullName();
TParse parser;
parser.Set(startFile,NULL,NULL);
startFile = parser.DriveAndPath();
#ifndef __WINS__
startFile.Append( _L("PicoDrive.EXE"));
#else
startFile.Append( _L("PicoDrive.DLL"));
#endif
CApaCommandLine* cmdLine=CApaCommandLine::NewLC(startFile);
RApaLsSession lsSession;
lsSession.Connect();
CleanupClosePushL(lsSession);
lsSession.StartApp(*cmdLine,iThreadId);
CleanupStack::PopAndDestroy();//close lsSession
CleanupStack::PopAndDestroy(cmdLine);
User::After(500000);// Let the application start
TApaTaskList taskList(iEikonEnv->WsSession());
TApaTask myTask=taskList.FindApp(TUid::Uid(0x101F9B49));
myTask.SendToBackground();
TApaTask exeTask=taskList.FindByPos(0);
iExeWgId=exeTask.WgId();
if(iThreadWatch.Open(iThreadId)==KErrNone)
{
iWatcher = new (ELeave)CPicoWatcher;
iWatcher->iAppUi=this;
iThreadWatch.Logon(iWatcher->iStatus);
}
}
CPicoWatcher::CPicoWatcher():CActive(EPriorityStandard)
{
CActiveScheduler::Add(this);
iStatus=KRequestPending;
SetActive();
}
CPicoWatcher::~CPicoWatcher()
{
}
void CPicoWatcher::DoCancel()
{
}
void CPicoWatcher::RunL()
{
iAppUi->HandleCommandL(EEikCmdExit);
}
void CPicoDriveUi::BringUpEmulatorL()
{
RThread thread;
if(thread.Open(iThreadId)==KErrNone)
{
thread.Close();
TApaTask apaTask(iEikonEnv->WsSession());
apaTask.SetWgId(iExeWgId);
apaTask.BringToForeground();
}
else
{
iExeWgId=-1;
}
}
void CPicoDriveUi::HandleCommandL(TInt aCommand)
{
switch(aCommand)
{
case EEikCmdExit:
{
RThread thread;
if(thread.Open(iThreadId)==KErrNone)
{
thread.Terminate(0);
thread.Close();
}
Exit();
}
break;
}
}
GLDEF_C TInt E32Dll(TDllReason)
{
return KErrNone;
}