ncdengine/provider/server/inc/ncdpurchaseoperationimpl.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdpurchaseoperationimpl.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,371 @@
+/*
+* Copyright (c) 2006-2008 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
+*
+*/
+
+
+#ifndef C_NCDPURCHASEOPERATIONIMPL_H
+#define C_NCDPURCHASEOPERATIONIMPL_H
+
+#include <e32base.h>
+
+#include "ncdbaseoperation.h"
+#include "ncdparserobserver.h"
+#include "catalogshttpobserver.h"
+#include "catalogssmsobserver.h"
+
+class MNcdParser;
+class MNcdProtocol;
+class CNcdNodeManager;
+class CNcdPurchaseHistoryDb;
+class MCatalogsSmsSession;
+class CNcdNode;
+class CNcdPreminetProtocolPurchaseInformationImpl;
+class CNcdPreminetProtocolPurchaseProcessedImpl;
+class MCatalogsAccessPointManager;
+
+class CNcdPurchaseOptionImpl;
+
+class MNcdPreminetProtocolPayment;
+class MNcdOperationRemoveHandler;
+
+class CNcdSubscriptionManager;
+class CNcdDelay;
+class MNcdConfigurationProtocolQuery;
+class CNcdNodeIdentifier;
+class CNcdDownloadInfo;
+class CNcdPurchaseDetails;
+class CNcdNodeMetaData;
+class CNcdKeyValuePair;
+
+
+/**
+ *  Purchase operation implementation.
+ *
+ *  @lib ?library
+ *  @since S60 ?S60_version *** for example, S60 v3.0
+ */
+class CNcdPurchaseOperationImpl : public CNcdBaseOperation,
+                                  public MNcdParserObserver,
+                                  public MNcdParserPurchaseObserver,
+                                  public MCatalogsHttpObserver,
+                                  public MCatalogsSmsObserver
+    {
+    
+public:
+
+    /**
+     *  Sub states of purchase operation 
+     */
+    enum TPurchaseOperationState
+        {
+        EBegin,
+        EPurchaseRequestSent,
+        EPurchaseInformationReceived,
+        EPurchaseRequestResent,
+        EDisclaimerQueried,
+        EPaymentMethodsQueried,
+        EPaymentInformationQueried,
+        EPaymentProcessed,
+        EPurchaseConfirmationSent,
+        EDownloadDetailsReceived,
+        EPurchaseComplete,
+        EFailed
+        };
+
+    enum TPurchaseRequestType
+        {
+        EPurchaseRequest,
+        EPurchaseConfirmation
+        };
+        
+
+    static CNcdPurchaseOperationImpl* NewL( 
+        const TDesC& aNameSpace,
+        const TDesC& aNodeId,
+        const TUid& aClientUid,
+        const TDesC& aPurchaseOptionId,
+        CNcdGeneralManager& aGeneralManager,        
+        MCatalogsHttpSession& aHttpSession, 
+        MCatalogsSmsSession& aSmsSession, 
+        CNcdSubscriptionManager& aSubscriptionManager,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MCatalogsSession& aSession );
+
+    static CNcdPurchaseOperationImpl* NewLC( 
+        const TDesC& aNameSpace,
+        const TDesC& aNodeId,
+        const TUid& aClientUid,
+        const TDesC& aPurchaseOptionId,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MCatalogsSmsSession& aSmsSession,
+        CNcdSubscriptionManager& aSubscriptionManager,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MCatalogsSession& aSession );
+        
+    virtual ~CNcdPurchaseOperationImpl();
+    
+public: // New functions
+
+    /**
+     * Call back function used in resend after case.
+     *
+     * @param aOperation The operation called in the function.
+     */
+    static TInt ResendAfterCallBack( TAny* aOperation );
+
+    /**
+     * Returns the identifier of the node that this operation relates to.
+     *
+     * @return Node identifier.
+     */
+    const CNcdNodeIdentifier& NodeIdentifier() const;
+    
+    
+public: // from base class CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::Cancel
+     */
+    virtual void Cancel();
+
+    /**
+     * @see CNcdBaseOperation::QueryCompletedL
+     */
+    virtual TBool QueryCompletedL( CNcdQuery* aQuery );
+
+public: // from base class MCatalogsHttpObserver
+
+    /**     
+     * @see MCatalogsHttpObserver::HandleHttpEventL
+     */
+
+    virtual void HandleHttpEventL( 
+        MCatalogsHttpOperation& aOperation, 
+        TCatalogsHttpEvent aEvent );
+
+    /**
+     * @see MCatalogsHttpObserver::HandleHttpError()
+     */
+    virtual TBool HandleHttpError(
+        MCatalogsHttpOperation& aOperation,
+        TCatalogsHttpError aError );
+        
+public: // from base class MCatalogsSmsObserver
+
+	/**
+	 * @see MCatalogsSmsObserver::HandleSmsEvent()
+	 */
+	virtual TInt HandleSmsEvent( 
+	    MCatalogsSmsOperation& aOperation, 
+	    TCatalogsSmsEvent aEvent );
+
+public: // from MNcdParserQueryObserver
+
+    /**
+     * @see MNcdParserQueryObserver
+     */
+    virtual void QueryL( MNcdConfigurationProtocolQuery* aData );
+
+
+
+public: // from base class MNcdParserObserver
+
+    /**
+     * @see MNcdParserObserver
+     */
+    virtual void ParseError( TInt aErrorCode );
+
+    /**
+     * @see MNcdParserObserver
+     */
+    virtual void ParseCompleteL( TInt aError );
+
+public: // from base class MNcdParserPurchaseObserver
+
+    /**
+     * @see MNcdParserPurchaseObserver::InformationL
+     */
+    virtual void InformationL( MNcdPreminetProtocolPurchaseInformation* aData );
+
+    /**
+     * @see MNcdParserPurchaseObserver::ProcessedL
+     */
+    virtual void ProcessedL( MNcdPreminetProtocolPurchaseProcessed* aData );
+    
+public: // from base class MNcdParserInformationObserver
+
+    virtual void InformationL( 
+        MNcdPreminetProtocolInformation* aData );
+        
+public: // from base class MNcdParserErrorObserver
+
+    virtual void ErrorL( MNcdPreminetProtocolError* aData );
+        
+
+        
+protected:
+
+    CNcdPurchaseOperationImpl(
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aHttpSession,
+        MCatalogsSmsSession& aSmsSession,
+        CNcdSubscriptionManager& aSubscriptionManager,
+        MNcdOperationRemoveHandler* aRemoveHandler,
+        MCatalogsSession& aSession );
+        
+    
+    void ConstructL( 
+        const TDesC& aNameSpace, 
+        const TDesC& aNodeId,
+        const TUid& aClientUid,
+        const TDesC& aPurchaseOptionId );
+        
+
+public: // from base class CNcdBaseOperation
+
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual TInt RunOperation();
+    
+    void DoRunOperationL();
+    
+    /**
+     * @see CNcdBaseOperation::RunOperation
+     */
+    virtual void ChangeToPreviousStateL();
+
+
+private:
+
+    HBufC8* CreatePurchaseRequestLC( TPurchaseRequestType aType, 
+                                    const TDesC& aServerUri );
+
+    void SendRequestL( const TDesC& aServerUri, const TDesC8& aData );
+
+    void ProcessSmsPaymentL();
+
+    void UpdatePurchaseHistoryL();
+    
+    // Copies relevant info from CNcdNodeContentInfo to given purchase details
+    void SetContentInfoToPurchaseDetailsL( 
+        CNcdPurchaseDetails& aDetails, 
+        const CNcdNodeMetaData& aMetadata ) const;
+
+    void HandleDependenciesL( CNcdPurchaseDetails& aDetails );   
+    
+    void AddDownloadInfosToDetailsL( CNcdPurchaseDetails& aDetails,
+        const RPointerArray<CNcdDownloadInfo>& aInfos );
+        
+    TInt RemovePendingSmsOp( const TCatalogsTransportOperationId& aId );
+
+    TInt StartResendAfterTimer();
+    
+private: // data
+    
+    /**
+     * A sub-state of this operation's execution.
+     */
+    TPurchaseOperationState iPurchaseOperationState;
+    
+    /**
+     * Reference to the access point manager.
+     * Not owned by the purchase operation.
+     */
+    MCatalogsAccessPointManager& iAccessPointManager;
+    
+    /**
+     * Not own.
+     */
+    CNcdPurchaseHistoryDb* iPurchaseHistory;
+
+    /**
+     * Http session for sending requests and receiving responses.
+     * Not owned by the purchase operation.
+     */
+    MCatalogsHttpSession& iHttpSession;
+    
+    /**
+     * Sms session for sending requests and receiving responses.
+     * Not owned by the purchase operation.
+     */
+    MCatalogsSmsSession* iSmsSession;
+    
+    /**
+     * Protocol.
+     * Not owned by the purchase operation.
+     */
+    MNcdProtocol& iProtocol;    
+    
+    /**
+     * Http operation for current transaction.
+     * Not owned by the purchase operation.
+     */
+    MCatalogsHttpOperation* iHttpTransaction;
+
+    /**
+     * Subscription manager.
+     * Not owned by the purchase operation.
+     */
+    CNcdSubscriptionManager& iSubscriptionManager;
+
+
+    CNcdPurchaseOptionImpl* iSelectedPurchaseOption;
+    const MNcdPreminetProtocolPayment* iSelectedPaymentMethod;
+    
+   
+    /**
+     * 
+     * Not own.
+     */
+    CNcdNode* iNode;
+    
+    /**
+     * Node identifier of the node to purchase.
+     */
+    CNcdNodeIdentifier* iNodeIdentifier;
+    
+    /**
+     * Purchase option id. Used in subscription renew.
+     */
+    HBufC* iPurchaseOptionId;
+
+
+    MNcdPreminetProtocolPurchaseInformation* iPurchaseInformationData;
+    MNcdPreminetProtocolPurchaseProcessed* iPurchaseProcessedData;
+
+	RPointerArray<MCatalogsSmsOperation> iPendingSmsOperations;
+
+    /**
+     * Purchase query.
+     */
+    CNcdQuery* iPurchaseQuery;
+    
+    TBool iLocked;
+        
+    CNcdDelay* iDelay;
+
+    // Key() is address and Value() is message
+    CNcdKeyValuePair* iSmsRegistrationRequest;
+    
+    HBufC* iRedirectUri;
+    
+    // Time after which the purchase request is resent
+    TInt iResendAfter;
+    };
+
+#endif // C_NCDPURCHASEOPERATIONIMPL_H