#include <eikenv.h> //for CEikProcess
#include <eikproc.h> //for CEikProcess
#include <PathInfo.h> //for PathInfo
#include <apgcli.h> //for RApaLsSession
#include <apacln.h> // for TApaDocCleanupItem
#include "LaunchCamera.h"
CLaunchCamera* CLaunchCamera::NewL(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )
{
CLaunchCamera* self = NewLC(pEvenCallBack ,pEikonEnv);
CleanupStack::Pop(self);
return self;
}
CLaunchCamera* CLaunchCamera::NewLC(MCameraEvenCallBack * pEvenCallBack,CEikonEnv * pEikonEnv )
{
CLaunchCamera* self = new (ELeave) CLaunchCamera;
CleanupStack::PushL(self);
self->ConstructL(pEvenCallBack,pEikonEnv);
return self;
}
void CLaunchCamera::ConstructL(MCameraEvenCallBack * pEvenCallBack , CEikonEnv * pEikonEnv)
{
m_pProcess = NULL ;
m_pAppdoc = NULL ;
m_pCallBack = pEvenCallBack ;
m_pEikonEnv = pEikonEnv ;
m_bCloseCamera = FALSE ;
}
CLaunchCamera::CLaunchCamera()
{
m_pAppdoc = NULL ;
}
CLaunchCamera::~CLaunchCamera()
{
//CloseCamera() ;
m_pEikonEnv = NULL ;
m_pCallBack = NULL ;
}
// Function name : CLaunchCamera::OpenCamera
// Description : Open camera and review
// Return type : TURE if successful, otherwise FALSE
TBool CLaunchCamera::OpenCamera()
{
if( m_pEikonEnv == NULL ) return FALSE ;
TApaAppInfo appInfo;
if( FindCamera( appInfo) == FALSE ) return FALSE ;
m_pProcess = m_pEikonEnv->Process();
m_pAppdoc = m_pProcess->AddNewDocumentL(appInfo.iFullName, appInfo.iUid);
ASSERT( m_pAppdoc != NULL ) ;
TApaDocCleanupItem cleanup(m_pProcess, m_pAppdoc);
CleanupStack::PushL(cleanup);
m_pAppdoc->NewDocumentL();
CleanupStack::Pop(); // cleanup
m_bCloseCamera = FALSE ;
m_pAppdoc->EditL(this, EFalse );
return TRUE ;
}
void CLaunchCamera::CloseCamera()
{
if( m_pProcess )
{
m_pProcess->DestroyDocument(m_pAppdoc) ;
m_pProcess = NULL ;
m_pAppdoc = NULL ;
}
m_bCloseCamera = TRUE ;
}
TBool CLaunchCamera::FindCamera(TApaAppInfo & appInfo)
{
RApaLsSession apaTmpLs;
User::LeaveIfError(apaTmpLs.Connect());
CleanupClosePushL(apaTmpLs);
User::LeaveIfError(apaTmpLs.GetAllApps());
TBool bFindCamera = FALSE ;
appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;
appInfo.iFullName.Zero() ;
while(apaTmpLs.GetNextApp(appInfo) == KErrNone)
{
appInfo.iFullName.LowerCase() ;
TInt nTmpID = appInfo.iFullName.Compare(KCameraAppString) ;
if( nTmpID == 0 )
{
bFindCamera = TRUE ;
break ;
}
appInfo.iFullName.FillZ(appInfo.iFullName.MaxLength()) ;
appInfo.iFullName.Zero() ;
}
CleanupStack::PopAndDestroy(); // apaTmpLs
return bFindCamera ;
}
// Function name : CLaunchCamera::NotifyExit
// Description : when selected "select", frame will call this function
// Return type : void
// Argument : TExitMode aMode
void CLaunchCamera::NotifyExit(TExitMode aMode)
{
if( aMode == EKeepChanges )
{
//不能在这里调,否则设备为crash
//m_pProcess->DestroyDocument(m_pAppdoc) ;
FindNewFile() ;
}
else
{
//m_pProcess->DestroyDocument(m_pAppdoc) ;
if( m_pCallBack )
m_pCallBack->Camera_HandleFile(CFT_NoFind, _L("FileNotSelect"));
}
m_bCloseCamera = TRUE ;
}
TBool CLaunchCamera::EnableCloseCamera()
{
return m_bCloseCamera ;
}
// Function name : CLaunchCamera::FindNewFile
// Description : Search the last new files
//if find the last new file, call Camera_HandleFile to caller
// Return type : void
void CLaunchCamera::FindNewFile()
{
if( m_pCallBack == NULL ) return ;
TFileName PhoneIamgePath ;
TFileName MemoryIamgePath ;
TFileName PhoneVideoPath ;
TFileName MemoryVideoPath ;
PhoneIamgePath.Append(PathInfo::PhoneMemoryRootPath()) ;
PhoneIamgePath.Append(PathInfo::ImagesPath());
MemoryIamgePath.Append(PathInfo::MemoryCardRootPath()) ;
MemoryIamgePath.Append(PathInfo::ImagesPath()) ;
PhoneVideoPath.Append(PathInfo::PhoneMemoryRootPath()) ;
PhoneVideoPath.Append(PathInfo::VideosPath()) ;
MemoryVideoPath.Append(PathInfo::MemoryCardRootPath()) ;
MemoryVideoPath.Append(PathInfo::VideosPath()) ;