--- /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