diff -r 1fc85118c3ae -r 870918037e16 landmarksui/engine/src/CLmkEncoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkEncoder.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,326 @@ +/* +* 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 implements the methods which wrap functionality related +* to landmark encoding into a simpler interface. +* +*/ + + + + + + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include "LmkConsts.h" +#include "Debug.h" +#include "LmkFileUtils.h" +#include "CLmkAOOperation.h" +#include "CLmkEncoder.h" +#include "CLmkEncodeUnsavedLandmarksOp.h" +#include + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT8( KLandmarkMimeType, "application/vnd.nokia.landmarkcollection+xml" ); +// We wrap two async. tasks (export and write to file) into one +// using estimated 0.8/0.2 progress distribution: +const TReal32 KLmkExportMaxProgress( TReal32( 0.8 ) ); + +#if defined(_DEBUG) +_LIT( KPanicMsg, "CLmkEncoder" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +#endif +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkEncoder::CLmkEncoder +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkEncoder::CLmkEncoder( + CPosLandmarkDatabase& aDb, + MLmkAOOperationObserver& aObserver, + TBool aProgressNote ) + : iDb( aDb ), + iObserver( aObserver ), + iProgressNote( aProgressNote ) + { + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::NewL() +// ----------------------------------------------------------------------------- +// +EXPORT_C CLmkEncoder* CLmkEncoder::NewL( + CPosLandmarkDatabase& aDb, + MLmkAOOperationObserver& aObserver, + TBool aProgressNote ) + { + CLmkEncoder* self = + new ( ELeave ) CLmkEncoder( aDb, aObserver, aProgressNote ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::ConstructL() +// ----------------------------------------------------------------------------- +// +void CLmkEncoder::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::~CLmkEncoder() +// ----------------------------------------------------------------------------- +// +CLmkEncoder::~CLmkEncoder() + { + delete iAOOperation; + delete iEncoder; + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::HandleOperationL +// ----------------------------------------------------------------------------- +// +void CLmkEncoder::HandleOperationL( + TOperationTypes aType, + TReal32 aProgress, + TInt aStatus ) + { + DEBUG2( CLmkEncoder::HandleOperationL entered: progress=%d status=%d, + aProgress, aStatus ); + + __ASSERT_DEBUG( aType == EEncode, Panic( KLmkPanicUnknownOperation ) ); + + if ( aStatus != KPosLmOperationNotComplete ) + { + __ASSERT_DEBUG( iAOOperation, Panic( KLmkPanicNullMember ) ); + + delete iAOOperation; + iAOOperation = NULL; + + if ( iExporting && aStatus == KErrNone ) + { // start second part of asynchronous task + FinalizeEncodingL(); + aStatus = KPosLmOperationNotComplete; + } + } + + // Modify progress information because we have wrapped two tasks into one: + if ( iExporting && aStatus == KPosLmOperationNotComplete ) + { + aProgress = aProgress * KLmkExportMaxProgress; + } + else if ( !iExporting && aStatus == KPosLmOperationNotComplete ) + { // Progress of writing to file is between KLmkExportMaxProgress...1 + aProgress = KLmkExportMaxProgress + + aProgress * ( 1 - KLmkExportMaxProgress ); + } + + if( iProgressNote || aStatus != KPosLmOperationNotComplete ) + { // Caller either requested to receive all events, or we + // have completed entirely and inform that to the caller. + iObserver.HandleOperationL( aType, aProgress, aStatus ); + } +} + +// ----------------------------------------------------------------------------- +// CLmkEncoder::SetPackageNameL +// ----------------------------------------------------------------------------- +// +//EXPORT_C void CLmkEncoder::SetPackageNameL( const TDesC& aName ) +void CLmkEncoder::SetPackageNameL( const TDesC& aName ) + { + iEncoder->AddCollectionDataL( EPosLmCollDataCollectionName, aName ); + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::StartEncodingL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkEncoder::StartEncodingL( + const TDesC& aFileName, + const RArray& aLandmarkIdArray ) + { + DEBUG( CLmkEncoder::StartEncodingL entered ); + LeaveIfInUseL(); + PrepareEncoderL(aFileName); + if (aLandmarkIdArray.Count() > 1) // Only if multiple Landmarks Are selected + { + // Set the package name here + SetPackageNameL(aFileName); + } + + CPosLmOperation* operation = + iDb.ExportLandmarksL( *iEncoder, + aLandmarkIdArray, + CPosLandmarkDatabase::EIncludeCategories ); + CleanupStack::PushL( operation ); + iAOOperation = CLmkAOOperation::NewL( operation, + *this, + EEncode, + iProgressNote ); + CleanupStack::Pop( operation ); // ownership transferred + + iExporting = ETrue; // exporting part of encoding is being done + + DEBUG( CLmkEncoder::StartEncodingL: starting operation ); + iAOOperation->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::CancelEncodeOperationL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkEncoder::CancelEncodeOperationL() + { + if ( iAOOperation ) + { + iAOOperation->Cancel(); + delete iAOOperation; + iAOOperation = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::FinalizeEncodingL +// ----------------------------------------------------------------------------- +// +void CLmkEncoder::FinalizeEncodingL() + { + DEBUG( CLmkEncoder::FinalizeEncodingL entered ); + + LeaveIfInUseL(); + + CPosLmOperation* operation = iEncoder->FinalizeEncodingL(); + CleanupStack::PushL( operation ); + iAOOperation = CLmkAOOperation::NewL( operation, + *this, + EEncode, + iProgressNote ); + CleanupStack::Pop( operation ); // ownership transferred + + iExporting = EFalse; // write to file -part of encoding is being done + + DEBUG( CLmkEncoder::FinalizeEncodingL: starting operation ); + iAOOperation->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::LeaveIfInUseL +// ----------------------------------------------------------------------------- +// +void CLmkEncoder::LeaveIfInUseL() + { + if ( iAOOperation ) + { + User::Leave( KErrInUse ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::PrepareEncoderL +// ----------------------------------------------------------------------------- +// +void CLmkEncoder::PrepareEncoderL(const TDesC& aFileName) + { + // Full path name (Private path c:\\Provate\\UID3 + pacakge File name) + HBufC* nameBuf = HBufC::NewLC( 2 * KLmkPackageNameMaxLen + KLmkEncodedDataFileExtension().Length() ); + + // For getting private path + TPtr ptr = nameBuf->Des(); + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + fs.SessionPath(ptr); + fs.MkDirAll(ptr); + CleanupStack::PopAndDestroy(); // fs + + ptr.Append(aFileName); + ptr.Append(KLmkEncodedDataFileExtension); + TInt err = KErrNone; + + if ( !iEncoder ) + { + DEBUG( CLmkEncoder::StartEncodingL: creating encoder ); + TRAP(err, iEncoder = CPosLandmarkEncoder::NewL( KLandmarkMimeType )); + DEBUG( CLmkEncoder::StartEncodingL: encoder created); + } + if(err != KErrNone) + { + LmkFileUtils::DeleteFileL( ptr ); // Delete old file if it exists + CleanupStack::PopAndDestroy(nameBuf); //nameBuf + User::LeaveIfError( err ); + } + LmkFileUtils::DeleteFileL( ptr ); // Delete old file if it exists + iEncoder->SetOutputFileL( ptr ); + CleanupStack::PopAndDestroy(nameBuf); //nameBuf + } + +// ----------------------------------------------------------------------------- +// CLmkEncoder::StartEncodingL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkEncoder::StartEncodingL( + const TDesC& aFileName, + const RPointerArray& aLandmarks ) + { + DEBUG( CLmkEncoder::StartEncodingL entered ); + LeaveIfInUseL(); + PrepareEncoderL(aFileName); + if (aLandmarks.Count() > 1) // Only if multiple Landmarks Are selected + { + // Set the package name here + SetPackageNameL(aFileName); + } + + CPosLmOperation* operation = + CLmkEncodeUnsavedLandmarksOp::NewL( *iEncoder, + aLandmarks, + CPosLandmarkDatabase::EIncludeCategories); + CleanupStack::PushL( operation ); + iAOOperation = CLmkAOOperation::NewL( operation, + *this, + EEncode, + iProgressNote ); + CleanupStack::Pop( operation ); // ownership transferred + + iExporting = ETrue; // exporting part of encoding is being done + + DEBUG( CLmkEncoder::StartEncodingL: starting operation ); + iAOOperation->StartOperation(); + } +// End of File