--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchsession.cpp Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2006-2007 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: CCCHSession implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include "cchlogger.h"
+#include "cchsession.h"
+#include "cchserverbase.h"
+#include "cchsubsession.h"
+#include "cchclientserverinternal.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================= LOCAL FUNCTIONS =============================
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCCHSession::CCCHSession
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCCHSession::CCCHSession( CCCHServerBase& aServer ) :
+ CSession2(),
+ iCCHServer( aServer )
+ {
+ TRAP_IGNORE( iCCHServer.NotifySessionCreatedL() );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHSession::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CCCHSession::ConstructL()
+ {
+ iSubsessions = iCCHServer.ObjectContainerIx().CreateL();
+ iObjectIx = CObjectIx::NewL();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHSession::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHSession* CCCHSession::NewL( CCCHServerBase& aServer )
+ {
+ CCCHSession* self = CCCHSession::NewLC( aServer );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHSession::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHSession* CCCHSession::NewLC( CCCHServerBase& aServer )
+ {
+ CCCHSession* self = new (ELeave) CCCHSession( aServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Destructor
+CCCHSession::~CCCHSession()
+ {
+ delete iObjectIx;
+ iObjectIx = NULL;
+
+ iCCHServer.ObjectContainerIx().Remove( iSubsessions );
+ iCCHServer.NotifySessionClosed();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHSession::ServiceL
+// Handles request received from client.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHSession::ServiceL( const RMessage2& aMessage )
+ {
+ CCHLOGSTRING( "CCCHSession::ServiceL: IN" );
+ TInt command = aMessage.Function();
+ switch ( command )
+ {
+ case ECCHOpenSubSession:
+ {
+ CCCHSubsession* subsession = CCCHSubsession::NewLC( iCCHServer );
+ iSubsessions->AddL( subsession );
+ const TInt handle( iObjectIx->AddL( subsession ) );
+ CleanupStack::Pop( subsession );
+ TPckg<TInt> handlePckg( handle );
+ TInt err = aMessage.Write( 3, handlePckg );
+
+ if ( KErrNone != err )
+ {
+ // Panic client
+ iObjectIx->Remove( handle );
+ iCCHServer.PanicClient( aMessage, ECCHErrSubSessionOpen );
+ }
+ else
+ {
+ aMessage.Complete( KErrNone );
+ }
+ }
+ break;
+ case ECCHCloseSubSession:
+ {
+ const TInt handle( aMessage.Int3() );
+ if ( iObjectIx->At( handle ) )
+ {
+ iObjectIx->Remove( handle );
+ aMessage.Complete( KErrNone );
+ }
+ else
+ {
+ // Panic client. Handle was not valid
+ iCCHServer.PanicClient( aMessage, ECCHErrSubSessionClose );
+ }
+ }
+ break;
+ /**
+ * CCH subsession functions
+ */
+ case ECCHSubscribeToEvents:
+ case ECCHSubscribeToEventsCancel:
+ case ECCHGetServices:
+ case ECCHGetServicesCancel:
+ case ECCHGetServiceState:
+ case ECCHEnableService:
+ case ECCHEnableServiceCancel:
+ case ECCHDisableService:
+ case ECCHDisableServiceCancel:
+ case ECCHGetServiceInfo:
+ case ECCHGetPreferredService:
+ case ECCHSetConnectionInfo:
+ case ECCHSetConnectionInfoCancel:
+ case ECCHGetConnectionInfo:
+ case ECCHGetConnectionInfoCancel:
+ case ECCHReserveService:
+ case ECCHFreeService:
+ case ECCHIsReserved:
+ case ECCHServiceCount:
+ case ECCHServerRegister:
+ case ECCHServerRegisterCancel:
+ {
+ CCCHSubsession* subsession = static_cast<CCCHSubsession*>(
+ iObjectIx->At( aMessage.Int3() ) );
+ if ( subsession )
+ {
+ subsession->ServiceL( aMessage );
+ }
+ else
+ {
+ // Panic client.
+ iCCHServer.PanicClient( aMessage, ECCHBadDescriptor );
+ }
+ }
+ break;
+ default:
+ {
+ iCCHServer.PanicClient( aMessage, ECCHBadRequest );
+ }
+
+ }
+ CCHLOGSTRING( "CCCHSession::ServiceL: OUT" );
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =======================
+
+// End of File