diff -r 000000000000 -r 164170e6151a gba/gbaserver/src/GbaSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gba/gbaserver/src/GbaSession.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,261 @@ +/* +* 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 "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 CGbaServerSession +* +*/ + + +#include +#include "GbaSession.h" +#include "bootstrap.h" +#include "GBALogger.h" +//Constants +const TInt KMessageIndex0 = 0; +const TInt KMessageIndex1 = 1; + +// --------------------------------------------------------------------------- +// CGbaServerSession* CGbaServerSession::NewL() +// --------------------------------------------------------------------------- +// +CGbaServerSession* CGbaServerSession::NewL() + { + CGbaServerSession* self=new(ELeave) CGbaServerSession; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::ConstructL() +// --------------------------------------------------------------------------- +// +void CGbaServerSession::ConstructL() + { + i3GPPBootstrap = C3GPPBootstrap::NewL( this ); + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::CGbaServerSession() +// --------------------------------------------------------------------------- +// +CGbaServerSession::CGbaServerSession() + { + // Implementation not required + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::~CGbaServerSession() +// --------------------------------------------------------------------------- +// +CGbaServerSession::~CGbaServerSession() + { + GBA_TRACE_DEBUG(("CGbaServerSession destructor")); + Server()->DecrementSessions(); + GBA_TRACE_DEBUG((" delete state machine")); + delete i3GPPBootstrap; + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::ServiceL() +// --------------------------------------------------------------------------- +// +void CGbaServerSession::ServiceL(const RMessage2& aMessage) + { + GBA_TRACE_DEBUG(("CGbaServerSession::ServiceL")); + switch (aMessage.Function()) + { + case EGbaServRequestBootstrap: + { + GBA_TRACE_DEBUG(("Request bootstrap")); + RequestBootstrapL(aMessage); + } + break ; + + case EGbaServIsGBAUSupported: + { + GBA_TRACE_DEBUG(("Check is GBA-U supported")); + TBool isGBAUSupported = i3GPPBootstrap->GBAUAvailabilityL(); + + if ( isGBAUSupported ) + { + GBA_TRACE_DEBUG(("GBA-U is available")); + } + else + { + GBA_TRACE_DEBUG(("GBA-U is not available")); + } + + const TPckgC pckg( isGBAUSupported ); + aMessage.Write( KMessageIndex0, pckg ); + aMessage.Complete( KErrNone ); + } + break; + + case EGbaServCancelRequestBootstrap : + { + GBA_TRACE_DEBUG(("Cancelling bootstrapping")); + if ( i3GPPBootstrap->GetState() != C3GPPBootstrap::EIdle ) + { + i3GPPBootstrap->CancelBootstrap(); + // complete original bootstrapping + iMessage.Complete(KErrCancel); + // complete the message for canceling + aMessage.Complete(KErrNone); + } + else + { + aMessage.Complete(KErrNone); + } + } + break ; + + case EGbaServWriteOption : + { + GBA_TRACE_DEBUG(("CGbaServerSession::ServiceL EGbaServWriteOption")); + + //Get the dictionary store UID + TUid uid = TUid::Uid(aMessage.Int0()); + + //First get the length of descriptor + TInt length = aMessage.GetDesLength(1); + + // If bigger than 256, + // we think it is an attack. + if ( length <= 0 || length > KMaxURLLength ) + { + aMessage.Complete( KErrBadDescriptor ); + break; + } + + //read the content + HBufC8 *buf = HBufC8::NewLC( length ); + TPtr8 ptrbuf = buf->Des(); + aMessage.Read(KMessageIndex1,ptrbuf,0); + + Server()->WriteOptionL( uid,*buf ); + aMessage.Complete( KErrNone ); + CleanupStack::PopAndDestroy( buf ); + } + break; + + default : + { + GBA_TRACE_DEBUG(("Unexpected request")); + aMessage.Complete(KErrArgument); + } + + } + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::RequestBootstrapL() +// --------------------------------------------------------------------------- +// +void CGbaServerSession::RequestBootstrapL(const RMessage2& aMessage) + { + if ( i3GPPBootstrap->GetState() != C3GPPBootstrap::EIdle ) + { + // We're already busy + aMessage.Complete(KErrInUse); + return; + } + else + { + // Keep a copy of message - for use later + iMessage = aMessage ; + + TPtr8 inputPtr(reinterpret_cast (&iGbaInputParams), sizeof(TGBABootstrapInputParams), sizeof(TGBABootstrapInputParams)); + + //Sanity checking + //First get the length of descriptor + TInt inputDesLength = aMessage.GetDesLength(0); + + // if the length is not eqaul to the size of gba credentails + // return bad descriptor + if ( inputDesLength != sizeof(TGBABootstrapInputParams)) + { + aMessage.Complete( KErrBadDescriptor ); + return; + } + + aMessage.Read(KMessageIndex0,inputPtr,0); + + //Initialize bootstrap process using the state machine + i3GPPBootstrap->InitializeL(); + } + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::StateMachineCallBack() +// bootstrap state machine call back function +// Copy the credentail back to client and complete the RMessage +// If something wrong, complete RMessage with error value +// --------------------------------------------------------------------------- +// +void CGbaServerSession::StateMachineCallBack( TInt aError ) + { + if ( i3GPPBootstrap->GetState() != C3GPPBootstrap::EIdle ) + { + if ( aError == KErrNone ) + { + GBA_TRACE_DEBUG(("B-TID to be sent")); + GBA_TRACE_DEBUG(iGbaOutputParams.iBTID); + GBA_TRACE_DEBUG(("KsNAF to be sent")); + GBA_TRACE_DEBUG_BINARY(iGbaOutputParams.iKNAF); + // Write the obtained Gba Bootstrap Creds data back to the client + TPtr8 gbaBuffer(NULL,0,0); + gbaBuffer.Set(reinterpret_cast (&iGbaOutputParams), sizeof(TGBABootstrapOutputParams), sizeof(TGBABootstrapOutputParams)); + TInt res = iMessage.Write(KMessageIndex1, gbaBuffer,0); + GBA_TRACE_DEBUG_NUM(("writing message to client with return value = %d."),res); + iMessage.Complete( res ); + } + else + { + GBA_TRACE_DEBUG((" Didn't get bootstrap credentails, pass error back")); + // send error message to client + iMessage.Complete( aError ); + } + + } + } + + + +// --------------------------------------------------------------------------- +// CGbaServerSession::CreateL() +// --------------------------------------------------------------------------- +// +void CGbaServerSession::CreateL() + { + Server()->IncrementSessions(); + } + + +// --------------------------------------------------------------------------- +// CGbaServerSession::Server() +// --------------------------------------------------------------------------- +// +CGbaServer* CGbaServerSession::Server() + { + return static_cast(const_cast(CSession2::Server())); + } +//EOF +