messagingappbase/smartmessaging/vcardbc/src/VCardBioControl.cpp
changeset 0 72b543305e3a
--- /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 <eikon.hrh>                // for EikEdwin defines
+#include <eiklabel.h>               // for CEikLabel
+#include <eikenv.h>                 // for eikenv
+#include <eikbtgpc.h>               // for CEikButtonGroupContainer
+#include <e32base.h>
+#include <eikmenup.h>
+#include <eikmenub.h>
+#include <avkon.hrh>
+#include <aknnotedialog.h>          // for CAknNoteDialog
+#include <gulicon.h>                // for CGulIcon
+#include <eikclbd.h>
+#include <bioscmds.h>
+#include <msvapi.h>                 // for CMsvSession
+#include <s32file.h>                // for RFileReadStream
+#include <msgbiocontrolObserver.h>  // for MMsgBioControlObserver
+#include <StringLoader.h>           // StringLoader
+#include <vcardbc.rsg>              // resouce identifiers
+#include <CRichBio.h>               // CRichBio
+#include <CPbkFieldInfo.h>
+#include <MsgBioUtils.h>
+#include <MsgSmsViewer.hrh> // ESmsViewerCreateCCNew, ESmsViewerCreateCCExisting
+#include <sysutil.h>
+#include <featmgr.h>
+#include <bldvariant.hrh>
+#include <csxhelp/smart.hlp.hrh>
+#include <mmsvattachmentmanager.h>
+#include <AknDef.h>
+#include <AknUtils.h>
+#include <PbkView.rsg>
+#include <akninputblock.h>
+
+//Phonebook 2 API
+#include <CPbk2StoreConfiguration.h>
+#include <VPbkContactStoreUris.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <CVPbkContactManager.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <CVPbkVCardEng.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldTextData.h>
+#include <VPbkContactStoreUris.h>
+
+// 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<MMsgBioControlScrollExtension*> (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