PECengine/PresenceManager2/SrcCommon/CPEngAsyncOperation.cpp
changeset 0 094583676ce7
equal deleted inserted replaced
-1:000000000000 0:094583676ce7
       
     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:  Asynchronous operation base class.
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include "CPEngAsyncOperation.h"
       
    20 #include "CPEngNWSessionSlotStorageProxy.h"
       
    21 #include "CPEngSessionSlotId.h"
       
    22 #include "MPEngAsyncOperationOwner.h"
       
    23 #include "CPEngTransactionStatus.h"
       
    24 
       
    25 
       
    26 
       
    27 //LOCAL constants
       
    28 namespace
       
    29     {
       
    30     //Panic
       
    31     _LIT( KPEngAsyncOpPanic, "PEngAsyncOp" );
       
    32 
       
    33     //Panic reasons
       
    34     enum TPEngAsyncOpPanicReasons
       
    35         {
       
    36         EEngAsyncOpHasAlreadyOwner,
       
    37         EEngAsyncOpAlreadyInUse
       
    38         };
       
    39 
       
    40     void PEngAsyncOpPanic( TPEngAsyncOpPanicReasons aPanicReason )
       
    41         {
       
    42         User::Panic( KPEngAsyncOpPanic, aPanicReason );
       
    43         }
       
    44     }
       
    45 
       
    46 
       
    47 
       
    48 // ================= MEMBER FUNCTIONS =======================
       
    49 // -----------------------------------------------------------------------------
       
    50 // CPEngAsyncOperation::CPEngAsyncOperation
       
    51 // -----------------------------------------------------------------------------
       
    52 CPEngAsyncOperation::CPEngAsyncOperation( TInt aPriority,
       
    53                                           RPEngManagerClient& aServer )
       
    54         : CActive( aPriority ),
       
    55         iCancelling( EFalse ),
       
    56         iTransactionServer( aServer )
       
    57     {
       
    58     CActiveScheduler::Add( this );
       
    59     }
       
    60 
       
    61 
       
    62 
       
    63 // -----------------------------------------------------------------------------
       
    64 // CPEngAsyncOperation::~CPEngAsyncOperation()
       
    65 // -----------------------------------------------------------------------------
       
    66 CPEngAsyncOperation::~CPEngAsyncOperation()
       
    67     {
       
    68     if ( iOperationOwner )
       
    69         {
       
    70         iOperationOwner->HandleAsyncOperationDestruction( this );
       
    71         }
       
    72 
       
    73     delete iTransactionStatus;
       
    74     delete iTransactionData;
       
    75 
       
    76     iTransactionClient.Close();
       
    77     }
       
    78 
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CPEngAsyncOperation::BaseConstructL()
       
    82 // -----------------------------------------------------------------------------
       
    83 void CPEngAsyncOperation::BaseConstructL(
       
    84     CPEngNWSessionSlotStorageProxy& aUsedSlot )
       
    85     {
       
    86     iTransactionStatus = CPEngTransactionStatus::NewL();
       
    87     HBufC8* sessSlotIdPkg = aUsedSlot.BaseId().PackLC();
       
    88     User::LeaveIfError( iTransactionClient.Connect( *sessSlotIdPkg,
       
    89                                                     aUsedSlot.AppId(),
       
    90                                                     iTransactionServer ) );
       
    91 
       
    92     CleanupStack::PopAndDestroy( sessSlotIdPkg );
       
    93     }
       
    94 
       
    95 
       
    96 
       
    97 // -----------------------------------------------------------------------------
       
    98 // CPEngAsyncOperation::SetOwner()
       
    99 // -----------------------------------------------------------------------------
       
   100 void CPEngAsyncOperation::SetOwner( MPEngAsyncOperationOwner& aOperationOwner )
       
   101     {
       
   102     __ASSERT_ALWAYS( !iOperationOwner,
       
   103                      PEngAsyncOpPanic( EEngAsyncOpHasAlreadyOwner ) );
       
   104 
       
   105     iOperationOwner = &aOperationOwner;
       
   106     }
       
   107 
       
   108 
       
   109 
       
   110 // -----------------------------------------------------------------------------
       
   111 // CPEngAsyncOperation::CancelOpD()
       
   112 // -----------------------------------------------------------------------------
       
   113 //
       
   114 void CPEngAsyncOperation::CancelOpD()
       
   115     {
       
   116     if ( iCancelling )
       
   117         {
       
   118         //Cancel already running...
       
   119         //==>This call is coming from observer callback which
       
   120         //was called from DoCancel(). Break the nesting here
       
   121         return;
       
   122         }
       
   123 
       
   124     iCancelling = ETrue;
       
   125     CActive::Cancel();
       
   126     iCancelling = EFalse;
       
   127 
       
   128     delete this;
       
   129     }
       
   130 
       
   131 
       
   132 
       
   133 // -----------------------------------------------------------------------------
       
   134 // CPEngAsyncOperation::InitTransaction()
       
   135 // -----------------------------------------------------------------------------
       
   136 //
       
   137 void CPEngAsyncOperation::InitTransaction( HBufC16* aTransactionData,
       
   138                                            TInt aTransactionOperation )
       
   139     {
       
   140     delete iTransactionData;
       
   141     iTransactionData = aTransactionData;
       
   142     iTransactionOperation = aTransactionOperation;
       
   143     }
       
   144 
       
   145 
       
   146 
       
   147 // -----------------------------------------------------------------------------
       
   148 // CPEngAsyncOperation::IssueTransaction()
       
   149 // -----------------------------------------------------------------------------
       
   150 //
       
   151 void CPEngAsyncOperation::IssueTransaction()
       
   152     {
       
   153     __ASSERT_ALWAYS( !IsActive(),
       
   154                      PEngAsyncOpPanic( EEngAsyncOpAlreadyInUse ) );
       
   155 
       
   156     TInt err = KErrNone;
       
   157     if ( iTransactionData )
       
   158         {
       
   159         err = iTransactionClient.UpdateData( iTransactionOperation,
       
   160                                              *iTransactionData,
       
   161                                              iStatus );
       
   162         }
       
   163     else
       
   164         {
       
   165         err = iTransactionClient.UpdateData( iTransactionOperation,
       
   166                                              KNullDesC,
       
   167                                              iStatus );
       
   168         }
       
   169 
       
   170 
       
   171     if ( err == KErrNone )
       
   172         {
       
   173         SetActive();
       
   174         }
       
   175 
       
   176     else
       
   177         {
       
   178         iStatus = KRequestPending;
       
   179         TRequestStatus *pS = &iStatus;
       
   180         User::RequestComplete( pS, err );
       
   181         SetActive();
       
   182         }
       
   183     }
       
   184 
       
   185 
       
   186 
       
   187 
       
   188 // -----------------------------------------------------------------------------
       
   189 // CPEngAsyncOperation::DoCancel()
       
   190 // -----------------------------------------------------------------------------
       
   191 void CPEngAsyncOperation::DoCancel()
       
   192     {
       
   193     iTransactionClient.CancelUpdateData();
       
   194 
       
   195     iTransactionStatus->Reset();
       
   196     iTransactionStatus->SetStatus( KErrCancel );
       
   197 
       
   198     DoHandleOpFailure( *iTransactionStatus,
       
   199                        iTransactionOperation );
       
   200 
       
   201     DoNotifyObserver( *iTransactionStatus,
       
   202                       iTransactionOperation );
       
   203     }
       
   204 
       
   205 
       
   206 
       
   207 
       
   208 // -----------------------------------------------------------------------------
       
   209 // CPEngAsyncOperation::RunL()
       
   210 // -----------------------------------------------------------------------------
       
   211 void CPEngAsyncOperation::RunL()
       
   212     {
       
   213     if ( iStatus.Int() < KErrNone )
       
   214         {
       
   215         //Operation failed somehow
       
   216         User::Leave( iStatus.Int() );
       
   217         }
       
   218 
       
   219     if ( iStatus.Int() == KErrNone )
       
   220         {
       
   221         //operation succesfull but no extra data available
       
   222         iTransactionStatus->Reset();
       
   223         iTransactionStatus->SetStatus( KErrNone );
       
   224         }
       
   225 
       
   226     else
       
   227         {
       
   228         //Fetch & decode operation results
       
   229         HBufC8* resultPkg = HBufC8::NewLC( iStatus.Int() );
       
   230         TPtr8 resultPkgPtr = resultPkg->Des();
       
   231         User::LeaveIfError( iTransactionClient.FetchLastRequestResult( resultPkgPtr ) );
       
   232 
       
   233         iTransactionStatus->Reset();
       
   234         iTransactionStatus->UnpackResultsL( *resultPkg );
       
   235         CleanupStack::PopAndDestroy(); // resultPkg
       
   236         }
       
   237 
       
   238     //Let derived class handle operation success
       
   239     //-> try to decode data from transaction status
       
   240     DoHandleOpSuccessL( *iTransactionStatus, iTransactionOperation );
       
   241 
       
   242 
       
   243     //And let derived class notify observer about operation completion
       
   244     TPEngAsyncOpResult opStatus = DoNotifyObserver( *iTransactionStatus,
       
   245                                                     iTransactionOperation );
       
   246 
       
   247     //Is transaction completed or should we wait for new round
       
   248     if ( opStatus == EPEngAsyncOpCompleted )
       
   249         {
       
   250         delete this;
       
   251         }
       
   252     else
       
   253         {
       
   254         iTransactionStatus->Reset();
       
   255         }
       
   256     }
       
   257 
       
   258 
       
   259 // -----------------------------------------------------------------------------
       
   260 // CPEngAsyncOperation::RunError()
       
   261 // -----------------------------------------------------------------------------
       
   262 TInt CPEngAsyncOperation::RunError( TInt aError )
       
   263     {
       
   264     iTransactionStatus->Reset();
       
   265     iTransactionStatus->SetStatus( aError );
       
   266 
       
   267     DoHandleOpFailure( *iTransactionStatus,
       
   268                        iTransactionOperation );
       
   269 
       
   270 
       
   271     TPEngAsyncOpResult opStatus = DoNotifyObserver( *iTransactionStatus,
       
   272                                                     iTransactionOperation );
       
   273 
       
   274     if ( opStatus == EPEngAsyncOpCompleted )
       
   275         {
       
   276         delete this;
       
   277         }
       
   278 
       
   279     return KErrNone;
       
   280     }
       
   281 
       
   282 
       
   283 // End of file