diff -r 000000000000 -r 72b543305e3a messagingappbase/smartmessaging/wmlbc/src/WmlBioControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smartmessaging/wmlbc/src/WmlBioControl.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,463 @@ +/* +* Copyright (c) 2002-2007 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: Bio control for Wap bookmarks +* +*/ + + + +// INCLUDE FILES + +#include "WmlBioControl.h" // Own header +#include "WmlItemEngine.h" // +#include "WmlState.h" // CWmlState and inherited states +#include "WmlBioControl.pan" +#include "WmlLog.h" + +#include // CAknTitlePane +#include +#include // CParsedField +#include // KUidMsvBIODataStream +#include // CRichBio +#include // +#include +#include + +// ================= LOCAL FUNCTIONS ======================= + +/** +* This method is a helper method for destroying the contents +* of the array, which is popped from the cleanupstack. +*/ +static void CleanupResetAndDestroy(TAny* aSelf) + { + __ASSERT_DEBUG(aSelf, User::Panic( _L("wmlbc.dll"), ENullPtr )); + CArrayPtrSeg* self = + static_cast* >(aSelf); + self->ResetAndDestroy(); + delete self; + } + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CWmlBioControl::NewL +// --------------------------------------------------------- +EXPORT_C CMsgBioControl* CWmlBioControl::NewL( + MMsgBioControlObserver& aObserver, + CMsvSession* aSession, + TMsvId aId, + TMsgBioMode aIsEditor, + const RFile* aFile) + { + RDebug::Print(_L("WMLBC")); + if ( aSession == NULL ) + { + User::Leave( KErrNotFound ); + } + + CWmlBioControl* self = new ( ELeave ) CWmlBioControl( + aObserver, aSession, aId, aIsEditor, aFile ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CWmlBioControl::~CWmlBioControl +// --------------------------------------------------------- +CWmlBioControl::~CWmlBioControl() + { + FeatureManager::UnInitializeLib(); + delete iStateFactory; + delete iRichBio; + + delete iItemEngine; + } + +// --------------------------------------------------------- +// CWmlBioControl::SetAndGetSizeL +// --------------------------------------------------------- +// +void CWmlBioControl::SetAndGetSizeL( TSize& aSize ) + { + iStateFactory->State().SetAndGetSizeL( aSize ); + + //the following compares the window size against the + //"virtual" height of the viewer. This way there is no + //scrolling if virtualHeight is less than window size + if(iRichBio->VirtualHeight() <= Window().Size().iHeight) + { + aSize.iHeight = iRichBio->VirtualHeight(); + SetSizeWithoutNotification(aSize); + } + else + { + SetSizeWithoutNotification(aSize); + } + } + +// --------------------------------------------------------- +// CWmlBioControl::SetMenuCommandSetL +// --------------------------------------------------------- +// +void CWmlBioControl::SetMenuCommandSetL( CEikMenuPane& aMenuPane ) + { + iStateFactory->State().SetMenuCommandSetL( aMenuPane ); + } + +// --------------------------------------------------------- +// CWmlBioControl::HandleBioCommandL() +// --------------------------------------------------------- +// +TBool CWmlBioControl::HandleBioCommandL( TInt aCommand ) + { + return iStateFactory->State().HandleBioCommandL( aCommand ); + } + +// --------------------------------------------------------- +// CWmlBioControl::CurrentLineRect +// --------------------------------------------------------- +// +TRect CWmlBioControl::CurrentLineRect() const + { + TRect lineRect(0,0,0,0); + lineRect = iStateFactory->State().CurrentLineRect(); + return lineRect; + } + +// --------------------------------------------------------- +// CWmlBioControl::IsFocusChangePossible +// --------------------------------------------------------- +// +TBool CWmlBioControl::IsFocusChangePossible( + TMsgFocusDirection aDirection ) const + { + return iStateFactory->State().IsFocusChangePossible( aDirection ); + } + +// --------------------------------------------------------- +// CWmlBioControl::HeaderTextL +// --------------------------------------------------------- +// +HBufC* CWmlBioControl::HeaderTextL() const + { + HBufC* title = iStateFactory->State().HeaderTextLC(); + CleanupStack::Pop( title ); + return title; + } + +// --------------------------------------------------------- +// CWmlBioControl::UpdateHeaderTextL +// --------------------------------------------------------- +// +void CWmlBioControl::UpdateHeaderTextL() const + { + HBufC* title = iStateFactory->State().HeaderTextLC(); + CEikStatusPane* sp = + ((CAknAppUi*)CEikonEnv::Static()->EikAppUi())->StatusPane(); + CAknTitlePane* titlePane = STATIC_CAST(CAknTitlePane*, + sp->ControlL(TUid::Uid(EEikStatusPaneUidTitle))); + titlePane->SetTextL( *title ); + CleanupStack::PopAndDestroy( title ); + } + +// --------------------------------------------------------- +// CWmlBioControl::OptionMenuPermissionsL +// --------------------------------------------------------- +// +TUint32 CWmlBioControl::OptionMenuPermissionsL() const + { + TUint32 permissions = EMsgBioExit; + iStateFactory->State().OptionMenuPermissionsL( permissions ); + return permissions; + } + +// --------------------------------------------------------- +// CWmlBioControl::VirtualHeight +// --------------------------------------------------------- +// +TInt CWmlBioControl::VirtualHeight() + { + return iStateFactory->State().VirtualHeight(); + } + +// --------------------------------------------------------- +// CWmlBioControl::VirtualVisibleTop +// --------------------------------------------------------- +// +TInt CWmlBioControl::VirtualVisibleTop() + { + return iStateFactory->State().VirtualVisibleTop(); + } + +// --------------------------------------------------------- +// CWmlBioControl::IsCursorLocation +// --------------------------------------------------------- +// +TBool CWmlBioControl::IsCursorLocation(TMsgCursorLocation aLocation) const + { + return iStateFactory->State().IsCursorLocation( aLocation ); + } + +// --------------------------------------------------------- +// CWmlBioControl::OfferKeyEventL +// --------------------------------------------------------- +// +TKeyResponse CWmlBioControl::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ) + { + return iStateFactory->State().OfferKeyEventL( aKeyEvent, aType ); + } + +// --------------------------------------------------------- +// CWmlBioControl::GetHelpContext +// --------------------------------------------------------- +// +void CWmlBioControl::GetHelpContext(TCoeHelpContext& aHelpContext) const + { + const TUid KUidSmart = {0x101F4CDA}; + iStateFactory->State().GetHelpContext(aHelpContext); // adds the context of current state + aHelpContext.iMajor = KUidSmart; + } + +// --------------------------------------------------------- +// CWmlBioControl::HandleResourceChange +// --------------------------------------------------------- +// +void CWmlBioControl::HandleResourceChange( TInt aType ) + { + LOG("CWmlBioControl::HandleResourceChange begin"); + CMsgBioControl::HandleResourceChange( aType ); + + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + iRichBio->Reset(); + } + LOG("CWmlBioControl::HandleResourceChange end"); + } + +// --------------------------------------------------------- +// CWmlBioControl::CountComponentControls +// --------------------------------------------------------- +// +TInt CWmlBioControl::CountComponentControls() const + { + // There can richbio or... + if ( iRichBio ) + { + return 1; + } + // No control at all. + else + { + return 0; + } + } + +// --------------------------------------------------------- +// CWmlBioControl::ComponentControl +// --------------------------------------------------------- +// +CCoeControl* CWmlBioControl::ComponentControl( TInt /*aIndex*/ ) const + { + // Precondition is that we have richbio control, otherwise this + // method should not be called at all. + __ASSERT_DEBUG( iRichBio, Panic( ERichBioNull ) ); + return iRichBio; + } + +// --------------------------------------------------------- +// CWmlBioControl::SizeChanged() +// --------------------------------------------------------- +// +void CWmlBioControl::SizeChanged() + { + iStateFactory->State().SizeChanged(); + } + +// --------------------------------------------------------- +// CWmlBioControl::FocusChanged +// --------------------------------------------------------- +// +void CWmlBioControl::FocusChanged( TDrawNow aDrawNow ) + { + iStateFactory->State().FocusChanged( aDrawNow ); + } + +// --------------------------------------------------------- +// CWmlBioControl::SetContainerWindowL +// --------------------------------------------------------- +// +void CWmlBioControl::SetContainerWindowL( const CCoeControl& aContainer ) + { + CCoeControl::SetContainerWindowL( aContainer ); + // Let the state create the viewer. + iStateFactory->State().CreateViewerL( aContainer ); + } + +// --------------------------------------------------------- +// CWmlBioControl::CWmlBioControl +// --------------------------------------------------------- +// +CWmlBioControl::CWmlBioControl( + MMsgBioControlObserver& aObserver, + CMsvSession* aSession, + TMsvId aId, + TMsgBioMode aIsEditor, + const RFile* aFile): + CMsgBioControl( aObserver, + aSession, + aId, + aIsEditor, + aFile) + { + // all functionality in base class + } + +// --------------------------------------------------------- +// Symbian OS default constructor can leave. +// --------------------------------------------------------- +// +void CWmlBioControl::ConstructL() + { + SetExtension( this ); + + FeatureManager::InitializeLibL(); + + iStateFactory = CWmlStateFactory::NewL( *this ); + + // Load resources + _LIT(KWMLBCResourceFileName, "wmlbc.rsc"); + + LoadResourceL( KWMLBCResourceFileName ); + LoadStandardBioResourceL(); + + CArrayPtrSeg* parsedFieldArray = + ReadStoreLC( iId ); + + + iItemEngine = CWmlItemEngine::NewL(); + iItemEngine->CreateItemArraysL( *parsedFieldArray ); + + + // Array was pushed inside the TCleanupItem and all it's + // elements are also destroyed by this call + CleanupStack::PopAndDestroy(); // parsedFieldArray + + TInt bmCount = iItemEngine->BookmarkCount(); + + if ( bmCount == 0 && !FeatureManager::FeatureSupported( KFeatureIdSmartmsgSMSWapApReceiving ) ) + { + User::Leave(KErrNotSupported); + } + + iStateFactory->SetInitialStateL(bmCount); + } + +// --------------------------------------------------------- +// CWmlBioControl::ReadStoreLC +// --------------------------------------------------------- +// +CArrayPtrSeg* CWmlBioControl::ReadStoreLC( + const TMsvId aId ) + { + CMsvEntry* entry = MsvSession().GetEntryL( aId ); + CleanupStack::PushL( entry ); + + if ( !entry->HasStoreL() ) + { + LOG("CWmlBioControl: No store for entry"); + User::Leave( KErrNotFound ); + } + + CMsvStore* store = entry->ReadStoreL(); + CleanupStack::PushL( store ); + + RMsvReadStream readStream; + readStream.OpenLC( *store, KUidMsvBIODataStream ); + + CArrayPtrSeg* parsedFields = + InternalizeFieldDataL( readStream ); + + CleanupStack::PopAndDestroy(3, entry); // readStream, store, entry + + CleanupStack::PushL( TCleanupItem(CleanupResetAndDestroy, parsedFields) ); + + return parsedFields; + } + +// --------------------------------------------------------- +// CWmlBioControl::InternalizeFieldDataL +// --------------------------------------------------------- +// +CArrayPtrSeg* CWmlBioControl::InternalizeFieldDataL( + RMsvReadStream& aReadStream ) + { + CArrayPtrSeg* parsedFieldArray = + new ( ELeave ) CArrayPtrSeg(1); + // Push array to the cleanupstack so that all of it's items + // are destroyed when it's popped. + CleanupStack::PushL( TCleanupItem(CleanupResetAndDestroy, parsedFieldArray) ); + + CParsedField* parsedField = NULL; + + const TInt streamCount = aReadStream.ReadUint8L(); // leaves on eof + + for ( TInt i=0; i < streamCount; i++ ) + { + parsedField = new (ELeave) CParsedField(); + CleanupStack::PushL( parsedField ); + parsedField->InternalizeL( aReadStream ); + parsedFieldArray->AppendL( parsedField ); // takes ownership + CleanupStack::Pop( parsedField ); + } + + if ( parsedFieldArray->Count() == 0 ) + { + User::Leave( KErrMsgBioMessageNotValid ); // no data found + } + + CleanupStack::Pop( parsedFieldArray ); + return parsedFieldArray; + } + +TAny* CWmlBioControl::BioControlExtension(TInt aExtensionId) + { + if ( aExtensionId == KMsgBioControlScrollExtension ) + { + return static_cast (this); + } + else + { + return NULL; + } + } + + +TInt CWmlBioControl::ExtScrollL( TInt aPixelsToScroll, + TMsgScrollDirection aDirection ) + { + return iRichBio->ScrollL(aPixelsToScroll, aDirection); + } + +void CWmlBioControl::ExtNotifyViewEvent( TMsgViewEvent aEvent, TInt aParam ) + { + iRichBio->NotifyViewEvent( aEvent, aParam ); + } + + + +// End of File