diff -r 63c982fb92f2 -r b73252188534 locationmanager/tagcreator/src/ctagcreator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationmanager/tagcreator/src/ctagcreator.cpp Thu Aug 19 10:20:41 2010 +0300 @@ -0,0 +1,307 @@ +/* +* 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: A class for creating country and city tags for media files +* +*/ + +#include "ctagcreator.h" +#include "locationmanagerdebug.h" + +#include "mdccommon.h" +#include "mdeobjectdef.h" +#include "mdepropertydef.h" +#include "mderelation.h" +#include "mdequery.h" +#include "mdeconstants.h" + +using namespace MdeConstants; + +_LIT ( KCountry, "country:"); // country:finland +_LIT ( KCity, "city:"); // city:helsinki|country:finland +_LIT ( KSeparator, "|" ); // Separator for city tag. Separate city and country. + +// -------------------------------------------------------------------------- +// CTagCreator::NewL +// -------------------------------------------------------------------------- +// +EXPORT_C CTagCreator* CTagCreator::NewL( ) + { + LOG( "CTagCreator::NewL(), begin" ); + CTagCreator* self = new (ELeave) CTagCreator( ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + LOG( "CTagCreator::NewL(), end" ); + return self; + } + +// -------------------------------------------------------------------------- +// CTagCreator::CTagCreator +// -------------------------------------------------------------------------- +// +CTagCreator::CTagCreator( ) + { + + } + +// -------------------------------------------------------------------------- +// CTagCreator::ConstructL +// -------------------------------------------------------------------------- +// +void CTagCreator::ConstructL() + { + + } + +// -------------------------------------------------------------------------- +// CTagCreator::~CTagCreator +// -------------------------------------------------------------------------- +// +CTagCreator::~CTagCreator() + { + + } + +// -------------------------------------------------------------------------- +// CTagCreator::SetMdeSession() +// -------------------------------------------------------------------------- +// +EXPORT_C void CTagCreator::SetSession(CMdESession* aSession) + { + iMdeSession = aSession; + } + +// --------------------------------------------------------------------------- +// CTagCreator::CreateTagForCountryL() +// --------------------------------------------------------------------------- +// +void CTagCreator::CreateTagForCountryL( const TPtrC& aCountry, + TItemId& aCountryTagId ) + { + LOG( "CTagCreator::CreateTagForCountryL - begin" ); + + // Crete new string for uri, -> country:India. + TUint totalLength = ( aCountry.Length() + KCountry().Length() ); + HBufC* buf = HBufC::NewLC( totalLength ); + TPtr uriPtr = buf->Des(); + _LIT(KCountryUriFormat, "%S%S"); + uriPtr.Format(KCountryUriFormat, &(KCountry()), &aCountry); + + // Check if there is allready tag for current country. + aCountryTagId = TagExistsL( uriPtr ); + + if( !aCountryTagId ) + { + // No tag, create tag for country. + aCountryTagId = CreateTagL( aCountry, uriPtr, MdeConstants::Tag::ESystemDefineCountryTags); + } + + CleanupStack::PopAndDestroy( buf ); + + LOG( "CTagCreator::CreateTagForCountryL - end" ); + } + +// --------------------------------------------------------------------------- +// CTagCreator::CreateTagForCityL() +// --------------------------------------------------------------------------- +// +void CTagCreator::CreateTagForCityL( const TPtrC& aCountry, const TPtrC& aCity, TItemId& aCityTagId ) + { + LOG( "CTagCreator::CreateTagForCityL - begin" ); + + // Crete new string for uri, -> city:bangalore|country:india + TUint totalLength = ( aCity.Length() + KCity.iTypeLength + + aCountry.Length() + KCountry.iTypeLength + KSeparator.iTypeLength ); + + HBufC* buf = HBufC::NewLC( totalLength ); + TPtr uriPtr = buf->Des(); + _LIT(KCityCountryUriFormat, "%S%S%S%S%S"); + uriPtr.Format(KCityCountryUriFormat, + &(KCity()), + &aCity, + &(KSeparator()), + &(KCountry()), + &aCountry); + + // Check if there is allready tag for current city. + aCityTagId = TagExistsL( uriPtr ); + + if( !aCityTagId ) + { + // No tag, create tag for city. + aCityTagId = CreateTagL( aCity, uriPtr, MdeConstants::Tag::ESystemDefineCityTags); + } + + CleanupStack::PopAndDestroy( buf ); + + LOG( "CTagCreator::CreateTagForCityL - end" ); + } + +// --------------------------------------------------------------------------- +// CTagCreator::CreateTagL +// --------------------------------------------------------------------------- +// +TUint32 CTagCreator::CreateTagL( const TPtrC& aTitle, + const TPtrC& aUri, + MdeConstants::Tag::TTagType aTagType) + { + LOG( "CTagCreator::CreateTagL - begin" ); + + CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL(); + // Create tag object. + CMdEObjectDef& tagObjectDef = defaultNamespace.GetObjectDefL( Tag::KTagObject ); + + CMdEObject* tagObject = NULL; + tagObject = iMdeSession->NewObjectLC( tagObjectDef, aUri ); + + // Type defs. + CMdEPropertyDef& creationDef = tagObjectDef.GetPropertyDefL( + Object::KCreationDateProperty ); + CMdEPropertyDef& modifiedDef = tagObjectDef.GetPropertyDefL( + Object::KLastModifiedDateProperty ); + CMdEPropertyDef& sizeDef = tagObjectDef.GetPropertyDefL( + Object::KSizeProperty ); + CMdEPropertyDef& itemTypeDef = tagObjectDef.GetPropertyDefL( + Object::KItemTypeProperty ); + CMdEPropertyDef& titleDef = tagObjectDef.GetPropertyDefL( + Object::KTitleProperty ); + + // Set propertys. + TTime universalTime; + universalTime.UniversalTime(); + + // Creation time. + tagObject->AddTimePropertyL( creationDef, universalTime ); + + // Modification time. + tagObject->AddTimePropertyL( modifiedDef, universalTime ); + + // Size + tagObject->AddUint32PropertyL( sizeDef, aTagType); + + // ItemType. + tagObject->AddTextPropertyL( itemTypeDef, Tag::KTagItemType ); + + // Title, for country. + if ( aTitle.Length() > 0 ) + { + tagObject->AddTextPropertyL( titleDef, aTitle ); // Add title + } + + // Finally add to database. + TItemId itemId = iMdeSession->AddObjectL( *tagObject ); + + CleanupStack::PopAndDestroy( tagObject ); + + LOG( "CTagCreator::CreateTagL - end" ); + + return itemId; + } + +// --------------------------------------------------------------------------- +// CTagCreator::TagExistsL +// --------------------------------------------------------------------------- +// +TUint32 CTagCreator::TagExistsL( const TPtrC& aUri ) + { + LOG( "CTagCreator::TagExistsL - begin" ); + + CMdEObject* mdeObject = NULL; + mdeObject = iMdeSession->GetObjectL( aUri ) ; // Just to find out if it exists. + + if( mdeObject ) + { + LOG( "CTagCreator::TagExistsL - returning object id" ); + return mdeObject->Id(); + } + else + { + LOG( "CTagCreator::TagExistsL - No object, return 0" ); + return 0; + } + } + +// --------------------------------------------------------------------------- +// CGeoTagger::AttachTagsL +// Create relationship to country and city tag +// --------------------------------------------------------------------------- +// +EXPORT_C void CTagCreator::AttachTagsL( const TUint32 aObjectId, const TItemId aCountryTagId, + const TItemId aCityTagId ) + { + LOG( "CGeoTagger::AttachTagsL" ); + CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL(); + // contains relation definition + CMdERelationDef& containsRelDef = defaultNamespace.GetRelationDefL( + Relations::KContains ); + + // Create relation between country tag and media object (image/video). + CMdERelation* relationObject = NULL; + if ( aCountryTagId ) + { + relationObject = iMdeSession->NewRelationLC ( containsRelDef, + aObjectId, aCountryTagId, 0 ); + + if ( !relationObject ) + { + LOG( "CGeoTagger::AttachTagsL - Couldn't create relation object!" ); + User::Leave ( KErrBadHandle ); + } + + iMdeSession->AddRelationL( *relationObject ); + + CleanupStack::PopAndDestroy( relationObject ); + } + + // Create relation between city tag and media object (image/video). + if ( aCityTagId ) + { + relationObject = iMdeSession->NewRelationLC ( containsRelDef, + aObjectId, aCityTagId, 0 ); + + if ( !relationObject) + { + LOG( "CGeoTagger::AttachTagsL - Couldn't create relation object!" ); + User::Leave ( KErrBadHandle ); + } + + iMdeSession->AddRelationL( *relationObject ); + + CleanupStack::PopAndDestroy( relationObject ); + } + + LOG( "CGeoTagger::AttachTagsL - end" ); + } + +// --------------------------------------------------------------------------- +// CGeoTagger::CreateLocationTagsL +// Create country and city tags +// --------------------------------------------------------------------------- +// +EXPORT_C void CTagCreator::CreateLocationTagsL( const TPtrC& aCountry, TItemId& aCountryTagId, + const TPtrC& aCity, TItemId& aCityTagId) + { + LOG( "CGeoTagger::CreateLocationTagsL" ); + if( aCountry.Length() > 0 ) + { + CreateTagForCountryL( aCountry, aCountryTagId ); + } + + if( aCity.Length() > 0 ) + { + CreateTagForCityL( aCountry, aCity, aCityTagId ); + } + } + +// End of file