--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/spbcontentprovider/src/spbphonenumberparser.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2009 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: .
+*
+*/
+
+
+#include "spbphonenumberparser.h"
+#include "spbcontent.h"
+
+#include <MVPbkContactOperationBase.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <CVPbkDefaultAttribute.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkFieldType.h>
+#include <VPbkEng.rsg> // resource ids for numbers
+
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::NewL
+// ---------------------------------------------------------------------------
+//
+CSpbPhoneNumberParser* CSpbPhoneNumberParser::NewL(
+ CVPbkContactManager& aContactManager,
+ CSpbContent& aContent)
+ {
+ CSpbPhoneNumberParser* self =
+ new (ELeave) CSpbPhoneNumberParser(aContactManager, aContent);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::~CSpbPhoneNumberParser
+// ---------------------------------------------------------------------------
+//
+CSpbPhoneNumberParser::~CSpbPhoneNumberParser()
+ {
+ delete iOperation;
+ iOperation = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::CSpbPhoneNumberParser
+// ---------------------------------------------------------------------------
+//
+inline CSpbPhoneNumberParser::CSpbPhoneNumberParser(
+ CVPbkContactManager& aContactManager,
+ CSpbContent& aContent)
+: iContactManager(aContactManager),
+ iContent(aContent)
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::ConstructL
+// ---------------------------------------------------------------------------
+//
+inline void CSpbPhoneNumberParser::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::VPbkSingleContactOperationComplete
+// ---------------------------------------------------------------------------
+//
+void CSpbPhoneNumberParser::VPbkSingleContactOperationComplete(
+ MVPbkContactOperationBase& /*aOperation*/,
+ MVPbkStoreContact* aContact )
+ {
+ delete iOperation;
+ iOperation = NULL;
+ TRAP_IGNORE( SolvePhoneNumberL( *aContact ) );
+ delete aContact;
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::VPbkSingleContactOperationFailed
+// ---------------------------------------------------------------------------
+//
+void CSpbPhoneNumberParser::VPbkSingleContactOperationFailed(
+ MVPbkContactOperationBase& /*aOperation*/,
+ TInt /*aError*/ )
+ {
+ delete iOperation;
+ iOperation = NULL;
+ TRAP_IGNORE( iContent.PhoneNumberUpdatedL(
+ KNullDesC, CSpbContentProvider::ETypePhoneNumber ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::SolvePhoneNumberL
+// ---------------------------------------------------------------------------
+//
+void CSpbPhoneNumberParser::SolvePhoneNumberL( MVPbkStoreContact& aContact )
+ {
+ RBuf number;
+ TInt numberCount = 0;
+
+ // check if the contact has default a number
+ MVPbkContactAttributeManager& attributeManager =
+ iContactManager.ContactAttributeManagerL();
+
+ CVPbkDefaultAttribute* attribute =
+ CVPbkDefaultAttribute::NewL( EVPbkDefaultTypePhoneNumber );
+ CleanupStack::PushL( attribute );
+
+ TBool hasDefaultNumberField = EFalse;
+ CDesC16Array* phoneNumberArray = new (ELeave) CDesC16ArraySeg(8);
+ CleanupStack::PushL( phoneNumberArray );
+
+ // get contact fields
+ MVPbkStoreContactFieldCollection& fields = aContact.Fields();
+ const TInt fieldCount = fields.FieldCount();
+ // check fields
+ for ( TInt i = 0; i < fieldCount; ++i )
+ {
+ const MVPbkStoreContactField& field = fields.FieldAt( i );
+ // if correct data type
+ if( field.FieldData().DataType() == EVPbkFieldStorageTypeText )
+ {
+ const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
+ if( fieldType )
+ {
+ const TInt fieldTypeResId = fieldType->FieldTypeResId();
+ // if one of the number fields
+ if( fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEGEN ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEHOME ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEWORK ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEGEN ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_CARPHONE ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_ASSTPHONE ||
+ fieldTypeResId == R_VPBK_FIELD_TYPE_PAGERNUMBER )
+ {
+ const MVPbkContactFieldTextData* textData =
+ &MVPbkContactFieldTextData::Cast( field.FieldData() );
+ if( attributeManager.HasFieldAttributeL( *attribute, field ) )
+ {
+ //default number found
+ number.CreateL( textData->Text() );
+ hasDefaultNumberField = ETrue;
+ }
+ const TPtrC phoneNumber( textData->Text() );
+ // we need count phonenumbers same way how this is implemented in CCA
+ // so that we show same count for phonenumbers in names list
+ // CCA uses descriptor folded compare for phonenumbers
+ TInt dummy = 0;
+ if( 0 != phoneNumberArray->FindIsq( phoneNumber, dummy, ECmpFolded ) )
+ {
+ // phone number doesn't exist
+ phoneNumberArray->InsertIsqL( phoneNumber, ECmpFolded );
+ }
+ }
+ }
+ }
+ }
+ numberCount = phoneNumberArray->Count();
+
+ //default number not found, and only one number
+ if( EFalse == hasDefaultNumberField && numberCount == 1 )
+ {
+ number.CreateL( (*phoneNumberArray)[0] );
+ }
+
+ CleanupStack::PopAndDestroy( phoneNumberArray );
+ CleanupStack::PopAndDestroy( attribute );
+
+ if( hasDefaultNumberField || numberCount <= 1 )
+ {
+ // inform the observer
+ iContent.PhoneNumberUpdatedL(
+ number, CSpbContentProvider::ETypePhoneNumber );
+ }
+ else
+ {
+ // contact has multiple numbers and no default
+ TBuf<12> count;
+ count.Num( numberCount );
+ iContent.PhoneNumberUpdatedL(
+ count, CSpbContentProvider::ETypePhoneNumberMultiple );
+ }
+
+ number.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// CSpbPhoneNumberParser::FetchPhoneNumber
+// ---------------------------------------------------------------------------
+//
+void CSpbPhoneNumberParser::FetchPhoneNumberL(
+ const MVPbkContactLink& aLink)
+ {
+ delete iOperation;
+ iOperation = NULL;
+
+ iOperation = iContactManager.RetrieveContactL(aLink, *this);
+ }
+
+// end of file