diff -r 1fc85118c3ae -r 870918037e16 landmarksui/engine/src/CLmkParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkParser.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,462 @@ +/* +* Copyright (c) 2002-2005 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: This file contains methods which interact with Landmarks Framework +* parser which does the job of parsing landmarks in the received +* landmark package +* +*/ + + + + + + + +// INCLUDE FILES + +#include "EPos_CPosLandmarkParser.h" +#include "EPos_CPosLandmarkDatabase.h" +#include "EPos_CPosLandmark.h" +#include "landmarks.hrh" +#include "LmkFileUtils.h" +#include "CLmkAOOperation.h" +#include "CLmkDbUtils.h" +#include "CLmkParser.h" +#include "CLmkParseAllWrapper.h" +#include +#include + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +#if defined(_DEBUG) +_LIT( KPanicMsg, "CLmkParser" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +#endif + +_LIT( KLmkTempDataFile, "c:\\system\\Temp\\LmkTemp.lmx" ); + +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkParser::CLmkParser +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkParser::CLmkParser( + CPosLandmarkDatabase& aDb, + MLmkAOOperationObserver& aObserver, + TBool aProgressNote ) + : iDb( aDb ), + iObserver( &aObserver ), + iProgressNote( aProgressNote ) + { + } + +// --------------------------------------------------------- +// CLmkParser::NewL +// --------------------------------------------------------- +// +EXPORT_C CLmkParser* CLmkParser::NewL( + const TDesC& aFile, + CPosLandmarkDatabase& aDb, + MLmkAOOperationObserver& aObserver, + TBool aProgressNote ) + { + CLmkParser* self = + new ( ELeave ) CLmkParser( aDb, aObserver, aProgressNote ); + CleanupStack::PushL( self ); + self->ConstructL( aFile ); + CleanupStack::Pop(); //self + return self; + } + +// --------------------------------------------------------- +// CLmkParser::NewL +// --------------------------------------------------------- +// +EXPORT_C CLmkParser* CLmkParser::NewL( + RFile& aFile, + CPosLandmarkDatabase& aDb, + MLmkAOOperationObserver& aObserver, + TBool aProgressNote ) + { + CLmkParser* self = + new ( ELeave ) CLmkParser( aDb, aObserver, aProgressNote ); + CleanupStack::PushL( self ); + self->ConstructL( aFile ); + CleanupStack::Pop(); //self + return self; + } + + +// ----------------------------------------------------------------------------- +// CLmkParser::ConstructL() +// ----------------------------------------------------------------------------- +// +void CLmkParser::ConstructL( const TDesC& aFile ) + { + + iDbUtils = CLmkDbUtils::NewL( iDb, *this, iProgressNote ); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile file; + LmkFileUtils::DeleteFileL(KLmkTempDataFile); + User::LeaveIfError(file.Create(fs, KLmkTempDataFile, EFileShareAny)); + CleanupClosePushL(file); + + RFile fileHandle; + User::LeaveIfError(fileHandle.Open(fs, aFile, EFileShareAny)); + CleanupClosePushL(fileHandle); + + TDataType mimeType; + User::LeaveIfError(ResolveMimeTypeL(fileHandle,mimeType)); + iParser = CPosLandmarkParser::NewL( mimeType.Des8()); + + HBufC8* tempBuf = HBufC8::NewLC(5000); // to manage for 5 Landmarks at the most + TPtr8 ptr = tempBuf->Des(); + User::LeaveIfError(fileHandle.Read( ptr )); + User::LeaveIfError(file.Write( ptr )); + + CleanupStack::PopAndDestroy(); // File + CleanupStack::PopAndDestroy(1); //tempBuf + + iParser->SetInputFileL( KLmkTempDataFile); + iParseWrapper = CLmkParseAllWrapper::NewL( *iParser, *this, iDb ); + iFileName = HBufC::NewL(256); + *iFileName = KLmkTempDataFile; + iFileHandleFlag = EFalse; + + CleanupStack::PopAndDestroy(); // File Handle + CleanupStack::PopAndDestroy(); // fs + } + +// ----------------------------------------------------------------------------- +// CLmkParser::ConstructL() +// ----------------------------------------------------------------------------- +// +void CLmkParser::ConstructL(RFile& aFile ) + { + iDbUtils = CLmkDbUtils::NewL( iDb, *this, iProgressNote ); + + TDataType mimeType; + User::LeaveIfError(ResolveMimeTypeL(aFile,mimeType)); + iParser = CPosLandmarkParser::NewL( mimeType.Des8()); + iParser->SetInputFileHandleL(aFile); + iParseWrapper = CLmkParseAllWrapper::NewL( *iParser, *this, iDb ); + + iFileHandle = &aFile; + iFileHandleFlag = ETrue; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::~CLmkParser() +// ----------------------------------------------------------------------------- +// +CLmkParser::~CLmkParser() + { + delete iAOOperation; + delete iParser; + delete iParseWrapper; + delete iDbUtils; + delete iFileName; + iFileHandle = NULL; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::HandleOperationL +// ----------------------------------------------------------------------------- +// +void CLmkParser::HandleOperationL( +TOperationTypes aType, +TReal32 aProgress, +TInt aStatus ) + { + // Initialize operation is not done with iAOOperation so in that case + // we don't delete iAOOperation. + if ( aType != EInitialize && aStatus != KPosLmOperationNotComplete ) + { + /* Parsing is done with iAOOperation when wrapper isn't used anymore. + * Remove the following if-statement when removing wrapper + */ + if( aType != EParse ) + { + __ASSERT_DEBUG( iAOOperation, Panic( KLmkPanicNullMember ) ); + + delete iAOOperation; + iAOOperation = NULL; + } + } + __ASSERT_DEBUG( iObserver, Panic( KLmkPanicNullMember ) ); + iObserver->HandleOperationL( aType, aProgress, aStatus ); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::FileName +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CLmkParser::FileName() + { + TInt error = KErrNone; + if( !iFileName ) + { + TRAP( error,iFileName = HBufC::NewL(256)); + } + if( !error ) + { + TPtr ptr = iFileName->Des(); + iFileHandle->Name( ptr ); + return *iFileName; + } + return TPtrC(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::FileHandle +// ----------------------------------------------------------------------------- +// +EXPORT_C RFile& CLmkParser::FileHandle() + { + return *iFileHandle; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::IsFileHandle +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CLmkParser::IsFileHandle() + { + return iFileHandleFlag; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::InitializeDbL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::InitializeDbL() + { + iDbUtils->InitializeDbL(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::StartParsingL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::StartParsingL() + { + LeaveIfInUseL(); + iParseWrapper->ParseAllL(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::NumOfParsedLandmarks +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CLmkParser::NumOfParsedLandmarks() + { + return iParseWrapper->NumOfLandmarks(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::PackageName +// ----------------------------------------------------------------------------- +// +EXPORT_C TPtrC CLmkParser::PackageName() + { + _LIT( KDot, "." ); + TPtrC ptr = iParser->CollectionData( EPosLmCollDataCollectionName ); + if( ptr.Length() == 0) + { + //get the position of '.' character + TInt pos = FileName().Find(KDot); + if( pos != KErrNotFound) + { + //get the left most string starting from '.' char + return FileName().Left( pos ); + } + else + { + return FileName(); + } + } + return ptr; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::LandmarkLC +// ----------------------------------------------------------------------------- +// +EXPORT_C CPosLandmark* CLmkParser::LandmarkLC( TInt aIndex ) + { + return iParseWrapper->LandmarkLC( aIndex ); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::LmkLandmarkLC +// ----------------------------------------------------------------------------- +// +EXPORT_C CLmkLandmark* CLmkParser::LmkLandmarkLC( TInt aIndex ) + { + return iParseWrapper->LmkLandmarkLC(aIndex); + } +// ----------------------------------------------------------------------------- +// CLmkParser::CategoryNameLC +// ----------------------------------------------------------------------------- +// +EXPORT_C CLmkLandMarkCategoriesName* CLmkParser::CategoryNameLC( TInt aIndex ) + { + /* THIS FUNCTIONALITY WILL BE USED WHEN WRAPPER IS REMOVED: + return iParser->LandmarkLC( aIndex ); + */ + return iParseWrapper->CategoryNameLC( aIndex ); + } + +// +// ----------------------------------------------------------------------------- +// CLmkParser::ChangeObserver +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::ChangeObserver( + MLmkAOOperationObserver& aNewObserver ) + { + iObserver = &aNewObserver; + } + +// ----------------------------------------------------------------------------- +// CLmkParser::StartImportingL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::StartImportingL(TBool aIncludeNewCategories) + { + LeaveIfInUseL(); + + CPosLandmarkDatabase::TTransferOptions options; + + if ( aIncludeNewCategories ) + { + options = CPosLandmarkDatabase::EIncludeCategories; + } + else + { + options = (CPosLandmarkDatabase::EIncludeCategories) | + (CPosLandmarkDatabase::ESupressCategoryCreation); + } + + CPosLmOperation* operation = + iDb.ImportLandmarksL( *iParser, options ); + CleanupStack::PushL( operation ); + iAOOperation = CLmkAOOperation::NewL( operation, + *this, + EImport, + iProgressNote ); + CleanupStack::Pop( operation ); // ownership transferred + + iAOOperation->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::StartImportingL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::StartImportingL( + const RArray& aSelected, TBool aIncludeNewCategories) + { + LeaveIfInUseL(); + + CPosLandmarkDatabase::TTransferOptions options; + + if ( aIncludeNewCategories ) + { + options = CPosLandmarkDatabase::EIncludeCategories; + } + else + { + options = (CPosLandmarkDatabase::EIncludeCategories) | (CPosLandmarkDatabase::ESupressCategoryCreation); + } + + CPosLmOperation* operation = + iDb.ImportLandmarksL( *iParser, aSelected, options ); + CleanupStack::PushL( operation ); + iAOOperation = CLmkAOOperation::NewL( operation, + *this, + EImport, + iProgressNote ); + CleanupStack::Pop( operation ); // ownership transferred + + iAOOperation->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkParser::CancelImporting +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkParser::CancelImporting() + { + if ( iAOOperation ) + { + iAOOperation->Cancel(); + delete iAOOperation; + iAOOperation = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CLmkParser::LeaveIfInUseL +// ----------------------------------------------------------------------------- +// +void CLmkParser::LeaveIfInUseL() + { + if ( iAOOperation ) + { + User::Leave( KErrInUse ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkParser::ResolveMimeTypeL +// ----------------------------------------------------------------------------- +// +TInt CLmkParser::ResolveMimeTypeL( RFile& aFile, TDataType& aDataType ) const + { + TInt result(KErrNotFound); + RApaLsSession ls ; + TDataRecognitionResult dataType; + TInt err( ls.Connect() ); + if ( err == KErrNone ) + { + CleanupClosePushL( ls ); + err = ls.RecognizeData(aFile, dataType); + if(err == KErrNone && + (dataType.iConfidence == CApaDataRecognizerType::EProbable + || dataType.iConfidence == CApaDataRecognizerType::ECertain + || dataType.iConfidence == CApaDataRecognizerType::EPossible)) + { + aDataType = dataType.iDataType; + result = KErrNone; + } + CleanupStack::PopAndDestroy(&ls); + } + return result; + } +// End of File