diff -r e1e28b0273b0 -r 93fff7023be8 EngSrc/IEImageFinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EngSrc/IEImageFinder.cpp Fri Oct 15 10:18:29 2010 +0900 @@ -0,0 +1,391 @@ +/* +* 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 +#include "IEImageFinder.h" +#include "IEImageList.h" +#include "IEImageProcessing.h" +#include "IEImageData.h" +#include "IEEngineImp.h" +#include "IEEngineUtils.h" +#ifdef _S60_5x_ACCELEROMETER_ +#include "IESensorMonitor.h" +#endif + +#define LATETHUMBCHECK + +// ================= MEMBER FUNCTIONS ======================= + +CIEImageFinder* CIEImageFinder::NewL( + CIEFileLoader* aCallback, + RArray& aFileNameData, + RArray& aFaceFileNameData, + RCriticalSection* aCritical) + { + CIEImageFinder* self = new(ELeave) CIEImageFinder(aCallback, aFileNameData, aFaceFileNameData, aCritical); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CIEImageFinder* CIEImageFinder::NewLC( + CIEFileLoader* aCallback, + RArray& aFileNameData, + RArray& aFaceFileNameData, + RCriticalSection* aCritical) + { + CIEImageFinder* self = new(ELeave) CIEImageFinder(aCallback, aFileNameData, aFaceFileNameData, aCritical); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CIEImageFinder::CIEImageFinder( + CIEFileLoader* aCallback, + RArray& aFileNameData, + RArray& aFaceFileNameData, + RCriticalSection* aCritical) : + //iList(aFileNameData, aCallback), + iCallback(aCallback), + iFileNameData(aFileNameData), + iFaceFileNameData(aFaceFileNameData), + iCritical(aCritical), + iIEEngineUtils(iFileServer) + { + DP0_IMAGIC(_L("CIEImageFinder::CIEImageFinder++ --")); + } + + +void CIEImageFinder::ConstructL() + { + DP0_IMAGIC(_L("CIEImageFinder::ConstructL++")); + + User::LeaveIfError(iFileServer.Connect()); + + iImageList = &iCallback->GetImageList(); + + //iFileSystemMonitor = CFileSystemMonitorAO::NewL(iFileServer, this); + + // Creating Engine Utility class pointer */ + + DP0_IMAGIC(_L("CIEImageFinder::ConstructL--")); + } + +CIEImageFinder::~CIEImageFinder() + { + DP0_IMAGIC(_L("CIEImageFinder::~CIEImageFinder++")); + + iFileServer.Close(); + + DP0_IMAGIC(_L("CIEImageFinder::~CIEImageFinder--")); + } + +TBool CIEImageFinder::IsSearching() const + { + return (iCallback->ImageFinderState() == CIEFileLoader::EImageFinderRunning); + } + +void CIEImageFinder::StartFinderL(const TDesC& aSearchName) + { + DP0_IMAGIC(_L("CIEImageFinder::StartFinderL++")); + +#ifdef IMAGIC_DATABASE + // Read initial list from database + TRAP_IGNORE(iImageList->ReadDatabaseL()); +#endif + if (IsSearching()) + SearchFilesL(aSearchName); + + DP0_IMAGIC(_L("CIEImageFinder::StartFinderL--")); + } + +void CIEImageFinder::SearchFilesL(const TDesC& aSearchName) + { + DP0_IMAGIC(_L("CIEImageFinder::SearchFilesL++")); + + // Use phone memory, external memory card and internal memory card for file scanning + TFileName rootPathPhoneMemory = PathInfo::PhoneMemoryRootPath(); + rootPathPhoneMemory.Append(ImagePath); + + TFileName rootPathMCard = PathInfo::MemoryCardRootPath(); + rootPathMCard.Append(ImagePath); + + TFileName rootPathFDrive; + rootPathFDrive.Copy(KRootPathFDrive); + rootPathFDrive.Append(ImagePath); + + //Append drives to array + RArray drives; + drives.Append(rootPathPhoneMemory); + drives.Append(rootPathMCard); + drives.Append(rootPathFDrive); + + DP0_IMAGIC(_L("CIEImageFinder::SearchFilesL start")); + + for(TInt i=0; iSetScanDataL( + drives[i], + KEntryAttDir|KEntryAttMatchExclusive, + EDirDescending/*|EDescending*/|ESortByDate, + CDirScan::EScanUpTree)); + + if(err == KErrNone) + { + CDir* dir; + while(IsSearching()) + { + TRAP(err, dirScan->NextL(dir)); + if(err != KErrNone || dir == NULL) + { + if (dir) + delete dir; + break; + } + + TRAP(err, ScanDirL(dir, dirScan->FullPath(), aSearchName)); + delete dir; + if (err != KErrNone) + break; + } + } + + delete dirScan; + } + } + +#ifdef IMAGIC_DATABASE + // Remove files from deleted directories + if (IsSearching()) + iImageList->RemoveNonExistImagesL(NULL, iFileServer); +#endif + +#ifdef LATETHUMBCHECK + // Check all thumbnails + for (TInt i = 0;i < iFileNameData.Count() && IsSearching();i++) + { + CheckCreatedThumbnails(*iFileNameData[i]); + + // Number of faces is unknown and thumbnail exists + if (iFileNameData[i]->GetNumberOfFaces() < 0 && + iFileNameData[i]->IsImageReady(ESize512x512)) + { + // Read number of faces from thumb's exif + RArray faceCoordinates; + TFileName fileName; + iFileNameData[i]->GetFileName(fileName, ESize512x512); + TRAPD(error, iIEEngineUtils.ReadFaceCoordinatesL(fileName, faceCoordinates)); + if (error == KErrNone) + { + TInt count = faceCoordinates.Count(); + DP2_IMAGIC(_L("Read face# %d for %S"), count, &fileName); + iFileNameData[i]->SetNumberOfFaces(count); + iImageList->SetChanged(fileName); + } + } + } +#endif + + // Let engine know that all file has been added to filename array + //iCallback->AllFilesAddedToFilenameArray(); + + drives.Close(); + +#ifdef IMAGIC_DATABASE + // Write list to database + TRAP_IGNORE(iImageList->WriteDatabaseL()); +#endif + + DP0_IMAGIC(_L("CIEImageFinder::SearchFilesL--")); + } + +void CIEImageFinder::ScanDirL(CDir* aDir, const TDesC& aDirPath, const TDesC& aWild) + { + DP1_IMAGIC(_L("CIEImageFinder::ScanDirL++ %S"), &aDirPath); + + TParse parse; + parse.Set(aWild, &aDirPath, NULL); + TPtrC spec(parse.FullName()); + + /*if(aDirPath.Find(KCRootBgroundImages) != KErrNotFound) + return;*/ + + TFindFile findFile(iFileServer); + + if (findFile.FindWildByPath(parse.FullName(), NULL, aDir) == KErrNone) + { + // Sort in time order + aDir->Sort(EDescending|ESortByDate); + + // Go through dir in inverted order + for(TInt i = 0;i < aDir->Count() && IsSearching();i++) + { + parse.Set((*aDir)[i].iName, &spec, NULL); + + // Full filename with path of original image + TFileName imageFileName; + imageFileName = parse.FullName(); + + // Check if file exist and not be hidden + TBool visible = EFalse; + TRAPD(err, visible = iImageList->IsImageViewableL(imageFileName, iFileServer)); + if (err != KErrNone || !visible) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - not found or hidden file")); + continue; + } + + CImageData* imageData = iImageList->GetImageData(imageFileName); + + // Read file time + TTime fileTime(0); + TRAP(err, iIEEngineUtils.GetModifiedTimeL(imageFileName, fileTime)); + if (err != KErrNone) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - get file time failed")); + + // File is locked for writing, use old file time if possible + if (imageData == NULL) + continue; + else + fileTime = imageData->GetFileTime(); + } + + // Image already exist in list + if (imageData != NULL) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - image exist")); + // File has been changed + if (imageData->GetFileTime() != fileTime) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - file time is different")); + // Delete thumbnails and remove image from the list + iIEEngineUtils.DeleteThumbnails(imageFileName, iFileServer); + iImageList->Remove(iImageList->GetImageIndex(imageData), iFileServer); + imageData = NULL; + } + } + + // Image already exist + if (imageData == NULL) + { + // Read aspect ratio + TSize size; + TRAP(err, iIEEngineUtils.GetImageSizeL(imageFileName, size)); + if (err != KErrNone) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - get size failed")); + continue; + } + + // Read EXIF created time (use file time if EXIF fails) + TTime createdTime; + TUint16 orientation = 0; + TRAP(err, iIEEngineUtils.GetExifDateTimeAndOrientationL( + imageFileName, + createdTime, + orientation)); + + if (err != KErrNone) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - No EXIF date")); + createdTime = fileTime; + } + + // Add image to list + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - Call AddImageL")); + TRAP(err, imageData = iImageList->CreateImageDataL(imageFileName, createdTime, orientation)); + DP1_IMAGIC(_L("CIEImageFinder::ScanDirL - AddImageL returned: err:% d"), err); + + if (err != KErrNone) + { + imageData = NULL; + } + else if (imageData) + { + imageData->SetFileTime(fileTime); + imageData->SetSize(size); + iImageList->AddImage(imageData); + } + iImageList->SetChanged(imageFileName); + } + + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - 03")); + // Mark original image as ready + if (imageData) + { + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL - 04")); + imageData->SetImageReady(EFullSize, ETrue); + } + } + + delete aDir; + } + +#ifdef IMAGIC_DATABASE + //RemoveDeletedImagesL(*array, &aDirPath); +#endif + + DP0_IMAGIC(_L("CIEImageFinder::ScanDirL--")); + } + +void CIEImageFinder::CheckCreatedThumbnails(CImageData& aImageData) const + { + TThumbSize sizes[] = { /*EFullSize,*/ ESize512x512, ESize128x128, ESize32x32 }; + + TInt numSizes = sizeof(sizes) / sizeof(TThumbSize); + for (TInt i = 0;i < numSizes; i++) + { + TFileName fileName; + aImageData.GetFileName(fileName, sizes[i]); + if (BaflUtils::FileExists(iFileServer, fileName)) + aImageData.SetImageReady(sizes[i], ETrue); + else + // Mark all smaller sizes non-exist + //while (i < numSizes) + { + aImageData.SetImageReady(sizes[i], EFalse); + //i++; + } + } + } + +void CIEImageFinder::FileSystemChanged() + { + //Scan filesystem for new images + //SearchForNewFilesL(KRootImagePath, KFileString); + +#ifdef __WINS__ + SearchFilesL(KFileString); +#else + TFileName rootPath = PathInfo::MemoryCardRootPath(); + rootPath.Append(ImagePath); + SearchFilesL(KFileString); +#endif + + }