gba/gbaapi/src/GbaClientRequestHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 15:20:08 +0200
changeset 0 164170e6151a
permissions -rw-r--r--
Revision: 201004

/*
* 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 CGbaClientRequestHandler
*
*/

#include <e32svr.h>
#include "GbaClientrequesthandler.h"
#include "GbaServerSession.h"
#include "GBALogger.h"
#include "GbaCommon.h"


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::NewL()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler* CGbaClientRequestHandler::NewL(MGbaObserver& aObserver)
    {
    CGbaClientRequestHandler* self = CGbaClientRequestHandler::NewLC(aObserver);
    CleanupStack::Pop( self );
    return(self) ;
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::NewLC()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler* CGbaClientRequestHandler::NewLC(MGbaObserver& aObserver)
    {
    CGbaClientRequestHandler* self = new (ELeave) CGbaClientRequestHandler(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self; 
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::NewL()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler* CGbaClientRequestHandler::NewL()
    {
    CGbaClientRequestHandler* self = NewLC();
    CleanupStack::Pop( self );
    return(self) ;
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::NewLC()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler* CGbaClientRequestHandler::NewLC()
    {
    CGbaClientRequestHandler* self = new (ELeave) CGbaClientRequestHandler();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self; 
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::ConstructL()
// -----------------------------------------------------------------------------
//
void CGbaClientRequestHandler::ConstructL()
    {
    iSession = new(ELeave) RGbaServerSession();
    User::LeaveIfError(iSession->Connect());
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::CGbaClientRequestHandler()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler::CGbaClientRequestHandler(MGbaObserver& aObserver)
:   CActive(EPriorityStandard),
    iObserver(&aObserver),
    iBootstrapState(EBootstrapNone)
    {
    CActiveScheduler::Add(this);
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::CGbaClientRequestHandler()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler::CGbaClientRequestHandler()
:   CActive(EPriorityStandard),
    iBootstrapState(EBootstrapNone)
    {
    iObserver = NULL;
    CActiveScheduler::Add(this);
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::~CGbaClientRequestHandler()
// -----------------------------------------------------------------------------
//
CGbaClientRequestHandler::~CGbaClientRequestHandler()
    {
    if(IsActive())
        {
        Cancel();
        }
    if ( iSession )
        {
        iSession->Close();
        }
    delete iSession;
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::RunL()
// -----------------------------------------------------------------------------
//
void CGbaClientRequestHandler::RunL()
    {
    GBA_TRACE_DEBUG_NUM(("CGbaClientRequestHandler::RunL iStatus=%d"),iStatus.Int());
    
    // only when the observer is in use, the runl function should be called.
    // if observer in runl is NULL, that means the factory function and bootstrap function
    // that user used that doesnot match.
    if( !iObserver )
        {
        return;
        }
	if( iStatus.Int() == KErrCancel && (iBootstrapState == EBootstrapCancelling))
		  {
		  iBootstrapState = EBootstrapNone;
		  return;
		  }
    if( iStatus.Int() < KErrNone )
        {
        iObserver->BootstrapComplete( iStatus.Int() );
        return;
        }
    
    switch (iBootstrapState)
        {
        case EBootstrapping:
            {
            GBA_TRACE_DEBUG(("BTID"));
            GBA_TRACE_DEBUG_BINARY(iGbaOutputParams->iBTID);
            GBA_TRACE_DEBUG(("Ks_NAF"));
            GBA_TRACE_DEBUG_BINARY(iGbaOutputParams->iKNAF);
            iBootstrapState = EBootstrapNone;
            iObserver->BootstrapComplete( KErrNone );
            GBA_TRACE_DEBUG(("Ks_NAF 2"));
            }
            break ;

        default:
            {
            GBA_TRACE_DEBUG(("Unexpected state"));
            iBootstrapState = EBootstrapNone;
            iObserver->BootstrapComplete( KErrUnknown );
            }
            break ;
        }
    }
    
    
// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::RunError()
// -----------------------------------------------------------------------------
//
TInt CGbaClientRequestHandler::RunError(TInt aError)
    {
    //when bootstrap fails, the error value from server
    //will be passed back to client.
    GBA_TRACE_DEBUG_NUM(("CGbaClientRequestHandler::RunError =%d"),aError );    
    if (iBootstrapState == EBootstrapping)
        {
        GBA_TRACE_DEBUG(("Call HandleUnexpected") );
        iObserver->BootstrapComplete(aError);
        GBA_TRACE_DEBUG(("Call HandleUnexpected End") );
        } 
    return KErrNone;       
    }
   

// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::DoCancel()
// -----------------------------------------------------------------------------
//
void CGbaClientRequestHandler::DoCancel()
    {
    if ( iBootstrapState == EBootstrapping )
        {      
        CancelBootstrap();
        }
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::Bootstrap()
// -----------------------------------------------------------------------------
//
TInt CGbaClientRequestHandler::Bootstrap( const TGBABootstrapInputParams aInput, TGBABootstrapOutputParams& aOutput )
    {
    if ( !iObserver )
        {
        return KErrGeneral;
        }
    
    if ( iBootstrapState == EBootstrapping )
        {
        return KErrInUse;
        }
    
    iGbaInputParams.iNAFName.Copy(aInput.iNAFName);
    iGbaInputParams.iFlags = aInput.iFlags;
    iGbaInputParams.iAPID = aInput.iAPID;
    iGbaInputParams.iProtocolIdentifier.Copy(aInput.iProtocolIdentifier);
    iGbaInputParams.iUICCLabel.Copy(aInput.iUICCLabel);
        
    iGbaOutputParams = &aOutput;
    
    iBootstrapState = EBootstrapping; 
     
    if ( !IsActive() )
        {
        iSession->RequestBootstrap( iGbaInputParams, *iGbaOutputParams, iStatus);
        SetActive();
        }
    return KErrNone;    
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::Bootstrap()
// -----------------------------------------------------------------------------
//
TInt CGbaClientRequestHandler::Bootstrap( const TGBABootstrapInputParams aInput, TGBABootstrapOutputParams& aOutput, TRequestStatus& aStatus )
    {
    iGbaInputParams.iNAFName.Copy(aInput.iNAFName);
    iGbaInputParams.iFlags = aInput.iFlags;
    iGbaInputParams.iAPID = aInput.iAPID;
    iGbaInputParams.iProtocolIdentifier.Copy(aInput.iProtocolIdentifier);
    iGbaInputParams.iUICCLabel.Copy(aInput.iUICCLabel);
    
    iGbaOutputParams = &aOutput;   
        
    iSession->RequestBootstrap(iGbaInputParams, *iGbaOutputParams, aStatus);
    return KErrNone;
    }    


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::CancelBootstrap()
// -----------------------------------------------------------------------------
//
TInt CGbaClientRequestHandler::CancelBootstrap()
    {
    GBA_TRACE_DEBUG(("CGbaClientRequestHandler::CancelBootstrap"));
    if ( iObserver )
        {
        iBootstrapState = EBootstrapCancelling;
        }
    return iSession->CancelBootstrap() ;
    }


// -----------------------------------------------------------------------------
// CGbaClientRequestHandler::SetBSFAddress()
// -----------------------------------------------------------------------------
//
TInt CGbaClientRequestHandler::SetBSFAddress(const TDesC8& aNewVal)
    {
    GBA_TRACE_DEBUG(("CGbaClientRequestHandler::SetBSFAddress"));
    TUid optionCode = KGbaBSFConfiguration;
    return iSession->WriteOption(optionCode,aNewVal);
    }

//EOF