ncdengine/provider/server/inc/ncdreportmanager.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdreportmanager.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,399 @@
+/*
+* Copyright (c) 2007-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:  
+*
+*/
+
+
+#ifndef C_NCDREPORTMANAGER_H
+#define C_NCDREPORTMANAGER_H
+
+#include <e32base.h>
+
+#include "ncdreportstatusinfo.h"
+#include "ncddownloadreportobserver.h"
+#include "ncdinstallreportobserver.h"
+#include "catalogsaccesspointobserver.h"
+#include "catalogshttpobserver.h"
+#include "catalogshttptypes.h"
+#include "ncdstoragedataitem.h"
+#include "ncdserverreportmanager.h"
+
+
+class MCatalogsContext;
+class CCatalogsNetworkManager;
+class CNcdNodeIdentifier;
+class CNcdReport;
+class MNcdStorageManager;
+class MNcdProtocol;
+class MCatalogsHttpSession;
+class MNcdConfigurationManager;
+class MNcdDatabaseStorage;
+class MNcdStorageItem;
+class MNcdOperationObserver;
+class CNcdGeneralManager;
+
+/**
+ * Report manager
+ *
+ * Sends download reports and OMA notifications
+ */
+class CNcdReportManager : 
+    public CActive,
+    public MNcdDownloadReportObserver,
+    public MNcdInstallReportObserver,
+    public MCatalogsAccessPointObserver,
+    public MCatalogsHttpObserver,
+    public MNcdStorageDataItem
+    {
+public:
+
+    static void ReportIdToDescriptor( 
+        const TNcdReportId& aId,
+        TDes& aTarget );
+
+public:
+    static CNcdReportManager* NewL(      
+        const MCatalogsContext& aContext,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aSession,
+        TBool aClientCrashed );
+        
+    virtual ~CNcdReportManager();
+
+
+public: // For managing the report sending
+
+    /**
+     * Setter for the reporting method.
+     *
+     * @param aMethod The reporting method that is used when reports are
+     * managed.
+     *
+     *
+     */
+    void SetReportingMethod( const MNcdServerReportManager::TReportingMethod& aMethod );
+
+
+    /**
+     * Getter for the reporting method.
+     *
+     * @param TReportingMethod The reporting method that is used 
+     * when reports are managed.
+     *
+     *
+     */
+    const MNcdServerReportManager::TReportingMethod& ReportingMethod() const;
+
+
+    /**
+     * Setter for the reporting style.
+     *
+     * @param aMethod The style that is used for reports.
+     *
+     *
+     */
+    void SetReportingStyle( const MNcdServerReportManager::TReportingStyle& aStyle );
+
+
+    /**
+     * Getter for the reporting style.
+     *
+     * @param TReportingMethod The style that is used for reports.
+     *
+     *
+     */
+    const MNcdServerReportManager::TReportingStyle& ReportingStyle() const;
+
+
+    /**
+     * Starts the server report sending operation.
+     *
+     * @note The reference count of the operation object is increased by one. So, Release()
+     * function of the operation should be called when operation is not needed anymore.
+     *
+     * @note The sending process is asynchronous. When sending has completed,
+     * the observer callback functions are called.
+     *
+     * @note After sending is finished the collected reports will be automatically
+     * removed.
+     *
+     * @note This function has an effect only if the reporting method is set to
+     * EReportingManaged. If reporting is done in the background, then reports 
+     * are sent automatically, and NULL is returned for the operation.
+     *
+     * @param aObserver Operation observer.
+     * @exception Leave System wide error code
+     *
+     *
+     */
+    void StartSendReportsL( MNcdOperationObserver& aObserver );
+
+
+
+public: // MNcdDownloadReportObserver
+
+    virtual TNcdReportId RegisterDownloadL(
+        const TDesC& aUri,
+        const CNcdNodeIdentifier& aMetadataId,
+    	const TNcdReportStatusInfo& aStatus, 
+    	const TDesC& aReportUri,
+    	const TDesC& aReportNamespace );
+        
+    
+    virtual TNcdReportId RegisterOmaDownloadL(
+        const TDesC& aUri,
+        const CNcdNodeIdentifier& aMetadataId,
+        const TNcdReportStatusInfo& aStatus,
+        const TDesC& aReportUri );    
+
+    virtual TInt SetDownloadReportAccessPoint( 
+        const TNcdReportId& aReportId,
+        const TCatalogsConnectionMethod& aAccessPoint );
+
+
+
+    virtual void ReportDownloadStatusL( 
+        const TNcdReportId& aReportId,
+        const TNcdReportStatusInfo& aStatus,
+        TBool aSendable );
+
+
+public: // MNcdInstallReportObserver
+
+    virtual TNcdReportId RegisterInstallL(
+        const TDesC& aContentIdentifier,
+        const CNcdNodeIdentifier& aMetadataId,
+    	const TNcdReportStatusInfo& aStatus, 
+    	const TDesC& aReportUri,
+    	const TDesC& aReportNamespace );
+        
+    virtual TInt SetInstallReportAccessPoint( 
+        const TNcdReportId& aReportId,
+        const TCatalogsConnectionMethod& aAccessPoint );
+
+    virtual void ReportInstallStatusL( 
+        const TNcdReportId& aReportId,
+        const TNcdReportStatusInfo& aStatus );
+    
+public:
+
+    /**
+     * Sets all reports that are related to given metadata as used
+     */
+    void SetReportsAsUsedL( const CNcdNodeIdentifier& aMetadataId );
+    
+    /**
+     * Removes unused reports after sending them with "user cancelled" code
+     */
+    void RemoveUnusedReportsL();
+
+
+public: // For storage handling during cache cleanup
+
+    void OpenStorageL();
+    void CloseStorage();
+    
+    
+    void LoadReportsL();
+
+    void SaveReportL( CNcdReport& aReport );
+    void RemoveReportL( const TNcdReportId& aId  );
+    
+    MNcdStorageItem& StorageItemForReportL( 
+        const TNcdReportId& aId );
+    
+        
+public: // MCatalogsAccessPointObserver
+
+    virtual void HandleAccessPointEventL( 
+        const TCatalogsConnectionMethod& aAp,
+        const TCatalogsAccessPointEvent& aEvent );
+
+public: // MCatalogsHttpObserver
+
+    virtual void HandleHttpEventL( 
+        MCatalogsHttpOperation& aOperation, 
+        TCatalogsHttpEvent aEvent );
+        
+    /**
+     * Handles HTTP errors
+     */
+    virtual TBool HandleHttpError(
+        MCatalogsHttpOperation& aOperation,
+        TCatalogsHttpError aError );
+
+
+public:
+
+    const MCatalogsContext& Context() const;
+    
+    void CancelReportSending();
+
+
+    TCatalogsConnectionMethod DefaultConnectionMethod();
+
+    CNcdGeneralManager& GeneralManager() const;
+    
+public: // MNcdStorageDataItem
+
+    /**
+     * @see MNcdStorageDataItem::ExternalizeL
+     */
+    virtual void ExternalizeL( RWriteStream& aStream );
+
+
+    /**
+     * @see MNcdStorageDataItem::InternalizeL
+     */
+    virtual void InternalizeL( RReadStream& aStream );
+
+
+protected: // From CActive
+
+    virtual void RunL();
+    virtual void DoCancel();
+    virtual TInt RunError( TInt aError );
+
+private:
+
+        
+    /**
+     * Checks if the server supports reports or not
+     */
+    TBool ServerSupportsReports( 
+        TNcdReportType aType,
+        const TDesC& aServerUri,
+        const TDesC& aServerNamespace ) const;
+
+private:
+
+    // Array for reports
+    typedef RPointerArray<CNcdReport> RNcdReportArray;
+
+    enum TNcdReportManagerState
+        {
+        ENcdReportManagerIdle,
+        ENcdReportManagerPreparing,
+        ENcdReportManagerSending,
+        ENcdReportManagerShuttingDown
+        };
+            
+    
+private:
+
+    
+    CNcdReportManager( 
+        const MCatalogsContext& aContext,
+        CNcdGeneralManager& aGeneralManager,
+        MCatalogsHttpSession& aSession,
+        TBool aClientCrashed );
+        
+    void ConstructL();
+
+    CNcdReportManager( const CNcdReportManager& );
+    CNcdReportManager& operator=( const CNcdReportManager& );
+    
+    CNcdReport* FindReport( 
+        const TNcdReportId& aReportId,
+        RNcdReportArray& aArray ) const;
+    
+
+    CNcdReport* FindReport( 
+        const TDesC& aId,
+        const CNcdNodeIdentifier& aNodeId,
+        const TDesC& aReportUri,
+        const TNcdReportType& aReportType,
+        RNcdReportArray& aArray ) const;
+
+
+    void SetManagerStateL( TNcdReportManagerState aState );
+    
+    void SendReportsL();
+    
+    TBool IsAccessPointOpen( 
+        const TCatalogsConnectionMethod& aAp ) const;
+    
+    void BundleReportsL( 
+        TInt aIndex, 
+        MCatalogsHttpOperation& aTransaction );
+
+    void UpdateReportAttributesForSendingL( CNcdReport& aReport );
+
+    TNcdReportBundleMatch CanBundleWithL(     
+        const CNcdReport& aReport, 
+        const CNcdReport& aReport2 ) const;
+
+    void PrepareReportL( 
+        CNcdReport& aReport,
+        MCatalogsHttpOperation& aTransaction );
+
+
+    void FinishReportL( MCatalogsHttpOperation& aOperation, TInt aErrorCode );
+    
+
+    void ExecuteRunL( TInt aError );
+    
+    
+    TNcdReportId GenerateReportId();
+    
+    void SetReportStatusL( 
+        CNcdReport& aReport,
+        const TNcdReportStatusInfo& aStatus,
+        TBool aSendable );
+
+    /** 
+     * Compares two connection methods and returns ETrue if the connection 
+     * methods are compatible for report sending.
+     */
+    TBool CompareConnectionMethods( 
+        const CNcdReport& aFirstReport,
+        const CNcdReport& aSecondReport ) const;
+
+    
+private:
+    
+    const MCatalogsContext& iContext;
+    CNcdGeneralManager& iGeneralManager;
+    MNcdConfigurationManager& iConfigurationManager;
+    MNcdStorageManager& iStorageManager;
+
+    MCatalogsHttpSession& iHttpSession;
+    
+    MNcdServerReportManager::TReportingMethod iReportingMethod;
+    MNcdServerReportManager::TReportingStyle iReportingStyle;
+        
+    // Network manager, not owned
+    CCatalogsNetworkManager* iNetworkManager;
+    
+    // Not owned
+    MNcdDatabaseStorage* iDb;
+        
+    // Currently active reports
+    // This array can contain multiple reports for the same URI & metadata
+    // combination if a new report is registered when a 
+    // failure/cancellation/success has not yet been sent
+    RNcdReportArray iReports;
+    
+    RCatalogsHttpOperationArray iTransactions;
+    TNcdReportManagerState iManagerState; 
+    TNcdReportId iNewReportId;    
+    TBool iClientCrashed;
+    
+    // Not owned.
+    MNcdOperationObserver* iObserver;
+    };
+
+
+#endif // C_NCDREPORTMANAGER_H