diff -r 000000000000 -r 164170e6151a wim/WimClient/src/ProvSC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimClient/src/ProvSC.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,453 @@ +/* +* Copyright (c) 2004 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: API which handles OMA Provisioning related operations +* +*/ + + + + +//INCLUDE FILES +#include "WimCertMgmt.h" +#include "WimMgmt.h" +#include "ProvSC.h" +#include "WimTrace.h" + + +// ----------------------------------------------------------------------------- +// CWimOMAProv::CWimOMAProv() +// Default constructor +// ----------------------------------------------------------------------------- +// +CWimOMAProv::CWimOMAProv(): CActive( EPriorityStandard ) + { + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv* CWimOMAProv::NewL() +// Symbian 2 phase construction +// ----------------------------------------------------------------------------- +// +EXPORT_C CWimOMAProv* CWimOMAProv::NewL() + { + CWimOMAProv* self = new( ELeave ) CWimOMAProv(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::ConstructL() +// Second phase +// ----------------------------------------------------------------------------- +// +void CWimOMAProv::ConstructL() + { + _WIMTRACE ( _L( "CWimOMAProv::ConstructL" ) ); + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::~CWimOMAProv() +// Destructor. All allocated memory is released. +// ----------------------------------------------------------------------------- +// +EXPORT_C CWimOMAProv::~CWimOMAProv() + { + _WIMTRACE ( _L( "CWimOMAProv::~CWimOMAProv" ) ); + Cancel(); + DeallocMemoryFromOmaProvStruct(); + + if( iConnectionHandle ) + { + iConnectionHandle->Close(); + delete iConnectionHandle; + } + + if ( iClientSession ) + { + iClientSession->Close(); + delete iClientSession; + } + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::Initialize() +// Initializes the WIM server cache. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::Initialize( TRequestStatus& aStatus ) + { + _WIMTRACE ( _L( "CWimOMAProv::Initialize" ) ); + aStatus = KRequestPending; + iClientStatus = &aStatus; + iPhase = EInitialize; + SignalOwnStatusAndComplete(); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::CancelInitialize() +// Cancels outgoing Initialize operation. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::CancelInitialize() + { + _WIMTRACE ( _L( "CWimOMAProv::CancelInitialize" ) ); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::GetSize() +// Fetches the size of provisioning information string. This information can +// be used as a notification, does provisioning information exist. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::GetSize( TInt& aSize, + const TOMAType& aOMAType, + TRequestStatus& aStatus ) + { + _WIMTRACE ( _L( "CWimOMAProv::GetSize" ) ); + aStatus = KRequestPending; + iClientStatus = &aStatus; + + if ( !iClientSession || !iConnectionHandle ) + { + User::RequestComplete( iClientStatus, KErrGeneral ); + } + else + { + iSize = &aSize; + iOMAType = aOMAType; + iPhase = EGetSize; + SignalOwnStatusAndComplete(); + } + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::CancelGetSize() +// Cancels ongoing GetSize operation +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::CancelGetSize() + { + _WIMTRACE ( _L( "CWimOMAProv::CancelGetSize" ) ); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::Retrieve() +// Fetches the whole data of provisioning information string. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::Retrieve( const TOMAType& aOMAType, + TDes8& aOMAData, + TRequestStatus& aStatus ) + { + _WIMTRACE ( _L( "CWimOMAProv::Retrieve" ) ); + aStatus = KRequestPending; + iClientStatus = &aStatus; + + if ( !iClientSession || !iConnectionHandle ) + { + User::RequestComplete( iClientStatus, KErrGeneral ); + return; + } + + if ( aOMAData.MaxLength() ) + { + iOMAType = aOMAType; + iData = &aOMAData; + iPhase = ERetrieve; + SignalOwnStatusAndComplete(); + } + else + { + User::RequestComplete( iClientStatus, KErrGeneral ); + } + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::CancelRetrieve() +// Cancels ongoing retrieve operation +// ----------------------------------------------------------------------------- +// +EXPORT_C void CWimOMAProv::CancelRetrieve() + { + _WIMTRACE ( _L( "CWimOMAProv::CancelRetrieve" ) ); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::RunL() +// Different phases are handled here +// iPhase = EInitialize: Gets ClientSession handle. Tries to connect +// to existing session. If there is no existing session, a new session +// is created. +// iPhase = EConnectClientSession: If new session was needed to be created, +// new connecting request is needed. +// iPhase = EInitializeWim: Sends initialize request to server and waits +// asyncronously. +// iPhase = EInitializeDone: Initialization is ready. +// iPhase = EGetSize: Gets OMA data type and data size from WIM Server +// iPhase = EGetSizeDone: WIM server has sent data to client and client copies +// data forward to caller. +// iPhase = ERetrieve: Retrieves OMA binary data from WIM Server according to +// type +// iPhase = ERetrieveDone: WIM Server has sent data and client copies data +// forward to caller. +// ----------------------------------------------------------------------------- +// +void CWimOMAProv::RunL() + { + switch ( iPhase ) + { + case EInitialize: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitialize" ) ); + //get ClientSession handle + iClientSession = RWimMgmt::ClientSessionL(); + + iPhase = EConnectClientSession; + TInt retval = 0; + iWimStartErr = iClientSession->Connect(); + if ( iWimStartErr == KErrNotFound ) + { + retval = iClientSession->StartWim(); + if( retval != KErrNone ) + { + User::RequestComplete( iClientStatus, retval ); + } + else + { + SignalOwnStatusAndComplete(); + } + } + else + { + SignalOwnStatusAndComplete(); + } + break; + } + case EConnectClientSession: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EConnectClientSession" ) ); + //Raise iPhase + iPhase = EInitializeWim; + if ( iWimStartErr ) + { + //New session was needed to be created. Try to reconnect. + iWimStartErr = iClientSession->Connect(); + if ( iWimStartErr ) + { + //Failed to connect. No reason to continue. + User::RequestComplete( iClientStatus, iWimStartErr ); + } + else + { + SignalOwnStatusAndComplete(); + } + } + else + { + SignalOwnStatusAndComplete(); + } + break; + } + case EInitializeWim: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitializeWim" ) ); + //Initialize WIM + SetActive(); + iClientSession->Initialize( iStatus ); + iPhase = EInitializeDone; + break; + } + case EInitializeDone: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitializeDone" ) ); + if ( iStatus.Int() == KErrNone ) + { + //Get connection handle to WIM Server. + iConnectionHandle = RWimCertMgmt::ClientSessionL(); + } + User::RequestComplete( iClientStatus, iStatus.Int() ); + break; + } + case EGetSize: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EGetSize" ) ); + TOmaProv omaProv; + omaProv.iOmaType = iOMAType; + iConnectionHandle->RetrieveOmaDataL( omaProv, + iStatus, + EGetOMAFileSize ); + iPhase = EGetSizeDone; + SetActive(); + break; + } + case EGetSizeDone: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: EGetSizeDone" ) ); + if ( iStatus.Int() == KErrNone ) + { + TPckgBuf omaProvPckgBuf; + + omaProvPckgBuf.operator = + ( *iConnectionHandle->TOmaProvPckgBuf()->PckgBuf() ); + + *iSize = omaProvPckgBuf().iSize; + } + iConnectionHandle->DeallocOmaDataPckgBuf(); + User::RequestComplete( iClientStatus, iStatus.Int() ); + break; + } + case ERetrieve: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: ERetrieve" ) ); + AllocMemoryForOmaProvStructL( iData->MaxLength() ); + TOmaProv omaProv; + omaProv.iOmaData = iOmaProvBufPtr; + omaProv.iOmaType = iOMAType; + iConnectionHandle->RetrieveOmaDataL( omaProv, + iStatus, + EGetOMAFile ); + iPhase = ERetrieveDone; + SetActive(); + break; + } + case ERetrieveDone: + { + _WIMTRACE ( _L( "CWimOMAProv::RunL case: ERetrieveDone" ) ); + if ( iStatus.Int() == KErrNone ) + { + TPtr8 ptr = iOmaProvBuf->Des(); + iData->Copy( ptr ); + } + DeallocMemoryFromOmaProvStruct(); + iConnectionHandle->DeallocOmaDataPckgBuf(); + User::RequestComplete( iClientStatus, iStatus.Int() ); + break; + } + default: + { + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::AllocMemoryForOmaProvStructL() +// Allocates memory for OMA binary data +// ----------------------------------------------------------------------------- +void CWimOMAProv::AllocMemoryForOmaProvStructL( const TInt aDataLength ) + { + _WIMTRACE ( _L( "CWimOMAProv::AllocMemoryForOmaProvStructL" ) ); + if ( aDataLength ) + { + iOmaProvBuf = HBufC8::NewL( aDataLength ); + iOmaProvBufPtr = new( ELeave ) TPtr8( iOmaProvBuf->Des() ); + } + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::DeallocMemoryFromOmaProvStruct() +// Deallocates memory from member variables +// ----------------------------------------------------------------------------- +void CWimOMAProv::DeallocMemoryFromOmaProvStruct() + { + _WIMTRACE ( _L( "CWimOMAProv::DeallocMemoryFromOmaProvStruct" ) ); + delete iOmaProvBuf; + delete iOmaProvBufPtr; + iOmaProvBuf = NULL; + iOmaProvBufPtr = NULL; + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::DoCancel() +// Deallocates member variables and completes client status with +// KErrCancel error code. +// ----------------------------------------------------------------------------- +// +void CWimOMAProv::DoCancel() + { + _WIMTRACE ( _L( "CWimOMAProv::DoCancel" ) ); + if ( iConnectionHandle && + ( iPhase == EGetSizeDone || iPhase == ERetrieveDone ) ) + { + iConnectionHandle->DeallocOmaDataPckgBuf(); + } + DeallocMemoryFromOmaProvStruct(); + User::RequestComplete( iClientStatus, KErrCancel ); + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::RunError() +// The active scheduler calls this function if this active object's RunL() +// function leaves. This gives this active object the opportunity to perform +// any necessary cleanup. +// After cleanup, complete request with received error code. +// ----------------------------------------------------------------------------- +// +TInt CWimOMAProv::RunError( TInt aError ) + { + _WIMTRACE ( _L( "CWimOMAProv::RunError Error = %d" ) ); + if ( iConnectionHandle && + ( iPhase == EGetSizeDone || iPhase == ERetrieveDone ) ) + { + iConnectionHandle->DeallocOmaDataPckgBuf(); + } + DeallocMemoryFromOmaProvStruct(); + User::RequestComplete( iClientStatus, aError ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CWimOMAProv::SignalOwnStatusAndComplete() +// Sets own iStatus to KRequestPending, and signals it +// with User::RequestComplete() -request. This gives chance +// active scheduler to run other active objects. After a quick +// visit in actives cheduler, signal returns to RunL() and starts next +// phase of operation. +// ----------------------------------------------------------------------------- +// +void CWimOMAProv::SignalOwnStatusAndComplete() + { + _WIMTRACE ( _L( "CWimOMAProv::SignalOwnStatusAndComplete" ) ); + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + +// End of File + + + + + + + + + + + + + + + + + + +