diff -r 8173571d354e -r 1fc85118c3ae locationdataharvester/maptileservice/src/maptileservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationdataharvester/maptileservice/src/maptileservice.cpp Tue Aug 31 15:09:25 2010 +0300 @@ -0,0 +1,394 @@ +/* +* 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 +#include +#include +#include +#include +#include "mylocationlogger.h" + +#include "maptileservice.h" +#include "maptiledblookuptable.h" +#include +// CONSTANTS +// Maptile interface uid +const TUid KUidMapTileInterface = { 0x2002E6E8 }; + +// Central Repository Key IDs +const TInt KEnableLocationFeature = 0x1; + +const char *MAPTILE_STATUS_RECEIVER = "/maptilestatuspublisher/name"; +const char *MAPTILE_STATUS_PUBLISHER = "/maptilecontactpublisher"; +const char *MAPTILE_STATUS_CALENDAR_PUBLISHER = "/maptilecalpublisher"; + + +// ----------------------------------------------------------------------------- +// MapTileService::MapTileService() +// Default constructor +// ----------------------------------------------------------------------------- +// +MapTileService::MapTileService():mCalPublisher(0) +{ + /* Constructs a QValueSpacePublisher that publishes values under path /mypublisher*/ + mPublisher = NULL; + mSubscriber = new QValueSpaceSubscriber( MAPTILE_STATUS_RECEIVER ); + //Connect for maptile status change key + QObject::connect(mSubscriber, SIGNAL(contentsChanged()), this, SLOT(setMaptileStatus())); + +} + +// ----------------------------------------------------------------------------- +// MapTileService::~MapTileService() +// Destructor +// ----------------------------------------------------------------------------- +// +MapTileService::~MapTileService() +{ + if( mSubscriber ) + { + delete mSubscriber; + mSubscriber = NULL; + } + + if( mPublisher ) + { + delete mPublisher; + mPublisher = NULL; + } + if( mCalPublisher ) + { + delete mCalPublisher; + mCalPublisher = NULL; + } +} +// ----------------------------------------------------------------------------- +// MapTileService::isLocationFeatureEnabled() +// Checks whether location feature is enabled or disabled +// ----------------------------------------------------------------------------- +// +bool MapTileService::isLocationFeatureEnabled(AppType appType) +{ + //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 + int ret=0; + if ( appType == AppTypeContacts ) + { + ret = centralRepository->Get( KEnableLocationFeature , repValue ); + } + else if ( appType == AppTypeCalendar ) + { + ret = centralRepository->Get( KEnableLocationFeature , repValue ); + } + + if ( ret == KErrNone && repValue == 1 ) + { + enableLocationFeature = true; + } + + delete centralRepository; + } + + return enableLocationFeature; + +} + + +// ----------------------------------------------------------------------------- +// MapTileService::getMapTileImage() +// Gets the maptile image path associated with a contact. +// ----------------------------------------------------------------------------- +// +int MapTileService::getMapTileImage( int id, AddressType sourceType, + QString& imagePath, Qt::Orientations orientation ) +{ + __TRACE_CALLSTACK; + + TLookupItem lookupItem; + + int addressCount = 0; + int maptileStatus = MapTileFetchingUnknownError; + + int error = readEntryFromMaptileDataBase( id, sourceType, lookupItem, addressCount ); + + //if entry available returns the file path otherwise NULL. + if ( KErrNone == error ) + { + + maptileStatus = lookupItem.iFetchingStatus; + MYLOCLOGSTRING1("getMapTileImage maptileStatus - %d ", maptileStatus ); + + if( maptileStatus == MapTileFetchingCompleted ) + { + //Get the image path + QString imageFile((QChar*)lookupItem.iFilePath.Ptr(), + lookupItem.iFilePath.Length()); + imagePath = imageFile; + + if( orientation == Qt::Vertical ) + { + imagePath.append( MAPTILE_IMAGE_PORTRAIT ); + } + else + { + if( sourceType == AddressPlain ) + { + imagePath.append( MAPTILE_IMAGE_CALENDAR ); + } + else if ( sourceType == AddressHome || + sourceType == AddressPreference || sourceType == AddressWork ) + { + imagePath.append( MAPTILE_IMAGE_CONTACT ); + } + imagePath.append( MAPTILE_IMAGE_LANDSCAPE ); + } + + //Check if file exist + if( !QFile::exists( imagePath ) ) + { + imagePath.clear(); + maptileStatus = MapTileFetchingUnknownError; + } + } + else if( maptileStatus == MapTileFetchingNetworkError || + maptileStatus == MapTileFetchingInProgress ) + { + switch(sourceType) + { + case AddressHome: + case AddressPreference: + case AddressWork: + { + publishValue( id, sourceType, addressCount ); + break; + } + + case AddressPlain: + { + publishCalEntry( id ); + break; + } + default: + break; + }; + + } + + + } + else if ( KErrNotFound == error ) + { + MYLOCLOGSTRING("getMapTileImage entry not found, return MapTileFetchingInProgress" ); + //If entry is not found , it will be a newly added entry. + switch (sourceType) { + case AddressHome: + case AddressPreference: + case AddressWork: + { + publishValue(id, sourceType, addressCount); + break; + } + + case AddressPlain: + { + publishCalEntry(id); + break; + } + default: + break; + }; + maptileStatus = MapTileFetchingInProgress; + } + + //Return the maptile status + MYLOCLOGSTRING("getMapTileImage returns MapTileFetchingUnknownError" ); + return maptileStatus; + +} + +// ----------------------------------------------------------------------------- +// MapTileService::setMaptileStatus() +// Gets call back from location engine , after maptile fetching done , +// to set status and emit signal . +// ----------------------------------------------------------------------------- +// +void MapTileService::setMaptileStatus() +{ + __TRACE_CALLSTACK; + QString imagePath; + AddressType addressType = AddressUnknown; + QStringList subPath = mSubscriber->subPaths(); + QVariant value = mSubscriber->value(subPath.at(0)); + + //Subscriber Protocol : [appid-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; + case ESourceCalendar: + addressType = AddressPlain; + break; + default: + break; + } + + //Emit the maptile status signal + int type = addressType; + MYLOCLOGSTRING1("setMaptileStatus() status - %d ", addressType ); + if( mLastViewedEntryId == id ) + { + emit maptileFetchingStatusUpdate( mLastViewedEntryId, type , status ); + } + +} + +// ----------------------------------------------------------------------------- +// MapTileService::publishValue() +// publish the contact entry +// ----------------------------------------------------------------------------- +// +void MapTileService::publishValue( int id, AddressType sourceType, int addressCount ) +{ + __TRACE_CALLSTACK; + mLastViewedEntryId = 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( MAPTILE_STATUS_PUBLISHER, this); + } + + + /* Publisher protocol [appid-addresstype-count] */ + QString addressId; + addressId.append( QVariant(id).toString()); + addressId.append( QChar('-') ); + addressId.append( QVariant(addressType).toString()); + addressId.append( QChar('-') ); + addressId.append( QVariant(addressCount).toString() ); + mPublisher->setValue("name", addressId.toAscii() ); + mPublisher->sync(); + +} + +// ----------------------------------------------------------------------------- +// MapTileService::publishValue() +// publish the calendar entry +// ----------------------------------------------------------------------------- +// +void MapTileService::publishCalEntry( int id) +{ + __TRACE_CALLSTACK; + mLastViewedEntryId = id; + if ( NULL ==mCalPublisher ) + { + /* Constructs a QValueSpacePublisher that publishes values under path /mypublisher*/ + mCalPublisher = new QValueSpacePublisher( MAPTILE_STATUS_CALENDAR_PUBLISHER, this); + } + mCalPublisher->setValue("name", id); + mCalPublisher->sync(); +} + +// ----------------------------------------------------------------------------- +// MapTileService::readEntryFromMaptileDataBase() +// Read all entries from database +// ----------------------------------------------------------------------------- +// +int MapTileService::readEntryFromMaptileDataBase( + int id, AddressType sourceType, TLookupItem& aLookupItem, int& aNoOfAddress ) +{ + + //Maptile database instance + CLookupMapTileDatabase* mapTileDatabase = NULL; + + TRAPD( err, mapTileDatabase = CLookupMapTileDatabase::NewL( + KMapTileLookupDatabaseName ) ); + + if ( KErrNone == err ) + { + TRAP( err,aNoOfAddress = mapTileDatabase->FindNumberOfAddressL(id) ); + MYLOCLOGSTRING1("no of address FindNumberOfAddressL returns - %d ", err ); + if ( KErrNone == err ) + { + aLookupItem.iUid = id; + switch (sourceType) + { + case AddressPlain: + aLookupItem.iSource = ESourceCalendar; + break; + 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 ) ); + + MYLOCLOGSTRING1("getMapTileImage FindEntryL returns - %d ", err ); + } + //delet the database instance + delete mapTileDatabase; + + } + + return err; +} +// End of file