phonebookengines/cntmaptileservice/src/cntmaptileservice.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:02:44 +0300
changeset 46 efe85016a067
parent 25 76a2435edfd4
child 47 7cbcb2896f0e
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* Copyright (c) 2010 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: 
*     Maptile service implementation
*
*/


#include <centralrepository.h> 
#include <locationservicedefines.h>
#include <qvaluespacepublisher.h>
#include <qvaluespacesubscriber.h>

#include "cntmaptileservice.h"
#include "cntmaptiledblookuptable.h"

// CONSTANTS
// Maptile interface uid
const TUid KUidMapTileInterface = { 0x2002C3A8 };
// Central Repository Key IDs
const TInt KEnableLocationFeature           = 0x1;

const char *CNT_MAPTILE_STATUS_RECEIVER = "/maptilestatuspublisher/name";
const char *CNT_MAPTILE_STATUS_PUBLISHER = "/cntmaptilepublisher";


// -----------------------------------------------------------------------------
// CntMapTileService::CntMapTileService()
// Default constructor
// -----------------------------------------------------------------------------
//
CntMapTileService::CntMapTileService()
{
    //publisher
    mPublisher = NULL;
    
    //subscriber
    mSubscriber = new QValueSpaceSubscriber( CNT_MAPTILE_STATUS_RECEIVER );
    //Connect for maptile status change key
    QObject::connect(mSubscriber, SIGNAL(contentsChanged()), this, SLOT(setMaptileStatus()));

}


// -----------------------------------------------------------------------------
// CntMapTileService::~CntMapTileService()
// Destructor
// -----------------------------------------------------------------------------
//
CntMapTileService::~CntMapTileService()
{
    if( mSubscriber )
    {
        delete mSubscriber;
        mSubscriber = NULL;
    }
    
    if( mPublisher )
    {
        delete mPublisher;
        mPublisher = NULL;
    }
}
// -----------------------------------------------------------------------------
// CntMapTileService::isLocationFeatureEnabled()
// Checks whether location feature is enabled or disabled
// -----------------------------------------------------------------------------
//
bool CntMapTileService::isLocationFeatureEnabled()
{ 
    //Create the centrep with uid 0x2002C3A8
    bool enableLocationFeature = false;
    
    CRepository* centralRepository = NULL;  

    TRAPD( err, centralRepository = CRepository::NewL( KUidMapTileInterface ) );

    if ( KErrNone == err )
    {
        TInt repValue;
      
        //Get the Location feature flag 
        TInt ret = centralRepository->Get( KEnableLocationFeature , repValue );
      
        if ( ret == KErrNone && repValue == 1 )
        {
            enableLocationFeature  = true;
        }
           
         delete centralRepository;
    }
           
    return   enableLocationFeature;
    
}


// -----------------------------------------------------------------------------
// CntMapTileService::getMapTileImage()
// Gets the maptile image path associated with a contact.
// -----------------------------------------------------------------------------
//
int CntMapTileService::getMapTileImage( int contactId , ContactAddressType sourceType, QString& imagePath )    
{
    
    TLookupItem lookupItem;
    
    int addressCount = 0;
    int maptileStatus = MapTileFetchingUnknownError;
    
    //Read the entry from maptile database
    int error = readEntryFromMaptileDataBase( contactId, sourceType, lookupItem, addressCount );
    
    //if entry available returns the file path otherwise NULL. 
    if ( KErrNone == error  )
    {
        maptileStatus = lookupItem.iFetchingStatus;
        
        if( maptileStatus == MapTileFetchingCompleted )
        {
            //Get the image path
            QString imageFile((QChar*)lookupItem.iFilePath.Ptr(),
                    lookupItem.iFilePath.Length());
            imagePath = imageFile;
        }
        else if( maptileStatus == MapTileFetchingNetworkError ||
                    maptileStatus == MapTileFetchingInProgress )
        {
            //Publish the contact id for maptile processing
           	publishValue( contactId, sourceType, addressCount );
        }

    }
    else if ( KErrNotFound == error )
    {
        //If entry is not found , it will be a newly added entry.
        publishValue( contactId, sourceType, addressCount );
        maptileStatus = MapTileFetchingInProgress;
    }
   
    //Return the maptile status
    return maptileStatus;
}


