diff -r 000000000000 -r c53acadfccc6 harvester/harvesterplugins/MessagePlugin/src/harvestermessageplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/harvesterplugins/MessagePlugin/src/harvestermessageplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,430 @@ +/* +* Copyright (c) 2006-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: Harvester image plugin +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "harvestermessageplugin.h" +#include "harvesterlog.h" +#include "mdsutils.h" +#include "mdeobjectdef.h" + +#ifdef _DEBUG +_LIT( KMsgHarvesterMsvPanic, "Message harvester: Message server terminated" ); +#endif +_LIT( KSemicolonSpace, "; " ); +_LIT( KCharSpace, " " ); +_LIT( KCharLeftAddressIterator, "<" ); +_LIT( KCharRightAddressIterator, ">" ); + +/** +* Default constructor +*/ +CHarvesterMessagePlugin::CHarvesterMessagePlugin() : CHarvesterPlugin() + , iItemType(NULL, 0) + , iSubject(NULL, 0) + { + } + +/** +* Construction +* @return Harvester image plugin +*/ +CHarvesterMessagePlugin* CHarvesterMessagePlugin::NewL() + { + WRITELOG("CHarvesterMessagePlugin::NewL()"); + CHarvesterMessagePlugin* self = new(ELeave) CHarvesterMessagePlugin(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +/** +* Destruction +*/ +CHarvesterMessagePlugin::~CHarvesterMessagePlugin() + { + WRITELOG("CHarvesterMessagePlugin::~CHarvesterMessagePlugin()"); + delete iMmsMtm; + delete iSmsMtm; + delete iMtmReg; + delete iMsvSession; + } + +/** +* 2nd phase constructor +*/ +void CHarvesterMessagePlugin::ConstructL() + { + WRITELOG("CHarvesterMessagePlugin::ConstructL()"); + if ( iMsvSession ) + { + delete iMsvSession; + iMsvSession = NULL; + } + iMsvSession = CMsvSession::OpenSyncL( *this ); + + iMtmReg = CClientMtmRegistry::NewL( *iMsvSession ); + iMmsMtm = static_cast + ( iMtmReg->NewMtmL( KUidMsgTypeMultimedia ) ); + iSmsMtm = static_cast + ( iMtmReg->NewMtmL( KUidMsgTypeSMS ) ); + + } + +void CHarvesterMessagePlugin::HarvestL( CHarvesterData* aHD ) + { + CMdEObject& mdeObject = aHD->MdeObject(); + mdeObject.SetMediaId( 0 ); + + TRAPD( error, GatherDataL( mdeObject ) ); + if ( error != KErrNone ) + { + WRITELOG1( "CHarvesterMessagePlugin::HarvestSingleFileL() - TRAP error: %d", error ); + TInt convertedError = KErrNone; + MdsUtils::ConvertTrapError( error, convertedError ); + aHD->SetErrorCode( convertedError ); + return; + } + +#ifdef _DEBUG + TRAP(error, SetPropertiesL( *aHD )); + + if ( error != KErrNone ) + { + WRITELOG1( "CHarvesterMessagePlugin::HarvestSingleFileL() - Handling object failed: %d", error ); + } +#else + TRAP_IGNORE( SetPropertiesL( *aHD ) ); +#endif + + } + +// --------------------------------------------------------------------------- +// CHarvesterMessagePlugin::GatherDataL +// --------------------------------------------------------------------------- +// +TInt CHarvesterMessagePlugin::GatherDataL( CMdEObject& aMetadataObject ) + { + + WRITELOG( "CHarvesterMessagePlugin::GatherDataL enter" ); + const TChar KPoint( '.' ); + + const TDesC& uri = aMetadataObject.Uri(); + const TInt i = uri.Locate( KPoint ); + TMsvId msgId( 0 ); + + TLex lex( uri.Left( i ) ); + lex.Val( msgId ); + WRITELOG1( "msgId: %d", msgId ); + + TMsvId service = 0; + TMsvEntry tEntry; + TInt err = iMsvSession->GetEntry( msgId, service, tEntry ); + User::LeaveIfError( err ); + + CBaseMtm* actMtm( iSmsMtm ); + + WRITELOG1( "tEntry.iMtm.iUid: %d", tEntry.iMtm.iUid ); + + + if ( tEntry.iMtm.iUid == KUidMsgTypeMultimedia.iUid ) + { + WRITELOG( "MMS MESSAGE" ); + actMtm = iMmsMtm; + } + actMtm->SwitchCurrentEntryL( msgId ); + actMtm->LoadMessageL(); + + tEntry = actMtm->Entry().Entry(); + + WRITELOG1( "tEntry.iMtm.iUid: %d", tEntry.iMtm.iUid ); + + TMsvId parentId = tEntry.Parent(); + + WRITELOG1( "parentId: %d", parentId ); + + iSize = (TUint)tEntry.iSize; + + WRITELOG1( "size: %d", iSize ); + + iDate = tEntry.iDate; + +#ifdef _DEBUG + WRITELOG1( "date.DaysInMonth: %d", iDate.DaysInMonth() ); +#endif + + delete iFromOrTo; + iFromOrTo = NULL; + + if ( KMsvSentEntryId == parentId ) // sent + { + iIncoming = EFalse; + const CDesCArray& array = static_cast( + actMtm->AddresseeList().RecipientList() ); + TInt count( array.Count() ); + TInt maxLength( 0 ); + + for ( TInt i( 0 ); i < count; ++i ) + { + maxLength += array[i].Length(); + } + WRITELOG1( "maxLength: %d", maxLength ); + + iFromOrTo = HBufC::NewL( maxLength + 3 * count ); + TPtr desReceipients( iFromOrTo->Des() ) ; + + for ( TInt i( 0 ); i < count; ++i ) + { + desReceipients.Append( array[i] ); + desReceipients.Append( KSemicolonSpace ); + } + count = desReceipients.Length(); + WRITELOG1("count: %d", count ); + + if ( count ) + { + desReceipients.Delete( count - 2, 2 ); + } + } + else // KMsvGlobalInBoxIndexEntryId received + { + iIncoming = ETrue; + WRITELOG( "Got incoming" ); + + HBufC* senderNumber = NULL; + if ( tEntry.iMtm.iUid == KUidMsgTypeMultimedia.iUid ) + { + senderNumber = iMmsMtm->Sender().AllocLC(); + } + else + { + senderNumber= iSmsMtm->SmsHeader().FromAddress().AllocLC(); + } + + TInt senderLength = senderNumber->Length(); + if ( senderLength > 0 ) + { + // Check if we have an alias + if ( senderNumber->Compare( tEntry.iDetails ) ) + { + // Additional space for chars: '<' '>' ',' + senderLength += KCharSpace.iTypeLength + + KCharLeftAddressIterator.iTypeLength + + KCharRightAddressIterator.iTypeLength; + + iFromOrTo = HBufC::NewL( tEntry.iDetails.Length() + senderLength ); + TPtr fromTextPtr = iFromOrTo->Des(); + fromTextPtr.Append( tEntry.iDetails ); + fromTextPtr.Append( KCharSpace ); + fromTextPtr.Append( KCharLeftAddressIterator ); + fromTextPtr.Append( *senderNumber ); + fromTextPtr.Append( KCharRightAddressIterator ); + } + else + { + iFromOrTo = senderNumber->AllocL(); + } + } + else + { + iFromOrTo = senderNumber->AllocL(); + } + + CleanupStack::PopAndDestroy( senderNumber ); + } + + // Set subject - MMS has subject but SMS doesn't have one + if ( tEntry.iMtm.iUid == KUidMsgTypeMultimedia.iUid ) + { + iItemType.Set( MdeConstants::Message::KMMSItemType ); + iSubject.Set( iMmsMtm->SubjectL() ); + } + else + { + iItemType.Set( MdeConstants::Message::KSMSItemType ); + iSubject.Set( KNullDesC ); + } + + WRITELOG1( "fromOrTo: %S", iFromOrTo ); + WRITELOG1( "incoming: %b", iIncoming ); + + WRITELOG( "CHarvesterMessagePlugin::GatherDataL return" ); + return KErrNone; + } + +void CHarvesterMessagePlugin::SetPropertiesL( CHarvesterData& aHD ) + { + WRITELOG( "CHarvesterMessagePlugin::SetPropertiesL enter" ); + CMdEObject& aMetadataObject = aHD.MdeObject(); + + CMdEObjectDef& messageObjectDef = aMetadataObject.Def(); + + CMdEPropertyDef& creationTimeDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KCreationDateProperty ) ; + + CMdEPropertyDef& lastModTimeDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KLastModifiedDateProperty ) ; + + CMdEPropertyDef& sizeDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KSizeProperty ) ; + + CMdEPropertyDef& receivedDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Message::KReceivedProperty ) ; + + CMdEPropertyDef& textDef = iIncoming + ? messageObjectDef.GetPropertyDefL( MdeConstants::Message::KSenderProperty ) + : messageObjectDef.GetPropertyDefL( MdeConstants::Message::KToWhomProperty ); + + CMdEPropertyDef& ItemtypeDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KItemTypeProperty ); + + CMdEPropertyDef& offSetDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KTimeOffsetProperty ); + + CMdEPropertyDef& titleDef = messageObjectDef.GetPropertyDefL( + MdeConstants::Object::KTitleProperty ); + + TTimeIntervalSeconds timeOffset = User::UTCOffset(); + TTime now; + now.HomeTime(); + + if ( EHarvesterAdd == aHD.EventType() ) + { + aMetadataObject.AddTimePropertyL( creationTimeDef, now ); + aMetadataObject.AddTimePropertyL( lastModTimeDef, iDate ); + aMetadataObject.AddBoolPropertyL( receivedDef, iIncoming ); + if (iFromOrTo && iFromOrTo->Length()) + { + aMetadataObject.AddTextPropertyL( textDef, *iFromOrTo ); + } + aMetadataObject.AddTextPropertyL( ItemtypeDef, iItemType ); + aMetadataObject.AddUint32PropertyL( sizeDef, iSize ); + aMetadataObject.AddInt16PropertyL( offSetDef, timeOffset.Int() / 60 ); + + CMdEProperty* prop = NULL; + TInt index = aMetadataObject.Property( titleDef, prop ); + + if (iSubject.Length()) + { + if( prop ) + { + prop->SetTextValueL( iSubject ); + } + else + { + aMetadataObject.AddTextPropertyL( titleDef, iSubject ); + } + } + else + { + if (iFromOrTo && iFromOrTo->Length()) + { + if( prop ) + { + prop->SetTextValueL( *iFromOrTo ); + } + else + { + aMetadataObject.AddTextPropertyL( titleDef, *iFromOrTo ); + } + } + } + } + else + { + CMdEProperty* prop = NULL; + TInt index = aMetadataObject.Property( textDef, prop ); + if (iFromOrTo && iFromOrTo->Length()) + { + if (prop) + { + prop->SetTextValueL( *iFromOrTo ); + } + else + { + aMetadataObject.AddTextPropertyL( textDef, *iFromOrTo ); + } + } + else if (index >= 0) + { + aMetadataObject.RemoveProperty(index); + } + + aMetadataObject.Property( sizeDef, prop ); + static_cast(prop)->SetValueL( iSize ); + + aMetadataObject.Property( lastModTimeDef, prop ); + static_cast (prop)->SetValueL( iDate ); + } + + iStatus = KErrNone; + WRITELOG( "CHarvesterMessagePlugin::SetPropertiesL return" ); + } + +// ----------------------------------------------------------------------------- +// CHarvesterMessagePlugin::HandleSessionEventL +// ----------------------------------------------------------------------------- +// +void CHarvesterMessagePlugin::HandleSessionEventL( TMsvSessionEvent aEvent, + TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/ ) + { + WRITELOG( "CHarvesterMessagePlugin::HandleSessionEventL enter" ); + + switch ( aEvent ) + { + case EMsvGeneralError: // not used after v5 + case EMsvServerFailedToStart: + case EMsvServerTerminated: + { + __ASSERT_DEBUG( EFalse, User::Panic( KMsgHarvesterMsvPanic, KErrServerTerminated )); + break; + } + case EMsvEntriesCreated: + case EMsvEntriesChanged: + case EMsvEntriesDeleted: + case EMsvEntriesMoved: + case EMsvMtmGroupInstalled: + case EMsvMtmGroupDeInstalled: + case EMsvServerReady: + case EMsvCorruptedIndexRebuilt: + case EMsvMediaChanged: + case EMsvMediaUnavailable: + case EMsvMediaAvailable: + case EMsvMediaIncorrect: + case EMsvCorruptedIndexRebuilding: + case EMsvCloseSession: + default: + { + break; + } + } + WRITELOG( "CHarvesterMessagePlugin::HandleSessionEventL return" ); + }