wim/WimServer/src/WimOmaProvisioning.cpp
changeset 0 164170e6151a
--- /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<TOmaProv> 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<TOmaProv> 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<KWimProvFileOidLength> bootstrapOid;
+        TBuf8<KWimProvFileOidLength> config1Oid;
+        TBuf8<KWimProvFileOidLength> config2Oid;
+
+        bootstrapOid.Copy( KWimProvBootstrapFileOID, KWimProvFileOidLength );
+        config1Oid.Copy( KWimProvConfig1FileOID, KWimProvFileOidLength );
+        config2Oid.Copy( KWimProvConfig2FileOID, KWimProvFileOidLength );
+
+        TBuf8<KWimProvFileOidLengthTaged> bootstrapOidTaged;
+        TBuf8<KWimProvFileOidLengthTaged> config1OidTaged;
+        TBuf8<KWimProvFileOidLengthTaged> 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<KWimOidLengthTaged> 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