landmarksui/engine/src/CLmkParser.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /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 <apgcli.h>
+#include <lmkerrors.h>
+
+// 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<TUint>& 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