diff -r 000000000000 -r 2e3d3ce01487 appfw/apparchitecture/apserv/APSRECUTIL.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/appfw/apparchitecture/apserv/APSRECUTIL.CPP Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,268 @@ +// Copyright (c) 1997-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: +// +// Description: +// Classes for synchronous and asynchronous file recognitions (of a directory) +// +// apsrecutil.cpp +// + + +#include "APSRECUTIL.H" +#include "APSRECCACHE.h" + +// +// CRecognitionResult +// + +CRecognitionResult* CRecognitionResult::NewL(const TDesC& aFileName, const TDataRecognitionResult& aRecognitionResult) + { + ASSERT(aFileName.Find(_L("\\")) == KErrNotFound); // the filename should not contain any path + + HBufC* fileName = aFileName.AllocLC(); + HBufC8* dataType = aRecognitionResult.iDataType.Des8().AllocLC(); + CRecognitionResult* self = new(ELeave) CRecognitionResult(fileName, dataType, aRecognitionResult.iDataType.Uid(), aRecognitionResult.iConfidence); + CleanupStack::Pop(2, fileName); + return self; + } + +CRecognitionResult::CRecognitionResult(HBufC* aFileName, HBufC8* aDataType, TUid aUid, TInt aConfidence) + : iFileName(aFileName), + iDataType(aDataType), + iUid(aUid), + iConfidence(aConfidence) + { + } + +CRecognitionResult::~CRecognitionResult() + { + delete iFileName; + delete iDataType; + } + +void CRecognitionResult::Get(TDataRecognitionResult& aRecognitionResult) + { + if(iUid == KNullUid) + aRecognitionResult.iDataType = TDataType(*iDataType); + else + aRecognitionResult.iDataType = TDataType(iUid); + + aRecognitionResult.iConfidence = iConfidence; + } + + + +TUint CRecognitionResult::GetRequiredBufferSize() const + { + return iFileName->Size() + iDataType->Size() + sizeof(TUid) + sizeof(TInt) + 2; + } + +void CRecognitionResult::WriteToStreamL(RWriteStream& aWriteStream) + { + aWriteStream.WriteUint8L(iFileName->Length()); + aWriteStream.WriteL(*iFileName); + aWriteStream.WriteUint8L(iDataType->Length()); + aWriteStream.WriteL(*iDataType); + aWriteStream.WriteInt32L(iUid.iUid); + aWriteStream.WriteInt32L(iConfidence); + } + +// +// CDirectoryRecognitionResult +// + +CDirectoryRecognitionResult::CDirectoryRecognitionResult(HBufC* aPath, HBufC8* aDataTypeFilter) + : iPath(aPath), iDataTypeFilter(aDataTypeFilter) + { + iRequiredBufferSize = sizeof(TUint); + } + +CDirectoryRecognitionResult::~CDirectoryRecognitionResult() + { + delete iPath; + delete iDataTypeFilter; + + const TInt count = iEntries.Count(); + for(TInt i = 0; i < count; i++) + iEntries[i]->Close(); + + iEntries.Reset(); + } + +void CDirectoryRecognitionResult::AppendL(CRecognitionResult* aEntry) + { + if(iDataTypeFilter) + { + if(aEntry->DataType().Match(*iDataTypeFilter) == KErrNotFound) + { + aEntry->Close(); //if we don't take ownership we must decrease reference count + return; + } + } + + iEntries.AppendL(aEntry); + iRequiredBufferSize += aEntry->GetRequiredBufferSize(); + } //lint !e818: Pointer parameter could be declared as pointing to const + +void CDirectoryRecognitionResult::WriteToStreamL(RWriteStream& aWriteStream) + { + aWriteStream.WriteUint32L(iEntries.Count()); + for (TInt i=0; i < iEntries.Count(); i++) + iEntries[i]->WriteToStreamL(aWriteStream); + + aWriteStream.CommitL(); + } + +// +// CFileRecognitionUtility +// + +CFileRecognitionUtility::CFileRecognitionUtility(CApaAppArcServer& aServer, TInt aMaxBufSize, RFs& aFs) + : CActive(0), + iServer(aServer), + iMaxBufSize(aMaxBufSize), + iFs(aFs), + iIndex(0), + iStep(0) + { + CActiveScheduler::Add(this); + } + +CFileRecognitionUtility::~CFileRecognitionUtility() + { + Cancel(); + delete iEntryList; + + iPath = NULL; + iResult = NULL; + } + +void CFileRecognitionUtility::RecognizeSynchronouslyL(CDirectoryRecognitionResult& aResult) + { + iPath = &(aResult.Path()); + iResult = &aResult; + + User::LeaveIfError(iFs.IsValidName(iPath->Des())); + + ReadDirectoryL(); + + // recognize files and calculate size of buffer + for(iIndex=0;iIndexCount();iIndex++) + RecognizeFileL(); + + delete iEntryList; + iEntryList = NULL; + } + +void CFileRecognitionUtility::RecognizeAsynchronously(CDirectoryRecognitionResult& aResult, const RMessage2& aMessage) + { + iIndex = 0; + iStep = 0; + iPath = &(aResult.Path()); + iResult = &aResult; + iMessage = aMessage; + + NextStep(); + } + +void CFileRecognitionUtility::ReadDirectoryL() + { + delete iEntryList; + iEntryList = NULL; + + // read directory content + User::LeaveIfError(iFs.GetDir(iPath->Des(),KEntryAttNormal,EDirsAnyOrder,iEntryList)); + } + +TInt CFileRecognitionUtility::BufferSizeL() const + { + const TInt preferredBufferSize = iServer.DataRecognizerPreferredBufSizeL(); + TInt bufSize = Min(preferredBufferSize,iMaxBufSize); + if (bufSize < 1) + bufSize = 8; // sensible minimum. + + return bufSize; + } + +void CFileRecognitionUtility::RecognizeFileL() + { + TFileName fullFileName(*iPath); + fullFileName.Append((*iEntryList)[iIndex].iName); + RFile file; + User::LeaveIfError(file.Open(iFs, fullFileName, EFileRead | EFileShareReadersOnly)); + CleanupClosePushL(file); + + CRecognitionResult* result = NULL; + TRAP_IGNORE(result = iServer.RecognizeDataAsCRecognitionResultL(file, BufferSizeL())); + if(result) + { + CleanupClosePushL(*result); + iResult->AppendL(result); + CleanupStack::Pop(result); + } + + CleanupStack::PopAndDestroy(&file); + } + +void CFileRecognitionUtility::CancelRecognitionRequest() + { + if(iStep <= 1) + { + Cancel(); + iMessage.Complete(KErrCancel); + } + } + +void CFileRecognitionUtility::NextStep() + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete(pStatus, KErrNone); + SetActive(); + } + +void CFileRecognitionUtility::RunL() + { + switch(iStep) + { + case 0: // first step: read the directory content + ReadDirectoryL(); + iIndex=0; + iStep++; + NextStep(); + break; + case 1: // read current file and recognize it + if(iIndex < iEntryList->Count()) + { + RecognizeFileL(); + iIndex++; + NextStep(); + } + else // finished + { + iMessage.WriteL(1,TPckgBuf(iResult->RequiredBufferSize())); + iMessage.Complete(KErrNone); + iStep++; // to show that we have completed the request + delete iEntryList; + iEntryList = NULL; + } + break; + default: + break; + } + } + +void CFileRecognitionUtility::DoCancel() + { + iIndex = 0; + iStep = 0; + } +