diff -r 000000000000 -r c53acadfccc6 contextengine/plugins/calendarplugin/src/CalendarContextPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextengine/plugins/calendarplugin/src/CalendarContextPlugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,561 @@ +/* +* Copyright (c) 2007-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: + * +*/ + + +// INCLUDE FILES +#include + +#include +#include +#include +#include +#include + +#include + +#include "CalendarContextPlugin.h" +#include "harvesterlog.h" +#include "mdeconstants.h" +#include "mdenamespacedef.h" +#include "mdeobjectdef.h" +#include "harvesterdata.h" +#include "mdsutils.h" + +using namespace MdeConstants; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::NewL +// ----------------------------------------------------------------------------- +// +CCalendarContextPlugin* CCalendarContextPlugin::NewL() + { + WRITELOG( "CCalendarContextPlugin::NewL -- ENTER" ); + + CCalendarContextPlugin* self = new(ELeave) CCalendarContextPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + WRITELOG( "CCalendarContextPlugin::NewL -- RETURN" ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::CCalendarContextPlugin +// ----------------------------------------------------------------------------- +// +CCalendarContextPlugin::CCalendarContextPlugin() : + iCalInstanceView( NULL ), iMdeSession( NULL ), + iCalSession( NULL ), iCalInstanceViewCompleted( EFalse ), + iRetryCount( 0 ) + { + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::ConstructL() // second-phase constructor + { + WRITELOG( "CCalendarContextPlugin::ConstructL -- ENTER" ); + + OpenViewL(); + + WRITELOG( "CCalendarContextPlugin::ConstructL -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::~CCalendarContextPlugin +// ----------------------------------------------------------------------------- +// +CCalendarContextPlugin::~CCalendarContextPlugin() // destruct + { + WRITELOG( "CCalendarContextPlugin::~CCalendarContextPlugin -- ENTER" ); + delete iCalInstanceView; + delete iCalSession; + + if( iInitTimer ) + { + iInitTimer->Cancel(); + delete iInitTimer; + } + + WRITELOG( "CCalendarContextPlugin::~CCalendarContextPlugin -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::InitL +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::Init( MContextPluginObserver& aObserver ) + { + WRITELOG( "CCalendarContextPlugin::InitL -- ENTER" ); + + // Notification to context framework + aObserver.PluginInitializationStatus( KErrNone ); + + WRITELOG( "CCalendarContextPlugin::InitL -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::ContextSnapshot +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::ContextSnapshot( MContextPluginObserver& aObserver, + CHarvesterData& aHD ) + { + WRITELOG( "CCalendarContextPlugin::ContextSnapshotL, 1 obj. --ENTER" ); + + CMdEObject& mdeObject = aHD.MdeObject(); + TRAPD( error, AddMetaDataL( mdeObject ) ) ; + // Notification to context framework + aHD.SetErrorCode( error ); + aObserver.PluginSnapshotStatus( &aHD ); + + WRITELOG( "CCalendarContextPlugin::ContextSnapshotL, 1 obj. --RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::ContextSnapshot +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::ContextSnapshot(MContextPluginObserver& aObserver, + RPointerArray< CHarvesterData >& aHDArray) + { +#ifdef _DEBUG + WRITELOG( "CCalendarContextPlugin::ContextSnapshotL, array -- ENTER" ); + WRITELOG1("Size of array: %d", aHDArray.Count() ); +#endif + + TInt err = KErrNone; + const TInt count( aHDArray.Count() ); + for( TInt i = 0; i < count; ++i ) + { + CHarvesterData* hd = aHDArray[i]; + CMdEObject& mdeObject = hd->MdeObject(); + TRAP( err,AddMetaDataL( mdeObject ) ); + hd->SetErrorCode( err ); + // Notification to context framework + aObserver.PluginSnapshotStatus( hd ); + } + + WRITELOG( "CCalendarContextPlugin::ContextSnapshotL, array -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::GetTimeMdEPropL +// ----------------------------------------------------------------------------- +// +#ifdef _DEBUG +TTime CCalendarContextPlugin::GetTimeMdEPropL( const TDesC& aNameSpace, + const TDesC& aProp, CMdEObject& aMdEObject) const +#else +TTime CCalendarContextPlugin::GetTimeMdEPropL( const TDesC&, + const TDesC& aProp, CMdEObject& aMdEObject) const +#endif + { + WRITELOG( "CCalendarContextPlugin::GetTimeMdEPropL -- ENTER" ); + WRITELOG1("aNameSpace: %S", &aNameSpace ); + WRITELOG1("aProp: %S", &aProp ); + + CMdEPropertyDef& timeDef = aMdEObject.Def().GetPropertyDefL( aProp ); + + CMdEProperty* timeProp = NULL; + aMdEObject.Property( timeDef, timeProp ); + + if ( !timeProp ) + { + User::Leave( KErrNotFound ); + } + + WRITELOG( "CCalendarContextPlugin::GetTimeMdEPropL -- RETURN" ); + + return timeProp->TimeValueL(); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::AddMetaDataL +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::AddMetaDataL( CMdEObject& aMdEObject ) const + { + if ( aMdEObject.Id() == KNoId ) + return; + + WRITELOG( "CCalendarContextPlugin::AddMetaDataL -- ENTER" ); + + if ( !iCalInstanceViewCompleted ) + { + // The CalendarInstanceView has not yet reported completion by calling + // the callback routine, so no calendar information can be looked up. + WRITELOG( "iCalInstanceViewCompleted==EFalse, returning." ); + WRITELOG( "CCalendarContextPlugin::AddMetaDataL -- RETURN" ); + return; + } + + RPointerArray instances; + TCleanupItem cleanupItem( MdsUtils::CleanupPtrArray, &instances ); + CleanupStack::PushL( cleanupItem ); + + // From the mdsAddTime find the start of the day and the end of the day + // in order to set the time range for the search in the calendar database + TTime mdsAddTime = GetTimeMdEPropL( + KMdEDefaultNameSpace, Object::KCreationDateProperty, aMdEObject ); + + TDateTime dateTime = mdsAddTime.DateTime(); + dateTime.SetHour( 0 ); + dateTime.SetMinute( 0 ); + dateTime.SetSecond( 0 ); + dateTime.SetMicroSecond( 0 ); + TTime dayBeginTime( dateTime ); + TCalTime startCalTime; + TCalTime stopCalTime; + startCalTime.SetTimeLocalL( dayBeginTime ); + stopCalTime.SetTimeLocalL( dayBeginTime + + TTimeIntervalDays ( 1 ) - TTimeIntervalMicroSeconds( 1 ) ); + + // Get a list of the all instances in the calendar database associated + // with this day + iCalInstanceView->FindInstanceL( instances, CalCommon::EIncludeAll, + CalCommon::TCalTimeRange( startCalTime, stopCalTime) ); + + const TInt instanceCount = instances.Count(); + + WRITELOG1( "CCalendarContextPlugin::AddMetaDataL -- instanceCount: %d", instanceCount ); + + // required object properties + WRITELOG( "CCalendarContextPlugin::AddMetaDataL" ); + User::LeaveIfNull( iMdeSession ); + CMdENamespaceDef& namespaceDef = iMdeSession->GetDefaultNamespaceDefL(); + WRITELOG( "CCalendarContextPlugin::AddMetaDataL" ); + + CMdERelationDef& containsRelDef = namespaceDef.GetRelationDefL( + Relations::KContains ); + CMdEObjectDef& calendarObjectDef = namespaceDef.GetObjectDefL( + Calendar::KCalendarObject ); + + CMdEPropertyDef& creationDef = calendarObjectDef.GetPropertyDefL( + Object::KCreationDateProperty ); + CMdEPropertyDef& modifiedDef = calendarObjectDef.GetPropertyDefL( + Object::KLastModifiedDateProperty ); + CMdEPropertyDef& sizeDef = calendarObjectDef.GetPropertyDefL( + Object::KSizeProperty ); + CMdEPropertyDef& itemTypeDef = calendarObjectDef.GetPropertyDefL( + Object::KItemTypeProperty ); + CMdEPropertyDef& titleDef = calendarObjectDef.GetPropertyDefL( + Object::KTitleProperty ); + CMdEPropertyDef& offSetDef = calendarObjectDef.GetPropertyDefL( + Object::KTimeOffsetProperty ); + + // calendar properties + CMdEPropertyDef& startDef = calendarObjectDef.GetPropertyDefL( + Calendar::KStartTimeProperty ); + CMdEPropertyDef& endDef = calendarObjectDef.GetPropertyDefL( + Calendar::KEndTimeProperty ); + CMdEPropertyDef& caltypeDef = calendarObjectDef.GetPropertyDefL( + Calendar::KCalendarTypeProperty ); + CMdEPropertyDef& locationDef = calendarObjectDef.GetPropertyDefL( + Calendar::KLocationProperty ); + CMdEPropertyDef& localUidDef = calendarObjectDef.GetPropertyDefL( + Calendar::KLocalUidProperty ); + + TTime curtime( 0 ); + curtime.UniversalTime(); + + const TTimeIntervalSeconds timeOffsetSeconds = User::UTCOffset(); + TTime localTime = curtime + timeOffsetSeconds; + + TInt timeOffset = timeOffsetSeconds.Int() / 60; + + for ( TInt i = 0; i < instanceCount; ++i ) + { + WRITELOG1( "CCalendarContextPlugin::AddMetaDataL - loop index: %d", i ); + + CCalInstance* instance = instances[i]; + CCalEntry& entry = instance->Entry(); + + const TDesC& location = entry.LocationL(); + const TDesC& title = entry.SummaryL(); + TTime beginTime = entry.StartTimeL().TimeLocalL(); + TTime endTime = entry.EndTimeL().TimeLocalL(); + TUint32 localUid = entry.LocalUidL(); + + CCalEntry::TType type = entry.EntryTypeL(); + + // Anniversaries and such are whole day events + if ( type == CCalEntry::EAnniv || type == CCalEntry::ETodo ) + { + // Set end time to the end of the day + endTime += TTimeIntervalDays ( 1 ); + endTime -= TTimeIntervalMicroSeconds( 1 ); + } + // Other type entry must be currently active + else if ( ( mdsAddTime < beginTime ) || ( endTime < mdsAddTime ) ) + { + WRITELOG( "CCalendarContextPlugin::AddMetaDataL - Calendar event not active - SKIP" ); + continue; + } + + WRITELOG( "CCalendarContextPlugin::AddMetaDataL - Create calendar item" ); + CMdEObject* calendarObject= NULL; + calendarObject = iMdeSession->NewObjectLC( + calendarObjectDef, Object::KAutomaticUri ); + calendarObject->AddTimePropertyL( creationDef, localTime ); + calendarObject->AddTimePropertyL( modifiedDef, curtime ); + calendarObject->AddUint32PropertyL( sizeDef, 0 ); // always zero size for calendar objects + calendarObject->AddTextPropertyL( itemTypeDef, Calendar::KCalendarItemType ); + calendarObject->AddInt16PropertyL( offSetDef, timeOffset ); + + //Calendar properties + calendarObject->AddTimePropertyL( startDef, beginTime ); + calendarObject->AddTimePropertyL( endDef, endTime ); + calendarObject->AddUint8PropertyL( caltypeDef, type ); + calendarObject->AddUint32PropertyL( localUidDef, localUid ); + if ( location.Length() > 0 ) + { + calendarObject->AddTextPropertyL( locationDef, location ); + } + if ( title.Length() > 0 ) + { + calendarObject->AddTextPropertyL( titleDef, title ); + } + + WRITELOG( "CCalendarContextPlugin::AddMetaDataL - Add calendar item to MDE" ); + TRAPD( addError, iMdeSession->AddObjectL( *calendarObject ) ); + if ( addError != KErrNone ) + { + WRITELOG1( "CCalendarContextPlugin::AddMetaDataL - Add calendar item to MDE error: %d", addError ); + CleanupStack::PopAndDestroy( calendarObject ); + continue; + } + + const TItemId calid = calendarObject->Id(); + const TItemId objid = aMdEObject.Id(); + + CMdERelation* relationObject = iMdeSession->NewRelationLC( + containsRelDef, objid, calid, 0 ); + if ( !relationObject ) + { + WRITELOG( "CCalendarContextPlugin::AddMetaDataL - Couldn't create relation object!" ); + User::Leave( KErrBadHandle ); + } + + WRITELOG( "CCalendarContextPlugin::AddMetaDataL - Add calendar relation to MDE" ); + TRAP( addError, iMdeSession->AddRelationL( *relationObject ) ); + if ( addError != KErrNone) + { + WRITELOG1( "CCalendarContextPlugin::AddMetaDataL - Add calendar relation to MDE error: %d", addError ); + } + + CleanupStack::PopAndDestroy( relationObject ); + CleanupStack::PopAndDestroy( calendarObject ); + } + + CleanupStack::PopAndDestroy( &instances ); + + WRITELOG( "CCalendarContextPlugin::AddMetaDataL -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::HandleSessionOpened +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::HandleSessionOpened( CMdESession& /*aSession*/, + TInt /*aError*/ ) + { + WRITELOG( "CCalendarContextPlugin::HandleSessionOpened -- ENTER" ); + WRITELOG( "CCalendarContextPlugin::HandleSessionOpened -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::HandleSessionError +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::HandleSessionError( CMdESession& /*aSession*/, + TInt /*aError*/ ) + { + WRITELOG( "CCalendarContextPlugin::HandleSessionError -- ENTER" ); + WRITELOG( "CCalendarContextPlugin::HandleSessionError -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::Progress +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::Progress( TInt /*aPercentageCompleted*/ ) + { + WRITELOG( "CCalendarContextPlugin::Progress -- ENTER" ); + WRITELOG( "CCalendarContextPlugin::Progress -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::Completed +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::Completed( TInt aError ) + { + WRITELOG( "CCalendarContextPlugin::Completed -- ENTER" ); + + if ( aError != KErrNone ) + { + iCalInstanceViewCompleted = EFalse; + WRITELOG1( "aError: %d", aError ); + TRAP_IGNORE( StartRetryL() ); + } + else + { + iCalInstanceViewCompleted = ETrue; + } + + WRITELOG( "CCalendarContextPlugin::Completed -- RETURN" ); + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::NotifyProgress +// ----------------------------------------------------------------------------- +// +TBool CCalendarContextPlugin::NotifyProgress() + { + WRITELOG( "CCalendarContextPlugin::NotifyProgress -- ENTER" ); + WRITELOG( "CCalendarContextPlugin::NotifyProgress -- RETURN" ); + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::SetMdeSession +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::SetMdeSession( CMdESession& aSession ) + { + iMdeSession = &aSession; + } + +// ----------------------------------------------------------------------------- +// CCalendarContextPlugin::OpenView +// ----------------------------------------------------------------------------- +// +void CCalendarContextPlugin::OpenViewL(TBool aRetry) + { + WRITELOG( "CCalendarContextPlugin::OpenViewL() ENTER" ); + TInt err(KErrNone); + + if(aRetry) + { + WRITELOG( "CCalendarContextPlugin::OpenViewL() retry" ); + iInitTimer->Cancel(); + delete iInitTimer; + iInitTimer = NULL; + } + + if(!iCalSession) + { + WRITELOG( "CCalendarContextPlugin::OpenViewL() new calsession"); + TRAP(err, iCalSession = CCalSession::NewL()); + + if( err != KErrNone) + { + WRITELOG1( "CCalendarContextPlugin::OpenViewL() CCalSession::NewL() err = %d", err ); + iCalSession = NULL; + StartRetryL(); + return; + } + } + + WRITELOG( "CCalendarContextPlugin::OpenViewL() open calsession"); + TRAP(err, iCalSession->OpenL( KNullDesC )); + + if(err != KErrNone ) + { + WRITELOG1( "CCalendarContextPlugin::OpenViewL() iCalSession->OpenL() err = %d", err ); + StartRetryL(); + return; + } + + WRITELOG( "CCalendarContextPlugin::OpenViewL() open view"); + TRAP( err, iCalInstanceView = CCalInstanceView::NewL( *iCalSession, *this ) ); + + if(err != KErrNone ) + { + WRITELOG1( "CCalendarContextPlugin::OpenViewL() CCalInstanceView::NewL() err = %d", err ); + iCalInstanceView = NULL; + StartRetryL(); + return; + } + + WRITELOG( "CCalendarContextPlugin::OpenViewL() RETURN" ); + } + + +void CCalendarContextPlugin::StartRetryL() + { + WRITELOG( "CCalendarContextPlugin::StartRetryL() ENTER" ); + TInt err(KErrNone); + + if(iRetryCount++ > KMaxRetryCount) + { + delete iCalInstanceView; + iCalInstanceView = NULL; + delete iCalSession; + iCalSession = NULL; + + if( iInitTimer ) + { + iInitTimer->Cancel(); + delete iInitTimer; + iInitTimer = NULL; + } + + return; + } + + + if(!iInitTimer) + { + TRAP(err, iInitTimer = CPeriodic::NewL(CActive::EPriorityStandard) ); + } + + if( err != KErrNone ) + { + WRITELOG1( "CCalendarContextPlugin::OpenViewL() iInitTimer->Start failed %d", err ); + User::Leave( err ); + } + + WRITELOG( "CCalendarContextPlugin::OpenViewL() iInitTimer->Start" ); + iInitTimer->Start( KInitRetryTimeout, KInitRetryTimeout, TCallBack(InitRetryCallback, this)); + WRITELOG( "CCalendarContextPlugin::StartRetryL() RETURN" ); + } + +// --------------------------------------------------------------------------- +// CCalendarContextPlugin::InitRetryCallback() +// --------------------------------------------------------------------------- +// +TInt CCalendarContextPlugin::InitRetryCallback(TAny* aAny) + { + WRITELOG( "CCalendarContextPlugin::InitRetryCallback() ENTER"); + CCalendarContextPlugin* self = static_cast( aAny ); + + TRAP_IGNORE( self->OpenViewL(ETrue) ); + + WRITELOG( "CCalendarContextPlugin::InitRetryCallback() RETURN"); + return KErrNone; + } +