ncdengine/provider/src/ncdpurchasedetails.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/src/ncdpurchasedetails.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,932 @@
+/*
+* 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:  
+*
+*/
+
+
+#include <s32strm.h>
+
+#include "ncdpurchasedetails.h"
+#include "ncdpurchasedownloadinfo.h"
+#include "ncdpurchaseinstallinfo.h"
+#include "catalogsutils.h"
+#include "catalogsconstants.h"
+#include "ncdutils.h"
+#include "ncdattributes.h"
+
+#include "catalogsdebug.h"
+
+
+static inline void AssignHBufC( HBufC*& aDes, HBufC* const aSource )
+    {
+    delete aDes;
+    aDes = aSource;
+    }
+
+EXPORT_C CNcdPurchaseDetails* CNcdPurchaseDetails::NewL()
+    {
+    CNcdPurchaseDetails* self = NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+EXPORT_C CNcdPurchaseDetails* CNcdPurchaseDetails::NewLC()
+    {
+    CNcdPurchaseDetails* self = new ( ELeave ) CNcdPurchaseDetails;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;    
+    }
+
+EXPORT_C CNcdPurchaseDetails* CNcdPurchaseDetails::NewL(
+    const MNcdPurchaseDetails& aDetails )
+    {
+    CNcdPurchaseDetails* self = NewLC( aDetails );
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+EXPORT_C CNcdPurchaseDetails* CNcdPurchaseDetails::NewLC(
+    const MNcdPurchaseDetails& aDetails )
+    {
+    DLTRACEIN((""));
+    CNcdPurchaseDetails* self = new ( ELeave ) CNcdPurchaseDetails;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    
+    self->SetCatalogSourceNameL( aDetails.CatalogSourceName() );
+    self->SetClientUid( aDetails.ClientUid() );
+    self->SetDescriptionL( aDetails.Description() );
+    self->SetDownloadAccessPointL( aDetails.DownloadAccessPoint() );
+    self->SetDownloadedFilesL( aDetails.DownloadedFiles() );
+    self->SetDownloadInfoL( aDetails.DownloadInfoL() );
+    self->SetEntityIdL( aDetails.EntityId() );
+    self->SetFinalPriceL( aDetails.FinalPrice() );
+    self->SetIconL( aDetails.Icon() );
+    self->SetInstallInfoL( aDetails.InstallInfoL() );
+    self->SetItemNameL( aDetails.ItemName() );
+    self->SetItemPurpose( aDetails.ItemPurpose() );
+    self->SetNamespaceL( aDetails.Namespace() );
+    self->SetPaymentMethodNameL( aDetails.PaymentMethodName() );
+    self->SetPurchaseOptionIdL( aDetails.PurchaseOptionId() );
+    self->SetPurchaseOptionNameL( aDetails.PurchaseOptionName() );
+    self->SetPurchaseOptionPriceL( aDetails.PurchaseOptionPrice() );
+    self->SetPurchaseTime( aDetails.PurchaseTime() );
+    self->SetVersionL( aDetails.Version() );
+    self->SetServerUriL( aDetails.ServerUri() );
+    self->SetItemType( aDetails.ItemType() );
+    self->SetTotalContentSize( aDetails.TotalContentSize() );
+    self->SetLastOperationTime( aDetails.LastOperationTime() );
+    self->SetLastOperationErrorCode( aDetails.LastOperationErrorCode() );
+    self->SetOriginNodeIdL( aDetails.OriginNodeId() );
+
+    // Some ugly stuff for copying the attributes
+    // This WILL NOT work for other MNcdPurchaseDetails-implementations
+    // if there's going to be any
+    const CNcdPurchaseDetails& details = 
+        static_cast<const CNcdPurchaseDetails&>( aDetails );
+    
+    if ( details.iAttributes ) 
+        {
+        DeletePtr( self->iAttributes );
+        self->iAttributes = CNcdAttributes::NewL( *details.iAttributes );
+        }
+
+    return self;    
+    }
+
+CNcdPurchaseDetails::~CNcdPurchaseDetails()
+    {
+    delete iNamespace;
+    delete iEntityId;
+    delete iItemName;
+    delete iCatalogSourceName;
+    ResetAndDestroyWithCast< CNcdPurchaseDownloadInfo >( iDownloadInfo );
+    delete iPurchaseOptionId;
+    delete iPurchaseOptionName;
+    delete iPurchaseOptionPrice;
+    delete iFinalPrice;
+    delete iPaymentMethodName;
+    delete iDownloadedFiles;
+    
+    ResetAndDestroyWithCast< CNcdPurchaseInstallInfo >( iInstallInfo );
+
+    delete iIcon;
+    delete iDownloadAccessPoint;
+    delete iDescription;
+    delete iVersion;
+    delete iServerUri;
+    delete iOriginNodeId;
+    delete iAttributes;
+    }
+
+MNcdPurchaseDetails::TState CNcdPurchaseDetails::State() const
+    {
+    // The state is automatically checked here without using any
+    // state member variable. At the moment, a member variable for 
+    // the state and setter function for the state can not be used
+    // because, for example, PC-client does not support it.
+
+    // Notice, that here we do not use the last operation error code
+    // to check if the last operation has failed. We just give, the current
+    // state. It is up to the user of the purchase details to do more checking
+    // related to the error code if more information is needed, for example, 
+    // to check if some operation has failed and the state has not progressed
+    // because of that.
+    
+    if ( iInstallInfo.Count() > 0
+         && iInstallInfo.Count() >= iDownloadInfo.Count() )
+        {
+        // All the items have been installed.
+        // So, we can suppose that the installation was a success.
+        // So, return installed-state.
+        return EStateInstalled;            
+        }
+    else if ( iDownloadedFiles 
+              && iDownloadedFiles->Count() > 0 
+              && iDownloadedFiles->Count() >= iDownloadInfo.Count() ) 
+        {
+        // All of the items have been downloaded,
+        // So, we can suppose that the download was a success.
+        return EStateDownloaded;            
+        }
+    else
+        {
+        // Because an item has not been yet fully downloaded or installed,
+        // its state is purchased-state.
+        return EStatePurchased;        
+        }
+    }
+
+TUid CNcdPurchaseDetails::ClientUid() const
+    {
+    return iClientUid;
+    }
+
+const TDesC& CNcdPurchaseDetails::Namespace() const
+    {
+    return *iNamespace;
+    }
+
+const TDesC& CNcdPurchaseDetails::EntityId() const
+    {
+    return *iEntityId;
+    }
+
+const TDesC& CNcdPurchaseDetails::ItemName() const
+    {
+    return *iItemName;
+    }
+
+TUint CNcdPurchaseDetails::ItemPurpose() const
+    {
+    return iItemPurpose;
+    }
+
+const TDesC& CNcdPurchaseDetails::CatalogSourceName() const
+    {
+    return *iCatalogSourceName;
+    }
+
+TArray< MNcdPurchaseDownloadInfo* >
+    CNcdPurchaseDetails::DownloadInfoL() const
+    {
+    return iDownloadInfo.Array();
+    }
+
+const TDesC& CNcdPurchaseDetails::PurchaseOptionId() const
+    {
+    return *iPurchaseOptionId;
+    }
+
+const TDesC& CNcdPurchaseDetails::PurchaseOptionName() const
+    {
+    return *iPurchaseOptionName;
+    }
+
+const TDesC& CNcdPurchaseDetails::PurchaseOptionPrice() const
+    {
+    return *iPurchaseOptionPrice;
+    }
+
+const TDesC& CNcdPurchaseDetails::FinalPrice() const
+    {
+    return *iFinalPrice;
+    }
+
+const TDesC& CNcdPurchaseDetails::PaymentMethodName() const
+    {
+    return *iPaymentMethodName;
+    }
+
+TTime CNcdPurchaseDetails::PurchaseTime() const
+    {
+    return iPurchaseTime;
+    }
+
+const MDesCArray& CNcdPurchaseDetails::DownloadedFiles() const
+    {
+    return *iDownloadedFiles;
+    }
+
+TArray< MNcdPurchaseInstallInfo* > CNcdPurchaseDetails::InstallInfoL() const
+    {
+    return iInstallInfo.Array();
+    }
+
+const TDesC8& CNcdPurchaseDetails::Icon() const
+    {
+    DASSERT( iIcon );
+    return *iIcon;
+    }
+    
+TBool CNcdPurchaseDetails::HasIcon() const
+    {
+    DLTRACE(("iHasIcon: %d",iHasIcon));
+    return iHasIcon;
+    }
+
+const TDesC& CNcdPurchaseDetails::DownloadAccessPoint() const
+    {
+    return *iDownloadAccessPoint;
+    }
+
+const TDesC& CNcdPurchaseDetails::Description() const
+    {
+    return *iDescription;
+    }
+
+const TDesC& CNcdPurchaseDetails::Version() const
+    {
+    return *iVersion;
+    }
+
+const TDesC& CNcdPurchaseDetails::ServerUri() const
+    {
+    return *iServerUri;
+    }
+
+MNcdPurchaseDetails::TItemType CNcdPurchaseDetails::ItemType() const
+    {
+    return iItemType;
+    }
+    
+TInt CNcdPurchaseDetails::TotalContentSize() const 
+    {
+    return iTotalContentSize;
+    }
+    
+const TDesC& CNcdPurchaseDetails::OriginNodeId() const
+    {
+    return *iOriginNodeId;
+    }
+
+TTime CNcdPurchaseDetails::LastOperationTime() const
+    {
+    return iLastOperationTime;
+    }
+    
+TInt CNcdPurchaseDetails::LastOperationErrorCode() const
+    {
+    return iLastOperationErrorCode;
+    }
+
+
+const TDesC& CNcdPurchaseDetails::AttributeString( 
+    TPurchaseAttribute aAttribute ) const
+    {
+    DLTRACEIN((""));
+    return iAttributes->AttributeString16( aAttribute );    
+    }
+
+
+TInt32 CNcdPurchaseDetails::AttributeInt32( 
+    TPurchaseAttribute aAttribute ) const
+    {
+    return iAttributes->AttributeInt32( aAttribute );    
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::ExternalizeL( RWriteStream& aStream ) const
+    {
+    TUint count = 0;
+
+    aStream.WriteInt32L( iClientUid.iUid );
+    ExternalizeDesL( *iNamespace, aStream );
+    ExternalizeDesL( *iEntityId, aStream );
+    ExternalizeDesL( *iItemName, aStream );
+    aStream.WriteUint32L( iItemPurpose );
+    ExternalizeDesL( *iCatalogSourceName, aStream );
+    
+    count = iDownloadInfo.Count();
+    aStream.WriteUint32L( count );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CNcdPurchaseDownloadInfo* info =
+            (CNcdPurchaseDownloadInfo*)iDownloadInfo[i];
+        info->ExternalizeL( aStream );
+        }
+        
+    ExternalizeDesL( *iPurchaseOptionId, aStream );
+    ExternalizeDesL( *iPurchaseOptionName, aStream );
+    ExternalizeDesL( *iPurchaseOptionPrice, aStream );
+    ExternalizeDesL( *iFinalPrice, aStream );
+    ExternalizeDesL( *iPaymentMethodName, aStream );
+    aStream << iPurchaseTime.Int64();
+    
+    count = iDownloadedFiles->Count();
+    aStream.WriteUint32L( count );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        ExternalizeDesL( (*iDownloadedFiles)[i], aStream );
+        }
+        
+    count = iInstallInfo.Count();
+    aStream.WriteUint32L( count );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CNcdPurchaseInstallInfo* info =
+            (CNcdPurchaseInstallInfo*)iInstallInfo[i];
+        info->ExternalizeL( aStream );
+        }
+
+    aStream.WriteInt32L( iHasIcon );
+    ExternalizeDesL( *iIcon, aStream );
+    ExternalizeDesL( *iDownloadAccessPoint, aStream );
+    ExternalizeDesL( *iDescription, aStream );
+    ExternalizeDesL( *iVersion, aStream );
+    ExternalizeDesL( *iServerUri, aStream );
+    aStream.WriteInt32L( iItemType );
+    aStream.WriteInt32L( iTotalContentSize );
+    ExternalizeDesL( *iOriginNodeId, aStream );
+
+    aStream << LastOperationTime().Int64();
+    aStream.WriteInt32L( LastOperationErrorCode() );
+    
+    iAttributes->ExternalizeL( aStream );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::InternalizeL( RReadStream& aStream )
+    {
+    TInt64 int64 = 0;
+    TUint count = 0;
+    
+    iClientUid = TUid::Uid( aStream.ReadInt32L() );
+    InternalizeDesL( iNamespace, aStream );
+    InternalizeDesL( iEntityId, aStream );
+    InternalizeDesL( iItemName, aStream );
+    iItemPurpose = aStream.ReadUint32L();
+    InternalizeDesL( iCatalogSourceName, aStream );
+    
+    count = aStream.ReadUint32L();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CNcdPurchaseDownloadInfo* info = CNcdPurchaseDownloadInfo::NewLC();
+        info->InternalizeL( aStream );
+        iDownloadInfo.AppendL( info );
+        CleanupStack::Pop( info );
+        }
+        
+    InternalizeDesL( iPurchaseOptionId, aStream );
+    InternalizeDesL( iPurchaseOptionName, aStream );
+    InternalizeDesL( iPurchaseOptionPrice, aStream );
+    InternalizeDesL( iFinalPrice, aStream );
+    InternalizeDesL( iPaymentMethodName, aStream );
+    aStream >> int64;
+    iPurchaseTime = int64;
+    
+    count = aStream.ReadUint32L();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        HBufC* buf = NULL;
+        InternalizeDesL( buf, aStream );
+        CleanupStack::PushL( buf );
+        iDownloadedFiles->AppendL( *buf );
+        CleanupStack::PopAndDestroy( buf );
+        }
+
+    count = aStream.ReadUint32L();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        CNcdPurchaseInstallInfo* info = CNcdPurchaseInstallInfo::NewLC();
+        info->InternalizeL( aStream );
+        User::LeaveIfError( iInstallInfo.Append( info ) );
+        CleanupStack::Pop( info );
+        }
+
+    iHasIcon = aStream.ReadInt32L();
+    InternalizeDesL( iIcon, aStream );
+    InternalizeDesL( iDownloadAccessPoint, aStream );
+    InternalizeDesL( iDescription, aStream );
+    InternalizeDesL( iVersion, aStream );
+    InternalizeDesL( iServerUri, aStream );
+    iItemType = (MNcdPurchaseDetails::TItemType)aStream.ReadInt32L();
+    iTotalContentSize = aStream.ReadInt32L();
+    InternalizeDesL( iOriginNodeId, aStream );
+    
+    TInt64 tmpLastOperationTime( 0 );
+    aStream >> tmpLastOperationTime;
+    iLastOperationTime = tmpLastOperationTime;
+    
+    iLastOperationErrorCode = aStream.ReadInt32L();
+    
+    iAttributes->InternalizeL( aStream );    
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetClientUid( TUid aClientUid )
+    {
+    iClientUid = aClientUid;
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetNamespaceL( const TDesC& aNamespace )
+    {
+    AssignDesL( iNamespace, aNamespace );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetNamespace( HBufC* aNamespace )
+    {
+    AssignHBufC( iNamespace, aNamespace );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetEntityIdL( const TDesC& aEntityId )
+    {
+    AssignDesL( iEntityId, aEntityId );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetEntityId( HBufC* aEntityId )
+    {
+    AssignHBufC( iEntityId, aEntityId );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetItemNameL( const TDesC& aItemName )
+    {
+    AssignDesL( iItemName, aItemName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetItemName( HBufC* aItemName )
+    {
+    AssignHBufC( iItemName, aItemName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetItemPurpose( TUint aItemPurpose )
+    {
+    iItemPurpose = aItemPurpose;
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetCatalogSourceNameL(
+    const TDesC& aCatalogSourceName )
+    {
+    AssignDesL( iCatalogSourceName, aCatalogSourceName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetCatalogSourceName( HBufC* aCatalogSourceName )
+    {
+    AssignHBufC( iCatalogSourceName, aCatalogSourceName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDownloadInfoL(
+    const TArray< MNcdPurchaseDownloadInfo* >& aDownloadInfo )
+    {
+    DLTRACEIN((""));
+    
+    RPointerArray< MNcdPurchaseDownloadInfo > tempArray;
+    // Can't push to cleanup stack since MNcdPurchaseDownloadInfo cannot be
+    // deleted but the array owns the objects
+    
+    TRAPD( err, 
+        {
+        TInt count = aDownloadInfo.Count();
+        tempArray.ReserveL( count );
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CNcdPurchaseDownloadInfo* info =
+                CNcdPurchaseDownloadInfo::NewLC( *aDownloadInfo[i] );
+            tempArray.AppendL( info );
+            CleanupStack::Pop( info );
+            }
+        });
+    if ( err != KErrNone ) 
+        {
+        DLERROR(("%d", err));
+        ResetAndDestroyWithCast<CNcdPurchaseDownloadInfo>( tempArray );
+        User::Leave( err );
+        }
+        
+    ResetAndDestroyWithCast<CNcdPurchaseDownloadInfo>( iDownloadInfo );
+    iDownloadInfo = tempArray;
+    }
+
+
+
+EXPORT_C void CNcdPurchaseDetails::AddDownloadInfoL( 
+    MNcdPurchaseDownloadInfo* aDownloadInfo )
+    {
+    iDownloadInfo.AppendL( aDownloadInfo );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::InsertDownloadInfoL( 
+    MNcdPurchaseDownloadInfo* aDownloadInfo, 
+    TInt aIndex )
+    {
+    iDownloadInfo.InsertL( aDownloadInfo, aIndex );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::RemoveDownloadInfo( TInt aIndex )
+    {
+    DeleteFromArray<CNcdPurchaseDownloadInfo>( iDownloadInfo, aIndex );
+    }
+    
+    
+EXPORT_C TInt CNcdPurchaseDetails::DownloadInfoCount() const
+    {
+    return iDownloadInfo.Count();
+    }
+    
+    
+EXPORT_C CNcdPurchaseDownloadInfo& CNcdPurchaseDetails::DownloadInfo(
+    TInt aIndex )
+    {
+    CNcdPurchaseDownloadInfo* ptr = static_cast<CNcdPurchaseDownloadInfo*>(
+        iDownloadInfo[aIndex] );
+    return *ptr;
+    }
+    
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionIdL(
+    const TDesC& aPurchaseOptionId )
+    {
+    AssignDesL( iPurchaseOptionId, aPurchaseOptionId );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionId( HBufC* aPurchaseOptionId )
+    {
+    AssignHBufC( iPurchaseOptionId, aPurchaseOptionId );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionNameL(
+    const TDesC& aPurchaseOptionName )
+    {
+    AssignDesL( iPurchaseOptionName, aPurchaseOptionName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionName( HBufC* aPurchaseOptionName )
+    {
+    AssignHBufC( iPurchaseOptionName, aPurchaseOptionName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionPriceL(
+    const TDesC& aPurchaseOptionPrice )
+    {
+    AssignDesL( iPurchaseOptionPrice, aPurchaseOptionPrice );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseOptionPrice(
+    HBufC* aPurchaseOptionPrice )
+    {
+    AssignHBufC( iPurchaseOptionPrice, aPurchaseOptionPrice );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetFinalPriceL( const TDesC& aFinalPrice )
+    {
+    AssignDesL( iFinalPrice, aFinalPrice );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetFinalPrice( HBufC* aFinalPrice )
+    {
+    AssignHBufC( iFinalPrice, aFinalPrice );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPaymentMethodNameL(
+    const TDesC& aPaymentMethodName )
+    {
+    AssignDesL( iPaymentMethodName, aPaymentMethodName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPaymentMethodName( HBufC* aPaymentMethodName )
+    {
+    AssignHBufC( iPaymentMethodName, aPaymentMethodName );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetPurchaseTime( TTime aPurchaseTime )
+    {
+    iPurchaseTime = aPurchaseTime;
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDownloadedFiles( CDesCArray* aDownloadedFiles )
+    {
+    delete iDownloadedFiles;
+    iDownloadedFiles = aDownloadedFiles;
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDownloadedFilesL(
+    const MDesCArray& aDownloadedFiles )
+    {
+    delete iDownloadedFiles;
+    iDownloadedFiles = NULL;
+    iDownloadedFiles = new (ELeave) CDesCArrayFlat( KListGranularity );
+    for ( TInt i = 0; i < aDownloadedFiles.MdcaCount(); i++ )
+        {
+        iDownloadedFiles->AppendL( aDownloadedFiles.MdcaPoint( i ) );
+        }
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::ReplaceDownloadedFileL( TInt aIndex, 
+    const TDesC& aDownloadedFile )
+    {    
+    iDownloadedFiles->InsertL( aIndex, aDownloadedFile );
+    iDownloadedFiles->Delete( aIndex + 1 );
+    }
+    
+
+EXPORT_C void CNcdPurchaseDetails::AddDownloadedFileL( 
+    const TDesC& aDownloadedFile )
+    {
+    iDownloadedFiles->AppendL( aDownloadedFile );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::InsertDownloadedFileL( 
+    const TDesC& aDownloadedFile, 
+    TInt aIndex )
+    {
+    iDownloadedFiles->InsertL( aIndex, aDownloadedFile );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::RemoveDownloadedFile( 
+    TInt aIndex )
+    {
+    iDownloadedFiles->Delete( aIndex );
+    }
+    
+
+EXPORT_C void CNcdPurchaseDetails::SetInstallInfoL(
+    const TArray< MNcdPurchaseInstallInfo* >& aInstallInfo )
+    {
+    DLTRACEIN((""));
+    RPointerArray<MNcdPurchaseInstallInfo> tempArray;
+    
+    TRAPD( err, 
+        {            
+        TInt count = aInstallInfo.Count();
+        tempArray.ReserveL( count );
+        
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CNcdPurchaseInstallInfo* info =
+                CNcdPurchaseInstallInfo::NewLC( *aInstallInfo[i] );
+            tempArray.AppendL( info );
+            CleanupStack::Pop( info );
+            }
+        });
+    
+    if ( err != KErrNone )
+        {
+        DLERROR(("%d", err));
+        ResetAndDestroyWithCast<CNcdPurchaseInstallInfo>( tempArray );    
+        User::Leave( err );
+        }
+        
+    ResetAndDestroyWithCast<CNcdPurchaseInstallInfo>( iInstallInfo );
+    iInstallInfo = tempArray;
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::AddInstallInfoL( 
+    MNcdPurchaseInstallInfo* aInstallInfo )
+    {
+    iInstallInfo.AppendL( aInstallInfo );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::InsertInstallInfoL( 
+    MNcdPurchaseInstallInfo* aInstallInfo,
+    TInt aIndex )
+    {
+    iInstallInfo.InsertL( aInstallInfo, aIndex );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::RemoveInstallInfo( TInt aIndex )
+    {
+    DeleteFromArray<CNcdPurchaseInstallInfo>( iInstallInfo, aIndex );
+    }
+    
+
+EXPORT_C TInt CNcdPurchaseDetails::InstallInfoCount() const
+    {
+    return iInstallInfo.Count();
+    }
+    
+    
+EXPORT_C CNcdPurchaseInstallInfo& CNcdPurchaseDetails::InstallInfo( 
+    TInt aIndex )
+    {
+    DASSERT( aIndex >= 0 && aIndex < iInstallInfo.Count() );
+    CNcdPurchaseInstallInfo* ptr = static_cast<CNcdPurchaseInstallInfo*>( 
+        iInstallInfo[aIndex] );
+    return *ptr;
+    }
+    
+
+EXPORT_C void CNcdPurchaseDetails::SetIconL( const TDesC8& aIcon )
+    {
+    HBufC8* tmpIcon = aIcon.AllocL();
+    delete iIcon;
+    iIcon = tmpIcon;
+    iHasIcon = ETrue;
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetIcon( HBufC8* aIcon )
+    {
+    delete iIcon;
+    iIcon = aIcon;
+    iHasIcon = ETrue;
+    }
+    
+EXPORT_C HBufC8* CNcdPurchaseDetails::GetIconData()
+    {
+    HBufC8* tmpIcon = iIcon;
+    iIcon = NULL;
+    return tmpIcon;
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetHasIcon( TBool aHasIcon )
+    {
+    iHasIcon = aHasIcon;
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetDownloadAccessPointL(
+    const TDesC& aAccessPoint )
+    {
+    AssignDesL( iDownloadAccessPoint, aAccessPoint );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDownloadAccessPoint(
+    HBufC* aAccessPoint )
+    {
+    AssignHBufC( iDownloadAccessPoint, aAccessPoint );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDescriptionL(
+    const TDesC& aDescription )
+    {
+    AssignDesL( iDescription, aDescription );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetDescription(
+    HBufC* aDescription )
+    {
+    AssignHBufC( iDescription, aDescription );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetVersionL(
+    const TDesC& aVersion )
+    {
+    AssignDesL( iVersion, aVersion );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetVersion(
+    HBufC* aVersion )
+    {
+    AssignHBufC( iVersion, aVersion );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetServerUriL(
+    const TDesC& aServerUri )
+    {
+    AssignDesL( iServerUri, aServerUri );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetServerUri(
+    HBufC* aServerUri )
+    {
+    AssignHBufC( iServerUri, aServerUri );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetItemType(
+    TItemType aItemType )
+    {
+    iItemType = aItemType;
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetTotalContentSize( TInt aSize )
+    {
+    iTotalContentSize = aSize;
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetOriginNodeIdL( const TDesC& aOriginNodeId )
+    {
+    AssignDesL( iOriginNodeId, aOriginNodeId );
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetOriginNodeId( HBufC* aOriginNodeId )
+    {
+    AssignHBufC( iOriginNodeId, aOriginNodeId );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetLastUniversalOperationTime()
+    {
+    TTime time;
+    time.UniversalTime();
+    SetLastOperationTime( time );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::SetLastOperationTime( const TTime& aTime )
+    {
+    iLastOperationTime = aTime;
+    }
+    
+EXPORT_C void CNcdPurchaseDetails::SetLastOperationErrorCode( TInt aError )
+    {
+    iLastOperationErrorCode = aError;
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::SetAttributeL( 
+    TPurchaseAttribute aAttribute, 
+    TInt32 aValue )
+    {    
+    iAttributes->SetAttributeL( aAttribute, aValue );
+    }
+
+
+EXPORT_C void CNcdPurchaseDetails::SetAttributeL( 
+    TPurchaseAttribute aAttribute, 
+    const TDesC& aValue )
+    {    
+    iAttributes->SetAttributeL( aAttribute, aValue );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::ExternalizeAttributesL( 
+    RWriteStream& aStream ) const
+    {
+    DLTRACEIN((""));
+    iAttributes->ExternalizeL( aStream );
+    }
+
+EXPORT_C void CNcdPurchaseDetails::InternalizeAttributesL( 
+    RReadStream& aStream )
+    {
+    DLTRACEIN((""));
+    iAttributes->InternalizeL( aStream );
+    }
+
+
+void CNcdPurchaseDetails::CreateAttributesL()
+    {
+    DLTRACEIN((""));
+    if ( !iAttributes ) 
+        {
+        iAttributes = CNcdAttributes::NewL( 
+            MNcdPurchaseDetails::EPurchaseAttributeInternal );
+        }
+    }
+
+
+void CNcdPurchaseDetails::ConstructL()
+    {
+    iNamespace = KNullDesC().AllocL();
+    iEntityId = KNullDesC().AllocL();
+    iItemName = KNullDesC().AllocL();
+    iCatalogSourceName = KNullDesC().AllocL();
+    iPurchaseOptionId = KNullDesC().AllocL();
+    iPurchaseOptionName = KNullDesC().AllocL();
+    iPurchaseOptionPrice = KNullDesC().AllocL();
+    iFinalPrice = KNullDesC().AllocL();
+    iPaymentMethodName = KNullDesC().AllocL();
+    iDownloadedFiles = new (ELeave) CDesCArrayFlat( KListGranularity );
+    iIcon = KNullDesC8().AllocL();
+    iDownloadAccessPoint = KNullDesC().AllocL();
+    iDescription = KNullDesC().AllocL();
+    iVersion = KNullDesC().AllocL();
+    iServerUri = KNullDesC().AllocL();
+    iItemType = MNcdPurchaseDetails::EItem;
+    iOriginNodeId = KNullDesC().AllocL();
+    CreateAttributesL();
+    }
+
+CNcdPurchaseDetails::CNcdPurchaseDetails()
+    : iPurchaseTime( 0 ),
+      iHasIcon( EFalse ), 
+      iTotalContentSize( 0 ), 
+      iLastOperationTime( 0 ),
+      iLastOperationErrorCode( KErrNone )
+      
+    {
+    iClientUid = TUid::Null();
+    }