diff -r e4ebb16b39ea -r 603d3f8b6302 plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp --- a/plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp Fri Sep 17 08:34:34 2010 +0300 +++ b/plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp Mon Oct 04 01:37:06 2010 +0300 @@ -44,7 +44,6 @@ #include "cntfilterdetail.h" #include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel -#include "cntsqlsearch.h" #include "cntsymbianengine.h" #include "cnttransformphonenumber.h" @@ -76,10 +75,10 @@ bool &filterSupportedflag, QContactManager::Error* error) { - Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if (!filterSupported(filter) ) { *error = QContactManager::NotSupportedError; + filterSupportedflag = false; return QList(); } QList idList; @@ -118,7 +117,16 @@ { bool result = false; if (QContactFilter::ContactDetailFilter == filter.type()) { - result = true; + QContactDetailFilter detailFilter = static_cast(filter); + if (m_dbInfo.SupportsDetail(detailFilter.detailDefinitionName(), + detailFilter.detailFieldName())) { + result = true; + } + if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName && + detailFilter.detailFieldName() == QContactPhoneNumber::FieldNumber) { + //cpecial case - phone number matching + result = true; + } } return result; } @@ -255,26 +263,26 @@ QList CntFilterDetail::HandlePredictiveSearchFilter(const QContactFilter& filter, QContactManager::Error* error) { - QString sqlQuery; - if (filter.type() == QContactFilter::ContactDetailFilter) { - const QContactDetailFilter detailFilter(filter); - if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) { - CntSqlSearch sqlSearch; - //convert string to numeric format + const QContactDetailFilter detailFilter(filter); + if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) { QString pattern = detailFilter.value().toString(); - sqlQuery = sqlSearch.CreatePredictiveSearch(pattern); - return m_srvConnection.searchContacts(sqlQuery, error); - } - else { - return QList(); - } + //if ( detailFilter.detailFieldName() == QContactEmailAddress::FieldEmailAddress ) { + return m_srvConnection.searchOnServer( + pattern, CntSymbianSrvConnection::CntPredictiveSearchList, error); + /*} else { + QString sqlQuery; + CntSqlSearch sqlSearch; + //convert string to numeric format + sqlQuery = sqlSearch.CreatePredictiveSearch(pattern); + return m_srvConnection.searchContacts(sqlQuery, error); + }*/ + } } - else { - return QList(); - } + return QList(); } + /* * Creates an sql query to fetch contact item IDs for all the contact items * which may contain the specified telephone number in a telephone, fax @@ -339,11 +347,55 @@ } else { // Checking the upper digits... - TMatch phoneNumber = createPhoneMatchNumber( - numberPtr, numLowerDigits, numUpperDigits, error); - QString fieldToMatch = QString(" LIKE '%1").arg(phoneNumber.iUpperDigits) + "%'" ; - whereClause += " AND extra_value" + fieldToMatch; - sqlQuery = "SELECT contact_id FROM comm_addr" + whereClause; + + // select fields for contacts that match phone lookup + // SELECT contact_id, extra_value FROM comm_addr + // WHERE value = [value string] AND type = [type value]; + // + QString type = QString(" type = %1").arg(CntDbInfo::EPhoneNumber); + QString value = QString(" value = %1").arg(phoneDigits.iLowerSevenDigits); + QString whereClause = " WHERE" + value + " AND" + type; + sqlQuery = "SELECT contact_id, extra_value FROM comm_addr" + whereClause; + + QList > contactMatches = m_srvConnection.searchPhoneNumbers(sqlQuery, error); + + // Check if search query was successful + if (*error != QContactManager::NoError) { + return; + } + + QStringList list; + for (int i=0; i(extraValue.utf16())); + if (TLex(extValString).Val(storedUpperDigits) == KErrNone) { + + const TInt KDigitsToRemove = KMaxPhoneMatchLength - KLowerSevenDigits - phoneDigits.iNumUpperDigits; + for (TInt j = 0; j < KDigitsToRemove; ++j) { + // repeatedly divide by 10 to lop off the appropriate number of digits from the right + storedUpperDigits /= 10; + } + + storedUpperDigits = TMatch::padOutPhoneMatchNumber(storedUpperDigits, KDigitsToRemove); + + if (phoneDigits.iUpperDigits == storedUpperDigits) { + list.append(QString("%1").arg(contactMatches.at(i).first)); + } + } + else { + *error = QContactManager::UnspecifiedError; + } + } + // Recreate query to fetch all match ids + // SELECT DISTINCT contact_id FROM contact WHERE contact_id in ( + // .. + // ) + QString ids = list.join(" ,"); + sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE contact_id in ("; + sqlQuery += ids; + sqlQuery += ')'; } // refine search @@ -439,7 +491,7 @@ TMatch phoneNumber = createPhoneMatchNumber( number, numLowerDigits, numUpperDigits, error); if (*error == QContactManager::NoError) { - if (phoneNumber.iNumLowerDigits + phoneNumber.iUpperDigits == 0) { + if (phoneNumber.iNumLowerDigits + phoneNumber.iNumUpperDigits == 0) { // No digits, do nothing } else if (phoneNumber.iNumLowerDigits < KLowerSevenDigits) {