diff -r 826cea16efd9 -r 13a33d82ad98 videoscheduler/SchedulerServer/src/CCseSchedulerServerSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoscheduler/SchedulerServer/src/CCseSchedulerServerSession.cpp Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,288 @@ +/* +* Copyright (c) 2006 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: Implementation of Scheduler server's* +*/ + + + + +// INCLUDE FILES +#include "CCseSchedulerServerSession.h" // Header file for this class +#include "CCseSchedulerServer.h" // Common methods for server +#include "CCseSchedulerServerEngine.h" // Intelligence aka engine of server +#include "CseSchedulerServer.pan" // Server panic codes +#include // Common defines for client and server +#include "CseDebug.h" // Debug macros + +// 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 + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCseSchedulerSession::CCseSchedulerSession() +// C++ constructor +// ----------------------------------------------------------------------------- +// + +CCseSchedulerServerSession::CCseSchedulerServerSession() : CSession2(), + iResourceCount( 0 ) + { + CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::CCseSchedulerServerSession"); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::NewL"); + + CCseSchedulerServerSession* self = new ( ELeave ) CCseSchedulerServerSession(); + CleanupStack::PushL( self ); + self->ConstructL( aServer ); + CleanupStack::Pop( self ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::ConstructL"); + + if ( aServer ) + { + aServer->Inc(); + } + + // Create new object index + iObjects = CObjectIx::NewL(); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::~CCseSchedulerServerSession"); + + delete iObjects; + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::ServiceL"); + + switch ( aMessage.Function() ) + { + case ECseServCreateSubSession: + case ECseServCloseSubSession: + case ECseServCloseSession: + { + // "Common messages" + TRAPD( err, DispatchMessageL( aMessage ) ); + aMessage.Complete( err ); + } + break; + + default: + { + // Ok, but must be subsession relative + CCseSchedulerServerEngine* engine = + (CCseSchedulerServerEngine*)iObjects->At( aMessage.Int3() ); + if ( !engine ) + { + aMessage.Complete( KErrBadHandle ); + PanicClient( ECsePanicBadSubSessionHandle ); + } + else + { + // this is the normal route, + // all engine commands go this way + TRAPD( error, engine->GeneralServiceL( aMessage ) ); + if ( error != KErrNone ) + { + CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::ServiceL - engine->GeneralServiceL() LEAVED: %d", error); + aMessage.Complete( error ); + } + } + } + break; + } + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::DispatchMessageL"); + + // Check for session-relative requests + switch ( aMessage.Function() ) + { + case ECseServCreateSubSession: + NewObjectL( aMessage ); + break; + + case ECseServCloseSubSession: + DeleteObject( aMessage.Int3() ); + break; + + case ECseServCloseSession: + Server()->Dec(); + break; + + default: + break; + } + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::NewObjectL"); + + CObject* obj = Server()->GetEngineObjectL(); + TInt handle( iObjects->AddL( obj ) ); + // Write the handle to client + TPckg handlePckg( handle ); + TRAPD( err, aMessage.WriteL( 3, handlePckg ) ); + + if ( err ) + { + PanicClient( ECsePanicBadRequest ); + return; + } + + // Notch up another resource + iResourceCount++; + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::DeleteObject"); + + // Panic if bad handle + CCseSchedulerServerEngine* engine = ( CCseSchedulerServerEngine* )iObjects->At( aHandle ); + if ( !engine ) + { + PanicClient( ECsePanicBadSubSessionHandle ); + } + + iResourceCount--; + // Deletes engine + iObjects->Remove( aHandle ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::CountResources"); + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerServerSession::PanicClient"); + + _LIT( KTxtSessionPanic, "SchedulerSession" ); + CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::PanicClient - panic code: %d", aPanic); + User::Panic( KTxtSessionPanic, aPanic ); + } + +// ----------------------------------------------------------------------------- +// CCseSchedulerSession::PanicClient() +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCseSchedulerServer* CCseSchedulerServerSession::Server() + { + return reinterpret_cast< CCseSchedulerServer* > ( + const_cast< CServer2* > ( CSession2::Server( ) ) ); + } +// End of File