bool CntFilterDetail::filterSupported(const QContactFilter& filter) { bool result = false; if (QContactFilter::ContactDetailFilter == filter.type()) { QContactDetailFilter detailFilter = static_cast<QContactFilter>(filter); if (m_dbInfo.SupportsDetail(detailFilter.detailDefinitionName(), detailFilter.detailFieldName())) { result = true; } else if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName && detailFilter.detailFieldName() == QContactPhoneNumber::FieldNumber) { //special case - phone number matching result = true; } else if (detailFilter.detailDefinitionName() == QContactType::DefinitionName && detailFilter.detailFieldName() == QContactType::FieldType) { //filtering by contact type is supported result = true; } else if (detailFilter.detailDefinitionName() == QContactGuid::DefinitionName && detailFilter.detailFieldName() == QContactGuid::FieldGuid) { //filtering by global Uid is supported result = true; } } return result; }
bool CntFilterIntersection::filterSupported(const QContactFilter& filter) { bool result = false; if (QContactFilter::IntersectionFilter == filter.type()) { result = true; } return result; }
bool CntFilterDefault::filterSupported(const QContactFilter& filter) { bool result = false; if(QContactFilter::DefaultFilter == filter.type()) { result = true; } return result; }
/*! * The contact database version implementation for QContactManager::contacts * function. See filterSupported for the list of supported filters. * All the other filtering flags fallback to the generic filtering done * in QContactManagerEngine (expected to be done by to the caller). Contacts * are sorted only if the sort order is supported by contacts database. See * CntSymbianSorterDbms::filterSupportLevel for the list of supported sort * orders. * * Using detail filter with match flag MatchPhoneNumber is implemented by the * contact model "phone number match" that filters by comparing the search * string characters (digits) starting from the rightmost digit. The detail * filter value must be at least 7 digits, otherwise an error code * NotSupportedError is given. The actual digit count that is used is 7 to 15 * digits, depending on the configuration of the device. * * \a filter The QContactFilter to be used. * \a sortOrders The sort orders to be used. If the sort orders are not * supported by contacts database this parameter is ignored and sorting needs * to be done by the caller. * \a error On return, contains the possible error in filtering/sorting. */ QList<QContactLocalId> CntSymbianFilter::contacts( const QContactFilter &filter, const QList<QContactSortOrder> &sortOrders, bool &filterSupportedFlag, QContactManager::Error* error) { QList<QContactLocalId> result; // No need to proceed if some of the filters in the chain is not supported if(!filterSupportedFlag) return result; // Intersection filter is handled by a recursive function call for each // contained filter (unless at least one requires slow filtering) if (filter.type() == QContactFilter::IntersectionFilter) { QList<QContactFilter> filters = ((QContactIntersectionFilter) filter).filters(); for(int i(0); filterSupportedFlag && i < filters.count(); i++) { if(result.isEmpty()) result = contacts(filters[i], sortOrders, filterSupportedFlag, error); else result = contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet().intersect(result.toSet()).toList(); } // Union filter is handled by a recursive function call for each // contained filter (unless at least one requires slow filtering) } else if (filter.type() == QContactFilter::UnionFilter) { QList<QContactFilter> filters = ((QContactUnionFilter) filter).filters(); for(int i(0); filterSupportedFlag && i < filters.count(); i++) { if(result.isEmpty()) result = contacts(filters[i], sortOrders, filterSupportedFlag, error); else result = (contacts(filters[i], sortOrders, filterSupportedFlag, error).toSet() + result.toSet()).toList(); } // Detail filter with a string list is split and re-constructed into // an intersection filter } else if (filter.type() == QContactFilter::ContactDetailFilter && (static_cast<const QContactDetailFilter &>(filter)).value().type() == QVariant::StringList) { QStringList values = (static_cast<const QContactDetailFilter &>(filter)).value().toStringList(); QContactIntersectionFilter intersectionFilter; foreach(const QString& value, values) { QContactDetailFilter detailFilter = filter; detailFilter.setValue(value); intersectionFilter.append(detailFilter); }
bool CntFilterRelationship::filterSupported(const QContactFilter& filter) { bool result = false; if (QContactFilter::RelationshipFilter == filter.type()) { QContactRelationshipFilter relationfilter(filter); if(relationfilter.relationshipType() == QContactRelationship::HasMember) { result = true; } } return result; }
void CntFilterIntersection::getSelectQueryforFilter(const QContactFilter& filter, QString& sqlSelectQuery, QContactManager::Error* error) { switch(filter.type()) { case QContactFilter::DefaultFilter: { CntFilterDefault defaultfltr(m_contactdatabase,m_srvConnection,m_dbInfo); defaultfltr.createSelectQuery(filter,sqlSelectQuery,error); break; } case QContactFilter::ContactDetailFilter: { QContactDetailFilter detailfilter(filter); if (detailfilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) { CntFilterDetail dtlfltr(m_contactdatabase,m_srvConnection,m_dbInfo); #ifdef PBK_UNIT_TEST if (m_emulateBestMatching) { dtlfltr.emulateBestMatching(); } #endif dtlfltr.createPhoneNumberQuery(filter,sqlSelectQuery,error); } else { CntFilterDetail dtlfltr(m_contactdatabase,m_srvConnection,m_dbInfo); dtlfltr.createSelectQuery(filter,sqlSelectQuery,error); } break; } case QContactFilter::RelationshipFilter: { CntFilterRelationship relationfltr(m_contactdatabase,m_srvConnection,m_dbInfo); relationfltr.createSelectQuery(filter,sqlSelectQuery,error); break; } case QContactFilter::IntersectionFilter: { sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; CntFilterIntersection intersectionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); intersectionfltr.createSelectQuery(filter,sqlSelectQuery,error); sqlSelectQuery += ')'; break; } case QContactFilter::UnionFilter: { sqlSelectQuery += "SELECT DISTINCT contact_id FROM ("; CntFilterUnion unionfltr(m_contactdatabase,m_srvConnection,m_dbInfo); unionfltr.createSelectQuery(filter,sqlSelectQuery,error); sqlSelectQuery += ')'; break; } default: { *error = QContactManager::NotSupportedError; break; } } }
/*! Returns true if the filter has the same type and criteria as \a other \since 1.0 */ bool QContactFilter::operator==(const QContactFilter& other) const { /* A default filter is only equal to other default filters */ if (!d_ptr) return !other.d_ptr; /* Different types can't be equal */ if (other.type() != type()) return false; /* Otherwise, use the virtual op == */ return d_ptr->compare(other.d_ptr); }
/*! \reimp */ bool QContactWinCEEngine::isFilterSupported(const QContactFilter& filter) const { switch (filter.type()) { case QContactFilter::InvalidFilter: case QContactFilter::DefaultFilter: case QContactFilter::LocalIdFilter: case QContactFilter::ContactDetailFilter: case QContactFilter::ContactDetailRangeFilter: case QContactFilter::ActionFilter: case QContactFilter::IntersectionFilter: case QContactFilter::UnionFilter: return true; } return false; }
bool CntFilterDetailDisplayLabel::filterSupported(const QContactFilter& filter) { bool result = false; if( filter.type() == QContactFilter::ContactDetailFilter) { const QContactDetailFilter detailFilter(filter); if (detailFilter.detailDefinitionName() == QContactDisplayLabel::DefinitionName) { result = true; } } return false; }
bool CntFilterDetail::filterSupported(const QContactFilter& filter) { bool result = false; if (QContactFilter::ContactDetailFilter == filter.type()) { QContactDetailFilter detailFilter = static_cast<QContactFilter>(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; }
QList<QContactLocalId> CntFilterDetail::HandlePredictiveSearchFilter(const QContactFilter& filter, QContactManager::Error* error) { if (filter.type() == QContactFilter::ContactDetailFilter) { const QContactDetailFilter detailFilter(filter); if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) { QString pattern = detailFilter.value().toString(); //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); }*/ } } return QList<QContactLocalId>(); }