--- /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 <msvids.h>
+
+#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<TMsvId*> (aArg2)) == KObservedFolderId )
+ {
+ CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>( 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<TMsvId*>(aArg2)) == KObservedFolderId )
+ {
+ CMsvEntrySelection* entries = static_cast<CMsvEntrySelection*>( 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;
+ }