diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/UIControls/src/CPbk2StoreInfoItemBuilder.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include +#include +#include + +// 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* + CPbk2StoreInfoItemBuilder::BuildSingleStoreItemsL + ( const TVPbkContactStoreUriPtr& aUriPtr ) + { + MVPbkContactStore* store = + iContactManager.ContactStoresL().Find(aUriPtr); + __ASSERT_DEBUG(store, Panic(EBuildSingleStoreItemsL_PreCond)); + + const TInt granularity = 10; + CArrayPtrFlat* results = + new(ELeave) CArrayPtrFlat(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* + CPbk2StoreInfoItemBuilder::BuildAllStoresItemsL + ( CVPbkContactStoreUriArray& aStoreUris ) + { + const TInt granularity = 10; + CArrayPtrFlat* results = + new(ELeave) CArrayPtrFlat(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 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( 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