diff -r 000000000000 -r 164170e6151a wim/WimServer/src/WimOmaProvisioning.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimServer/src/WimOmaProvisioning.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,480 @@ +/* +* Copyright (c) 2003-2009 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: WIM OMA Provisioning functionality. Reads OMA Provisioning +* documents from Smart Card. +* +*/ + + +// INCLUDE FILES +#include "WimOmaProvisioning.h" +#include "Wimi.h" // WIMI +#include "WimClsv.h" +#include "WimUtilityFuncs.h" +#include "WimResponse.h" // Callback response message +#include "WimTrace.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::CWimOmaProvisioning +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWimOmaProvisioning::CWimOmaProvisioning() + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::CWimOmaProvisioning | Begin")); + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWimOmaProvisioning::ConstructL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::ConstructL | Begin")); + iWimUtilityFuncs = CWimUtilityFuncs::NewL(); + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWimOmaProvisioning* CWimOmaProvisioning::NewL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::NewL | Begin")); + CWimOmaProvisioning* self = new( ELeave ) CWimOmaProvisioning; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// Destructor +CWimOmaProvisioning::~CWimOmaProvisioning() + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::~CWimOmaProvisioning | Begin")); + delete iWimUtilityFuncs; + free_WIMI_Ref_t( iWimRef ); + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::OmaFileSizeL +// Get OMA Provisioning file size +// ----------------------------------------------------------------------------- +// +void CWimOmaProvisioning::OmaFileSizeL( const RMessage2& aMessage ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::OmaFileSizeL | Begin")); + + InitializePathsAndSizes(); + + TOmaProv omaProvisioning; + omaProvisioning.iSize = 0; + TPckgBuf omaFilePckg( omaProvisioning ); + aMessage.ReadL( 0, omaFilePckg ); + + TInt fileSize = 0; + TInt err = KErrNone; + + switch ( omaFilePckg().iOmaType ) + { + case EBootStrap: + { + fileSize = iBootstrapFileSize; + break; + } + + case EConfig1: + { + fileSize = iConfig1FileSize; + break; + } + + case EConfig2: + { + fileSize = iConfig2FileSize; + break; + } + + default: + { + err = KErrArgument; + break; + } + } + + _WIMTRACE3(_L("WIM | WIMServer | CWimOmaProvisioning::OmaFileSizeL | FileType=%d, FileSize=%d"), omaFilePckg().iOmaType, fileSize); + + if ( err == KErrNone ) + { + omaFilePckg().iSize = ( TInt )fileSize; + aMessage.WriteL( 0, omaFilePckg ); + } + aMessage.Complete( err ); + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::OmaFileContentL +// Write content of OMA provisioning file to client memory +// ----------------------------------------------------------------------------- +// +void CWimOmaProvisioning::OmaFileContentL( const RMessage2& aMessage ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::OmaFileContentL | Begin")); + + TUint16 callStatus = KErrNone; + WIMI_BinData_t pt_path; + WIMI_BinData_t fileContent; + TUint16 fileSize = 0; + TPtrC8 path; + + // Do initialization + InitializePathsAndSizes(); + + TOmaProv omaProvisioning; + omaProvisioning.iSize = 0; + TPckgBuf omaFilePckg( omaProvisioning ); + aMessage.ReadL( 0, omaFilePckg ); + + if ( !iWimRef ) + { + callStatus = WIMI_ERR_KeyNotFound; // Mapped to KErrNotFound + } + + if ( callStatus == KErrNone ) + { + switch ( omaFilePckg().iOmaType ) + { + case EBootStrap: + { + path.Set( iPathBootstrap.Ptr() ); + fileSize = ( TUint16 )iBootstrapFileSize; + break; + } + + case EConfig1: + { + path.Set( iPathConfig1.Ptr() ); + fileSize = ( TUint16 )iConfig1FileSize; + break; + } + + case EConfig2: + { + path.Set( iPathConfig2.Ptr() ); + fileSize = ( TUint16 )iConfig2FileSize; + break; + } + + default: + { + callStatus = WIMI_ERR_BadParameters; + break; + } + } + } + + if ( callStatus == KErrNone ) + { + if ( path.Length() == 0 ) + { + callStatus = WIMI_ERR_KeyNotFound; // Mapped to KErrNotFound + } + } + + _WIMTRACE3(_L("WIM | WIMServer | CWimOmaProvisioning::OmaFileContentL | FileType=%d, FileSize=%d"), omaFilePckg().iOmaType, fileSize); + + if ( callStatus == KErrNone ) + { + pt_path.ui_buf_length = ( TUint16 )path.Length(); + pt_path.pb_buf = ( TUint8* )path.Ptr(); + + WIMI_TransactId_t trId = ( void* )EOMAProvContentSync; + + fileContent.pb_buf = NULL; + fileContent.ui_buf_length = 0; + // Get OMA Provisioning file from card + callStatus = WIMI_GetOMAFileSync( trId, + iWimRef, + &pt_path, + 0, + &fileContent ); + + if ( callStatus == KErrNone ) + { + //Use filesize here, should be equal or smaller than fileContent.ui_length + TPtrC8 omaFilePtr( fileContent.pb_buf, fileSize ); + TInt err = aMessage.Write( 1, omaFilePtr ); + if( err ) + { + WSL_OS_Free( fileContent.pb_buf ); + User::Leave( err ); + } + aMessage.Complete( KErrNone ); + } + else + { + aMessage.Complete( CWimUtilityFuncs::MapWIMError( callStatus ) ); + } + + WSL_OS_Free( fileContent.pb_buf ); // Deallocate file content buffer + } + + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::OmaFileContentL | End")); + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::InitializePathsAndSizes +// Initializes the path and size data members +// ----------------------------------------------------------------------------- +// +void CWimOmaProvisioning::InitializePathsAndSizes() + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::InitializePathsAndSizesL | Begin")); + + // Do initialization only if initialization is not done + if ( !iFileInfosInitialized ) + { + TUint16 callStatus = KErrNone; + + TBuf8 bootstrapOid; + TBuf8 config1Oid; + TBuf8 config2Oid; + + bootstrapOid.Copy( KWimProvBootstrapFileOID, KWimProvFileOidLength ); + config1Oid.Copy( KWimProvConfig1FileOID, KWimProvFileOidLength ); + config2Oid.Copy( KWimProvConfig2FileOID, KWimProvFileOidLength ); + + TBuf8 bootstrapOidTaged; + TBuf8 config1OidTaged; + TBuf8 config2OidTaged; + + bootstrapOidTaged.Copy( KWimProvBootstrapFileOIDTaged, + KWimProvFileOidLengthTaged ); + config1OidTaged.Copy( KWimProvConfig1FileOIDTaged, + KWimProvFileOidLengthTaged ); + config2OidTaged.Copy( KWimProvConfig2FileOIDTaged, + KWimProvFileOidLengthTaged ); + + WIMI_BinData_t path; + path.pb_buf = NULL; + path.ui_buf_length = 0; + + WIMI_File_Info* fileInfos = NULL; + + TUint16 fileCount = 0; + + WIMI_BinData_t fileOid; + fileOid.pb_buf = NULL; + fileOid.ui_buf_length = 0; + + // Get WIM reference, reader is always 0 + iWimRef = WIMI_GetWIMRef( 0 ); + + if ( !iWimRef ) + { + callStatus = WIMI_ERR_BadReference; + } + + if ( callStatus == KErrNone ) + { + + // Get OMA file info from Wimlib + callStatus = WIMI_OMAFileInfo( iWimRef, + &fileInfos, + &fileCount ); + } + + if ( callStatus == KErrNone ) + { + TBuf8 oidBuf; // Buffer for OID + + // Loop all file infos and safe path to each file + for ( TInt i = 0; i < fileCount; i++ ) + { + // Get file OID from infos + fileOid.pb_buf = fileInfos[i].t_oid.pb_buf; + fileOid.ui_buf_length = fileInfos[i].t_oid.ui_buf_length; + oidBuf.Copy( fileOid.pb_buf, fileOid.ui_buf_length ); + + // File path + path.pb_buf = fileInfos[i].b_path.pb_buf; + path.ui_buf_length = fileInfos[i].b_path.ui_buf_length; + + // Compare OIDs + if ( !oidBuf.Compare( bootstrapOid ) + || !oidBuf.Compare( bootstrapOidTaged ) ) // Bootstrap File + { + // Copy file path to member + iPathBootstrap.Copy( path.pb_buf, path.ui_buf_length ); + // Set file size + iBootstrapFileSize = fileInfos[i].ui_file_size; + + // Check if path is given but size not. If path exists and + // size == 0 then parse size from fetched file + if ( iPathBootstrap.Length() > 0 && + iBootstrapFileSize == 0 ) + { + ParseFileSize( EBootStrap ); + } + } + else if ( !oidBuf.Compare( config1Oid ) + || !oidBuf.Compare( config1OidTaged ) ) // Config1 File + { + // Copy file path to member + iPathConfig1.Copy( path.pb_buf, path.ui_buf_length ); + // Set file size + iConfig1FileSize = fileInfos[i].ui_file_size; + + // Check if path is given but size not. If path exists and + // size == 0 then parse size from fetched file + if ( iPathConfig1.Length() > 0 && iConfig1FileSize == 0 ) + { + ParseFileSize( EConfig1 ); + } + } + else if ( !oidBuf.Compare( config2Oid ) + || !oidBuf.Compare( config2OidTaged ) ) // Config2 File + { + // Copy file path to member + iPathConfig2.Copy( path.pb_buf, path.ui_buf_length ); + // Set file size + iConfig2FileSize = fileInfos[i].ui_file_size; + + // Check if path is given but size not. If path exists and + // size == 0 then parse size from fetched file + if ( iPathConfig2.Length() > 0 && iConfig2FileSize == 0 ) + { + ParseFileSize( EConfig2 ); + } + } + } + } + iFileInfosInitialized = ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CWimOmaProvisioning::ParseFileSize +// Get content of file and parse size of it. For WIM size is mandatory in +// DODF-PROV file but for SIM implementation it is not mandatory. +// ----------------------------------------------------------------------------- +// +void CWimOmaProvisioning::ParseFileSize( TOMAType aOmaType ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimOmaProvisioning::ParseFileSize | Begin")); + WIMI_BinData_t path; + WIMI_BinData_t fileContent; + TInt fileSize; + TPtrC8 pathPtr; + + // Set path to file + switch ( aOmaType ) + { + case EBootStrap: + { + pathPtr.Set( iPathBootstrap.Ptr() ); + break; + } + + case EConfig1: + { + pathPtr.Set( iPathConfig1.Ptr() ); + break; + } + + case EConfig2: + { + pathPtr.Set( iPathConfig2.Ptr() ); + break; + } + + default: + { + return; + } + } + + path.ui_buf_length = ( TUint16 )pathPtr.Length(); + path.pb_buf = ( TUint8* )pathPtr.Ptr(); + + + WIMI_TransactId_t trId = ( void* )EOMAProvContentSync; + + TPtr8 contentPtr = TPtr8( NULL, 0, 0 ); + + fileContent.pb_buf = NULL; + fileContent.ui_buf_length = 0; + // Get OMA Provisioning file from card + WIMI_STAT callStatus = WIMI_GetOMAFileSync( trId, + iWimRef, + &path, + 0, + &fileContent ); + + if ( callStatus != KErrNone ) + { + fileSize = 0; + } + else + { + contentPtr.Set( fileContent.pb_buf, + fileContent.ui_buf_length, + fileContent.ui_buf_length ); + + fileSize = fileContent.ui_buf_length; + } + + // Set file size + switch ( aOmaType ) + { + case EBootStrap: + { + iBootstrapFileSize = fileSize; + _WIMTRACE2( _L("WIM | WIMServer | CWimOmaProvisioning::ParseFileSize | Bootstrap size=%d"), + fileSize ); + break; + } + + case EConfig1: + { + iConfig1FileSize = fileSize; + _WIMTRACE2( _L("WIM | WIMServer | CWimOmaProvisioning::ParseFileSize | Config1 size=%d"), + fileSize ); + break; + } + + case EConfig2: + { + iConfig2FileSize = fileSize; + _WIMTRACE2( _L("WIM | WIMServer | CWimOmaProvisioning::ParseFileSize | Config2 size=%d"), + fileSize ); + break; + } + + default: + { + break; + } + } + + WSL_OS_Free( fileContent.pb_buf ); // Deallocate file content buffer + } + +// End of File