diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/src/ncdserverreportmanagerimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/server/src/ncdserverreportmanagerimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,388 @@ +/* +* 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: Implements CNcdServerReportManager class +* +*/ + + +#include +#include +#include + +#include "ncdserverreportmanagerimpl.h" +#include "ncdreportmanager.h" +#include "ncdnodeidentifier.h" +#include "ncdnodeimpl.h" +#include "ncdnodemetadataimpl.h" +#include "ncdproviderimpl.h" +#include "ncdpurchasehistorydbimpl.h" +#include "ncdpurchasehistoryutils.h" +#include "ncdutils.h" +#include "ncdnodefunctionids.h" +#include "catalogssession.h" +#include "catalogsbasemessage.h" +#include "catalogscontext.h" +#include "catalogsaccesspointmanager.h" +#include "catalogshttpsession.h" +#include "catalogsdebug.h" + + +CNcdServerReportManager* CNcdServerReportManager::NewL( CNcdProvider& aProvider ) + { + CNcdServerReportManager* self = + CNcdServerReportManager::NewLC( aProvider ); + CleanupStack::Pop( self ); + return self; + } + +CNcdServerReportManager* CNcdServerReportManager::NewLC( CNcdProvider& aProvider ) + { + CNcdServerReportManager* self = + new( ELeave ) CNcdServerReportManager( aProvider); + CleanupClosePushL( *self ); + self->ConstructL(); + return self; + } + + +CNcdServerReportManager::CNcdServerReportManager( CNcdProvider& aProvider ) +: CCatalogsCommunicable(), + iProvider( aProvider ) + { + } + + +void CNcdServerReportManager::ConstructL() + { + DLTRACEIN(("")); + } + + +CNcdServerReportManager::~CNcdServerReportManager() + { + DLTRACEIN(("")); + } + + +void CNcdServerReportManager::ReceiveMessage( MCatalogsBaseMessage* aMessage, + TInt aFunctionNumber ) + { + DLTRACEIN(("handle: %d, function: %d", + aMessage->Handle(), + aFunctionNumber)); + + DASSERT( aMessage ); + + // Now, we can be sure that rest of the time iMessage exists. + // This member variable is set for the CounterPartLost function. + iMessage = aMessage; + + TInt trapError( KErrNone ); + + switch( aFunctionNumber ) + { + case NcdNodeFunctionIds::ENcdServerReportManagerSetReportingMethod: + TRAP( trapError, SetReportingMethodRequestL( *aMessage ) ); + break; + + case NcdNodeFunctionIds::ENcdServerReportManagerReportingMethod: + TRAP( trapError, ReportingMethodRequestL( *aMessage ) ); + break; + + case NcdNodeFunctionIds::ENcdServerReportManagerSetReportingStyle: + TRAP( trapError, SetReportingStyleRequestL( *aMessage ) ); + break; + + case NcdNodeFunctionIds::ENcdServerReportManagerReportingStyle: + TRAP( trapError, ReportingStyleRequestL( *aMessage ) ); + break; + + case NcdNodeFunctionIds::ENcdServerReportManagerNodeSetAsInstalled: + TRAP( trapError, NodeSetAsInstalledRequestL( *aMessage ) ); + break; + + case NcdNodeFunctionIds::ENcdRelease: + ReleaseRequest( *aMessage ); + break; + + default: + DLERROR(("Unidentified function request")); + DASSERT( EFalse ); + break; + } + + if ( trapError != KErrNone ) + { + // Because something went wrong the complete has not been + // yet called for the message. + // So, inform the client about the error. + DLTRACEIN(("Complete with error message")); + aMessage->CompleteAndRelease( trapError ); + } + + // Because the message should not be used after this, set it NULL. + // So, CounterPartLost function will know that no messages are + // waiting the response at the moment. + iMessage = NULL; + + DLTRACEOUT(("")); + } + + +void CNcdServerReportManager::CounterPartLost( const MCatalogsSession& aSession ) + { + // This function may be called whenever -- when the message is waiting + // response or when the message does not exist. + // iMessage may be NULL here, because in the end of the + // ReceiveMessage it is set to NULL. The life time of the message + // ends shortly after CompleteAndRelease is called. + if ( iMessage != NULL ) + { + iMessage->CounterPartLost( aSession ); + } + } + + +CNcdProvider& CNcdServerReportManager::Provider() + { + return iProvider; + } + + +CNcdReportManager& CNcdServerReportManager::ReportManagerL( MCatalogsBaseMessage& aMessage ) + { + // Get current context + MCatalogsContext& context( aMessage.Session().Context() ); + + // All the clients have their own report manager. + TNcdProviderContext providerContext; + Provider().GetProviderContextL( context, providerContext ); + CNcdReportManager& reportManager( *providerContext.iReportManager ); + + return reportManager; + } + + +void CNcdServerReportManager::SetReportingMethodRequestL( MCatalogsBaseMessage& aMessage ) + { + HBufC8* input = HBufC8::NewLC( aMessage.InputLength() ); + TPtr8 inputPtr = input->Des(); + aMessage.ReadInput( inputPtr ); + RDesReadStream inputStream( *input ); + CleanupClosePushL( inputStream ); + + MNcdServerReportManager::TReportingMethod method( + static_cast( inputStream.ReadInt32L() ) ); + + CleanupStack::PopAndDestroy( &inputStream ); + CleanupStack::PopAndDestroy( input ); + + ReportManagerL( aMessage ).SetReportingMethod( method ); + + // If this leaves, ReceiveMessge will complete the message. + aMessage.CompleteAndRelease( KErrNone ); + } + + +void CNcdServerReportManager::ReportingMethodRequestL( MCatalogsBaseMessage& aMessage ) + { + TInt method( + ReportManagerL( aMessage ).ReportingMethod() ); + aMessage.CompleteAndReleaseL( method, KErrNone ); + } + + +void CNcdServerReportManager::SetReportingStyleRequestL( MCatalogsBaseMessage& aMessage ) + { + HBufC8* input = HBufC8::NewLC( aMessage.InputLength() ); + TPtr8 inputPtr = input->Des(); + aMessage.ReadInput( inputPtr ); + RDesReadStream inputStream( *input ); + CleanupClosePushL( inputStream ); + + MNcdServerReportManager::TReportingStyle style( + static_cast( inputStream.ReadInt32L() ) ); + + CleanupStack::PopAndDestroy( &inputStream ); + CleanupStack::PopAndDestroy( input ); + + ReportManagerL( aMessage ).SetReportingStyle( style ); + + // If this leaves, ReceiveMessge will complete the message. + aMessage.CompleteAndRelease( KErrNone ); + } + + +void CNcdServerReportManager::ReportingStyleRequestL( MCatalogsBaseMessage& aMessage ) + { + TInt style( + ReportManagerL( aMessage ).ReportingStyle() ); + aMessage.CompleteAndReleaseL( style, KErrNone ); + } + + +void CNcdServerReportManager::NodeSetAsInstalledRequestL( MCatalogsBaseMessage& aMessage ) + { + HBufC8* input = HBufC8::NewLC( aMessage.InputLength() ); + TPtr8 inputPtr = input->Des(); + aMessage.ReadInput( inputPtr ); + RDesReadStream inputStream( *input ); + CleanupClosePushL( inputStream ); + + TInt errorCode( inputStream.ReadInt32L() ); + CNcdNodeIdentifier* identifier( CNcdNodeIdentifier::NewLC( inputStream ) ); + + CNcdReportManager& reportManager( ReportManagerL( aMessage ) ); + CNcdNode& node( Provider().NodeManager().NodeL( *identifier ) ); + CNcdNodeMetaData& metaData( node.NodeMetaDataL() ); + + TNcdReportStatusInfo info( ENcdReportCreate, errorCode ); + // Use the node identifier to identify the content in install report. + // Node id uniquely identifies the node that contains contents + // that will be installed. One node may contains multiple contents but + // they are all thought as one bundle, in one operation. Also, notice that + // multiple nodes can contain same metadata and same content. + TNcdReportId reportId = + reportManager.RegisterInstallL( + identifier->NodeId(), + metaData.Identifier(), + info, + metaData.Identifier().ServerUri(), + metaData.Identifier().NodeNameSpace() ); + + // Set access point for report. + UpdateInstallReportAccessPointL( aMessage.Session().Context().FamilyId(), + reportId, + node, + metaData, + reportManager, + HttpSessionL( aMessage.Session().Context() ) ); + + // Set the final success information directly into the report instead of + // reporting other install statuses here. + TNcdReportStatus status( ENcdReportSuccess ); + if ( errorCode == KErrNone ) + { + status = ENcdReportSuccess; + } + else if ( errorCode == KErrCancel ) + { + status = ENcdReportCancel; + } + else + { + status = ENcdReportFail; + } + + // Create the status info object with the given info. + info.iStatus = status; + info.iErrorCode = errorCode; + + reportManager.ReportInstallStatusL( + reportId, + info ); + + CleanupStack::PopAndDestroy( identifier ); + CleanupStack::PopAndDestroy( &inputStream ); + CleanupStack::PopAndDestroy( input ); + + aMessage.CompleteAndRelease( KErrNone ); + } + + +void CNcdServerReportManager::ReleaseRequest( MCatalogsBaseMessage& aMessage ) const + { + DLTRACEIN(("")); + + // Decrease the reference count for this object. + // When the reference count reaches zero, this object will be destroyed + // and removed from the session. + MCatalogsSession& requestSession( aMessage.Session() ); + TInt handle( aMessage.Handle() ); + aMessage.CompleteAndRelease( KErrNone ); + requestSession.RemoveObject( handle ); + + DLTRACEOUT(("")); + } + + +void CNcdServerReportManager::UpdateInstallReportAccessPointL( const TUid& aClientUid, + TInt aReportId, + CNcdNode& aNode, + CNcdNodeMetaData& aMetaData, + CNcdReportManager& aReportManager, + MCatalogsHttpSession& aHttpSession ) + { + DLTRACEIN(("")); + + CNcdPurchaseHistoryDb& db = Provider().NodeManager().PurchaseHistory(); + + CNcdPurchaseDetails* purchase = + NcdPurchaseHistoryUtils::PurchaseDetailsLC( + db, + aClientUid, + aMetaData.Identifier(), + EFalse ); + + // Create origin identifier + CNcdNodeIdentifier* originIdentifier = + CNcdNodeIdentifier::NewL( + aNode.Identifier().NodeNameSpace(), + purchase->OriginNodeId(), + aNode.Identifier().ClientUid() ); + + CleanupStack::PopAndDestroy( purchase ); + + CleanupStack::PushL( originIdentifier ); + + // Get report ap + TUint32 apId( 0 ); + + TInt error = + Provider().AccessPointManager().AccessPointIdL( + *originIdentifier, + MCatalogsAccessPointManager::EBrowse, + aClientUid, + apId ); + + TCatalogsConnectionMethod reportAp; + if ( error == KErrNone ) + { + DLTRACE(( "Setting access point %d for reports", apId )) + reportAp = + TCatalogsConnectionMethod( + apId, + ECatalogsConnectionMethodTypeAccessPoint ); + } + + if ( reportAp.iId == 0 ) + { + reportAp = aHttpSession.ConnectionManager().DefaultConnectionMethod(); + } + + CleanupStack::PopAndDestroy( originIdentifier ); + + aReportManager.SetInstallReportAccessPoint( + aReportId, + reportAp ); + } + + +MCatalogsHttpSession& CNcdServerReportManager::HttpSessionL( MCatalogsContext& aContext ) + { + TNcdProviderContext providerContext; + Provider().GetProviderContextL( aContext, providerContext ); + return *providerContext.iHttpSession; + } +