--- /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 <mdeobject.h>
+
+#include <calinstance.h>
+#include <calinstanceview.h>
+#include <calsession.h>
+#include <caldataexchange.h>
+#include <caldataformat.h>
+
+#include <s32mem.h>
+
+#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<CCalInstance> instances;
+ TCleanupItem cleanupItem( MdsUtils::CleanupPtrArray<CCalInstance>, &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<CCalendarContextPlugin*>( aAny );
+
+ TRAP_IGNORE( self->OpenViewL(ETrue) );
+
+ WRITELOG( "CCalendarContextPlugin::InitRetryCallback() RETURN");
+ return KErrNone;
+ }
+