wim/WimClient/src/ProvSC.cpp
changeset 0 164170e6151a
equal deleted inserted replaced
-1:000000000000 0:164170e6151a
       
     1 /*
       
     2 * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  API which handles OMA Provisioning related operations
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 //INCLUDE FILES
       
    22 #include "WimCertMgmt.h"
       
    23 #include "WimMgmt.h"
       
    24 #include "ProvSC.h"
       
    25 #include "WimTrace.h"
       
    26 
       
    27 
       
    28 // -----------------------------------------------------------------------------
       
    29 // CWimOMAProv::CWimOMAProv()
       
    30 // Default constructor
       
    31 // -----------------------------------------------------------------------------
       
    32 //
       
    33 CWimOMAProv::CWimOMAProv(): CActive( EPriorityStandard )
       
    34     {
       
    35     }
       
    36 
       
    37 // -----------------------------------------------------------------------------
       
    38 // CWimOMAProv* CWimOMAProv::NewL()
       
    39 // Symbian 2 phase construction
       
    40 // -----------------------------------------------------------------------------
       
    41 //
       
    42 EXPORT_C CWimOMAProv* CWimOMAProv::NewL()
       
    43     {
       
    44     CWimOMAProv* self = new( ELeave ) CWimOMAProv();
       
    45     CleanupStack::PushL( self );
       
    46     self->ConstructL();
       
    47     CleanupStack::Pop( self );
       
    48     return self;
       
    49     }
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // CWimOMAProv::ConstructL()
       
    53 // Second phase
       
    54 // -----------------------------------------------------------------------------
       
    55 //
       
    56 void CWimOMAProv::ConstructL()
       
    57     {
       
    58     _WIMTRACE ( _L( "CWimOMAProv::ConstructL" ) );
       
    59     CActiveScheduler::Add( this );
       
    60     }
       
    61 
       
    62 // -----------------------------------------------------------------------------
       
    63 // CWimOMAProv::~CWimOMAProv()
       
    64 // Destructor. All allocated memory is released.
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 EXPORT_C CWimOMAProv::~CWimOMAProv()
       
    68     {
       
    69     _WIMTRACE ( _L( "CWimOMAProv::~CWimOMAProv" ) );
       
    70     Cancel();
       
    71     DeallocMemoryFromOmaProvStruct();
       
    72     
       
    73     if( iConnectionHandle )
       
    74         {
       
    75         iConnectionHandle->Close();
       
    76         delete iConnectionHandle;
       
    77         }
       
    78     
       
    79     if ( iClientSession )
       
    80         {
       
    81         iClientSession->Close();
       
    82         delete iClientSession;
       
    83         }
       
    84     }
       
    85 
       
    86 // -----------------------------------------------------------------------------
       
    87 // CWimOMAProv::Initialize()
       
    88 // Initializes the WIM server cache.
       
    89 // -----------------------------------------------------------------------------
       
    90 //
       
    91 EXPORT_C void CWimOMAProv::Initialize( TRequestStatus& aStatus )
       
    92     {
       
    93     _WIMTRACE ( _L( "CWimOMAProv::Initialize" ) );
       
    94     aStatus = KRequestPending;
       
    95     iClientStatus = &aStatus;
       
    96     iPhase = EInitialize;
       
    97     SignalOwnStatusAndComplete();
       
    98     }
       
    99 
       
   100 // -----------------------------------------------------------------------------
       
   101 // CWimOMAProv::CancelInitialize()
       
   102 // Cancels outgoing Initialize operation.
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 EXPORT_C void CWimOMAProv::CancelInitialize()
       
   106     {
       
   107     _WIMTRACE ( _L( "CWimOMAProv::CancelInitialize" ) );
       
   108     Cancel();
       
   109     }
       
   110 
       
   111 // -----------------------------------------------------------------------------
       
   112 // CWimOMAProv::GetSize()
       
   113 // Fetches the size of provisioning information string. This information can
       
   114 // be used as a notification, does provisioning information exist.
       
   115 // -----------------------------------------------------------------------------
       
   116 //
       
   117 EXPORT_C void CWimOMAProv::GetSize( TInt& aSize, 
       
   118                                     const TOMAType& aOMAType, 
       
   119                                     TRequestStatus& aStatus )
       
   120     {
       
   121     _WIMTRACE ( _L( "CWimOMAProv::GetSize" ) );
       
   122     aStatus = KRequestPending;
       
   123     iClientStatus = &aStatus;
       
   124 
       
   125     if ( !iClientSession || !iConnectionHandle )
       
   126         {
       
   127         User::RequestComplete( iClientStatus, KErrGeneral );
       
   128         }
       
   129     else
       
   130         {
       
   131         iSize = &aSize;
       
   132         iOMAType = aOMAType;
       
   133         iPhase = EGetSize;
       
   134         SignalOwnStatusAndComplete();
       
   135         }
       
   136     }
       
   137 
       
   138 // -----------------------------------------------------------------------------
       
   139 // CWimOMAProv::CancelGetSize()
       
   140 // Cancels ongoing GetSize operation
       
   141 // -----------------------------------------------------------------------------
       
   142 //
       
   143 EXPORT_C void CWimOMAProv::CancelGetSize()
       
   144     {
       
   145     _WIMTRACE ( _L( "CWimOMAProv::CancelGetSize" ) );
       
   146     Cancel();
       
   147     }
       
   148 
       
   149 // -----------------------------------------------------------------------------
       
   150 // CWimOMAProv::Retrieve()
       
   151 // Fetches the whole data of provisioning information string.
       
   152 // -----------------------------------------------------------------------------
       
   153 //
       
   154 EXPORT_C void CWimOMAProv::Retrieve( const TOMAType& aOMAType, 
       
   155                                      TDes8& aOMAData, 
       
   156                                      TRequestStatus& aStatus )
       
   157     {
       
   158     _WIMTRACE ( _L( "CWimOMAProv::Retrieve" ) );    
       
   159     aStatus = KRequestPending;
       
   160     iClientStatus = &aStatus;
       
   161 
       
   162     if ( !iClientSession || !iConnectionHandle )
       
   163         {
       
   164         User::RequestComplete( iClientStatus, KErrGeneral );
       
   165         return;
       
   166         }
       
   167 
       
   168     if ( aOMAData.MaxLength() )
       
   169         {
       
   170         iOMAType = aOMAType;
       
   171         iData = &aOMAData;
       
   172         iPhase = ERetrieve;
       
   173         SignalOwnStatusAndComplete();
       
   174         }
       
   175     else
       
   176         {
       
   177         User::RequestComplete( iClientStatus, KErrGeneral );
       
   178         }
       
   179     }
       
   180 
       
   181 // -----------------------------------------------------------------------------
       
   182 // CWimOMAProv::CancelRetrieve()
       
   183 // Cancels ongoing retrieve operation
       
   184 // -----------------------------------------------------------------------------
       
   185 //
       
   186 EXPORT_C void CWimOMAProv::CancelRetrieve()
       
   187     {
       
   188     _WIMTRACE ( _L( "CWimOMAProv::CancelRetrieve" ) );
       
   189     Cancel();
       
   190     }
       
   191 
       
   192 // -----------------------------------------------------------------------------
       
   193 // CWimOMAProv::RunL()
       
   194 // Different phases are handled here
       
   195 // iPhase = EInitialize: Gets ClientSession handle. Tries to connect
       
   196 //          to existing session. If there is no existing session, a new session 
       
   197 //          is created.
       
   198 // iPhase = EConnectClientSession: If new session was needed to be created, 
       
   199 //          new connecting request is needed.
       
   200 // iPhase = EInitializeWim: Sends initialize request to server and waits
       
   201 //          asyncronously.
       
   202 // iPhase = EInitializeDone: Initialization is ready.
       
   203 // iPhase = EGetSize: Gets OMA data type and data size from WIM Server
       
   204 // iPhase = EGetSizeDone: WIM server has sent data to client and client copies
       
   205 //                        data forward to caller.
       
   206 // iPhase = ERetrieve: Retrieves OMA binary data from WIM Server according to
       
   207 //                     type
       
   208 // iPhase = ERetrieveDone: WIM Server has sent data and client copies data 
       
   209 //                         forward to caller.
       
   210 // -----------------------------------------------------------------------------
       
   211 //
       
   212 void CWimOMAProv::RunL()
       
   213     {
       
   214     switch ( iPhase ) 
       
   215         {
       
   216         case EInitialize:
       
   217             {    
       
   218             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitialize" ) );
       
   219              //get ClientSession handle
       
   220             iClientSession = RWimMgmt::ClientSessionL();
       
   221 
       
   222             iPhase = EConnectClientSession;
       
   223             TInt retval = 0;
       
   224             iWimStartErr = iClientSession->Connect();
       
   225             if ( iWimStartErr == KErrNotFound ) 
       
   226                 {
       
   227                 retval = iClientSession->StartWim();
       
   228                 if( retval != KErrNone )
       
   229                     {
       
   230                     User::RequestComplete( iClientStatus, retval ); 
       
   231                     }
       
   232                 else
       
   233                     {
       
   234                     SignalOwnStatusAndComplete();
       
   235                     }
       
   236                 }
       
   237             else
       
   238                 {
       
   239                  SignalOwnStatusAndComplete(); 
       
   240                 }
       
   241             break;
       
   242             }
       
   243         case EConnectClientSession:
       
   244             {
       
   245             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EConnectClientSession" ) );
       
   246             //Raise iPhase
       
   247             iPhase = EInitializeWim; 
       
   248             if ( iWimStartErr )
       
   249                 {
       
   250                 //New session was needed to be created. Try to reconnect.
       
   251                 iWimStartErr = iClientSession->Connect();
       
   252                 if ( iWimStartErr )
       
   253                     {
       
   254                     //Failed to connect. No reason to continue.
       
   255                     User::RequestComplete( iClientStatus, iWimStartErr );
       
   256                     }
       
   257                 else
       
   258                     {
       
   259                     SignalOwnStatusAndComplete();
       
   260                     }
       
   261                 }
       
   262             else
       
   263                 {
       
   264                 SignalOwnStatusAndComplete();
       
   265                 }
       
   266             break;
       
   267             }
       
   268         case EInitializeWim:
       
   269             {
       
   270             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitializeWim" ) );
       
   271             //Initialize WIM
       
   272             SetActive();
       
   273             iClientSession->Initialize( iStatus );
       
   274             iPhase = EInitializeDone;
       
   275             break;   
       
   276             }
       
   277         case EInitializeDone:
       
   278             {
       
   279             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EInitializeDone" ) );
       
   280             if ( iStatus.Int() == KErrNone )
       
   281                 {
       
   282                  //Get connection handle to WIM Server.
       
   283                 iConnectionHandle = RWimCertMgmt::ClientSessionL(); 
       
   284                 }
       
   285             User::RequestComplete( iClientStatus, iStatus.Int() );
       
   286             break;
       
   287             }
       
   288         case EGetSize:
       
   289             {
       
   290             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EGetSize" ) );
       
   291             TOmaProv omaProv;
       
   292             omaProv.iOmaType = iOMAType;
       
   293             iConnectionHandle->RetrieveOmaDataL( omaProv, 
       
   294                                                  iStatus, 
       
   295                                                  EGetOMAFileSize );
       
   296             iPhase = EGetSizeDone;
       
   297             SetActive();
       
   298             break;
       
   299             }
       
   300         case EGetSizeDone:
       
   301             {
       
   302             _WIMTRACE ( _L( "CWimOMAProv::RunL case: EGetSizeDone" ) );
       
   303             if ( iStatus.Int() == KErrNone )
       
   304                 {
       
   305                 TPckgBuf<TOmaProv> omaProvPckgBuf;
       
   306     
       
   307                 omaProvPckgBuf.operator = 
       
   308                     ( *iConnectionHandle->TOmaProvPckgBuf()->PckgBuf() );
       
   309 
       
   310                 *iSize = omaProvPckgBuf().iSize;
       
   311                 }
       
   312             iConnectionHandle->DeallocOmaDataPckgBuf();
       
   313             User::RequestComplete( iClientStatus, iStatus.Int() );
       
   314             break;
       
   315             }
       
   316         case ERetrieve:
       
   317             {
       
   318             _WIMTRACE ( _L( "CWimOMAProv::RunL case: ERetrieve" ) );
       
   319             AllocMemoryForOmaProvStructL( iData->MaxLength() );
       
   320             TOmaProv omaProv;
       
   321             omaProv.iOmaData = iOmaProvBufPtr;
       
   322             omaProv.iOmaType = iOMAType;
       
   323             iConnectionHandle->RetrieveOmaDataL( omaProv, 
       
   324                                                  iStatus,
       
   325                                                  EGetOMAFile );
       
   326             iPhase = ERetrieveDone;
       
   327             SetActive();
       
   328             break;
       
   329             }
       
   330         case ERetrieveDone:
       
   331             {
       
   332             _WIMTRACE ( _L( "CWimOMAProv::RunL case: ERetrieveDone" ) );
       
   333             if ( iStatus.Int() == KErrNone )
       
   334                 {
       
   335                 TPtr8 ptr = iOmaProvBuf->Des();
       
   336                 iData->Copy( ptr );
       
   337                 }
       
   338             DeallocMemoryFromOmaProvStruct();
       
   339             iConnectionHandle->DeallocOmaDataPckgBuf();
       
   340             User::RequestComplete( iClientStatus, iStatus.Int() );
       
   341             break;
       
   342             }
       
   343         default:
       
   344             {
       
   345             break;
       
   346             }
       
   347         }
       
   348     }
       
   349 
       
   350 // -----------------------------------------------------------------------------
       
   351 // CWimOMAProv::AllocMemoryForOmaProvStructL()
       
   352 // Allocates memory for OMA binary data
       
   353 // -----------------------------------------------------------------------------
       
   354 void CWimOMAProv::AllocMemoryForOmaProvStructL( const TInt aDataLength )
       
   355     {
       
   356     _WIMTRACE ( _L( "CWimOMAProv::AllocMemoryForOmaProvStructL" ) );
       
   357     if ( aDataLength )
       
   358         {
       
   359         iOmaProvBuf = HBufC8::NewL( aDataLength );
       
   360         iOmaProvBufPtr = new( ELeave ) TPtr8( iOmaProvBuf->Des() );
       
   361         }
       
   362     }
       
   363 
       
   364 // -----------------------------------------------------------------------------
       
   365 // CWimOMAProv::DeallocMemoryFromOmaProvStruct()
       
   366 // Deallocates memory from member variables
       
   367 // -----------------------------------------------------------------------------
       
   368 void CWimOMAProv::DeallocMemoryFromOmaProvStruct()
       
   369     {
       
   370     _WIMTRACE ( _L( "CWimOMAProv::DeallocMemoryFromOmaProvStruct" ) );
       
   371     delete iOmaProvBuf;
       
   372     delete iOmaProvBufPtr;
       
   373     iOmaProvBuf = NULL;
       
   374     iOmaProvBufPtr = NULL;
       
   375     }
       
   376 
       
   377 // -----------------------------------------------------------------------------
       
   378 // CWimOMAProv::DoCancel()
       
   379 // Deallocates member variables and completes client status with
       
   380 // KErrCancel error code.
       
   381 // -----------------------------------------------------------------------------
       
   382 //
       
   383 void CWimOMAProv::DoCancel()
       
   384     {
       
   385     _WIMTRACE ( _L( "CWimOMAProv::DoCancel" ) );
       
   386     if ( iConnectionHandle && 
       
   387          ( iPhase == EGetSizeDone || iPhase == ERetrieveDone ) )
       
   388         {
       
   389         iConnectionHandle->DeallocOmaDataPckgBuf();
       
   390         }
       
   391     DeallocMemoryFromOmaProvStruct();
       
   392     User::RequestComplete( iClientStatus, KErrCancel );
       
   393     }
       
   394 
       
   395 // -----------------------------------------------------------------------------
       
   396 // CWimOMAProv::RunError()
       
   397 // The active scheduler calls this function if this active object's RunL() 
       
   398 // function leaves. This gives this active object the opportunity to perform 
       
   399 // any necessary cleanup.
       
   400 // After cleanup, complete request with received error code.
       
   401 // -----------------------------------------------------------------------------
       
   402 //
       
   403 TInt CWimOMAProv::RunError( TInt aError )
       
   404     {
       
   405     _WIMTRACE ( _L( "CWimOMAProv::RunError Error = %d" ) );
       
   406     if ( iConnectionHandle && 
       
   407          ( iPhase == EGetSizeDone || iPhase == ERetrieveDone ) )
       
   408         {
       
   409         iConnectionHandle->DeallocOmaDataPckgBuf();
       
   410         }
       
   411     DeallocMemoryFromOmaProvStruct();
       
   412     User::RequestComplete( iClientStatus, aError );
       
   413     return KErrNone;
       
   414     }
       
   415 
       
   416 // -----------------------------------------------------------------------------
       
   417 // CWimOMAProv::SignalOwnStatusAndComplete()       
       
   418 // Sets own iStatus to KRequestPending, and signals it 
       
   419 // with User::RequestComplete() -request. This gives chance 
       
   420 // active scheduler to run other active objects. After a quick
       
   421 // visit in actives cheduler, signal returns to RunL() and starts next
       
   422 // phase of operation. 
       
   423 // -----------------------------------------------------------------------------
       
   424 //
       
   425 void CWimOMAProv::SignalOwnStatusAndComplete()
       
   426     {
       
   427     _WIMTRACE ( _L( "CWimOMAProv::SignalOwnStatusAndComplete" ) );
       
   428     iStatus = KRequestPending;
       
   429     SetActive();
       
   430     TRequestStatus* status = &iStatus;
       
   431     User::RequestComplete( status, KErrNone );
       
   432     }
       
   433 
       
   434 // End of File
       
   435 
       
   436 
       
   437 
       
   438 
       
   439 
       
   440 
       
   441 
       
   442 
       
   443 
       
   444 
       
   445 
       
   446 
       
   447 
       
   448 
       
   449 
       
   450 
       
   451 
       
   452 
       
   453