ncdengine/provider/server/src/ncdserverreportmanagerimpl.cpp
changeset 0 ba25891c3a9e
--- /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 <e32err.h>
+#include <e32base.h>
+#include <s32mem.h>
+
+#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<MNcdServerReportManager::TReportingMethod>( 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<MNcdServerReportManager::TReportingStyle>( 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;
+    }
+