diff -r 000000000000 -r 72b543305e3a messagingappbase/smartmessaging/vcardbc/src/VCardBioControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smartmessaging/vcardbc/src/VCardBioControl.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,564 @@ +/* +* 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 Business Cards. +* +*/ + + + +// INCLUDE FILES +#include "VCardBioControl.h" // for CVCardBioControl +#include "vcardvpbutil.h" +#include "VCardLog.h" // Logging functionality + +#include // for EikEdwin defines +#include // for CEikLabel +#include // for eikenv +#include // for CEikButtonGroupContainer +#include +#include +#include +#include +#include // for CAknNoteDialog +#include // for CGulIcon +#include +#include +#include // for CMsvSession +#include // for RFileReadStream +#include // for MMsgBioControlObserver +#include // StringLoader +#include // resouce identifiers +#include // CRichBio +#include +#include +#include // ESmsViewerCreateCCNew, ESmsViewerCreateCCExisting +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//Phonebook 2 API +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// LOCAL CONSTANTS AND MACROS + +_LIT(KResourceFile, "vcardbc.rsc"); +_LIT(KPbk2CommonUi,"Pbk2CommonUi.rsc"); +_LIT(KPbk2UIControls,"Pbk2UIControls.rsc"); +_LIT(KClassName, "CVCardBioControl"); + +const TInt KMenuPos = 1; //The inserting position of menu item. + +// Compact Business Card Bio UID +const TUid KUidBioBusinessCard = {0x10005531}; + +const TInt KVcdBcHeightReductionBva = 9; + +// CLASS-SPECIFIC PANIC CODES +enum TPanicCode + { + ENullObject1, + ENullObject2, + ENullObject3, + ENullObject4, + ENullObject5, + ENullObject6, + ENullObject7, + EUndefinedEnum, + EInvalidIndex, + EPanicPostCond_ReallocBufferL + }; + +// MEMBER FUNCTIONS + +// Two-phased constructor. +EXPORT_C CMsgBioControl* CVCardBioControl::NewL( + MMsgBioControlObserver& aObserver, + CMsvSession* aSession, + TMsvId aId, + TMsgBioMode aEditorOrViewerMode, + const RFile* aFile) + { + LOG("CVCardBioControl::NewL begin"); + CVCardBioControl* self = new(ELeave) CVCardBioControl( + aObserver, + aSession, + aId, + aEditorOrViewerMode, + aFile); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + LOG("CVCardBioControl::NewL end"); + return self; + } + +CVCardBioControl::~CVCardBioControl() + { + FeatureManager::UnInitializeLib(); + delete iViewer; + delete iVpbUtil; + } + +void CVCardBioControl::SetAndGetSizeL(TSize& aSize) + { + LOG("CVCardBioControl::SetAndGetSizeL begin"); + __ASSERT_DEBUG(iViewer, Panic(ENullObject1)); + + if(iIsFileBased) + { + SetPosition(TPoint(0,KVcdBcHeightReductionBva)); + aSize.iHeight -= KVcdBcHeightReductionBva; + iViewer->SetAndGetSizeL(aSize); + SetSizeWithoutNotification(aSize); + } + else + { + iViewer->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(iViewer->VirtualHeight() <= Window().Size().iHeight) + { + aSize.iHeight = iViewer->VirtualHeight(); + SetSizeWithoutNotification(aSize); + } + else + { + SetSizeWithoutNotification(aSize); + } + } + + LOG("CVCardBioControl::SetAndGetSizeL end"); + } + +void CVCardBioControl::SetMenuCommandSetL(CEikMenuPane& aMenuPane) + { + LOG("CVCardBioControl::SetMenuCommandSetL begin"); + if (!IsEditor()) + { + if (iIsFileBased) + { + FileBasedAddMenuItemL(aMenuPane, R_QTN_SM_ADD_PHONEBOOK, + EAddToPhonebook); + } + else + { + AddMenuItemL(aMenuPane, R_QTN_SM_ADD_PHONEBOOK, + EAddToPhonebook, KMenuPos); + } + } + LOG("CVCardBioControl::SetMenuCommandSetL end"); + } + +TBool CVCardBioControl::HandleBioCommandL(TInt aCommand) + { + if (aCommand == iBioControlObserver.FirstFreeCommand() + + EAddToPhonebook) + { + CAknInputBlock* blocker = CAknInputBlock::NewLC(); + AddToPhoneBookL(); + CleanupStack::PopAndDestroy( blocker ); + return ETrue; + } + return EFalse; + } + +TRect CVCardBioControl::CurrentLineRect() const + { + return iViewer->CurrentLineRect(); + } + +TBool CVCardBioControl::IsFocusChangePossible( + TMsgFocusDirection aDirection) const + { + if (aDirection == EMsgFocusUp) + { + return iViewer->IsCursorLocation(EMsgTop); + } + return EFalse; + } + +HBufC* CVCardBioControl::HeaderTextL() const + { + return StringLoader::LoadL(R_QTN_SM_TITLE_BUSINESS_CARD, iCoeEnv); + } + +TInt CVCardBioControl::VirtualHeight() + { + __ASSERT_DEBUG(iViewer, Panic(ENullObject2)); + return iViewer->VirtualHeight(); + } + +TInt CVCardBioControl::VirtualVisibleTop() + { + __ASSERT_DEBUG(iViewer, Panic(ENullObject3)); + return iViewer->VirtualVisibleTop(); + } + +TBool CVCardBioControl::IsCursorLocation(TMsgCursorLocation aLocation) const + { + return iViewer->IsCursorLocation(aLocation); + } + +TKeyResponse CVCardBioControl::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType) + { + __ASSERT_DEBUG(iViewer, Panic(ENullObject4)); + return iViewer->OfferKeyEventL(aKeyEvent, aType); + } + +void CVCardBioControl::GetHelpContext(TCoeHelpContext& aHelpContext) const + { + LOG("CVCardBioControl::GetHelpContext begin"); + const TUid KUidSmart = {0x101F4CDA}; + if (!iIsFileBased) + { + aHelpContext.iContext=IsEditor()? + KSMART_HLP_BUSINESSEDITOR():KSMART_HLP_BUSINESSVIEWER() ; + aHelpContext.iMajor=KUidSmart; + } + else + { + if ( !IsEditor() ) + { + aHelpContext.iContext=KSMART_HLP_BUSPULLMESVIEWER; + aHelpContext.iMajor=KUidSmart; + } + } + LOG("CVCardBioControl::GetHelpContext end"); + } + +void CVCardBioControl::SetDimmed(TBool aDimmed) + { + LOG("CVCardBioControl::SetDimmed begin"); + CCoeControl::SetDimmed(aDimmed); + LOG("CVCardBioControl::SetDimmed end"); + } + +TInt CVCardBioControl::CountComponentControls() const + { + return 1; // just the iViewer + } + +CCoeControl* CVCardBioControl::ComponentControl(TInt aIndex) const + { + if (aIndex == 0) + { + return iViewer; + } + return NULL; + } + +void CVCardBioControl::SizeChanged() + { + LOG("CVCardBioControl::SizeChanged begin"); + __ASSERT_DEBUG(iViewer, Panic(ENullObject5)); + iViewer->SetExtent(Position(), iViewer->Size()); + LOG("CVCardBioControl::SizeChanged end"); + } + +void CVCardBioControl::FocusChanged(TDrawNow /*aDrawNow*/) + { + LOG("CVCardBioControl::FocusChanged begin"); + __ASSERT_DEBUG(iViewer, Panic(ENullObject6)); + iViewer->SetFocus(IsFocused()); + LOG("CVCardBioControl::FocusChanged end"); + } + +void CVCardBioControl::SetContainerWindowL(const CCoeControl& aContainer) + { + LOG("CVCardBioControl::SetContainerWindowL begin"); + CCoeControl::SetContainerWindowL(aContainer); + + // The reason for creating the viewer control here is that the + // construction requires a parent with a window. So it cannot be done in + // ConstructL(). + + iViewer = CRichBio::NewL(this, ERichBioModeEditorBase); + AddVPbkFieldsToViewerL(*iVpbContact); + LOG("CVCardBioControl::SetContainerWindowL end"); + } + +CVCardBioControl::CVCardBioControl( + MMsgBioControlObserver& aObserver, + CMsvSession* aSession, + TMsvId aId, + TMsgBioMode aEditorOrViewerMode, + const RFile* aFile + ): + CMsgBioControl(aObserver, + aSession, + aId, + aEditorOrViewerMode, + aFile) + { + } + +// Symbian OS default constructor can leave. +void CVCardBioControl::ConstructL() + { + LOG("CVCardBioControl::ConstructL begin"); + + SetExtension( this ); + iIsFileBased = IsFileBased(); + + LoadResourceL(KResourceFile); + LoadResourceL(KPbk2CommonUi); + LoadResourceL(KPbk2UIControls); + LoadStandardBioResourceL(); + + TVCardBCBusinessCardType type; + + // file handle to the vcard attachment in msv store + RFile fileHandle; + ResolveFileHandleAndTypeL( fileHandle, type ); + CleanupClosePushL( fileHandle ); + + iVpbUtil = CVCardVpbUtil::NewL(); + + FeatureManager::InitializeLibL(); + + // Now do the importing + // + if (type == EVCard ) + { + CleanupStack::Pop( &fileHandle ); + //after this call the fileHandle will no longer be valid + TRAPD(err,iVpbUtil->ImportVCardL(EVCard,fileHandle)); + if (err != KErrNone) + { + User::Leave(KErrMsgBioMessageNotValid); + } + + if (iVpbUtil->IsContactItemEmpty()) + { + User::Leave(KErrMsgBioMessageNotValid); + } + + iVpbContact = iVpbUtil->ContactData(); + } + else if(type == ECompactBusinessCard) + { + CleanupStack::Pop( &fileHandle ); + //after this call the fileHandle will no longer be valid + TRAPD(err,iVpbUtil->ImportVCardL(ECompactBusinessCard,fileHandle)); + if(err != KErrNone) + { + User::Leave(KErrMsgBioMessageNotValid); + } + + iVpbContact = iVpbUtil->ContactData(); + + if (iVpbUtil->IsContactItemEmpty()) + { + User::Leave(KErrMsgBioMessageNotValid); + } + } + else + { + __ASSERT_DEBUG(EFalse, Panic(EUndefinedEnum)); + } + LOG("CVCardBioControl::ConstructL end"); + } + +void CVCardBioControl::AddToPhoneBookL() + { + LOG("CVCardBioControl::AddToPhoneBookL begin"); + RFs fs; + TInt connVal = fs.Connect(); + User::LeaveIfError(connVal); + CleanupClosePushL( fs ); + + // Check whether there's free space in flash mem to save the contact + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &fs )) + { + User::Leave( KErrDiskFull ); + } + CleanupStack::PopAndDestroy(); // fs + + TBool vcardStored(EFalse); + vcardStored = iVpbUtil->CommitVCardToStoreL(); + + if( vcardStored ) + { + MsgBioUtils::ConfirmationNoteL( R_QTN_BCARD_SAVED_TO_PB_AS_NEW ); + } + LOG("CVCardBioControl::AddToPhoneBookL end"); + } + +void CVCardBioControl::ResolveFileHandleAndTypeL( + RFile& aFile, + TVCardBCBusinessCardType& aBCType ) + { + LOG("CVCardBioControl::ResolveFileHandleAndTypeL begin"); + if (iIsFileBased) + { + // Note that file based Compact Business Cards are not supported. + // (The stand alone Bio Viewer Application will not be registered to + // handle CBC mime types) + aBCType = EVCard; + aFile.Duplicate(FileHandle()); + } + else + { + CMsvEntry* entry = MsvSession().GetEntryL( iId ); + if (entry->Entry().iBioType == KUidBioBusinessCard.iUid) + { + aBCType = ECompactBusinessCard; //Bio type of COMPACT Business card + } + else + { + aBCType = EVCard; // It is a vCard + } + + CleanupStack::PushL( entry ); + CMsvStore* store = entry->ReadStoreL(); + CleanupStack::PushL(store); + MMsvAttachmentManager& attachMan = store->AttachmentManagerL(); + aFile = attachMan.GetAttachmentFileL( 0 ); //card is the firstattachment + CleanupStack::PopAndDestroy( 2 ); // store, entry + } + LOG("CVCardBioControl::ResolveFileHandleAndTypeL end"); + } + +void CVCardBioControl::AddVPbkFieldsToViewerL(const MVPbkStoreContact& aContact) + { + LOG("CVCardBioControl::AddPbkFieldsToViewerL begin"); + + const MVPbkStoreContactFieldCollection& fields = aContact.Fields(); + TInt count = fields.FieldCount(); + + for (TInt n(0); n < count; n++) + { + const MVPbkStoreContactField& field = fields.FieldAt(n); + if (FieldToBeShown(field)) + { + TPtrC text(iVpbUtil->FormatFieldContentL(field)); + if (text.Length() && field.FieldLabel().Length()) + { + iViewer->AddItemL(field.FieldLabel(), text); + } + } + } + LOG("CVCardBioControl::AddPbkFieldsToViewerL end"); + } + +TBool CVCardBioControl::FieldToBeShown(const MVPbkStoreContactField& aField) + { + LOG("CVCardBioControl::FieldToBeShown begin"); + if (aField.FieldData().DataType() == EVPbkFieldStorageTypeBinary || + aField.FieldData().DataType() == EVPbkFieldStorageTypeNull) + { + return EFalse; + } + LOG("CVCardBioControl::FieldToBeShown end"); + return ETrue; + } + +void CVCardBioControl::FileBasedAddMenuItemL(CEikMenuPane& aMenuPane, + TInt aStringRes, TInt aCommandOffset) + { + LOG("CVCardBioControl::FileBasedAddMenuItemL begin"); + CEikMenuPaneItem::SData menuItem; + menuItem.iCascadeId = NULL; + menuItem.iFlags = NULL; + HBufC* menuItemText(StringLoader::LoadLC(aStringRes, iCoeEnv)); + TPtr textPtr = menuItemText->Des(); + if(textPtr.Length() > menuItem.iText.MaxLength()) + { + menuItem.iText.Format(textPtr.MidTPtr(0,menuItem.iText.MaxLength()) ); + } + else + { + menuItem.iText.Format(textPtr); + } + CleanupStack::PopAndDestroy(menuItemText); + menuItem.iCommandId = iBioControlObserver.FirstFreeCommand() + + aCommandOffset; + aMenuPane.InsertMenuItemL(menuItem, 0); + LOG("CVCardBioControl::FileBasedAddMenuItemL end"); + } + +void CVCardBioControl::OpenStreamLC(RFileReadStream& aStream, + TFileName& aFileName) + { + LOG("CVCardBioControl::OpenStreamLC begin"); + User::LeaveIfError( aStream.Open( + CCoeEnv::Static()->FsSession(), + aFileName, + EFileStream )); + aStream.PushL(); + LOG("CVCardBioControl::OpenStreamLC end"); + } + +void CVCardBioControl::HandleResourceChange( TInt aType ) + { + LOG("CVCardBioControl::HandleResourceChange begin"); + CMsgBioControl::HandleResourceChange( aType ); + + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + iViewer->Reset(); + } + LOG("CVCardBioControl::HandleResourceChange end"); + } + +TAny* CVCardBioControl::BioControlExtension(TInt aExtensionId) + { + if ( aExtensionId == KMsgBioControlScrollExtension ) + { + return static_cast (this); + } + else + { + return NULL; + } + } + +TInt CVCardBioControl::ExtScrollL( TInt aPixelsToScroll, + TMsgScrollDirection aDirection ) + { + return iViewer->ScrollL(aPixelsToScroll, aDirection); + } + +void CVCardBioControl::ExtNotifyViewEvent( TMsgViewEvent aEvent, TInt aParam ) + { + iViewer->NotifyViewEvent( aEvent, aParam ); + } + +void CVCardBioControl::Panic(TInt aReason) + { + User::Panic(KClassName, aReason); + } +// End of File