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 // |