--- /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