// -----------------------------------------------------------------------------
// CntMapTileService::setMaptileStatus()
// Emits the maptile status changed event to contact application
// -----------------------------------------------------------------------------
//
void CntMapTileService::setMaptileStatus()
{
    QString imagePath;
    ContactAddressType addressType = AddressPreference;
    
    QStringList subPath = mSubscriber->subPaths();
    QVariant value = mSubscriber->value(subPath.at(0));
    
    //Subscriber Protocol : [contactid-addresstype-maptilestatus]
    QStringList text = value.toString().split("-");
    int id = text.at(0).toInt();
    int status = text.at(2).toInt();
    
    switch( text.at(1).toInt() )
    {
        case ESourceContactsPref:
            addressType = AddressPreference;
            break;
        case ESourceContactsWork:
            addressType = AddressWork;
            break;        
        case ESourceContactsHome:
            addressType = AddressHome;
            break;
        default:
            break;
    }
  
    //Emit the maptile status signal 
    int type = addressType;
    if( mLastViewedContactId == id )
    {
        emit maptileFetchingStatusUpdate( mLastViewedContactId, type , status );
    }
}


// -----------------------------------------------------------------------------
// CntMapTileService::publishValue()
// Publish the the contact id and address for which maptile to be processed.
// -----------------------------------------------------------------------------
//
void CntMapTileService::publishValue( int id, ContactAddressType sourceType, int addressCount )
{
    
    mLastViewedContactId = id;
    int addressType = ESourceInvalid;
    
    switch( sourceType )
    {
        case AddressPreference:
            addressType = ESourceContactsPref;
            break;
        case AddressWork:
            addressType = ESourceContactsWork;
            break;
        case AddressHome:
            addressType = ESourceContactsHome;
            break;
    }
    
    if ( !mPublisher )
    {
        /* Constructs a QValueSpacePublisher that publishes values under path /mypublisher*/
        mPublisher = new QValueSpacePublisher( CNT_MAPTILE_STATUS_PUBLISHER, this);
    }
       
    /* Publisher protocol [appid-addresstype-count] */
    mContactEntryInfo.clear();
    mContactEntryInfo.append( QVariant(id).toString());
    mContactEntryInfo.append( QChar('-') );
    mContactEntryInfo.append( QVariant(addressType).toString());
    mContactEntryInfo.append( QChar('-') );
    mContactEntryInfo.append( QVariant(addressCount).toString() );
    
    mPublisher->setValue("name", mContactEntryInfo.toAscii() );
    mPublisher->sync();
    
}

// -----------------------------------------------------------------------------
// CntMapTileService::readEntryFromMaptileDataBase()
// Read the entry from maptile database
// -----------------------------------------------------------------------------
//
int CntMapTileService::readEntryFromMaptileDataBase( 
            int id, ContactAddressType sourceType, TLookupItem& aLookupItem, int& aNoOfAddress )
{
    
    //Maptile database  instance
    CLookupMapTileDatabase* mapTileDatabase = NULL;

    TRAPD( err, mapTileDatabase = CLookupMapTileDatabase::NewL(
            KMapTileLookupDatabaseName ) );

    if ( KErrNone == err )
    {
        int appId = id;
        TRAP( err, aNoOfAddress = mapTileDatabase->FindNumberOfAddressL(appId) );
       
        if( err != KErrNone )
        {
            aNoOfAddress = 0;
        }
            
        aLookupItem.iUid = id;
        switch( sourceType )
        {
           case AddressPreference:
               aLookupItem.iSource = ESourceContactsPref;
               break;
           case AddressWork:
               aLookupItem.iSource = ESourceContactsWork;
               break;
           case AddressHome:
               aLookupItem.iSource = ESourceContactsHome;
               break;
           default: 
               break;
        }
   
        TRAP( err , mapTileDatabase->FindEntryL( aLookupItem ) );
        
        //delet the database instance
        delete mapTileDatabase;
           
    }
    
    return err;
}

// End of file