inc/msgcontacthandler.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 17 Sep 2010 08:28:39 +0300
changeset 70 a15d9966050f
parent 44 36f374c67aa8
permissions -rw-r--r--
Revision: 201035 Kit: 201037

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: This header handles the phonebook manager resolve number static
 *              functions.
 *
 */

#ifndef MSGCONTACTHANDLER_H_
#define MSGCONTACTHANDLER_H_

#include <qmobilityglobal.h>

#include <qtcontacts.h>
#include <qcontactfilter.h>
#include <qcontactdetailfilter.h>
#include <QFile>
#include <qversitcontactimporter.h>
#include <qversitdocument.h>
#include <qversitreader.h>
#include <qcontactid.h>

QTM_BEGIN_NAMESPACE
class QContactManager;
QTM_END_NAMESPACE

QTM_USE_NAMESPACE

class MsgContactHandler
{

public:

    /**
     * This shall resolve contact number with display name
     * @param contactNumber number to resolve
     * @param displayName resolved name
     * @param countPhoneNumber specifies number of contacts inside
     * the resolved contact ex mobile, home, office etc
     * @return contacts unique localId
     */
    static int resolveContactDisplayName(const QString& contactNumber,
                                         QString& displayName,
                                         int& countPhoneNumber)
    {
        QContactManager phonebookManager;
        QVariant address(contactNumber);

        // apply filter on phone number field
        QContactDetailFilter phoneFilter;
        phoneFilter.setDetailDefinitionName(
                QContactPhoneNumber::DefinitionName,
                QContactPhoneNumber::FieldNumber);

        phoneFilter.setValue(address);
        phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);
        QList<QContact> matchingContacts =
                phonebookManager.contacts(phoneFilter);
        if (matchingContacts.count() > 0)
        {
            // Fill the contact details
            QContact match = matchingContacts.at(0);

            displayName = match.displayLabel();
            QList<QContactPhoneNumber> numbers =
                    match.details<QContactPhoneNumber> ();
            countPhoneNumber = numbers.count();
            return match.localId();
        }

        // apply filter on email address field
        QContactDetailFilter emailFilter;
        emailFilter.setDetailDefinitionName(
                QContactEmailAddress::DefinitionName,
                QContactEmailAddress::FieldEmailAddress);

        emailFilter.setValue(address);
        emailFilter.setMatchFlags(QContactFilter::MatchExactly);
        matchingContacts = phonebookManager.contacts(emailFilter);
        if ( matchingContacts.count() > 0 )
        {
            // Fill the contact details
            QContact match = matchingContacts.at(0);

            displayName = match.displayLabel();
            QList<QContactEmailAddress> numbers =
                    match.details<QContactEmailAddress> ();
            countPhoneNumber = numbers.count();
            return match.localId();
        }

        // no matching contact
        displayName = contactNumber;
        return -1;
    }

    /**
     * This shall resolve contact number with display name
     * @param contactNumber number to resolve
     * @param fieldName specifies filter name
     * @param fieldType specifies filter type
     * @return contact unique local id
     */
    static int resolveContactDisplayName(const QString& contactNumber,
                                         const QString& fieldName,
                                         const QString& fieldType)
    {
        int contactId = -1;

        QContactManager phonebookManager("symbian");

        QContactDetailFilter phoneFilter;
        phoneFilter.setDetailDefinitionName(fieldName, fieldType);
        phoneFilter.setValue(contactNumber);
        phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);

        QList<QContact>
                matchingContacts = phonebookManager.contacts(phoneFilter);

        if (matchingContacts.count() > 0)
        {
            contactId = matchingContacts.at(0).localId();
        }
        return contactId;
    }

    //---------------------------------------------------------------
    // findContactList
    // Finds the contact matching the phone number.
    // @param phoneNumber Phone number to be matchned.
    // @return List of matching contacts.
    //---------------------------------------------------------------
    static QList<QContact> findContactList(const QString &phoneNumber)
    {
        QContactManager phonebookManager("symbian");

        QContactDetailFilter phoneFilter;
        phoneFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName,
            QContactPhoneNumber::FieldNumber);
        phoneFilter.setValue(phoneNumber);
        phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith);

        QList<QContact> matchingContacts = phonebookManager.contacts(phoneFilter);

        return matchingContacts;
    }

    /**
     * Get display-name of a contact from VCard.
     * @param filePath, VCard file-path
     * @return display-name
     */

    static QString getVCardDisplayName(QString& filePath)
    {
        QString displayName = QString("");
        //open file for parsing
        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly))
        {
            return displayName;
        }
        // parse contents
        QVersitReader reader;
        reader.setDevice(&file);
        if (reader.startReading())
        {
            if (reader.waitForFinished())
            {
                QList<QVersitDocument> versitDocuments = reader.results();
                // Use the resulting document
                if (versitDocuments.count() > 0)
                {
                    QVersitContactImporter importer;
                    bool import_docs = importer.importDocuments(versitDocuments);
                    if(import_docs)
                    {
                       QList<QContact> contacts = importer.contacts();
                       // get display-name
                       if (contacts.count() > 0)
                       {
                          //resolveSynthesizedDisplayLabel
                          QContactManager* contactManager =
                                new QContactManager("symbian");
                          displayName
                                = contactManager->synthesizedDisplayLabel(contacts[0]);
                          delete contactManager;
                       }
                    }
                }
            }
        }
        file.close();
        return displayName;
    }

    /**
     * Get list of self-addresses
     * @return QStringList, list of self-addresses
     */
    static QStringList selfAddresses()
    {
        QStringList selfAddrs;
        QContactManager* contactManager =
                                        new QContactManager("symbian");
        QContactLocalId selfId = contactManager->selfContactId();
        if( (selfId == 0) ||
            (contactManager->error() == QContactManager::DoesNotExistError) )
        {
            // if no self-address exists
            return selfAddrs;
        }

        QContact selfContact = contactManager->contact(selfId);
        
        // append numbers to the list of self-addresses
        QList<QContactPhoneNumber> selfPhoneNumbers = 
                        selfContact.details<QContactPhoneNumber>();
        int selfNumCount = selfPhoneNumbers.count();
        for(int i=0; i< selfNumCount; i++)
        {
            selfAddrs << selfPhoneNumbers.at(i).number();
        }

        // append email-addresses to the list
        QList<QContactEmailAddress> selfEmailAddrs = 
                        selfContact.details<QContactEmailAddress>();
        int selfEmailAddrCount = selfEmailAddrs.count();
        for(int i=0; i< selfEmailAddrCount; i++)
        {
            selfAddrs << selfEmailAddrs.at(i).emailAddress();
        }
        return selfAddrs;
    }

};

#endif /* MSGCONTACTHANDLER_H_ */