diff -r e1e28b0273b0 -r 93fff7023be8 EngSrc/IEFileLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EngSrc/IEFileLoader.cpp Fri Oct 15 10:18:29 2010 +0900 @@ -0,0 +1,475 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: Juha Kauppinen, Mika Hokkanen +* +* Description: Photo Browser +* +*/ + +// Include files + +#include +#include + + +#include "IEEngineImp.h" +#include "IEFileLoader.h" +#include "IEImageFinder.h" +#include "ImageMonitorAO.h" + +#ifdef _S60_5x_ACCELEROMETER_ +#include "IESensorMonitor.h" +#endif + +#define IMAGEFINDERMONITORAO + +//_LIT(KFacesPath, "ImagicFaces"); + + +CIEFileLoader* CIEFileLoader::NewL( + RFs& aFileServer, + CIEEngineImp* aEngImp, + RCriticalSection* aCritical/*, TRequestStatus& aStatus*/) + { + DP0_IMAGIC(_L("CIEFileLoader::NewL++")); + + CIEFileLoader* self = new (ELeave) CIEFileLoader(aFileServer, aEngImp, aCritical/*, aStatus*/); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + DP0_IMAGIC(_L("CIEFileLoader::NewL--")); + return self; + } + +CIEFileLoader::~CIEFileLoader() + { + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader++")); + + // Save database file if needed + if (iImageList) + TRAP_IGNORE(iImageList->WriteDatabaseL()); + + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader 1")); +#ifdef IMAGEFINDERMONITORAO + if(iImageFinderMonitor->IsActive()) + { + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader 1.1")); + iImageFinderMonitor->Cancel(); + } + + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader 2")); + delete iImageFinderMonitor; + iImageFinderMonitor = NULL; +#endif + + // The object is created in ThreadEngine CreateThreadsL(). + // This is done because thread1 needs to cleanup before killing + // the thread. + iImageFinderThread->Stop(); + delete iImageFinderThread; + iImageFinderThread = NULL; + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader 3")); + + for(TInt i = 0;i < iFileNameData.Count();i++) + delete iFileNameData[i]; + + for(TInt i = 0;i < iFaceFilenameData.Count();i++) + delete iFaceFilenameData[i]; + + iFileNameData.Reset(); + iFileNameData.Close(); + + iFaceFilenameData.Reset(); + iFaceFilenameData.Close(); + + delete iImageList; + + //delete iFileSystemMonitor; + DP0_IMAGIC(_L("CIEFileLoader::~CIEFileLoader--")); + } + +CIEFileLoader::CIEFileLoader( + RFs& aFileServer, + CIEEngineImp* aEngImp, + RCriticalSection* aCritical) : + iFileServer(aFileServer), + iEngImp(aEngImp), + iCritical(aCritical) + { + + } + +void CIEFileLoader::ConstructL() + { + DP0_IMAGIC(_L("CIEFileLoader::ConstructL++")); + + iCurrentFileIndex = 0; + //iJpgFileCountingComplete = EFalse; + iImageFinderState = EImageFinderRunning; + + iImageList = CIEImageList::NewL(iFileNameData, this); + + TFileName rootPath; + + //iFileSystemMonitor = FileSystemMonitorAO::NewL(iFileServer, this); + //iFileSystemMonitor->StartMonitoring(); +#ifdef IMAGEFINDERMONITORAO + iImageFinderMonitor = CImageMonitorAO::NewL(iEngImp); + iImageFinderMonitor->iStatus = KRequestPending; + iImageFinderMonitor->ActiveRequest(); +#endif + //Create and start ImageFinder thread + iImageFinderThread = CFileFinderThread::NewL( + this, + iFileNameData, + iFaceFilenameData, + iCritical, + rootPath); + + iImageFinderThread->StartL(); + + iMainThreadId = RThread().Id(); + + DP0_IMAGIC(_L("CIEFileLoader::ConstructL--")); +} + +CIEFileLoader::TImageFinderState CIEFileLoader::ImageFinderState() const + { + return iImageFinderState; + //return (iImageFinderThread != NULL); + } + +CIEImageList& CIEFileLoader::GetImageList() + { + return *iImageList; + } + +void CIEFileLoader::StopImageFinder() + { + DP0_IMAGIC(_L("CIEFileLoader::Stop++")); + if (iImageFinderState == EImageFinderRunning) + iImageFinderState = EImageFinderStopping; + DP0_IMAGIC(_L("CIEFileLoader::Stop--")); + } + +void CIEFileLoader::ImageFinderStopped() + { + iImageFinderState = EImageFinderStopped; + } + +void CIEFileLoader::ImageListChanged(TInt aIndex, TBool aAdded) + { + iEngImp->GetObserver().ImageListChanged(aIndex, aAdded); + } + +/* Added new image */ +void CIEFileLoader::AddNewImage(CImageData* aTmpImageData, TInt aImageIndex) + { + //Insert new image data to filename array + iFileNameData.Insert(aTmpImageData, aImageIndex); + } + +/* Added new image */ +void CIEFileLoader::AddNewFaceCropImage(CImageData* aTmpImageData, TInt aImageIndex) + { + + //Insert new image data to filename array + aTmpImageData->iGridData.iCorrupted = EFalse; + aTmpImageData->iGridData.iRotationAngle = 0;//rotation angle of one image + aTmpImageData->iGridData.iTargetRotationAngle = 0;//target rotation angle of one image + aTmpImageData->iGridData.iX = aTmpImageData->iGridData.iY = aTmpImageData->iGridData.iZ = 0;//OpenGL Z coord + aTmpImageData->iGridData.iScale = 0;//OpenGL iScale + aTmpImageData->iGridData.iGlLQ32TextIndex = 0;//OpenGL 32x32 texture index + aTmpImageData->iGridData.iGlLQ128TextIndex = 0;//OpenGL 128x128 texture index + aTmpImageData->iGridData.iGlHQ512TextIndex = 0;//OpenGL 512x512 texture index + aTmpImageData->iGridData.iGlSuperHQTextIndex = 0;//OpenGL 2048x2048 texture index + + iFaceFilenameData.Insert(aTmpImageData, aImageIndex); + } + + +/* +void CIEFileLoader::StartFileSystemMonitoring() + { + //iFileSystemMonitor->StartMonitoring(); + } + +void CIEFileLoader::StopFileSystemMonitoring() + { + //iFileSystemMonitor->StopMonitoring(); + } + +void CIEFileLoader::FileSystemChanged() + { + + } +*/ +CIEEngineImp* CIEFileLoader::GetEngineImpPtr() + { + return iEngImp; + } + +void CIEFileLoader::ModifyImageData(CImageData* aTmpImageData, TInt aImageIndex) + { + //Insert new image data to filename array + iFileNameData[aImageIndex] = aTmpImageData; + } + + +/* All files are added to fine name array */ +void CIEFileLoader::AllFilesAddedToFilenameArray() + { +#ifdef IMAGEFINDERMONITORAO + TRequestStatus* status = &iImageFinderMonitor->iStatus; + RThread mainThread; + mainThread.Open( iMainThreadId ); + mainThread.RequestComplete( status, KErrNone ); +#else + iEngImp->AllFilesAddedToFilenameArrayL(); +#endif + DP0_IMAGIC(_L("CIEFileLoader::AllFilesAddedToFilenameArray 1")); + //JPG File counting completed + //iJpgFileCountingComplete = ETrue; + + } + +//Only used for getting number of TNs in file system +#if 0 +void CIEFileLoader::SearchFileCountL(const TDesC& aRootPath, const TDesC& aSearchName, TInt& aImageFileCount, TInt& aFacesFileCount) + { + DP0_IMAGIC(_L("CIEFileLoader::SearchFileCountL++")); + TInt error = KErrNone; + TInt tnFileCount = 0; + + CDirScan* dirScan = CDirScan::NewL(iFileServer); + dirScan->SetScanDataL(aRootPath, KEntryAttDir|KEntryAttMatchExclusive, ESortNone, CDirScan::EScanDownTree); + + while(1) + { + CDir* dir = NULL; + dirScan->NextL(dir); + + if(error || !dir) + break; + + delete dir; + + TBool isFace = EFalse; + TPtrC FacesDir = dirScan->FullPath(); + if(FacesDir.Find(KFacesPath) != KErrNotFound) + { + aFacesFileCount += ScanDirFileCountL(dirScan->FullPath(), aSearchName); + } + else + { + aImageFileCount += ScanDirFileCountL(dirScan->FullPath(), aSearchName); + } + } + + delete dirScan; + dirScan = NULL; + + DP0_IMAGIC(_L("CIEFileLoader::SearchFileCountL--")); + } + + +//Only used for getting number of TNs in file system +TInt CIEFileLoader::ScanDirFileCountL(const TDesC& aDir, const TDesC& aWild) +{ + DP0_IMAGIC(_L("CIEFileLoader::ScanDirFileCountL++")); + TParse parse; + TInt count = 0; + + parse.Set(aWild, &aDir, NULL); + TPtrC spec(parse.FullName()); + + TFindFile findFile(iFileServer); + CDir* dir; + + if (!findFile.FindWildByPath(parse.FullName(), NULL, dir)) + { + CleanupStack::PushL(dir); + + count = dir->Count(); + + CleanupStack::PopAndDestroy(dir); + } + + return count; + +} +#endif + +/* Deleting all corresponding Thumbnails including Gallery TNs */ +TInt CIEFileLoader::DeleteFile(TInt aIndex) + { + TInt err = KErrNotFound; + if(aIndex < iFileNameData.Count()) + { + err = DeleteFile(iFileNameData[aIndex]); + + if (err == KErrNone) + { + CImageData* imageData = iFileNameData[aIndex]; + iFileNameData.Remove(aIndex); + delete imageData; + iNumberOfImages = iFileNameData.Count(); + } + } + return err; + } + +TInt CIEFileLoader::DeleteFile(const CImageData* aImageData) + { + TFileName fileName; + TInt err = KErrNone; + + if(aImageData->IsImageReady(EFullSize)) + { + aImageData->GetFileName(fileName, EFullSize); + TInt err = iFileServer.Delete(fileName); + if (err != KErrNone) + return err; + } + + //Here if condition is not required. If the file does not exists + //then it returns not found system error code ? + //There is no value addition for extra check any way we have to remove + // that index from the array...( Cross check) + if(aImageData->IsImageReady(ESize128x128)) + { + aImageData->GetFileName(fileName, ESize128x128); + iFileServer.Delete(fileName); + } + + if(aImageData->IsImageReady(ESize512x512)) + { + aImageData->GetFileName(fileName, ESize512x512); + iFileServer.Delete(fileName); + } + + if(aImageData->IsImageReady(ESize32x32)) + { + aImageData->GetFileName(fileName, ESize32x32); + iFileServer.Delete(fileName); + } + + // Delete standard gallery thumbnail files + TFileName path, imageName; + aImageData->GetPath(path); + aImageData->GetFileName(imageName); + + const TPtrC thumbPaths[] = { + _L("_PAlbTN\\320x320\\"), _L("_320x320"), + _L("_PAlbTN\\320x240\\"), _L(""), + _L("_PAlbTN\\170x128\\"), _L("_170x128"), + _L("_PAlbTN\\"), _L("_128x96"), + _L("_PAlbTN\\64x64dat\\"), _L(""), + _L("_PAlbTN\\56x42\\"), _L("_56x42") + }; + + for (TInt i = 0;i < sizeof(thumbPaths) / sizeof(TPtrC) ;i+=2) + { + fileName = path; + fileName.Append(thumbPaths[i]); + fileName.Append(imageName); + fileName.Append(thumbPaths[i + 1]); + iFileServer.Delete(fileName); + } + + return err; + } + +/* Deleting all corresponding Thumbnails including Gallery TNs */ +TInt CIEFileLoader::DeleteFaceFile(TInt aIndex) + { + TInt err = KErrNotFound; + if(aIndex < iFaceFilenameData.Count()) + { + //Here if condition is not required. If the file does not exists + //then it returns not found system error code ? + //There is no value addition for extra check any way we have to remove + // that index from the array...( Cross check) + err = DeleteFile(iFaceFilenameData[aIndex]); + CImageData* imageData = iFaceFilenameData[aIndex]; + iFaceFilenameData.Remove(aIndex); + delete imageData; + iNumberOfFaces = iFaceFilenameData.Count(); + } + return err; + } + + +RArray& CIEFileLoader::GetFileNameArray() +{ + return iFileNameData; +} + +RArray& CIEFileLoader::GetFacesFileNameArray() +{ + return iFaceFilenameData; +} + +TInt CIEFileLoader::GetTotalNumOfImages() +{ + //return iNumberOfImages; + return iFileNameData.Count(); +} + +void CIEFileLoader::GetTotalNumOfImages(TInt& aNumOfImages, TInt& aNumOfFaces) + { + aNumOfImages = iFileNameData.Count(); + aNumOfFaces = iFaceFilenameData.Count(); + } + +void CIEFileLoader::GetUpdatedNumOfImages(TInt& aNumOfImages, TInt& aNumOfFaces) + { + aNumOfImages = iFileNameData.Count(); + aNumOfFaces = iFaceFilenameData.Count(); + } + +void CIEFileLoader::GetFileNameL(TInt aFileIndex, TFileName& aFileName, TThumbSize aThumbRes) +{ + if(aFileIndex < 0 || aFileIndex > iFileNameData.Count()) + { + User::Leave(KErrArgument); + } + else + { + iFileNameData[aFileIndex]->GetFileName(aFileName, aThumbRes); + } +} + +/*CImageData* CIEFileLoader::GetImageData(TInt aIndex) + { + return (aIndex < iFileNameData.Count()) ? iFileNameData[aIndex] : NULL; + }*/ + +CImageData* CIEFileLoader::GetImageData(TInt aIndex/*, TImageArrayMode aMode*/) + { + return (aIndex >= 0 && aIndex < iFileNameData.Count()) ? iFileNameData[aIndex] : NULL; + } + +void CIEFileLoader::SetImageData(TInt aIndex, CImageData* aGridData) + { + if(aIndex < iFileNameData.Count()) + iFileNameData[aIndex] = aGridData; + } + +#ifdef _ACCELEROMETER_SUPPORTED_ +TImagicDeviceOrientation CIEFileLoader::DeviceOrientation() + { + return iEngImp->GetDeviceOrientation(); + } +#endif + +// EOF