diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_messaging/messagingservice/src/messagenotify.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_messaging/messagingservice/src/messagenotify.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,189 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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 + +#include "messageheader.h" +#include "messagenotify.h" + +#ifdef __WINS__ +const TMsvId KObservedFolderId = KMsvDraftEntryId; +#else +const TMsvId KObservedFolderId = KMsvGlobalInBoxIndexEntryId; +#endif + + +// --------------------------------------------------------------------------- +// two-phased constructor +// --------------------------------------------------------------------------- +CMessageObserver* CMessageObserver::NewL( CMsvSession* aSession, + CMsgCallbackBase* aNotifyCallback ) + { + return new(ELeave) CMessageObserver( aSession, aNotifyCallback ); + } + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +CMessageObserver::~CMessageObserver() + { + delete iNotifyCallback; + } + +// --------------------------------------------------------------------------- +// default constructor +// --------------------------------------------------------------------------- +CMessageObserver::CMessageObserver( CMsvSession* aSession, + CMsgCallbackBase* aNotifyCallback ) : + iServerSession( aSession ), + iNotifyCallback( aNotifyCallback ), + iNewMessageId( -1 ) + { + + } + + +// --------------------------------------------------------------------------- +// CMessageObserver::HandleSessionEventL +// Indicates the event of arrival of new message. +// --------------------------------------------------------------------------- +void CMessageObserver::HandleSessionEventL( TMsvSessionEvent aEvent, + TAny* aArg1, + TAny* aArg2, + TAny* /*aArg3*/ ) + { + //if there is a callback request registered + if ( iNotifyCallback ) + { + switch ( aEvent ) + { + // if there is a new entry created + case EMsvEntriesCreated: + { + //aArg2 specifies the parent ID of the entry + // entry is created in observed folder + if ( aArg2 && *(static_cast (aArg2)) == KObservedFolderId ) + { + CMsvEntrySelection* entries = static_cast( aArg1 ); + //one or more new entries created + if ( entries->Count() > 0 ) + { + // get the message ID of the first entry + iNewMessageId = entries->At(0); + } + } + } + break; + + // one or more index entries are changed + case EMsvEntriesChanged: + { + //change in index entry in the observed folder + if ( aArg2 && *(static_cast(aArg2)) == KObservedFolderId ) + { + CMsvEntrySelection* entries = static_cast( aArg1 ); + if( entries->Count() > 0 && iNewMessageId == entries->At(0) ) + { + CMessageHeader* newEntryHeader; + // set the message header fields + newEntryHeader = MessageHeaderL( iNewMessageId ); + if( newEntryHeader ) + { + CleanupStack::PushL( newEntryHeader ); + //notify new header entry created + iNotifyCallback->NotifyResultL( KErrNone, (TAny*)newEntryHeader ); + CleanupStack::PopAndDestroy(newEntryHeader); + iNewMessageId = -1; + } + } + } + } + break; + + default: break; + } + } + } + +// --------------------------------------------------------------------------- +// CMessageObserver::SetSession +// sets the iServersession member variable with a message server session +// --------------------------------------------------------------------------- +void CMessageObserver::SetSession( CMsvSession* aSession ) + { + iServerSession = aSession; + } + +// --------------------------------------------------------------------------- +// CMessageObserver::SetCallbackL +// registers a new callback request +// returns the old callback request +// --------------------------------------------------------------------------- +CMsgCallbackBase* CMessageObserver::SetCallback( CMsgCallbackBase* aCallback ) + { + CMsgCallbackBase* oldCallback = iNotifyCallback; + // get the new callback request + iNotifyCallback = aCallback; + return oldCallback; + } + +// --------------------------------------------------------------------------- +// Checks if Notification is activated +// return True if notification request is active. +// --------------------------------------------------------------------------- +TBool CMessageObserver::IsActive() + { + if ( iNotifyCallback ) + return ETrue; + + return EFalse; + } + + +// --------------------------------------------------------------------------- +// CMessageObserver::GetMessageHeaderL +// sets the header fields of a message +// returns an header object. +// --------------------------------------------------------------------------- +CMessageHeader* CMessageObserver::MessageHeaderL( TMsvId aMessageId ) + { + TMsvEntry newEntry; + TMsvId serviceId; + + //gets index of the specified message ID + if( iServerSession->GetEntry( aMessageId, serviceId, newEntry ) == KErrNone ) + { + CMessageHeader* newEntryHeader = CMessageHeader::NewL(); + CleanupStack::PushL( newEntryHeader ); + + newEntryHeader->SetMtmId( newEntry.iMtm ); + newEntryHeader->SetTime( newEntry.iDate ); + newEntryHeader->SetMessageId( aMessageId ); + newEntryHeader->SetFromL( newEntry.iDetails ); + newEntryHeader->SetSubjectL( newEntry.iDescription ); + newEntryHeader->SetAttachFlag( newEntry.Attachment() ); + newEntryHeader->SetPriorityFlag( newEntry.Priority() ); + newEntryHeader->SetUnreadFlag( newEntry.Unread() ); + + CleanupStack::Pop(newEntryHeader); + + return newEntryHeader; + } + + return NULL; + }