--- /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<TOmaProv> 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+