diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/inc/ncdreportmanager.h --- /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 + +#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 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