phonebookui/Phonebook2/spbcontentprovider/src/spbphonenumberparser.cpp
branchRCL_3
changeset 15 34879f5cfc63
parent 5 81f8547efd4f
child 17 2666d9724c76
equal deleted inserted replaced
13:a6539d1e8e43 15:34879f5cfc63
   107 // ---------------------------------------------------------------------------
   107 // ---------------------------------------------------------------------------
   108 // CSpbPhoneNumberParser::SolvePhoneNumberL
   108 // CSpbPhoneNumberParser::SolvePhoneNumberL
   109 // ---------------------------------------------------------------------------
   109 // ---------------------------------------------------------------------------
   110 //
   110 //
   111 void CSpbPhoneNumberParser::SolvePhoneNumberL( MVPbkStoreContact& aContact )
   111 void CSpbPhoneNumberParser::SolvePhoneNumberL( MVPbkStoreContact& aContact )
   112 	{
   112     {
   113 	RBuf number;
   113     RBuf number;
   114 	TInt numberCount = 0;
   114     TInt numberCount = 0;
   115 	
   115 	
   116 	// check if the contact has default a number
   116     // check if the contact has default a number
   117 	MVPbkContactAttributeManager& attributeManager = 
   117     MVPbkContactAttributeManager& attributeManager = 
   118 			iContactManager.ContactAttributeManagerL();
   118             iContactManager.ContactAttributeManagerL();
   119 	
   119 	
   120 	CVPbkDefaultAttribute* attribute = 
   120     CVPbkDefaultAttribute* attribute = 
   121 			CVPbkDefaultAttribute::NewL( EVPbkDefaultTypePhoneNumber );
   121             CVPbkDefaultAttribute::NewL( EVPbkDefaultTypePhoneNumber );
   122 	CleanupStack::PushL( attribute );
   122     CleanupStack::PushL( attribute );
       
   123 
       
   124     TBool hasDefaultNumberField = EFalse;
       
   125     CDesC16Array* phoneNumberArray = new (ELeave) CDesC16ArraySeg(8);
       
   126     CleanupStack::PushL( phoneNumberArray );
       
   127 
       
   128     // get contact fields
       
   129     MVPbkStoreContactFieldCollection& fields = aContact.Fields();
       
   130     const TInt fieldCount = fields.FieldCount();
       
   131     // check fields
       
   132     for ( TInt i = 0; i < fieldCount; ++i )
       
   133         {
       
   134         const MVPbkStoreContactField& field = fields.FieldAt( i );
       
   135         // if correct data type
       
   136         if( field.FieldData().DataType() == EVPbkFieldStorageTypeText )
       
   137             {
       
   138             const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
   139             if( fieldType )
       
   140                 {
       
   141                 const TInt fieldTypeResId = fieldType->FieldTypeResId();
       
   142                 // if one of the number fields
       
   143                 if( fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEGEN    ||
       
   144                     fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEHOME   ||
       
   145                     fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEWORK   ||
       
   146                     fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEGEN  ||
       
   147                     fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ||
       
   148                     fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ||
       
   149                     fieldTypeResId == R_VPBK_FIELD_TYPE_CARPHONE        ||
       
   150                     fieldTypeResId == R_VPBK_FIELD_TYPE_ASSTPHONE       ||
       
   151                     fieldTypeResId == R_VPBK_FIELD_TYPE_PAGERNUMBER )
       
   152                     {
       
   153                     const MVPbkContactFieldTextData* textData =
       
   154                             &MVPbkContactFieldTextData::Cast( field.FieldData() );
       
   155                     if( attributeManager.HasFieldAttributeL( *attribute, field ) )
       
   156                         {
       
   157                         //default number found
       
   158                         number.CreateL( textData->Text() );
       
   159                         hasDefaultNumberField = ETrue;
       
   160                         break;
       
   161                         }
       
   162                     const TPtrC phoneNumber( textData->Text() );
       
   163                     // we need count phonenumbers same way how this is implemented in CCA
       
   164                     // so that we show same count for phonenumbers in names list
       
   165                     // CCA uses descriptor folded compare for phonenumbers
       
   166                     TInt dummy = 0;
       
   167                     if( 0 != phoneNumberArray->FindIsq( phoneNumber, dummy, ECmpFolded ) )
       
   168                         {
       
   169                         // phone number doesn't exist
       
   170                         phoneNumberArray->InsertIsqL( phoneNumber, ECmpFolded );
       
   171                         }
       
   172                     }
       
   173                 }
       
   174             }
       
   175         }
       
   176     numberCount = phoneNumberArray->Count();
       
   177     
       
   178     //default number not found, and only one number
       
   179     if( EFalse == hasDefaultNumberField && numberCount == 1 )
       
   180         {
       
   181             number.CreateL( (*phoneNumberArray)[0] );
       
   182         }
       
   183 
       
   184     CleanupStack::PopAndDestroy( phoneNumberArray );
       
   185     CleanupStack::PopAndDestroy( attribute );
   123 	
   186 	
   124 	MVPbkStoreContactField* field = 
   187     // no number was found
   125 			attributeManager.FindFieldWithAttributeL( *attribute, aContact );
   188     if( numberCount > 1 )
   126 	if( field )
   189         {
   127 		{
       
   128 		const MVPbkContactFieldTextData* textData =
       
   129 				&MVPbkContactFieldTextData::Cast( field->FieldData() );
       
   130 		number.CreateL( textData->Text() );
       
   131 		}
       
   132 	CleanupStack::PopAndDestroy(); //attribute
       
   133 	
       
   134 	// was the default number found?
       
   135 	if( number.Length() == 0 )
       
   136 		{
       
   137         CDesC16Array* phoneNumberArray = new (ELeave) CDesC16ArraySeg(8);
       
   138         CleanupStack::PushL( phoneNumberArray );
       
   139         
       
   140 		// get contact fields
       
   141 		MVPbkStoreContactFieldCollection& fields = aContact.Fields();
       
   142 		const TInt fieldCount = fields.FieldCount();
       
   143 		// check fields
       
   144 		for ( TInt i = 0; i < fieldCount; ++i )
       
   145 			{
       
   146 			const MVPbkStoreContactField& field = fields.FieldAt( i );
       
   147 			// if correct data type
       
   148 			if( field.FieldData().DataType() == EVPbkFieldStorageTypeText )
       
   149 				{
       
   150 				const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
   151 				if( fieldType )
       
   152 					{
       
   153                     const TInt fieldTypeResId = fieldType->FieldTypeResId();
       
   154 					// if one of the number fields
       
   155 					if( fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEGEN    ||
       
   156      			        fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEHOME   ||
       
   157                         fieldTypeResId == R_VPBK_FIELD_TYPE_LANDPHONEWORK   ||
       
   158                         fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEGEN  ||
       
   159                         fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ||
       
   160                         fieldTypeResId == R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ||
       
   161                         fieldTypeResId == R_VPBK_FIELD_TYPE_CARPHONE        ||
       
   162                         fieldTypeResId == R_VPBK_FIELD_TYPE_ASSTPHONE       ||
       
   163                         fieldTypeResId == R_VPBK_FIELD_TYPE_PAGERNUMBER )
       
   164 						{
       
   165 					    const MVPbkContactFieldTextData* textData =
       
   166                                 &MVPbkContactFieldTextData::Cast( field.FieldData() );
       
   167 					    const TPtrC phoneNumber( textData->Text() );
       
   168 					    
       
   169                         // we need count phonenumbers same way how this is implemented in CCA
       
   170                         // so that we show same count for phonenumbers in names list
       
   171                         // CCA uses descriptor folded compare for phonenumbers
       
   172 					    TInt dummy = 0;
       
   173 					    if( 0 != phoneNumberArray->FindIsq( phoneNumber, dummy, ECmpFolded ) )
       
   174 					        {
       
   175                             // phone number doesn't exist
       
   176                             phoneNumberArray->InsertIsqL( phoneNumber, ECmpFolded );
       
   177 					        }
       
   178 						}
       
   179 					}
       
   180 				}
       
   181 			}
       
   182         numberCount = phoneNumberArray->Count();
       
   183         // if only one number, store it
       
   184         if( numberCount == 1 )
       
   185             {
       
   186             number.CreateL( (*phoneNumberArray)[0] );
       
   187             }
       
   188         CleanupStack::PopAndDestroy( phoneNumberArray );
       
   189 		}
       
   190 	
       
   191 	// no number was found
       
   192 	if( numberCount > 1 )
       
   193 	    {
       
   194         // contact has multiple numbers and no default
   190         // contact has multiple numbers and no default
   195         TBuf<12> count;
   191         TBuf<12> count;
   196         count.Num( numberCount );
   192         count.Num( numberCount );
   197         iContent.PhoneNumberUpdatedL( 
   193         iContent.PhoneNumberUpdatedL( 
   198             count, CSpbContentProvider::ETypePhoneNumberMultiple );
   194             count, CSpbContentProvider::ETypePhoneNumberMultiple );
   199 	    }
   195         }
   200     else
   196     else
   201         {
   197         {
   202         // inform the observer
   198         // inform the observer
   203         iContent.PhoneNumberUpdatedL( 
   199         iContent.PhoneNumberUpdatedL( 
   204             number, CSpbContentProvider::ETypePhoneNumber );
   200             number, CSpbContentProvider::ETypePhoneNumber );
   205         }
   201         }
   206 
   202 
   207 	number.Close();
   203     number.Close();
   208 	}
   204     }
   209 
   205 
   210 // ---------------------------------------------------------------------------
   206 // ---------------------------------------------------------------------------
   211 // CSpbPhoneNumberParser::FetchPhoneNumber
   207 // CSpbPhoneNumberParser::FetchPhoneNumber
   212 // ---------------------------------------------------------------------------
   208 // ---------------------------------------------------------------------------
   213 //
   209 //