--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/CNcnSession.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,268 @@
+/*
+* Copyright (c) 2005 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: Server session class.
+*
+*/
+
+
+
+// ----------------------------------------------------------------------------
+// INCLUDE FILES
+// ----------------------------------------------------------------------------
+//
+#include "CNcnSession.h"
+#include "NcnCommsDefs.h"
+#include "CNcnUnpackDescrArray.h"
+#include "MNcnNotificationObserver.h"
+#include <MNcnNotification.h>
+
+// CONSTANTS
+/// Unnamed namespace for local definitions
+namespace {
+
+
+} // namespace
+
+
+// ----------------------------------------------------------------------------
+// CNcnSession::CNcnSession
+//
+// Constructor.
+// ----------------------------------------------------------------------------
+//
+CNcnSession::CNcnSession( MNcnNotificationObserver& aObserver )
+ : iObserver( aObserver )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::ConstructL
+//
+// Symbian 2nd phase constructor.
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::ConstructL()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::~CNcnSession
+//
+// Destructor.
+// ----------------------------------------------------------------------------
+//
+CNcnSession::~CNcnSession()
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::NewL
+//
+// Symbian two-phased construction.
+// ----------------------------------------------------------------------------
+//
+CNcnSession* CNcnSession::NewL( MNcnNotificationObserver& aObserver )
+ {
+ CNcnSession* self =
+ new( ELeave ) CNcnSession( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::ServiceL
+//
+// ServiceL method from CSession2.
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::ServiceL( const RMessage2& aMessage )
+ {
+ // If this method leaves default ServiceError implementation will
+ // complete the message using the leave value.
+
+ // However, we have to reset our member variable in any case so
+ // we can't rely on this functionality, hence the trap below
+
+ if( IsRequestPending() )
+ {
+ PanicClient( aMessage, EPanicNcnRequestActive );
+ }
+
+ // set current request message
+ SetRequestMessage( aMessage );
+
+ // handle service inside a trap so we can
+ // reset our message member if service leaves
+ TRAPD( error, HandleServiceL( aMessage ) );
+
+ // complete & reset current message
+ CompleteRequestMessage( error );
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::HandleServiceL
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::HandleServiceL( const RMessage2& aMessage )
+ {
+ switch ( aMessage.Function() )
+ {
+ case ENewInternalMessages1:
+ {
+ ServiceNewInternalMessages1L( aMessage );
+ break;
+ }
+ case ENewInternalMessages2:
+ {
+ ServiceNewInternalMessages2L( aMessage );
+ break;
+ }
+ case EInternalMarkUnread1:
+ {
+ ServiceInternalMarkUnread1L( aMessage );
+ break;
+ }
+ case EInternalMarkUnread2:
+ {
+ ServiceInternalMarkUnread2L( aMessage );
+ break;
+ }
+ case EInternalCancelMarkUnread:
+ {
+ CancelRequest();
+ break;
+ }
+ case ENewMessages1:
+ {
+ ServiceNewMessages1L( aMessage );
+ break;
+ }
+ case EMarkUnread1:
+ {
+ ServiceMarkUnread1L( aMessage );
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::CompleteRequestMessage
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::CompleteRequestMessage( TInt aError )
+ {
+ // if request message is set complete it with error code
+ if( !iRequestMessage.IsNull() )
+ {
+ iRequestMessage.Complete( aError );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::SetRequestMessage
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::SetRequestMessage( const RMessage2& aMessage )
+ {
+ iRequestMessage = aMessage;
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::IsRequestPending
+// ----------------------------------------------------------------------------
+//
+TBool CNcnSession::IsRequestPending() const
+ {
+ return !iRequestMessage.IsNull();
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::CancelRequest
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::CancelRequest()
+ {
+ // complete pending request with KErrCancel
+ CompleteRequestMessage( KErrCancel );
+ }
+
+// ----------------------------------------------------------------------------
+// CNcnSession::PanicClient
+// ----------------------------------------------------------------------------
+//
+void CNcnSession::PanicClient( const RMessage2& aMessage, TNcnSessionPanic aPanic )
+ {
+ _LIT( KPanicCategory, "ncnsession" );
+ aMessage.Panic( KPanicCategory, aPanic );
+ }
+
+void CNcnSession::ServiceNewInternalMessages1L( const RMessage2& aMessage )
+ {
+ TNcnNotifMessageType type =
+ static_cast <TNcnNotifMessageType> ( aMessage.Int0() );
+ iObserver.HandleNewInternalMessagesL( type );
+ }
+
+void CNcnSession::ServiceNewInternalMessages2L( const RMessage2& aMessage )
+ {
+ TNcnNotifMessageType type =
+ static_cast <TNcnNotifMessageType> ( aMessage.Int0() );
+ TMsvId mailBox = static_cast <TMsvId> ( aMessage.Int1() );
+ CNcnUnpackDescrArray* packedInfo = CNcnUnpackDescrArray::NewLC();
+ packedInfo->UnpackL( aMessage, 2 );
+ iObserver.HandleNewInternalMessagesL( type, mailBox, *packedInfo );
+ CleanupStack::PopAndDestroy( packedInfo );
+ }
+
+void CNcnSession::ServiceInternalMarkUnread1L( const RMessage2& aMessage )
+ {
+ TNcnUnreadRequestType type =
+ static_cast <TNcnUnreadRequestType> ( aMessage.Int0() );
+ iObserver.HandleInternalMarkUnreadL( type );
+ }
+
+void CNcnSession::ServiceInternalMarkUnread2L( const RMessage2& aMessage )
+ {
+ TNcnUnreadRequestType type =
+ static_cast <TNcnUnreadRequestType> ( aMessage.Int0() );
+
+ TMsvId mailBox = static_cast <TMsvId> ( aMessage.Int1() );
+ iObserver.HandleInternalMarkUnreadL( type, mailBox );
+ }
+
+void CNcnSession::ServiceNewMessages1L( const RMessage2& aMessage )
+ {
+ TMsvId mailBox = static_cast <TMsvId> ( aMessage.Int0() );
+ MNcnNotification::TIndicationType indicationType =
+ static_cast <MNcnNotification::TIndicationType> ( aMessage.Int1() );
+ CNcnUnpackDescrArray* packedInfo = CNcnUnpackDescrArray::NewLC();
+ packedInfo->UnpackL( aMessage, 2 );
+ iObserver.HandleNewMessagesL( mailBox, indicationType, *packedInfo );
+ CleanupStack::PopAndDestroy( packedInfo );
+ }
+
+void CNcnSession::ServiceMarkUnread1L( const RMessage2& aMessage )
+ {
+ TMsvId mailBox = static_cast <TMsvId> ( aMessage.Int0() );
+ iObserver.HandleMarkUnreadL( mailBox );
+ }
+
+// End of file