upnpsharing/upnpcontentserver/src/upnpcontentsharingao.cpp
changeset 0 7f85d04be362
child 30 5ec426854821
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpcontentserver/src/upnpcontentsharingao.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,1972 @@
+/*
+* Copyright (c) 2006-2007 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:      CUpnpContentSharingAo class implementation
+ *
+*/
+
+
+
+
+
+
+//  Include Files
+#include <upnpcontainer.h>
+#include <upnpfilesharing.h>
+#include <upnpcontainer.h>
+#include <upnpitem.h>
+#include <upnpitemlist.h>
+#include <upnpobject.h>
+#include <upnpstring.h>
+#include <s32file.h>
+#include <f32file.h>
+#include "upnpcommonutils.h" // FindContainerByTitle
+#include "upnpcdsreselementutility.h"
+// CLF headers
+#include <MCLFContentListingEngine.h>
+#include <ContentListingFactory.h>
+#include <MCLFItemListModel.h>
+#include <CLFContentListing.hrh>
+
+//#include <clfcontentlistingextended.hrh>
+
+#include <MCLFItem.h>
+
+#include "upnpcontentsharingao.h"
+#include "upnpcontentmetadatautility.h"
+#include "upnpselectionwriter.h"
+#include "upnpcontainercheckerao.h"
+#include "upnpcontentserverdefs.h"
+#include "upnpunsharerao.h"
+
+_LIT( KComponentLogfile, "contentserver.txt");
+#include "upnplog.h"
+
+// FORWARD DECLARATIONS
+class UPnPCommonUtils;
+
+// CONSTANTS
+
+const TInt KUiSelectionOffset = 2;
+const TInt KDefaultGranularity( 10 );
+
+// KContentDirCommitAmount should be in sync with KCommitEveryNum in
+// upnpcontentdirectoryglobals.h which is not exported
+const TInt KContentDirCommitAmount = 10;
+
+using namespace UpnpContentServer;
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::CUpnpContentSharingAo
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUpnpContentSharingAo::CUpnpContentSharingAo(
+    MUpnpSharingCallback* aEngine,
+    CUpnpContentMetadataUtility* aMetadata )
+    : CActive( CActive::EPriorityStandard )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    iEngine = aEngine;
+    iMetadataUtility = aMetadata;
+    iContainerId = KErrNotFound;
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::NewL
+// Two-phased constructor.
+// --------------------------------------------------------------------------
+//
+CUpnpContentSharingAo* CUpnpContentSharingAo::NewL(
+    MUpnpSharingCallback* aEngine,
+    CUpnpContentMetadataUtility* aMetadata )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    CUpnpContentSharingAo* self = new (ELeave)
+        CUpnpContentSharingAo( aEngine, aMetadata );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return self;
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ConstructL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    iContainerIdx = 0;
+    iObjectIdx = 0;
+    iVideoIndex = 0;
+    iImageIndex = 0;
+    iAllVideosShared = EFalse;
+    iAllImagesShared = EFalse;
+
+    CActiveScheduler::Add( this );
+
+    iFileSharing = CUpnpFileSharing::NewL();
+    ConnectMediaServer();
+    iWriter = CUpnpSelectionWriter::NewL( iContainerType );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// Destructor
+CUpnpContentSharingAo::~CUpnpContentSharingAo()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    iMediaServer.Close();
+    delete iFileSharing;
+    iFileSharing = NULL;
+
+
+    if ( IsActive() )
+        {
+        __LOG1("CUpnpContentSharingAo destructor IsActive==\
+true iSharingState: %d", iSharingState );
+        iSharingState = ENotActive;
+        TRequestStatus* stat = &iStatus;
+        User::RequestComplete( stat, KErrNone );
+        }
+
+    Cancel();
+    iEngine = NULL;
+    iContainerIds = NULL;
+
+    delete iTmpContainer;
+    delete iSharedContainerIds;
+    delete iWriter;
+    DeleteListUpnpObject();
+    delete iFileNameArr;   
+    delete iTmpItem;
+    delete iPlaylists;
+    delete iCollections;
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::RunL
+// Called when asyncronous request is ready
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::RunL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    __LOG8_1( "iStatus", iStatus.Int() );
+    if ( iStatus.Int() == KErrCorrupt ||
+        iStatus.Int() == KErrDiskFull ||
+        iStatus.Int() == KErrNoMemory )
+        {
+        iSharingState = ENotActive;
+        }
+    if ( iStopRequested == MUpnpSharingCallback::ESharingPause )
+        {
+        TInt err = iMediaServer.Stop(
+            RUpnpMediaServerClient::EStopSilent );
+        __LOG1( "Error: %d", err );
+        err = iMediaServer.StartOffline();
+        __LOG1( "Error: %d", err );
+        
+        iStopRequested = MUpnpSharingCallback::ESharingNoStop;
+        }
+
+    switch ( iSharingState )
+        {
+    case EUnshareContainers :
+        {
+        // Unshare the container structure
+        UnshareContainersL();
+        }
+        break;
+    case EShareContainers :
+        {
+        // Share the container structure
+        ShareContainersL();
+        }
+        break;
+    case EShareContainersResult :
+        {
+        // advance to next container or share items
+        ShareContainersResultL();
+        }
+        break;
+    case EShareItems :
+        {
+        // coming here after all containers are shared
+        // then at least once per container
+        HandleSharingSubstatesL();
+        }
+        break;
+    case EShareItemsResult :
+        {
+        // advance to next item or end
+        ShareItemsResultL();
+        }
+        break;
+    case EShareAllItems :
+        {
+        //..coming to here once "All files" is selected and
+        // individual albums are already shared
+        HandleSharingSubstatesL();
+        }
+        break;
+    case EShareAllItemsResult :
+        {
+        // advance to next item set or end
+        AllItemsResultL();
+        }
+        break;
+    case ENotActive :
+        // informs handler that we are done
+        {
+        TInt err ( iStatus.Int() );
+        if ( iStopRequested == MUpnpSharingCallback::ESharingFullStop )
+            {
+            // normal case
+            err = KErrCancel;
+            iStopRequested = EFalse;
+            }
+
+        TRAP_IGNORE( 
+            iEngine->CompleteSharingOperationL( err,
+                                                iContainerType ));
+        }
+        break;
+
+    default :
+        {
+        __LOG( "RunL - default" );
+        }
+        break;
+        }
+
+    __LOG( "RunL - end" );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::DoCancel
+// Cancels active object
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::DoCancel()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::RunError
+// Cancels active object
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::RunError( TInt aError )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    __LOG8_1( "RunError = ", aError );
+    if ( aError == KErrNoMemory ||
+         aError == KErrDiskFull ||
+         aError == KErrCorrupt )
+        {
+        iSharingState = ENotActive;
+        }
+    if ( iSharingState == EUnshareContainers )
+        {
+        if ( iShareAllSelection == EShareNone )
+            {
+            iSharingState = ENotActive;
+            TRAP_IGNORE( iWriter->SaveSharingStateL( EShareNone ) );
+            }
+        else
+            {
+            iSharingState = EShareContainers;
+            }
+        }
+    else
+        {
+        iSharingState = ENotActive;
+        }
+    if ( iSharingState != EEnumerateSelections )
+        {
+        SelfComplete( aError );
+        }
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::IsActive()
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+TBool CUpnpContentSharingAo::IsActive() const
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    TBool ret( CActive::IsActive());
+    if ( !ret )
+        {
+        ret = iProfilerActive;
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::HandleSharingSubstatesL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::HandleSharingSubstatesL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    if ( iSharingSubState == EIdle )
+        {
+        if ( iSharingState == EShareItems )
+            {
+            ShareItemsL();
+            }
+        else if ( iSharingState == EShareAllItems )
+            {
+            ShareAllItemsL();
+            }
+        else
+            {
+            }
+        }
+    else if ( iSharingSubState == EProfileItemList )
+        {
+        ProfileItemListL();
+        }
+    else if ( iSharingSubState == EProfileItemListResult )
+        {
+        ProfileItemListResult();
+        }
+    else if ( iSharingSubState == EShareItemList )
+        {
+        TInt parentId( KErrNotFound );
+        if ( iSharingState == EShareItems )
+            {
+            parentId = iSharedContainerIds->operator[]( iContainerIdx );
+            }
+        else if ( iSharingState == EShareAllItems )
+            {
+            parentId = iContainerId;
+            }
+        else
+            {
+            }
+        ShareItemListL( parentId );
+        }
+    else if ( iSharingSubState == EShareItemListResult )
+        {
+        ShareItemListResultL();
+        }
+    else
+        {
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareFilesL
+// Starts file sharing
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::InitializeL(
+    TUpnpMediaType aContainerType,
+    const RArray<TInt>& aCurrentSelection,
+    CDesCArray& aPlaylistIds,
+    CDesCArray& aPlaylistNames,    
+    const TInt aContainerId )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    // Initialize values
+    iObjectIdx = 0;
+    iContainerIdx = 0;
+    iVideoIndex = 0;
+    iImageIndex = 0;
+    iAllVideosShared = EFalse;
+    iAllImagesShared = EFalse;
+    iSharingProgress = 0;
+
+    iContainerType = aContainerType;
+
+    delete iWriter;
+    iWriter = NULL;
+    iWriter = CUpnpSelectionWriter::NewL( iContainerType );
+
+    AdjustShareAllSelection( aCurrentSelection );
+    iCurrentSelections = aCurrentSelection;
+    iContainerIds = &aPlaylistIds;
+    iContainerNames = &aPlaylistNames;
+    iContainerId = aContainerId;
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareFilesL
+// Starts file sharing
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareFiles( )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    // Open file sharing session from mediaserver.
+    // Start offline if not started.
+    TInt status( RUpnpMediaServerClient::EStopped );
+    iMediaServer.Status( status );
+    if ( status == RUpnpMediaServerClient::EStopped )
+        {
+        iMediaServer.StartOffline();
+        }
+    iSharingState = EUnshareContainers;
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPSettingsEngineAO::CreateContainerL
+// creates container
+// --------------------------------------------------------------------------
+//
+CUpnpContainer* CUpnpContentSharingAo::CreateContainerL(
+    TUpnpMediaType aContainerType,
+    const TDesC8& aTitle ) const
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    CUpnpContainer* cont= CUpnpContainer::NewL();
+    CleanupStack::PushL( cont );
+    cont->SetParentIdL( KRootContainerIdDesc8 );
+    cont->SetTitleL( aTitle );
+    switch ( aContainerType )
+        {
+    case EImageAndVideo :
+        {
+        cont->SetObjectClassL( KImageVideoContainerClass );
+        }
+        break;
+    case EPlaylist :
+        {
+        cont->SetObjectClassL( KStorageFolderContainerClass );
+        }
+        break;
+    default :
+        {
+        __LOG( "CreateContainerL - default");
+        }
+        break;
+        }
+    CleanupStack::Pop( cont );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return cont;
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::CloseFileSharingSession
+// Closes mediaserver and file sharing session
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::CloseFileSharingSession()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    iMediaServer.Close();
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::UnshareContainersL
+// Unshares objects, this should only be called from RunL
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::UnshareContainersL( )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    // All old containers unshred, move to next state
+    if ( iShareAllSelection == EShareNone )
+        {
+        iSharingState = ENotActive;
+        iWriter->SaveSharingStateL( EShareNone );
+        }
+    else
+        {
+        iSharingState = EShareContainers;
+        }
+
+    // All old containers unshred, move to next state
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ConnectMediaServer
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::ConnectMediaServer()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    TInt error = iMediaServer.Connect();
+    __LOG8_1( "ConnectMediaServer error %d", error );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return error;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::AdjustShareAllSelection
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::AdjustShareAllSelection(
+    const RArray<TInt>& aSelections )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    if ( aSelections.Count() == 1 )
+        {
+
+        if ( aSelections[0] == 0 )
+            {
+            __LOG("CUpnpContentSharingAo::AdjustShareAllSelection: \
+EShareNone");
+            iShareAllSelection = EShareNone;
+            }
+        else if ( aSelections[0] == 1 )
+            {
+            __LOG("CUpnpContentSharingAo::AdjustShareAllSelection: \
+EShareAll");
+            iShareAllSelection = EShareAll;
+            }
+        else
+            {
+            __LOG("CUpnpContentSharingAo::AdjustShareAllSelection: \
+EShareMany");
+            iShareAllSelection = EShareMany;
+            }
+        }
+    else
+        {
+        __LOG("CUpnpContentSharingAo::AdjustShareAllSelection: EShareMany");
+        iShareAllSelection = EShareMany;
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareContainersL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareContainersL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    iMetadataUtility->ClearPostFiltersL();
+
+    TInt ind( 0 );
+    // Theres is still containers to share
+    switch ( iContainerType )
+        {
+    case EImageAndVideo :
+        {
+        // get the correct index for CLF
+        ind = GetContainerIndexL();
+        HBufC8* albumName( NULL );
+        if (  ind != KErrNotFound )
+            {
+            albumName = UpnpString::FromUnicodeL( 
+                iContainerNames->MdcaPoint( ind ) );
+            CleanupStack::PushL( albumName );
+
+            TInt plErr( KErrNone );
+
+                
+            if ( !plErr )
+                {
+                iWriter->AppendItemL( iContainerIds->MdcaPoint( ind ) );
+
+                iTmpContainer = CreateContainerL( iContainerType,
+                                                  *albumName );
+
+                iFileSharing->ShareContainerL(
+                    *UPnPCommonUtils::IntToDesC8LC ( iContainerId ),
+                    *iTmpContainer,
+                    iStatus );
+                CleanupStack::PopAndDestroy(); //UPnPCommonUtils::IntToDesC8LC
+                CleanupStack::PopAndDestroy( albumName );
+                SetActive();
+                }
+            else
+                {
+                SelfComplete( KErrNotFound );
+                }
+            }
+        else
+            {
+            SelfComplete( KErrNone );
+            }
+        }
+            break;
+    case EPlaylist :
+        {
+
+        // get the correct index for CLF
+        ind = GetContainerIndexL();
+        if ( ind != KErrNotFound )
+            {
+            HBufC8* playlistName( NULL );
+            playlistName = UpnpString::FromUnicodeL( 
+                iContainerNames->MdcaPoint( ind ) );
+            CleanupStack::PushL( playlistName  );
+
+            TInt plErr( KErrNone );
+            if ( !plErr )
+                {
+                // do the id..
+                iWriter->AppendItemL( iContainerIds->MdcaPoint( ind ) );
+
+                // ..then do the name for the container
+                iTmpContainer = CreateContainerL( iContainerType,
+                                                  *playlistName );
+
+                iFileSharing->ShareContainerL(
+                    *UPnPCommonUtils::IntToDesC8LC( iContainerId ),
+                    *iTmpContainer,
+                    iStatus );
+
+                CleanupStack::PopAndDestroy(); // IntToDesC8LC
+
+                SetActive();
+                }
+            else
+                {
+                SelfComplete( KErrNotFound );
+                }
+            CleanupStack::PopAndDestroy( playlistName );
+            }
+        else
+            {
+            SelfComplete( KErrNone );
+            }
+        }
+        break;
+    default :
+        break;
+        }
+
+    iSharingState = EShareContainersResult;
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareItemsL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareItemsL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    delete iFileNameArr;
+    iFileNameArr = NULL;
+    iFileNameArr = new (ELeave)
+    CDesCArrayFlat( 4 );
+    DeleteListUpnpObject();
+    iItemList = CUpnpItemList::NewL();
+    TInt ind( 0 );
+
+
+    TInt parentId( 0 );
+
+    switch ( iContainerType )
+        {
+    case EImageAndVideo :
+        {
+        if ( !iCollections ) 
+            {
+            iCollections = CUPnPAlbumServices::NewL();
+            }
+
+        // get the correct index for CLF
+        ind  = GetContainerIndexL();
+
+        // ..then do the name for the container
+        CDesCArray* items = new (ELeave) CDesCArrayFlat(4);
+        CleanupStack::PushL( items );
+        TInt itemCount( 0 );
+        if ( ind < iContainerIds->MdcaCount() && ind != KErrNotFound )
+            {
+            TPtrC plId( iContainerIds->MdcaPoint( ind ) );
+            TRAPD( albErr,  iCollections->OpenAlbumL( plId, 
+                                                      *items ));
+            delete iCollections;
+            iCollections = NULL;
+
+            if( !albErr )
+                {
+                itemCount = items->MdcaCount();
+                }
+            }
+
+        if ( itemCount )
+            {
+
+            parentId =
+                iSharedContainerIds->operator[]( iContainerIdx );
+            TInt i = iObjectIdx;
+
+            delete iFileNameArr;
+            iFileNameArr = NULL;
+            iFileNameArr = new (ELeave)
+                CDesCArrayFlat( 4 );
+            TBool canAppend = items->MdcaCount();
+
+            while ( i < itemCount && canAppend )
+                {
+                // process all items in curret collection
+                HBufC8* id = UPnPCommonUtils::IntToDesC8LC( parentId );
+                TPtrC item( items->MdcaPoint( i ) );
+                TRAPD( itemErr,
+                       iTmpItem = iMetadataUtility->CreateItemL(
+                           item,
+                           *id ));
+                if ( !itemErr && iTmpItem )
+                    {
+                    if ( !itemErr )
+                        {
+                        if( !iMetadataUtility->UpdateMetadataL( 
+                            EPhotoFile,
+                            iTmpItem,
+                            item ))
+                            {
+                            // The item was not found from prev model
+                            if( !iMetadataUtility->UpdateMetadataL( 
+                                EVideoFile,
+                                iTmpItem,
+                                item ) )
+                                {
+                                iTmpItem->SetObjectClassL( 
+                                    KImageItemObjectClass );
+                                }
+                            }
+                        iItemList->AppendObjectL( *iTmpItem );
+                        iFileNameArr->AppendL(
+                            item );
+                        // transfer ownership
+                        }
+                    else
+                        {
+                        delete iTmpItem;
+                        }
+                    iTmpItem = NULL;
+                    i++;
+                    if ( iItemList->ObjectCount() >
+                         KContentDirCommitAmount )
+                        {
+                        // the list is full, next share it
+                        canAppend = EFalse;
+                        // save the current position in list for
+                        // next run
+                        iObjectIdx = i;
+                        }
+                    }
+                else
+                    {
+                    i++;
+                    iTmpItem = NULL;
+                    }
+                CleanupStack::PopAndDestroy(); // IntToDesC8LC
+
+                }
+            }
+        CleanupStack::PopAndDestroy( items );     
+
+        if ( iItemList->ObjectCount() <= KContentDirCommitAmount )
+            {
+            // next time start with new album
+            iSharingProgress += iObjectIdx;
+            iObjectIdx = 0;
+            iMetadataUtility->ClearPostFiltersL();
+            }
+
+        if ( iItemList->ObjectCount() )
+            {
+            iSharingSubState = EProfileItemList;
+            SelfComplete( KErrNone );
+            }
+        else
+            {
+            // update indexes
+            iMetadataUtility->ClearPostFiltersL();
+            iSharingSubState = EShareItemListResult;
+            SelfComplete( KErrNone );
+            }
+        }
+        break;
+    case EPlaylist :
+        {
+        if ( !iPlaylists ) 
+            {
+            iPlaylists = CUPnPPlaylistServices::NewL();
+            }
+
+        // get the correct index for CLF
+        ind  = GetContainerIndexL();
+
+        // ..then do the name for the container
+        CDesCArray* items = new (ELeave) CDesCArrayFlat(4);
+        CleanupStack::PushL( items );
+        TInt itemCount( 0 );
+        if ( ind < iContainerIds->MdcaCount() && ind != KErrNotFound )
+            {
+            TPtrC plId( iContainerIds->MdcaPoint( ind ) );
+            TRAPD( plErr, iPlaylists->OpenPlaylistL( plId, 
+                                                     *items ) );
+            delete iPlaylists;
+            iPlaylists = NULL;
+
+            if( !plErr )
+                {
+                itemCount = items->MdcaCount();
+                }
+            }
+
+        if ( itemCount )
+            {
+
+            parentId =
+                iSharedContainerIds->operator[]( iContainerIdx );
+            TInt i = iObjectIdx;
+
+            TBool canAppend = items->MdcaCount();
+
+            while ( i < itemCount && canAppend )
+                {
+                // process all items in curret collection
+                HBufC8* id = UPnPCommonUtils::IntToDesC8LC( parentId );
+                TPtrC item( items->MdcaPoint( i ) );
+                TRAPD( plErr,
+                       iTmpItem = iMetadataUtility->CreateItemL(
+                           item,
+                           *id ));
+                if ( !plErr && iTmpItem )
+                    {
+                    if ( !plErr )
+                        {
+                        iMetadataUtility->UpdateMetadataL( 
+                            EMusicFile,
+                            iTmpItem,
+                            item );
+                        iTmpItem->SetObjectClassL( 
+                            KMusicItemObjectClass );
+                        iItemList->AppendObjectL( *iTmpItem );
+                        iFileNameArr->AppendL(
+                            item );
+                        // transfer ownership
+                        }
+                    else
+                        {
+                        delete iTmpItem;
+                        }
+                    iTmpItem = NULL;
+                    i++;
+                    if ( iItemList->ObjectCount() >
+                         KContentDirCommitAmount )
+                        {
+                        // the list is full, next share it
+                        canAppend = EFalse;
+                        // save the current position in list for
+                        // next run
+                        iObjectIdx = i;
+                        }
+                    }
+                else
+                    {
+                    i++;
+                    iTmpItem = NULL;
+                    }
+                CleanupStack::PopAndDestroy(); // IntToDesC8LC
+
+                }
+            }
+        CleanupStack::PopAndDestroy( items );
+
+        if ( iItemList->ObjectCount() <= KContentDirCommitAmount )
+            {
+            // next time start with new album
+            iSharingProgress += iObjectIdx;
+            iObjectIdx = 0;
+            iMetadataUtility->ClearPostFiltersL();
+            }
+
+
+        if ( iItemList->ObjectCount() )
+            {
+            iSharingSubState = EProfileItemList;
+            SelfComplete( KErrNone );
+            }
+        else
+            {
+            // goto RunL and update indexes
+            iMetadataUtility->ClearPostFiltersL();
+            iSharingSubState = EShareItemListResult;
+            SelfComplete( KErrNone );
+            }
+        }
+        break;
+    default :
+        break;
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareAllItemsL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareAllItemsL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    delete iFileNameArr;
+    iFileNameArr = NULL;
+    iFileNameArr = new (ELeave)
+        CDesCArrayFlat( 4 );
+
+    DeleteListUpnpObject();
+    iItemList = CUpnpItemList::NewL();
+
+    switch ( iContainerType )
+        {
+    case EImageAndVideo:
+        {
+        if ( !iAllImagesShared )
+            {
+            AppendImageFilesToListL();
+            }
+
+        // do not share videos if the list is already full
+        if ( !iAllVideosShared &&
+             iItemList->ObjectCount() <= KContentDirCommitAmount )
+            {
+            AppendVideoFilesToListL();
+            }
+        }
+        break;
+    case EPlaylist:
+        {
+        const MCLFItemListModel* list(NULL);
+        list = &iMetadataUtility->MusicFiles();
+        if ( !list )
+            {
+            User::Leave( KErrArgument );
+            }
+        TInt musicCount = list->ItemCount();
+
+        if ( iObjectIdx < musicCount )
+            {
+            // sharing images
+            TBool canAppend( list->ItemCount() );
+            TInt i( iObjectIdx );
+
+            while ( i < list->ItemCount() && canAppend )
+                {
+                // process all items in curret collection
+                HBufC8* id = UPnPCommonUtils::IntToDesC8LC(
+                    iContainerId );
+                TRAPD( plErr, iTmpItem = iMetadataUtility->CreateItemL(
+                           list->Item( i ),
+                           *id ));
+                if ( !plErr && iTmpItem )
+                    {
+                    TPtrC fullFileName;
+                    list->Item( i ).GetField( ECLFFieldIdFileNameAndPath,
+                                              fullFileName );
+
+                    if ( !plErr )
+                        {
+                        iMetadataUtility->UpdateMetadataL( 
+                            EMusicFile,
+                            iTmpItem,
+                            fullFileName );
+                        iTmpItem->SetObjectClassL( KMusicItemObjectClass );
+                        iItemList->AppendObjectL( *iTmpItem );
+                        iFileNameArr->AppendL( fullFileName );
+                        }
+                    else
+                        {
+                        delete iTmpItem;
+                        }
+                    iTmpItem = NULL;
+                    i++;
+                    if ( iItemList->ObjectCount() >
+                         KContentDirCommitAmount )
+                        {
+                        // the list is full, next share it
+                        canAppend = EFalse;
+                        }
+                    }
+                else
+                    {
+                    i++;
+                    iTmpItem = NULL;
+                    }
+
+                CleanupStack::PopAndDestroy(); // IntToDesC8LC
+                }
+            // save the current position in list, for next run
+            iObjectIdx = i;
+            }
+
+        }
+        break;
+    default :
+        break;
+        }
+
+    // do not share empty list
+    if ( iItemList->ObjectCount() )
+        {
+        iSharingSubState = EProfileItemList;
+        SelfComplete( KErrNone );
+        }
+    else
+        {
+        // update indexes
+        iSharingSubState = EShareItemListResult;
+        SelfComplete( KErrNone );
+        }
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ProfileItemListL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ProfileItemListL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    if ( iProfileInd < iItemList->ObjectCount() )
+        {
+        iProfilerActive = ETrue;
+
+        CUpnpItem*
+            tmpItem = static_cast<CUpnpItem*>(
+                iItemList->operator[]( iProfileInd ));
+
+        TPtrC fileName = iFileNameArr->MdcaPoint( iProfileInd );
+
+        iSharingSubState = EProfileItemListResult;
+
+        TRAPD( err, UpnpCdsResElementUtility::AddResElementL(
+                   *tmpItem,
+                   fileName ));
+        if ( iDeletePending )
+            {
+            DeleteListUpnpObject();
+            delete iFileNameArr;
+            iFileNameArr = NULL;
+            }
+        else
+            {
+            SetActive();
+            TRequestStatus* stat = &iStatus;
+            User::RequestComplete( stat, err );
+            }
+#ifdef _DEBUG
+        HBufC* log = HBufC::NewLC(512);
+        log->Des().Append(_L("CUpnpContentSharingAo: Profiling: "));
+        log->Des().Append( fileName );
+        __LOG16( *log );
+        __LOG2( "CUpnpContentSharingAo: Profile index: (%d of %d)", 
+                       iProfileInd, 
+                       iItemList->ObjectCount());
+        CleanupStack::PopAndDestroy( log );
+#endif
+        iProfilerActive = EFalse;
+        }
+    else
+        {
+        // update indexes
+        iProfileInd = 0;
+        iSharingSubState = EShareItemListResult;
+        SelfComplete( KErrNone );
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ProfileItemListResult
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ProfileItemListResult()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    if ( iStatus.Int() )
+        {
+        CUpnpItem* tmpItem = static_cast<CUpnpItem*>(
+            iItemList->operator[]( iProfileInd ));
+        TPtrC8 id( tmpItem->Id() );
+        iItemList->RemoveAndDestroy( id );
+        
+        iFileNameArr->Delete(iProfileInd);  
+        }
+    else
+        {
+        iProfileInd++; 
+        }
+
+    if ( iProfileInd < iItemList->ObjectCount() )
+        {
+        iSharingSubState = EProfileItemList;
+        }
+    else
+        {
+        iProfileInd = 0;
+        delete iFileNameArr;
+        iFileNameArr = NULL;
+        iSharingSubState = EShareItemList;
+        }
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareItemListL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareItemListL( const TInt& aParentId )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    // do not share empty list
+    if ( iItemList && iItemList->ObjectCount() )
+        {
+        iFileSharing->ShareItemListL(
+            *UPnPCommonUtils::IntToDesC8LC( aParentId ),
+            *iItemList,
+            iSharedContainersCount, iStatus );
+        CleanupStack::PopAndDestroy(); // UPnPCommonUtils::IntToDesC8LC
+        iSharingSubState = EShareItemListResult;
+        SetActive();
+        }
+    else
+        {
+        // update indexes
+        iSharingSubState = EShareItemListResult;
+        SelfComplete( KErrNone );
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareItemListResultL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareItemListResultL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    iTmpItem = NULL;
+    if ( iSharingState == EShareItems )
+        {
+        ShareItemsResultL();
+        }
+    else if ( iSharingState == EShareAllItems )
+        {
+        AllItemsResultL();
+        }
+    iSharingSubState = EIdle;
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::AllItemsResultL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::AllItemsResultL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    TInt totalItemCount( 0 );
+
+    if ( iItemList )
+        {
+        // This updates the field needed in UI for progress
+        iSharingProgress += iItemList->ObjectCount();
+        iEngine->SetProgressL( iSharingProgress );
+        DeleteListUpnpObject();
+        delete iFileNameArr;
+        iFileNameArr = NULL;
+        }
+    iTmpItem = NULL;
+
+    switch ( iContainerType )
+        {
+    case EImageAndVideo:
+        {
+        totalItemCount = iMetadataUtility->ImageFiles().ItemCount() +
+            iMetadataUtility->VideoFiles().ItemCount();
+        }
+        break;
+    case EPlaylist :
+        {
+        totalItemCount = iMetadataUtility->MusicFiles().ItemCount();
+        }
+        break;
+    default :
+        break;
+        }
+    // Fix EYSN-7CWDZ5 error in UPnP FW2.1  
+    // Have not changed it in UPnP FW2.5 because the FW 2.5 have 
+    // so much change. 
+    if ( iObjectIdx < totalItemCount )
+        {
+        // Continue sharing process since not everything is shared yet.
+        iSharingState = EShareAllItems;
+        }
+    else
+        {
+        if ( !iWriter )
+            {
+            User::Leave( KErrGeneral );
+            }
+        iWriter->SaveSharingStateL( iShareAllSelection );
+        iSharingState = ENotActive;
+
+        }
+
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareContainersResultL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::ShareContainersResultL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+
+    if ( !iStatus.Int() )
+        {
+        // previous container shared OK, save the album name
+        iWriter->AppendStatusL( iContainerIdx );
+        }
+
+    if ( iTmpContainer )
+        {
+        TInt newId = UPnPCommonUtils::DesC8ToInt( iTmpContainer->Id() );
+        __LOG1("CUpnpContentSharingAo::ShareContainersResultL:\
+ id: %d", newId );
+        if ( !iSharedContainerIds )
+            {
+            iSharedContainerIds =
+                new (ELeave) CArrayFixFlat<TInt>( 10 );
+            }
+        iSharedContainerIds->AppendL( newId );
+        delete iTmpContainer;
+        iTmpContainer = NULL;
+        }
+
+    TInt totalContainers( 0 );
+    // determine next state
+    if ( iShareAllSelection == EShareAll )
+        {
+        switch ( iContainerType )
+            {
+            // totalContainers is used as index -> -1
+        case EImageAndVideo :
+            {
+            totalContainers = iContainerIds->MdcaCount() -1;
+            }
+            break;
+        case EPlaylist :
+            {
+            totalContainers = iContainerIds->MdcaCount() -1;
+            }
+            break;
+        default:
+            break;
+            }
+        }
+    else if ( iShareAllSelection == EShareMany )
+        {
+        totalContainers = iCurrentSelections.Count() -1;
+        }
+
+    if ( iContainerIdx < totalContainers )
+        {
+        iContainerIdx++;
+        iSharingState = EShareContainers;
+        }
+    else
+        {
+        // all selected containers shared, next share items
+        iContainerIdx = 0;
+        iSharingState = EShareItems;
+        }
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::ShareItemsResultL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+void CUpnpContentSharingAo::ShareItemsResultL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    if ( !iMetadataUtility )
+        {
+        User::Leave( KErrGeneral );
+        }
+
+    if ( iItemList )
+        {
+        // This updates the field needed in UI for progress
+        iSharingProgress += iItemList->ObjectCount();
+        iEngine->SetProgressL( iSharingProgress );
+        DeleteListUpnpObject();
+        delete iFileNameArr;
+        iFileNameArr = NULL;
+        }
+    iTmpItem = NULL;
+    iSharingState = EShareItems;
+
+    TInt totalContainers( 0 );
+    // Clear postfilters, they are re-set if needed: ShareItemsL/
+    // ShareAllItemsL
+    iMetadataUtility->ClearPostFiltersL();
+    // determine next state
+    if ( iShareAllSelection == EShareAll )
+        {
+        switch ( iContainerType )
+            {
+        case EImageAndVideo :
+            {
+            totalContainers = iContainerIds->MdcaCount() -1;
+            }
+            break;
+        case EPlaylist :
+            {
+            totalContainers = iContainerIds->MdcaCount() -1;
+                
+            }
+            break;
+        default:
+            break;
+            }
+        }
+    else if ( iShareAllSelection == EShareMany )
+        {
+        if( iSharedContainerIds )
+            {
+            totalContainers = iSharedContainerIds->Count() -1;
+            }
+        else
+            {
+            // sharing of all containers failed or the containers under 
+            // sharing were deleted
+            totalContainers = KErrNotFound;
+            }
+        }
+
+
+    if ( !iObjectIdx )
+        {
+
+        // all files were shared from current container
+        if ( iContainerIdx < totalContainers )
+            {
+            // more items in the selected..
+            iContainerIdx++;
+            }
+        else
+            {
+            // all selected containers shared..
+            if ( iShareAllSelection == EShareAll )
+                {
+                // next share individual files
+                iSharingState = EShareAllItems;
+                }
+            else
+                {
+                // sharing process is done.
+                if ( totalContainers == KErrNotFound )
+                    {
+                    iShareAllSelection = EShareNone;
+                    }
+                iWriter->SaveSharingStateL( iShareAllSelection );
+                iSharingState = ENotActive;
+                }
+            }
+        }
+
+    SelfComplete( KErrNone );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::SelectionObjectCountL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::SelectionObjectCountL(
+    const TUpnpMediaType aContainerType )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+    TInt totalCount( 0);
+    if ( iShareAllSelection != EShareNone )
+        {
+        switch ( aContainerType )
+            {
+        case EImageAndVideo :
+            {
+            if ( !iCollections ) 
+                {
+                iCollections = CUPnPAlbumServices::NewL();
+                }
+            __LOG("albumserv created");
+            CDesCArray* collIds = new ( ELeave ) CDesCArrayFlat( 
+                KDefaultGranularity );
+            CleanupStack::PushL( collIds );
+            CDesCArray* collNames = new ( ELeave ) CDesCArrayFlat( 
+                KDefaultGranularity );
+            CleanupStack::PushL( collNames );
+            iCollections->ListAlbumsL( *collIds, *collNames );
+            __LOG("albums listed");
+            collNames->Reset();
+
+            if ( iShareAllSelection == EShareAll )
+                {
+                __LOG("EShareAll");
+                for( TInt i(0); i<collIds->MdcaCount(); i++ )
+                    {
+                    TPtrC id( collIds->MdcaPoint( i ) );
+                    RDebug::Print(_L("id: %S"), &id );
+                    TRAPD( lcode, iCollections->OpenAlbumL( id,
+                                                            *collNames ));
+                    if( !lcode )
+                        {
+                        totalCount += collNames->MdcaCount();
+                        }
+                    else
+                        {
+                        }
+                    collNames->Reset();
+                    __LOG("Loop cycle end");
+                    }
+                __LOG("Loop done");
+                // Add individual files count
+                const MCLFItemListModel* imgList =
+                    &iMetadataUtility->ImageFiles();
+                totalCount += imgList->ItemCount();
+                const MCLFItemListModel* vidList =
+                    &iMetadataUtility->VideoFiles();
+                totalCount += vidList->ItemCount();
+                __LOG("EShareAll done");
+                }
+            else if ( iShareAllSelection == EShareMany )
+                {
+                for( iContainerIdx = 0; 
+                     iContainerIdx < iCurrentSelections.Count();
+                     iContainerIdx++ )
+                    {
+                    TInt ind = GetContainerIndexL(); 
+
+                    if ( ind != KErrNotFound )
+                        {
+                        TPtrC id = iContainerIds->MdcaPoint( ind );
+                        TRAPD( openErr, iCollections->OpenAlbumL( 
+                                   id, 
+                                   *collNames ));
+                        if( !openErr )
+                            {
+                            totalCount += collNames->MdcaCount();
+                            collNames->Reset();
+                            }
+                        }
+                    __LOG("end for(..)");
+                    }
+                iContainerIdx = 0;
+                }
+            delete iCollections;
+            iCollections = NULL;
+            __LOG("iCollections deleted");
+            CleanupStack::PopAndDestroy( collNames );
+            CleanupStack::PopAndDestroy( collIds );
+            }
+            break;
+        case EPlaylist :
+            {
+            if ( !iPlaylists ) 
+                {
+                iPlaylists = CUPnPPlaylistServices::NewL();
+                }
+
+            CDesCArray* plIds = new ( ELeave ) CDesCArrayFlat( 
+                KDefaultGranularity );
+            CleanupStack::PushL( plIds );
+            CDesCArray* plNames = new ( ELeave ) CDesCArrayFlat( 
+                KDefaultGranularity );
+            CleanupStack::PushL( plNames );
+            iPlaylists->ListPlaylistsL( *plIds, *plNames );
+            plNames->Reset();
+
+            if ( iShareAllSelection == EShareAll )
+                {
+                for( TInt i(0); i<plIds->MdcaCount(); i++ )
+                    {
+                    TPtrC id( plIds->MdcaPoint( i ) );
+                    iPlaylists->OpenPlaylistL( id,
+                                               *plNames );
+
+                    totalCount += plNames->MdcaCount();
+                    plNames->Reset();
+                    }
+                // Add individual files count
+                const MCLFItemListModel* musicList =
+                    &iMetadataUtility->MusicFiles();
+                totalCount += musicList->ItemCount();
+                }
+            else if ( iShareAllSelection == EShareMany )
+                {
+                for( iContainerIdx = 0; 
+                     iContainerIdx < iCurrentSelections.Count();
+                     iContainerIdx++ )
+                    {
+                    TInt ind = GetContainerIndexL(); 
+
+                    if ( ind != KErrNotFound )
+                        {
+                        TPtrC id = iContainerIds->MdcaPoint( ind );
+                        iPlaylists->OpenPlaylistL( id, 
+                                                   *plNames );
+                        totalCount += plNames->MdcaCount();
+                        plNames->Reset();
+                        }
+                    
+                    }
+                iContainerIdx = 0;
+                }
+            delete iPlaylists;
+            iPlaylists = NULL;
+            CleanupStack::PopAndDestroy( plNames );
+            CleanupStack::PopAndDestroy( plIds );
+            }
+            break;
+        default :
+            {
+            }
+            break;
+            }
+        }
+    __LOG1("CUpnpContentSharingAo::SelectionObjectCountL: totalCount: %d",
+        totalCount );
+
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return totalCount;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::SharingProgress
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::SharingProgress(
+    TUpnpMediaType& aContainerType ) const
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    aContainerType = iContainerType;
+    __LOG1("CUpnpContentSharingAo::SharingProgress: iObjectIdx: %d",
+        iSharingProgress );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return iSharingProgress;
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::GetContainerIndexL
+// Returns IntValue for aObject
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::GetContainerIndexL()
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    TInt ind( KErrNone );
+    if ( iShareAllSelection == EShareAll )
+        {
+        if( iContainerIds->MdcaCount() )
+            {
+            ind = iContainerIdx;
+            }
+        else
+            {
+            ind = KErrNotFound;
+            }
+        }
+    else if ( iContainerIdx >= iCurrentSelections.Count() ||
+        ( iCurrentSelections[ iContainerIdx ]- KUiSelectionOffset 
+          >= iContainerIds->MdcaCount() ))
+        {
+        ind = KErrNotFound;
+        }
+    else
+        {
+        if ( iShareAllSelection == EShareMany )
+            {
+            ind = iCurrentSelections[ iContainerIdx ] 
+                - KUiSelectionOffset;
+            
+            }
+        else
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return ind; // correct index or KErrNotFound
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::SelfComplete
+// Complete own request
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::SelfComplete( const TInt aError )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    if ( iStopRequested )
+        {
+        iSharingState = ENotActive;
+        }
+    SetActive();
+    TRequestStatus* stat = &iStatus;
+    User::RequestComplete( stat, aError );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::AppendImageFilesToListL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::AppendImageFilesToListL()
+    {
+    // Obtain list of image files from CLF
+    const MCLFItemListModel* list(NULL);
+    list = &iMetadataUtility->ImageFiles();
+    if ( !list )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    // check if the iImageIndex is still less than the number of images
+    //       -> there are still images to be shared
+    TInt imageCount = list->ItemCount();
+    if ( !imageCount )
+        {
+        iAllImagesShared = ETrue;
+        return;
+        }
+
+    if ( iImageIndex < imageCount )
+        {
+
+        // Prepare storage for filenames
+        // Loop until all images are processed or until we have
+        // KContentDirCommitAmount files in the list of objects to be shared.
+        while ( !iAllImagesShared &&
+                iItemList->ObjectCount() <= KContentDirCommitAmount )
+            {
+            // Create an item with parent id of Images&Videos container.
+            HBufC8* id = UPnPCommonUtils::IntToDesC8LC(
+                iContainerId );
+            TRAPD( imgErr, iTmpItem = iMetadataUtility->CreateItemL(
+                       list->Item( iImageIndex ),
+                       *id ) );
+
+            if ( !imgErr && iTmpItem )
+                {
+                TPtrC fullFileName;
+                list->Item( iImageIndex ).GetField( 
+                    ECLFFieldIdFileNameAndPath,
+                    fullFileName );
+
+                if ( !imgErr && iTmpItem )
+                    {
+                    // Update item's metadata and append it to iItemList.
+                    iMetadataUtility->UpdateMetadataL( 
+                        EPhotoFile,
+                        iTmpItem,
+                        fullFileName );
+                    iTmpItem->SetObjectClassL( KImageItemObjectClass );
+                    iItemList->AppendObjectL( *iTmpItem );
+                    iFileNameArr->AppendL( fullFileName );
+                    }
+                else
+                    {
+                    delete iTmpItem;
+                    }
+                }
+            else
+                {
+                }
+
+            // set iTmpItem to NULL
+            iTmpItem = NULL;
+
+            // clean up
+            CleanupStack::PopAndDestroy(); // IntToDesC8LC
+
+            // increment counter to process next image.
+            iImageIndex++;
+
+            if ( iImageIndex >= imageCount )
+                {
+                iAllImagesShared = ETrue;
+                }
+            }
+
+        }
+    // update iObjectIdx to keep the progressbar ok.
+    iObjectIdx = iImageIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::AppendVideoFilesToListL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::AppendVideoFilesToListL()
+    {
+    // Obtain list of video files from CLF
+    const MCLFItemListModel* list(NULL);
+    list = &iMetadataUtility->VideoFiles();
+    if ( !list )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    // Obtain the number of video file items in the list.
+    TInt videoCount( list->ItemCount() );
+    if ( !videoCount )
+        {
+        iAllVideosShared = ETrue;
+        return;
+        }
+
+    // Check that there are still videos to be shared.
+    if ( iVideoIndex < videoCount )
+        {
+
+        if ( !iFileNameArr )
+            {
+            iFileNameArr = new (ELeave)
+                CDesCArrayFlat( 4 );
+            }
+        // Loop until all videos are processed or until we have
+        // KContentDirCommitAmount files in the list of objects to be shared.
+        while ( !iAllVideosShared &&
+                iItemList->ObjectCount() <= KContentDirCommitAmount )
+            {
+            // Create an item with parent id of Images&Videos container.
+            HBufC8* id = UPnPCommonUtils::IntToDesC8LC(
+                iContainerId );
+            TRAPD( vidErr, iTmpItem = iMetadataUtility->CreateItemL(
+                       list->Item( iVideoIndex ),
+                       *id ) );
+
+            if ( !vidErr && iTmpItem )
+                {
+                TPtrC fullFileName;
+                list->Item( iVideoIndex ).GetField( 
+                    ECLFFieldIdFileNameAndPath,
+                    fullFileName );
+               
+
+                if ( !vidErr && iTmpItem )
+                    {
+                    // Update item's metadata and append it to iItemList.
+                    iMetadataUtility->UpdateMetadataL( 
+                        EVideoFile,
+                        iTmpItem,
+                        fullFileName );
+                    iTmpItem->SetObjectClassL( KVideoItemObjectClass );
+                    iItemList->AppendObjectL( *iTmpItem );
+                    iFileNameArr->AppendL( fullFileName );
+                    }
+                else
+                    {
+                    delete iTmpItem;
+                    iTmpItem = NULL;
+                    }
+                }
+            else
+                {
+                }
+
+            // set iTmpItem to NULL
+            iTmpItem = NULL;
+
+            // clean up
+            CleanupStack::PopAndDestroy(); // IntToDesC8LC
+
+            // increment counter to process next video.
+            iVideoIndex++;
+
+            if ( iVideoIndex >= videoCount )
+                {
+                // all videos are processed.
+                // Set iAllVideosShared -> ETrue to end the while loop.
+                iAllVideosShared = ETrue;
+                }
+            }
+        }
+
+    // update iObjectIdx to keep the progressbar ok.
+    // Remember to add iImageIndex here!
+    iObjectIdx = iImageIndex + iVideoIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::RequestStop
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+void CUpnpContentSharingAo::RequestStop( 
+    MUpnpSharingCallback::TSharingStopType aStopType )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    iStopRequested = aStopType;
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpContentSharingAo::GetPlaylistNameByIdL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentSharingAo::GetContainerNameByIdL( const TDesC& aId,
+                                                   TDes8& aPlaylistName,
+                                                   const TInt aContainerType )
+    {
+    __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+    TInt err( KErrNone );
+    CDesCArray* newIds = new ( ELeave )CDesCArrayFlat( 4 );
+    CleanupStack::PushL(newIds);
+    CDesCArray* newNames = new ( ELeave )CDesCArrayFlat( 4 );
+    CleanupStack::PushL(newNames);
+
+    if( aContainerType == EImageAndVideo )
+        {
+        if ( !iCollections ) 
+            {
+            iCollections = CUPnPAlbumServices::NewL();
+            }
+        iCollections->ListAlbumsL( *newIds, *newNames );
+        delete iCollections;
+        iCollections = NULL;
+        }
+    else if ( aContainerType == EPlaylist )
+        {
+        if ( !iPlaylists ) 
+            {
+            iPlaylists = CUPnPPlaylistServices::NewL();
+            }
+        iPlaylists->ListPlaylistsL( *newIds, *newNames );
+        delete iPlaylists;
+        iPlaylists = NULL;
+        }
+
+    if ( !newIds->MdcaCount() )
+        {
+        err = KErrGeneral;
+        }
+    else
+        {
+        for ( TInt i(0); i<newIds->MdcaCount();i++ )
+            {
+            if ( aId.Compare( newIds->MdcaPoint( i ) ) == 0 )
+                {
+                HBufC8* name8 = 
+                    UpnpString::FromUnicodeL( newNames->MdcaPoint( i ) );
+                CleanupStack::PushL( name8 );
+                TPtr8 name8tmp = name8->Des();
+                aPlaylistName = name8tmp;
+                CleanupStack::PopAndDestroy( name8 );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( newNames );
+    CleanupStack::PopAndDestroy( newIds );
+    __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+    return err;
+    }
+
+void CUpnpContentSharingAo::DeleteListUpnpObject()
+    {
+    if ( iItemList )
+        {
+        TInt count = iItemList->ObjectCount();
+        for ( TInt i = count - 1; i >= 0; --i )
+            {
+            CUpnpItem* tmpItem = static_cast<CUpnpItem*>(
+                iItemList->operator[]( i ));
+            TPtrC8 id( tmpItem->Id() );
+            iItemList->RemoveAndDestroy( id ); 
+            } 
+        delete iItemList;
+        iItemList = NULL;
+        }
+    }
+// End of file