diff -r 1fc85118c3ae -r 870918037e16 landmarksui/msgviewer/src/CLmkMsgViewerAppUi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/msgviewer/src/CLmkMsgViewerAppUi.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,503 @@ +/* +* Copyright (c) 2002 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: LandmarksUi Content File - Provides LM UI class methods. +* +*/ + + + + + + + +// INCLUDE FILES +#include "CLmkMsgViewerAppUi.h" +#include "CLmkMsgViewerAppView.h" +#include "landmarks.hrh" +#include "CLmkMsgViewerDocument.h" +#include "CLmkParser.h" +#include "CLmkSender.h" +#include "CLmkPackageEditorImpl.h" +#include "CLmkDlgPackageSelectorImpl.h" +#include "LmkConsts.h" +#include "CLmkEditorDlg.h" +#include +#include +#include +#include +#include +#include +#include "LmkNotes.h" +#include + +#if defined(_DEBUG) +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CLmkMsgViewerAppUi"); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +} // namespace +#endif + +// Constant for periodic timer +const TInt KOneMicroSec = 1; + +// ================= LOCAL FUNCTIONS ======================= + +//----------------------------------------------------------------------- +// ErrorNoteL +// ---------------------------------------------------------------------------- +// +void ErrorNoteL(const TInt aResourceId) + { + HBufC* noteText = CEikonEnv::Static()->AllocReadResourceLC(aResourceId); + + CAknErrorNote* dialog = + new( ELeave ) CAknErrorNote( R_AKN_INFORMATION_NOTE_WAIT ); + dialog->ExecuteLD( *noteText ); + + CleanupStack::PopAndDestroy(noteText); //noteText + } + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------- +// CLmkMsgViewerAppUi::ConstructL +// ---------------------------------------------------------- +// +void CLmkMsgViewerAppUi::ConstructL() + { + + BaseConstructL( EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible); + + iAppView = CLmkMsgViewerAppView::NewL( ClientRect() ); + + // Start an idle timer to start the dialog synchronously. + iIdleTimer = CPeriodic::NewL(CActive::EPriorityIdle); + iIdleTimer->Start(KOneMicroSec, KOneMicroSec, + TCallBack(CallBackFuncL,this)); + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::~CLmkMsgViewerAppUi +// Destructor +// Frees reserved resources +// ---------------------------------------------------- +// +CLmkMsgViewerAppUi::~CLmkMsgViewerAppUi() + { + if ( iIdleTimer ) + { + delete iIdleTimer; + iIdleTimer = NULL; + } + + TInt err = KErrNone; + TRAP(err, CloseWaitNoteL()); + + delete iAppView; + delete iLmkSender; + delete iParser; + delete iDb; + + if( iDoorObserver ) + { + iDoorObserver->NotifyExit( MApaEmbeddedDocObserver::EEmpty ); + } + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::HandleCommandL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + // these all are same: save & exit + case EAknSoftkeyBack: + case EAknSoftkeyExit: + case EAknCmdExit: + case EEikCmdExit: + { + Exit(); + break; + } + default: + { + break; + } + } + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::LmkSender +// ---------------------------------------------------- +// +CLmkSender& CLmkMsgViewerAppUi::LmkSender() const + { + __ASSERT_DEBUG( iLmkSender, Panic( KLmkPanicNullMember ) ); + return *iLmkSender; + } + + +// ---------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::OpenFileL +// This is called by framework when application is already open in background +// and user opens other file +// New file to been shown is passed via aFileName. +// ---------------------------------------------------------------------------- +// +void CLmkMsgViewerAppUi::OpenFileL( const TDesC& aFileName ) + { + // File changed. + + // TODO: What to do with the possibly existing package? + // Should we just leave or do something else? + if ( iParser ) + { + User::Leave( KErrAlreadyExists ); + } + else + { + Document()->OpenFileL( EFalse, aFileName, iEikonEnv->FsSession() ); + } + } + + +// ---------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::OpenFileL +// This is called by framework when application is already open in background +// and user opens other file +// New file to been shown is passed via aFileName. +// ---------------------------------------------------------------------------- +// +void CLmkMsgViewerAppUi::OpenFileL(RFile& aFileHandle ) + { + // File changed. + if ( iParser ) + { + User::Leave( KErrAlreadyExists ); + } + else + { + CFileStore* aFileStore = NULL; + static_cast(Document())->OpenFileL(aFileStore, aFileHandle); + } + } + +// ---------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::ProcessCommandParametersL +// This method must return true or documents OpenFileL() get wrong file name. +// ---------------------------------------------------------------------------- +// +TBool CLmkMsgViewerAppUi::ProcessCommandParametersL( + TApaCommand /*aCommand*/, + TFileName& /*aDocumentName*/, + const TDesC8& /*aTail*/ ) + { + // Never call CEikAppUi::ProcessCommandParametersL(..) because + // it is so harmful to overwrite and destroy aDocumentName. + + // Return ETrue so that CLmkMsgViewerAppUi::OpenFileL() gets + // the right document name. + return ETrue; + } + + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::HandleOperationL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::HandleOperationL( + TOperationTypes aType, + TReal32 /*aProgress*/, + TInt aStatus ) + { + __ASSERT_DEBUG( ( aType == EInitialize || + aType == EParse ) && + aStatus != KPosLmOperationNotComplete, + Panic( KLmkPanicAlreadyActive ) ); + + TInt err = KErrNone; + if (aType == EInitialize) + { + TRAP(err, HandleDbInitFinishedL(aStatus)); + } + else // (aType == EParse) + { + TRAP(err, HandleParseFinishedL(aStatus)); + } + + if (err) + { + CloseWaitNoteL(); // when wait note closes, application exits + } + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::HandleDbInitFinishedL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::HandleDbInitFinishedL( TInt aStatus ) + { + if (aStatus != KErrNone) + { + CCoeEnv::Static()->HandleError(aStatus); + User::Leave(aStatus); + } + iParser->StartParsingL(); + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::HandleParseFinishedL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::HandleParseFinishedL( TInt aStatus ) + { + if (aStatus != KErrNone) + { + ErrorNoteL(R_LMK_BADPACKAGE_ERROR); + User::Leave(aStatus); + } + // now everything's ready for viewing + iDataReadyForView = ETrue; + CloseWaitNoteL(); // when wait note closes, view dialog opens + } + +void CLmkMsgViewerAppUi::CloseWaitNoteL() + { + if (iWaitDialog) + { + iWaitDialog->ProcessFinishedL(); + iWaitDialog = NULL; + } + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::ExecuteLmViewerL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::ExecuteLmViewerL() + { + __ASSERT_DEBUG( iParser->NumOfParsedLandmarks() == 1, + Panic( KLmkPanicOutOfRange ) ); + + CLmkPackageEditorImpl* editorImpl = + CLmkPackageEditorImpl::NewL( *iDb, *iParser, *iLmkSender, 0 ); + + // Parser observing responsibility is given to the lm viewer, + // application is not interested in it anymore: + iParser->ChangeObserver( *editorImpl ); + editorImpl->ExecuteLD(); + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::ExecutePkgViewerL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::ExecutePkgViewerL() + { + __ASSERT_DEBUG( iParser->NumOfParsedLandmarks() > 1, + Panic( KLmkPanicOutOfRange ) ); + + CLmkDlgPackageSelectorImpl* pkgViewer = + CLmkDlgPackageSelectorImpl::NewL( *iDb, *iParser, *iLmkSender ); + CleanupStack::PushL( pkgViewer ); + + // Parser observing responsibility is given to the package viewer, + // application is not interested in it anymore: + iParser->ChangeObserver( *pkgViewer ); + + CArrayFix* selectedItems = + new( ELeave ) CArrayFixFlat( KLmkMultiSelectionGranularity ); + CleanupStack::PushL( selectedItems ); + + pkgViewer->ExecuteL( *selectedItems, iParser->PackageName()); + CleanupStack::PopAndDestroy( selectedItems ); + CleanupStack::PopAndDestroy( pkgViewer ); + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::OpenL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::OpenL( const TDesC& aFilename ) + { + iParser = CLmkParser::NewL( aFilename, *iDb, *this, EFalse ); + DoOpenL(); + Exit(); + } + +// ---------------------------------------------------- +// CLmkMsgViewerAppUi::OpenL +// ---------------------------------------------------- +// +void CLmkMsgViewerAppUi::OpenL(RFile& aFile) + { + iParser = CLmkParser::NewL( aFile, *iDb, *this, EFalse ); + DoOpenL(); + Exit(); + } + +void CLmkMsgViewerAppUi::DoOpenL() + { + // We need to initialize db before we start parsing: + iParser->InitializeDbL(); + + iWaitDialog = new( ELeave ) CAknWaitDialog( NULL, ETrue ); + if (!iWaitDialog->ExecuteLD( R_LMK_MSGVIEWER_WAIT )) + { + //making iWaitDialog null, since framework destroys waitnote + //dialog on pressing cancel. + + iWaitDialog = NULL; + } + + if( iDataReadyForView ) + { + if ( iParser->NumOfParsedLandmarks() == 1 ) + { + ExecuteLmViewerL(); + } + else if ( iParser->NumOfParsedLandmarks() > 1 ) + { + ExecutePkgViewerL(); + } + else + { + // exit + } + } + } + +// ----------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::CallBackFuncL() +// Used to callback by the idle timer in order to launch +// the dialog +// ----------------------------------------------------------------------------- +// +TInt CLmkMsgViewerAppUi::CallBackFuncL(TAny *aPtr) + { + CLmkMsgViewerAppUi* appUi = + static_cast< CLmkMsgViewerAppUi* >( aPtr ); + + if ( appUi ) + { + return ( appUi->LaunchDialogL() ); + } + else + { + // To indicate that the timer is not + // called again, return false to the timer + // RunL + return ( EFalse ); + } + } + + +// ----------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::LaunchDialogL() +// This function accesses the document and launches the +// content. +// ----------------------------------------------------------------------------- +// +TBool CLmkMsgViewerAppUi::LaunchDialogL() + { + if(!iIsDbOpen) + { + // Try to open DB + TRAPD( err, iDb = CPosLandmarkDatabase::OpenL() ); + + if( KErrNone != err ) + { + // Cancel the periodic timer + if ( iIdleTimer->IsActive() ) + { + iIdleTimer->Cancel(); + } + // Display general system error note + HBufC* noteText = StringLoader::LoadL( R_LMK_ERR_EIKON_GENERAL, iEikonEnv ); + CleanupStack::PushL( noteText ); + CAknErrorNote* dialog = new(ELeave)CAknErrorNote( ETrue ); + dialog->SetTone( CAknNoteDialog::EErrorTone ); + dialog->ExecuteLD( *noteText ); + CleanupStack::PopAndDestroy( noteText ); //noteText + // exit LmkMsgViewer app + Exit(); + } + // DB was opened successfully + iIsDbOpen = ETrue; + iLmkSender = CLmkSender::NewL( *iDb ); + } + CLmkMsgViewerDocument* document = + static_cast(iDocument); + + // Check if file-handle in document is valid + if (document->IsFileHandleValid()) + { + // Obtain the file-handle + RFile& fileHandle = document->GetLandmarkContentFileHandle(); + + // Cancel the periodic timer + if ( iIdleTimer->IsActive() ) + { + iIdleTimer->Cancel(); + } + // Launch the content + TRAPD(err,OpenL(fileHandle)); + if(err != KErrNone) + { + if( err == KErrNotSupported) + { + LmkNotes::InformationNoteL( iEikonEnv, R_LMK_BADPACKAGE_ERROR ); + } + Exit(); + } + // Delete and reset the idle-timer + delete iIdleTimer; + iIdleTimer = NULL; + + // Return False to indicate that + // timer need not callback further. + return EFalse; + } + else + { + // Return True to indicate that the + // timer needs to callback this function + // again, as the file-handle is not valid + // yet. + return ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CLmkMsgViewerAppUi::HandleResourceChangeL() +// ----------------------------------------------------------------------------- +// +void CLmkMsgViewerAppUi::HandleResourceChangeL(TInt aType) + { + CAknAppUi::HandleResourceChangeL( aType ); + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + iAppView->SetRect(ClientRect()); + } + } +// End of File