--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpsharingalgorithm/src/upnpcdsreaderao.cpp Wed Nov 03 11:45:09 2010 +0200
@@ -0,0 +1,330 @@
+/**
+ * Copyright (c) 2009 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: CUpnpCdsReaderAO class implementation
+ *
+ */
+
+// INCLUDES
+#include <upnpfilesharing.h>
+#include <upnpobject.h>
+
+#include "upnpcdsreaderao.h"
+#include "upnpsharingalgorithmconstants.h"
+#include "upnplog.h"
+#include "upnpcommonutils.h"
+#include "upnpcdsliteobjectarray.h"
+#include "upnpbrowsecriteria.h"
+#include "upnpcontainerlist.h"
+#include "upnpitemlist.h"
+
+const TInt KDefaultBrowseReqCount( 50 );
+const TInt KLoopLimit( 3 );
+
+// --------------------------------------------------------------------------
+// CUpnpSecAccessController::NewL
+// --------------------------------------------------------------------------
+//
+CUpnpCdsReaderAO* CUpnpCdsReaderAO::NewL(
+ CUpnpCdsLiteObjectArray& aUpnpCdsLiteObjects )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::NewL" );
+
+ CUpnpCdsReaderAO* self = new ( ELeave ) CUpnpCdsReaderAO(
+ aUpnpCdsLiteObjects );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::ConstructL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::ConstructL()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::ConstructL" );
+
+ if ( !CActiveScheduler::Current() )
+ {
+ iScheduler = new ( ELeave ) CActiveScheduler;
+ CActiveScheduler::Install( iScheduler );
+ }
+ // Add this active object to the active scheduler.
+ CActiveScheduler::Add( this );
+
+ iFileSharing = CUpnpFileSharing::NewL();
+ iWaitRequest = new ( ELeave ) CActiveSchedulerWait();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::~CUpnpCdsReaderAO
+// --------------------------------------------------------------------------
+//
+CUpnpCdsReaderAO::~CUpnpCdsReaderAO()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::~CUpnpCdsReaderAO" );
+
+ delete iFileSharing;
+ delete iWaitRequest;
+
+ if ( CActiveScheduler::Current() == iScheduler )
+ {
+ CActiveScheduler::Install( NULL );
+ }
+ delete iScheduler;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::ReadCdsStructureL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::ReadCdsStructureL()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::ReadCdsStructureL" );
+
+ // Start reading from root container
+ GetContainersL( KRootContainer );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::GetContainersL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::GetContainersL( const TDesC8& aContainerId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::GetContainersL" );
+
+ // Get all items of container with id aContainerId
+ GetItemsL( aContainerId );
+
+ // Number of found items. Count is initialized as KDefaultBrowseReqCount
+ // to get into the while loop. Loop ends, when GetSharedItemListL
+ // request does not get new objects
+ TInt count( KDefaultBrowseReqCount );
+ TInt startingIndex( 0 );
+ TInt loopCounter( 0 );
+
+ while ( startingIndex < count )
+ {
+ count = 0;
+
+ CUpnpContainerList* containerList = CUpnpContainerList::NewL();
+ CleanupStack::PushL( containerList );
+
+ CUpnpBrowseCriteria* browseCriteria = CUpnpBrowseCriteria::NewLC();
+ browseCriteria->SetRequestedCount( KDefaultBrowseReqCount );
+ browseCriteria->SetStartingIndex( startingIndex );
+ browseCriteria->SetFilterL( KBrowseCriteriaFilter );
+
+ // Query all items and containers with container id aContainerId
+ iFileSharing->GetSharedContainerListL(
+ UPnPCommonUtils::DesC8ToInt( aContainerId ),
+ *browseCriteria,
+ *containerList,
+ count,
+ iStatus );
+
+ CleanupStack::PopAndDestroy( browseCriteria );
+
+ // Wait for the request to complete
+ CompleteRequestL();
+
+ // Leave, if GetSharedContainerListL gives continuously zero items
+ if ( !containerList->ObjectCount() )
+ {
+ loopCounter += 1;
+ if ( loopCounter >= KLoopLimit )
+ {
+ User::Leave( KErrGeneral );
+ }
+ }
+ else
+ {
+ loopCounter = 0;
+ }
+
+ for ( TInt index( 0 ); index < containerList->ObjectCount(); index++ )
+ {
+ // Append container to the objects array
+ iUpnpCdsLiteObjects.AppendL( ( *containerList )[ index ] );
+ // Call object search recursively for each found container
+ GetContainersL( ( *containerList )[ index ]->Id() );
+ }
+
+ startingIndex += containerList->ObjectCount();
+
+ CleanupStack::PopAndDestroy( containerList );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::GetItemsL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::GetItemsL( const TDesC8& aContainerId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::GetItemsL" );
+
+ // Number of found items. Count is initialized as KDefaultBrowseReqCount
+ // to get into the while loop. Loop ends, when GetSharedItemListL
+ // request does not get new objects
+ TInt count( KDefaultBrowseReqCount );
+ TInt startingIndex( 0 );
+ TInt loopCounter( 0 );
+
+ while ( startingIndex < count )
+ {
+ count = 0;
+
+ CUpnpItemList* itemList = CUpnpItemList::NewL();
+ CleanupStack::PushL( itemList );
+
+ CUpnpBrowseCriteria* browseCriteria = CUpnpBrowseCriteria::NewLC();
+ browseCriteria->SetRequestedCount( KDefaultBrowseReqCount );
+ browseCriteria->SetStartingIndex( startingIndex );
+ browseCriteria->SetFilterL( KBrowseCriteriaFilter );
+
+ // Query all items of container with container id aContainerId
+ iFileSharing->GetSharedItemListL(
+ UPnPCommonUtils::DesC8ToInt( aContainerId ),
+ *browseCriteria,
+ *itemList,
+ count,
+ iStatus );
+
+ CleanupStack::PopAndDestroy( browseCriteria );
+
+ // Wait for the request to complete
+ CompleteRequestL();
+
+ // Leave, if GetSharedContainerListL gives continuously zero items
+ if ( !itemList->ObjectCount() )
+ {
+ loopCounter += 1;
+ if ( loopCounter >= KLoopLimit )
+ {
+ User::Leave( KErrGeneral );
+ }
+ }
+ else
+ {
+ loopCounter = 0;
+ }
+
+ // Append files to the objects array
+ for ( TInt index( 0 ); index < itemList->ObjectCount(); index++ )
+ {
+ // Local media applications store temporary items under
+ // root container. Therefore items whose parent container
+ // is root, are not appended to the objects array.
+ if ( ( *itemList )[ index ]->ParentId().Match( KRootContainer )
+ == KErrNotFound )
+ {
+ iUpnpCdsLiteObjects.AppendL( ( *itemList )[ index ] );
+ }
+ }
+
+ startingIndex += itemList->ObjectCount();
+
+ CleanupStack::PopAndDestroy( itemList );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::RunL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::RunL()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::RunL" );
+
+ // Request completed - no need to wait anymore
+ // Let ao caller to continue
+ StopWaitingRequestComplete();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::DoCancel
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::DoCancel()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::DoCancel" );
+
+ Cancel();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::WaitRequestToComplete
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::WaitRequestToComplete()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::\
+WaitRequestToComplete" );
+
+ // Wait for a request to complete
+ if ( iWaitRequest && !iWaitRequest->IsStarted() )
+ {
+ iWaitRequest->Start();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::StopWaitingRequestComplete
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::StopWaitingRequestComplete()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::\
+StopWaitingRequestComplete" );
+
+ // Stop waiting process after query has been completed
+ if ( iWaitRequest && iWaitRequest->IsStarted() )
+ {
+ iWaitRequest->AsyncStop();
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsReaderAO::CompleteRequestL
+// --------------------------------------------------------------------------
+//
+void CUpnpCdsReaderAO::CompleteRequestL()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsReaderAO::\
+CompleteRequestL" );
+
+ if ( !IsActive() )
+ {
+ SetActive();
+ }
+ else
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // Wait for request to complete
+ WaitRequestToComplete();
+
+ // Leave if error happens
+ if ( iStatus.Int() != KErrNone &&
+ iStatus.Int() != KErrNotFound )
+ {
+ User::Leave( iStatus.Int() );
+ }
+ }
+
+// End of File