diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdpurchaseoperationproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/client/src/ncdpurchaseoperationproxy.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,350 @@ +/* +* Copyright (c) 2006 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: ?Description +* +*/ + + +#include +#include + +#include "ncdpurchaseoperationproxy.h" +#include "ncdpurchaseoperationobserver.h" +#include "ncdoperationfunctionids.h" +#include "catalogsdebug.h" +#include "catalogsclientserver.h" +#include "ncdpurchaseoptionproxy.h" +#include "ncdoperationproxyremovehandler.h" +#include "catalogsconstants.h" +#include "catalogsutils.h" +#include "ncdqueryimpl.h" +#include "ncdqueryselectionitemimpl.h" +#include "ncdsubscriptionmanagerproxy.h" +#include "ncdnodeproxy.h" +#include "ncdnodemanagerproxy.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdPurchaseOperationProxy* CNcdPurchaseOperationProxy::NewL( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdPurchaseOptionProxy* aSelectedPurchaseOption, + MNcdPurchaseOperationObserver* aObserver, + CNcdSubscriptionManagerProxy* aSubscriptionManager, + CNcdNodeManagerProxy* aNodeManager, + MNcdClientLocalizer* aLocalizer ) + { + CNcdPurchaseOperationProxy* self = CNcdPurchaseOperationProxy::NewLC( + aSession, + aHandle, + aRemoveHandler, + aNode, + aSelectedPurchaseOption, + aObserver, + aSubscriptionManager, + aNodeManager, + aLocalizer ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdPurchaseOperationProxy* CNcdPurchaseOperationProxy::NewLC( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdPurchaseOptionProxy* aSelectedPurchaseOption, + MNcdPurchaseOperationObserver* aObserver, + CNcdSubscriptionManagerProxy* aSubscriptionManager, + CNcdNodeManagerProxy* aNodeManager, + MNcdClientLocalizer* aLocalizer ) + { + CNcdPurchaseOperationProxy* self = + new( ELeave ) CNcdPurchaseOperationProxy( aLocalizer ); + + self->AddRef(); + CleanupReleasePushL( *self ); + self->ConstructL( + aSession, + aHandle, + aRemoveHandler, + aNode, + aSelectedPurchaseOption, + aObserver, + aSubscriptionManager, + aNodeManager ); + + return self; + } + + + +// --------------------------------------------------------------------------- +// From MNcdPurchaseOperation +// --------------------------------------------------------------------------- +// +const MNcdPurchaseOption& CNcdPurchaseOperationProxy::PurchaseOption() + { + DASSERT( iPurchaseOption ); + return *iPurchaseOption; + } + + + +// --------------------------------------------------------------------------- +// From MNcdOperation +// ?implementation_description +// --------------------------------------------------------------------------- +// +TNcdInterfaceId CNcdPurchaseOperationProxy::OperationType() const + { + return static_cast(MNcdPurchaseOperation::KInterfaceUid); + } + + + + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdPurchaseOperationProxy::CNcdPurchaseOperationProxy( + MNcdClientLocalizer* aLocalizer ) : + CNcdOperation< MNcdPurchaseOperation >( aLocalizer ) + { + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdPurchaseOperationProxy::~CNcdPurchaseOperationProxy() + { + DLTRACEIN( ( "" ) ); + + if ( iPurchaseOption != NULL ) + { + iPurchaseOption->InternalRelease(); + } + + DASSERT( iRemoveHandler ); + if ( iRemoveHandler ) + { + DLTRACE(("Removing proxy from remove handler")); + iRemoveHandler->RemoveOperationProxy( *this ); + } + DLTRACEOUT( ( "" ) ); + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +void CNcdPurchaseOperationProxy::ConstructL( MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdPurchaseOptionProxy* aSelectedPurchaseOption, + MNcdPurchaseOperationObserver* aObserver, + CNcdSubscriptionManagerProxy* aSubscriptionManager, + CNcdNodeManagerProxy* aNodeManager ) + { + DLTRACEIN( ( "" ) ); + CNcdBaseOperationProxy::ConstructL( aSession, + aHandle, + aRemoveHandler, + aNode, + aNodeManager ); + + iObserver = aObserver; + iSubscriptionManager = aSubscriptionManager; + + // We increment the reference count of the used purchaseoption + // to ensure that it exists as long as the operation. + iPurchaseOption = aSelectedPurchaseOption; + if ( iPurchaseOption != NULL ) + { + iPurchaseOption->InternalAddRef(); + } + + + // Initialize the operation +// InitializeOperationL(); + DLTRACEOUT( ( "" ) ); + } + + + +// --------------------------------------------------------------------------- +// HandleCompletedMessage +// --------------------------------------------------------------------------- +// + +void CNcdPurchaseOperationProxy::HandleCompletedMessage( + TNcdOperationMessageCompletionId aCompletionId, + RReadStream& aReadStream, + TInt aDataLength ) + { + DLTRACEIN((_L("aCompletionId =%d, aDataLength =%d"), aCompletionId, + aDataLength)); + switch ( aCompletionId ) + { + case ENCDOperationMessageCompletionProgress: + { + TRAPD( err, SendContinueMessageL() ); + if ( err != KErrNone ) + { + CompleteCallback( err ); + } + break; + } + case ENCDOperationMessageCompletionComplete: + { + DLTRACE( ( "ENCDOperationMessageCompletionComplete" ) ); + // Should get errorcode from the received message + CompleteCallback( KErrNone ); + break; + } + + default: + { + // Call base class + CNcdBaseOperationProxy::HandleCompletedMessage( aCompletionId, + aReadStream, + aDataLength ); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// Handle progress callback +// --------------------------------------------------------------------------- +// +void CNcdPurchaseOperationProxy::ProgressCallback() + { + DLTRACEIN( ( "" ) ); + DASSERT( 0 ); + DLTRACEOUT( ( "" ) ); + } + + +// --------------------------------------------------------------------------- +// Handle query received callback +// --------------------------------------------------------------------------- +// +void CNcdPurchaseOperationProxy::QueryReceivedCallback( CNcdQuery* aQuery ) + { + DLTRACEIN(("")); + aQuery->AddRef(); + + // Following special case concerns only one query received during + // the purchase process. + // The query is received in the first phase of purchase process. + // It is not received from the server but it is constructed on + // the server side when the information response is received + // from the server. The information response contains + // updated price for the purchase. The updated price is set + // on the server side into the used purchase option. This is + // why the purchase option has to be reinternalized. + if ( aQuery->Id() == KQueryIdPaymentMethod() ) + { + // If this fails, then possibly updated price + // cannot be shown to user and purchase process should + // not be continued + TRAPD( priceError, iPurchaseOption->InternalizeL() ); + if ( priceError ) + { + // This error handling is copied and altered from the base + // operation's DoCancelOperation because call for + // DoCancelOperation would complete the operation with + // KErrCancel + + + DLTRACE(("Price update failed. Canceling operation.")); + Cancel(); + + // Send cancel message to server-side + TInt tmpNum( 0 ); + ClientServerSession(). + SendSync( ENCDOperationFunctionCancel, + KNullDesC8(), + tmpNum, + Handle() ); + SetState( MNcdOperation::EStateCancelled ); + + DLTRACE(( "Calling complete callback with error: %d", + priceError )); + CompleteCallback( priceError ); + return; + } + } + + iObserver->QueryReceived( *this, aQuery ); + DLTRACEOUT(("")); + } + + +// --------------------------------------------------------------------------- +// Handle operation complete +// --------------------------------------------------------------------------- +// +void CNcdPurchaseOperationProxy::CompleteCallback( TInt aError ) + { + DLTRACEIN( ( "Error: %d", aError ) ); + TInt error = aError; + + AddRef(); + + DASSERT( iPurchaseOption ); + MNcdPurchaseOption::TType purchaseOptionType = + iPurchaseOption->PurchaseOptionType(); + + DLINFO(("Update purchase history")); + TRAP_IGNORE( UpdateOperationInfoToPurchaseHistoryL( aError ) ); + + // Subscription manager on server side handles the informing + // of all relevant proxies so no internalization for + // subscription manager proxy here is needed. + + // Actually node internalization is probably not needed + // in case we buy subscription, or subscription upgrade. + // Then again, a updated price can be received in the + // purchase operation. Should because of this internalize + // be done always to update purchase options? Or can the + // prices change? + + TRAPD( err, + NodeManager()->InternalizeRelatedNodesL( *NodeProxy() ) ); + if ( err != KErrNone ) + { + error = err; + } + + iObserver->OperationComplete( *this, error ); + Release(); + DLTRACEOUT( ( "" ) ); + }