phonebookui/Phonebook2/UIControls/src/CPbk2StoreInfoItemBuilder.cpp
branchRCL_3
changeset 20 f4a778e096c2
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2StoreInfoItemBuilder.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,497 @@
+/*
+* 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:  A class for building store info items
+*
+*/
+
+
+#include "CPbk2StoreInfoItemBuilder.h"
+
+// Phonebook2
+#include "MPbk2StoreInfoUiItem.h"
+#include <CPbk2StoreInfoItemArray.h>
+#include <CPbk2StoreInfoItem.h>
+#include <CPbk2StorePropertyArray.h>
+#include <RPbk2LocalizedResourceFile.h>
+#include <Pbk2DataCaging.hrh>
+#include <CPbk2StoreProperty.h>
+#include <Pbk2UIControls.rsg>
+#include <CPbk2StorePropertyContentStoreName.h>
+#include <Pbk2StoreProperty.hrh>
+
+// Virtual Phonebook
+#include <MVPbkContactStoreInfo.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreList.h>
+#include <CVPbkContactManager.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <CVPbkContactStoreUriArray.h>
+
+// System includes
+#include <barsread.h>
+#include <coemain.h>
+#include <StringLoader.h>
+#include <avkon.rsg>
+
+// CONSTANTS
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EBuildSingleStoreItemsL_PreCond
+    };
+
+void Panic(TInt aReason)
+    {
+    _LIT(KPanicText, "CPbk2StoreInfoItemBuilder");
+    User::Panic(KPanicText, aReason);
+    }
+
+#endif // _DEBUG
+
+const TInt KMaxIntSize = 16;
+const TInt KKByte = 1024;
+typedef TInt (MVPbkContactStoreInfo::*StoreInfoFunction)() const;
+
+// Create mappings that doesn't interfere with definitions
+// in Pbk2StoreProperty.hrh -> they start from 0x01
+// There is no "max number of contact" item in the UI but
+// this is needed to calculate free slots
+const TUint32 KPbk2StoreInfoMaxNumberOfContacts = 0x10000000;
+const TUint32 KPbk2StoreInfoLastMapping = 0xffffffff;
+
+/// Function mapping definitions
+struct TPbk2StoreInfoFunctionMapping
+    {
+    TUint32 iType;
+    StoreInfoFunction iInfoFunctionL;
+    };
+
+/// Mappings for MVPbkContactStoreInfo functions that return TInt
+static const TPbk2StoreInfoFunctionMapping KInfoFunctionMappings[] =
+    {
+        {
+        KPbk2StoreInfoMaxNumberOfContacts,
+        &MVPbkContactStoreInfo::MaxNumberOfContactsL
+        },
+        {
+        KPbk2StoreInfoNumberOfContacts,
+        &MVPbkContactStoreInfo::NumberOfContactsL
+        },
+        {
+        KPbk2StoreInfoNumberOfGroups,
+        &MVPbkContactStoreInfo::NumberOfGroupsL
+        },
+        {
+        KPbk2StoreInfoLastMapping,
+        NULL
+        }
+    };
+
+/**
+ * Gets info data.
+ *
+ * @param aType     Type of info.
+ * @param aInfo     Contact store info interface.
+ * @return  Requested info data.
+ */
+TInt GetInfoDataL( TUint32 aType, const MVPbkContactStoreInfo& aInfo )
+    {
+    TInt ret = KErrNotFound;
+
+    for ( TInt i = 0;
+        KInfoFunctionMappings[i].iType != KPbk2StoreInfoLastMapping; ++i)
+        {
+        if (KInfoFunctionMappings[i].iType & aType)
+            {
+            ret = (aInfo.*KInfoFunctionMappings[i].iInfoFunctionL)();
+            }
+        }
+
+    if ( ret == KErrNotFound )
+        {
+        if (aType & KPbk2StoreInfoReservedMemory)
+            {
+            ret = I64LOW((aInfo.ReservedMemoryL() + KKByte/2) / KKByte);
+            }
+        else if (aType & KPbk2StoreInfoFreeMemory)
+            {
+            ret = I64LOW(aInfo.FreeMemoryL() / KKByte);
+            }
+        }
+
+    return ret;
+    }
+
+/**
+ * Store info UI item representation.
+ */
+NONSHARABLE_CLASS(CUiItem) : public CBase, public MPbk2StoreInfoUiItem
+    {
+    public: // Destruction
+
+        /**
+         * Destructor.
+         */
+        ~CUiItem();
+
+    public: // Interface
+
+        /**
+         * Sets heading text.
+         *
+         * @param aText     The text to set.
+         */
+        void SetHeadingText(
+                TDesC* aText );
+
+        /**
+         * Sets item text.
+         *
+         * @param aText     The text to set.
+         */
+        void SetItemText(
+                TDesC* aText );
+
+    public: // From MPbk2StoreInfoUiItem
+        const TDesC& HeadingText() const;
+        const TDesC& ItemText() const;
+
+    private: // Data
+        /// Own: Heading text
+        TDesC* iHeadingText;
+        /// Own: Item
+        TDesC* iItem;
+    };
+
+// --------------------------------------------------------------------------
+// CUiItem::~CUiItem
+// --------------------------------------------------------------------------
+//
+CUiItem::~CUiItem()
+    {
+    delete iHeadingText;
+    delete iItem;
+    }
+
+// --------------------------------------------------------------------------
+// CUiItem::SetHeadingText
+// --------------------------------------------------------------------------
+//
+void CUiItem::SetHeadingText( TDesC* aText )
+    {
+    iHeadingText = aText;
+    }
+
+// --------------------------------------------------------------------------
+// CUiItem::SetItemText
+// --------------------------------------------------------------------------
+//
+void CUiItem::SetItemText( TDesC* aText )
+    {
+    iItem = aText;
+    }
+
+// --------------------------------------------------------------------------
+// CUiItem::HeadingText
+// --------------------------------------------------------------------------
+//
+const TDesC& CUiItem::HeadingText() const
+    {
+    return *iHeadingText;
+    }
+
+// --------------------------------------------------------------------------
+// CUiItem::ItemText
+// --------------------------------------------------------------------------
+//
+const TDesC& CUiItem::ItemText() const
+    {
+    return *iItem;
+    }
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::CPbk2StoreInfoItemBuilder
+// --------------------------------------------------------------------------
+//
+CPbk2StoreInfoItemBuilder::CPbk2StoreInfoItemBuilder
+        ( CVPbkContactManager& aContactManager,
+          CPbk2StorePropertyArray& aStoreProperties ) :
+            iContactManager( aContactManager ),
+            iStoreProperties( aStoreProperties )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::~CPbk2StoreInfoItemBuilder
+// --------------------------------------------------------------------------
+//
+CPbk2StoreInfoItemBuilder::~CPbk2StoreInfoItemBuilder()
+    {
+    delete iSingleStoreItemDefs;
+    delete iAllStoresItemDefs;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2StoreInfoItemBuilder* CPbk2StoreInfoItemBuilder::NewL
+        ( CVPbkContactManager& aContactManager,
+          CPbk2StorePropertyArray& aStoreProperties )
+    {
+    CPbk2StoreInfoItemBuilder* self = new( ELeave ) CPbk2StoreInfoItemBuilder
+        ( aContactManager, aStoreProperties );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2StoreInfoItemBuilder::ConstructL()
+    {
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC
+        (reader, R_PBK2_SINGLE_STORE_INFO_ITEMS);
+    iSingleStoreItemDefs = CPbk2StoreInfoItemArray::NewL(reader);
+    CleanupStack::PopAndDestroy(); // reader
+
+    CCoeEnv::Static()->CreateResourceReaderLC
+        (reader, R_PBK2_ALL_STORES_INFO_ITEMS);
+    iAllStoresItemDefs = CPbk2StoreInfoItemArray::NewL(reader);
+    CleanupStack::PopAndDestroy(); // reader
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::BuildSingleStoreItemsL
+// --------------------------------------------------------------------------
+//
+CArrayPtr<MPbk2StoreInfoUiItem>*
+        CPbk2StoreInfoItemBuilder::BuildSingleStoreItemsL
+            ( const TVPbkContactStoreUriPtr& aUriPtr )
+    {
+    MVPbkContactStore* store =
+        iContactManager.ContactStoresL().Find(aUriPtr);
+    __ASSERT_DEBUG(store, Panic(EBuildSingleStoreItemsL_PreCond));
+
+    const TInt granularity = 10;
+    CArrayPtrFlat<MPbk2StoreInfoUiItem>* results =
+        new(ELeave) CArrayPtrFlat<MPbk2StoreInfoUiItem>(granularity);
+    CleanupStack::PushL(results);
+    const CPbk2StoreProperty* prop = iStoreProperties.FindProperty(aUriPtr);
+    const TInt count = iSingleStoreItemDefs->Count();
+    for (TInt i = 0; i < count; ++i)
+        {
+        const CPbk2StoreInfoItem& item = iSingleStoreItemDefs->At(i);
+        if (prop->MemoryInfoTypes() & item.ItemType())
+            {
+            MPbk2StoreInfoUiItem* uiItem =
+                CreateSingleStoreUiItemLC(*store, *prop, item);
+            results->AppendL(uiItem);
+            CleanupStack::Pop(); // uiItem
+            }
+        }
+    CleanupStack::Pop(results);
+    return results;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::BuildSingleStoreItemsL
+// --------------------------------------------------------------------------
+//
+CArrayPtr<MPbk2StoreInfoUiItem>*
+        CPbk2StoreInfoItemBuilder::BuildAllStoresItemsL
+            ( CVPbkContactStoreUriArray& aStoreUris )
+    {
+    const TInt granularity = 10;
+    CArrayPtrFlat<MPbk2StoreInfoUiItem>* results =
+        new(ELeave) CArrayPtrFlat<MPbk2StoreInfoUiItem>(granularity);
+    CleanupStack::PushL(results);
+
+    const TInt storeCount = aStoreUris.Count();
+    const TInt itemCount = iAllStoresItemDefs->Count();
+    for (TInt i = 0; i < itemCount; ++i)
+        {
+        TInt sumValue = KErrNotFound;
+        const CPbk2StoreInfoItem& item = iAllStoresItemDefs->At(i);
+        for (TInt j = 0; j < storeCount; ++j)
+            {
+            // Get store property
+            const CPbk2StoreProperty* prop =
+                iStoreProperties.FindProperty(aStoreUris[j]);
+            // Get store
+            MVPbkContactStore* store =
+                iContactManager.ContactStoresL().Find(aStoreUris[j]);
+
+            if (prop->MemoryInfoTypes() & item.ItemType())
+                {
+                if (item.Flags() & KPbk2StoreInfoOneItemForEachStore)
+                    {
+                    // Create own item for each store
+                    MPbk2StoreInfoUiItem* uiItem =
+                        CreateSingleStoreUiItemLC(*store, *prop, item);
+                    results->AppendL(uiItem);
+                    CleanupStack::Pop(); // uiItem
+                    }
+                else if (sumValue == KErrNotFound)
+                    {
+                    // Init sum value with first stores value
+                    sumValue = GetInfoDataL(item.ItemType(),
+                        store->StoreInfo());
+                    }
+                else
+                    {
+                    // Add to sumValue
+                    sumValue += GetInfoDataL(item.ItemType(),
+                        store->StoreInfo());
+                    }
+                }
+
+            }
+
+        if (sumValue != KErrNotFound)
+            {
+            MPbk2StoreInfoUiItem* uiItem =
+                CreateUiItemLC(NULL, item, sumValue);
+            results->AppendL(uiItem);
+            CleanupStack::Pop(); // uiItem
+            }
+        }
+
+    CleanupStack::Pop(results);
+    return results;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::CreateSingleStoreUiItemLC
+// --------------------------------------------------------------------------
+//
+MPbk2StoreInfoUiItem* CPbk2StoreInfoItemBuilder::CreateSingleStoreUiItemLC
+        ( MVPbkContactStore& aStore, const CPbk2StoreProperty& aProperty,
+          const CPbk2StoreInfoItem& aItem )
+    {
+    TInt value = 0;
+    const MVPbkContactStoreInfo& info = aStore.StoreInfo();
+    if (aItem.ItemType() & KPbk2StoreInfoFreeLocations)
+        {
+        value = GetInfoDataL(KPbk2StoreInfoMaxNumberOfContacts, info) -
+            GetInfoDataL(KPbk2StoreInfoNumberOfContacts, info);
+        }
+    else
+        {
+        value = GetInfoDataL(aItem.ItemType(), info);
+        }
+
+    return CreateUiItemLC(&aProperty, aItem, value);
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::CreateUiItemLC
+// --------------------------------------------------------------------------
+//
+MPbk2StoreInfoUiItem* CPbk2StoreInfoItemBuilder::CreateUiItemLC
+        ( const CPbk2StoreProperty* aProperty,
+          const CPbk2StoreInfoItem& aItem, TInt aIntValue )
+    {
+    CUiItem* uiItem = new(ELeave) CUiItem;
+    CleanupStack::PushL(uiItem);
+
+    HBufC* itemValue = FormatUiItemValueL(aItem, aIntValue);
+    uiItem->SetItemText(itemValue); // takes ownership
+
+    HBufC* heading = CreateHeadingL(aProperty, aItem, aIntValue);
+    uiItem->SetHeadingText( heading ); // takes ownership
+
+    return uiItem;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::FormatUiItemValueL
+// --------------------------------------------------------------------------
+//
+HBufC* CPbk2StoreInfoItemBuilder::FormatUiItemValueL
+        ( const CPbk2StoreInfoItem& aItem,  TInt aValue )
+    {
+    HBufC* result = NULL;
+
+    TUint memoryItemTypes =
+        KPbk2StoreInfoFreeMemory | KPbk2StoreInfoReservedMemory;
+    if (aItem.ItemType() & memoryItemTypes)
+        {
+        result = StringLoader::LoadL(R_QTN_SIZE_KB, aValue);
+        }
+    else
+        {
+        TBuf<KMaxIntSize> intBuf;
+        intBuf.Num(aValue);
+        result = intBuf.AllocL();
+        }
+
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2StoreInfoItemBuilder::CreateHeadingL
+// --------------------------------------------------------------------------
+//
+HBufC* CPbk2StoreInfoItemBuilder::CreateHeadingL
+        ( const CPbk2StoreProperty* aProperty,
+          const CPbk2StoreInfoItem& aItem, TInt aValue )
+    {
+    HBufC* retVal = NULL;
+
+    const TInt singleValue = 1;
+
+    if ( aItem.TextType() == EPbk2StoreInfoStoreName && aProperty )
+        {
+        CPbk2Content* content = aProperty->RetrieveContentLC
+            ( EPbk2MemInfoContacts );
+
+        CPbk2StorePropertyContentStoreName* propContent =
+            dynamic_cast<CPbk2StorePropertyContentStoreName*>( content );
+
+        HBufC* storeName = NULL;
+        if (propContent && propContent->StoreName() != KNullDesC())
+            {
+            storeName = propContent->StoreName().AllocL();
+            }
+        else
+            {
+            // Backup plan -> use store name
+            storeName = aProperty->StoreName().AllocL();
+            }
+
+        CleanupStack::PopAndDestroy( content );
+        retVal = storeName;
+        }
+
+    else
+        {
+        retVal = aItem.ItemTextPlural().AllocL();
+        }
+
+    return retVal;
+    }
+
+// End of File