diff -r ebe688cedc25 -r 7fdbb852d323 mobilemessaging/smsmtm/clientmtm/src/smut.cpp --- a/mobilemessaging/smsmtm/clientmtm/src/smut.cpp Tue Aug 31 15:11:31 2010 +0300 +++ b/mobilemessaging/smsmtm/clientmtm/src/smut.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -373,7 +373,7 @@ KErrAlreadyExists if more than one contact entry found. KErrNone if details is obtained successfully. */ -EXPORT_C TInt TSmsUtilities::GetDetails(RFs& /*aFs*/, const TDesC& aFromAddress, TDes& aDetails, TInt aMaxLength) +EXPORT_C TInt TSmsUtilities::GetDetails(RFs& aFs, const TDesC& aFromAddress, TDes& aDetails, TInt aMaxLength) { __ASSERT_DEBUG( aMaxLength <= aDetails.MaxLength(), User::Invariant() ); @@ -382,7 +382,9 @@ aMaxLength = aDetails.MaxLength(); } - if ( (aDetails.Length() == 0) ) + TRAPD(err, DoGetDetailsL(aFs, aFromAddress, aDetails, aMaxLength)); + + if ( (err != KErrNone) || (aDetails.Length() == 0) ) { if (aFromAddress.Length() <= aMaxLength) { @@ -522,6 +524,130 @@ } } +void TSmsUtilities::DoGetDetailsL(RFs& aFs, const TDesC& aFromAddress, TDes& aDetails, TInt aMaxLength) + { + __UHEAP_MARK; + + // Check that aFromAddress is a valid GSM telephone number + if (!ValidGsmNumber(aFromAddress)) + User::Leave(KErrArgument); + + aDetails.Zero(); + + CContactDatabase* db = CContactDatabase::OpenL(); + CleanupStack::PushL(db); + + // Lookup the telephone number (aFromAddress) in the contact database + CContactIdArray* contactId = db->MatchPhoneNumberL(aFromAddress, KLowerSevenDigits); + CleanupStack::PushL(contactId); + + // Add the name if there is one and only one match in contacts. If there's more than + // one then wouldn't know which one to choose + if (contactId->Count() <= 0) + { + //The telephone number (aFromAddress) was not found in the contact database. + User::Leave(KErrNotFound); + } + else if (contactId->Count() > 1) + { + //There's more than one telephone number match in contacts. + User::Leave(KErrAlreadyExists); + } + + CContactItem* newContact = db->ReadMinimalContactL((*contactId)[0]); + CleanupStack::PushL(newContact); + + CContactItemFieldSet& fieldSet = newContact->CardFields(); + + TInt count = fieldSet.Count(); + + HBufC* family = HBufC::NewLC(aMaxLength); + HBufC* given = HBufC::NewLC(aMaxLength); + TPtr familyPtr(family->Des()); + TPtr givenPtr(given->Des()); + + // Find the Given and First Name of the contact + // Order important + for (TInt curField = 0; curField < count && !(familyPtr.Length() && givenPtr.Length()); curField++) + { + CContactItemField& field = fieldSet[curField]; + + if (!familyPtr.Length()) + GetName(field, KUidContactFieldFamilyName, familyPtr); + + if (!givenPtr.Length()) + GetName(field, KUidContactFieldGivenName, givenPtr); + } + + familyPtr.Trim(); + givenPtr.Trim(); + + TInt familyLen = familyPtr.Length(); + TInt givenLen = givenPtr.Length(); + + if (!familyLen && !givenLen) + { + //Leave if no family nor given name found + User::Leave(KErrNotFound); + } + else if (givenLen == 0) + { + // The maximum length of familyPtr may be greater than + // aMaxLength, so need to check its length before copying. + if (familyPtr.Length() > aMaxLength) + { + familyPtr.Set(familyPtr.LeftTPtr(aMaxLength)); + } + + aDetails = familyPtr; + } + else if (familyLen == 0) + { + // The maximum length of givenPtr may be greater than + // aMaxLength, so need to check its length before copying. + if (givenPtr.Length() > aMaxLength) + { + givenPtr.Set(givenPtr.LeftTPtr(aMaxLength)); + } + + aDetails = givenPtr; + } + else + { + RResourceFile resFile = OpenResourceFileL(aFs); + CleanupClosePushL(resFile); + ReadResourceStringL(resFile, R_SENDER_NAME_FORMAT, aDetails); + CleanupStack::PopAndDestroy(&resFile); + + TBuf<8> givenPlaceHolder = L_SMS_GIVEN_NAME; + TBuf<8> familyPlaceHolder = L_SMS_FAMILY_NAME; + TInt minLength = aDetails.Length() - givenPlaceHolder.Length() - familyPlaceHolder.Length(); + + if ((familyLen + givenLen + minLength) > aMaxLength) + { + // The maximum length of familyPtr may be greater than + // aMaxLength, so need to check its length before copying. + if (familyPtr.Length() > aMaxLength) + { + familyPtr.Set(familyPtr.LeftTPtr(aMaxLength)); + } + aDetails = familyPtr; + } + else + { + Replace(givenPlaceHolder, givenPtr, aDetails); + Replace(familyPlaceHolder, familyPtr, aDetails); + } + } + + //Remove leading and trailing spaces + aDetails.Trim(); + + CleanupStack::PopAndDestroy(5, db); + + __UHEAP_MARKEND; + } + TBool TSmsUtilities::ValidGsmNumber(const TDesC& aTelephone) { // Returns ETrue if @@ -579,6 +705,17 @@ return validTel && validCharsFound >= KSmsValidGsmNumberMinLength; } +void TSmsUtilities::GetName(CContactItemField& aField, TUid aFieldType, TDes& aName) + { + __UHEAP_MARK; + if (aField.ContentType().ContainsFieldType(aFieldType)) + { + TPtrC name = aField.TextStorage()->Text(); + aName = name.Left(Min(aName.MaxLength(), name.Length())); + } + __UHEAP_MARKEND; + } + TBool TSmsUtilities::DoGetDescriptionL(const CSmsMessage& aMessage, TDes& aDescription, TInt aMaxLength) // this function returns EFalse if aMessage has no special message indication data and is not an SMS_STATUS_REPORT, // i.e. more needs to be done to extract the description from the message