--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/applicationengine/src/upnpcontentshareao.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: CUpnpContentShareAO class implementation
+*
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+
+#include "upnpcontentshareao.h"
+#include "upnpfilesharingengine.h"
+
+_LIT( KComponentLogfile, "applicationengine.txt");
+#include "upnplog.h"
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::CUpnpContentShareAO
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUpnpContentShareAO::CUpnpContentShareAO(
+ CUPnPFileSharingEngine& aEngine,
+ RUpnpContentServerClient& aContentServer ):
+ CActive( CActive::EPriorityStandard ),
+ iEngine( aEngine ),
+ iContentServer( aContentServer )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::ConstructL()
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::ConstructL()
+ {
+ __LOG( "CUpnpContentShareAO::ConstructL" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::NewL
+// --------------------------------------------------------------------------
+//
+CUpnpContentShareAO* CUpnpContentShareAO::NewL(
+ CUPnPFileSharingEngine& aEngine,
+ RUpnpContentServerClient& aContentServer )
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::NewL begin" );
+ CUpnpContentShareAO* self = CUpnpContentShareAO::NewLC(
+ aEngine, aContentServer );
+ CleanupStack::Pop( self );
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::NewL end" );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::NewLC
+// --------------------------------------------------------------------------
+//
+CUpnpContentShareAO* CUpnpContentShareAO::NewLC(
+ CUPnPFileSharingEngine& aEngine,
+ RUpnpContentServerClient& aContentServer )
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::NewLC begin" );
+ CUpnpContentShareAO* self = new( ELeave )
+ CUpnpContentShareAO( aEngine, aContentServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::NewLC end" );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::~CUpnpContentShareAO()
+// Destructor
+// --------------------------------------------------------------------------
+//
+CUpnpContentShareAO::~CUpnpContentShareAO()
+ {
+ __LOG( "CUpnpContentShareAO::~CUpnpContentShareAO " );
+
+ iQueuedSelections.ResetAndDestroy();
+ iQueuedSelections.Close();
+ iQueuedTypes.Close();
+
+ Cancel();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::ChangeSharedContentL()
+// Sends the selected indexes to server and starts sharing
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::ChangeSharedContentL(
+ UpnpContentServer::TUpnpMediaType aType,
+ const CArrayFix<TInt>& aMarkedItems )
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::\
+ChangeSharedContentL begin" );
+
+ if ( !IsActive() )
+ {
+ __ASSERTD( iQueuedTypes.Count() == 0, __FILE__, __LINE__ );
+ iContentServer.ChangeSharedContentL( aType, aMarkedItems, iStatus );
+ iStatus = KRequestPending;
+ SetActive();
+ }
+ else
+ {
+ //remove all queued requests with this type
+ RemoveQueuedObjectByType( aType );
+
+ //queue this request
+ CArrayFix<TInt>* selections =
+ new ( ELeave ) CArrayFixFlat<TInt>( aMarkedItems.Count() );
+ CleanupStack::PushL( selections );
+ for ( TInt i ( 0 ); i < aMarkedItems.Count(); i++ )
+ {
+ selections->AppendL( aMarkedItems.At(i) );
+ }
+
+ AppendQueuedObjectL( aType, selections );
+ CleanupStack::Pop( selections );
+ __ASSERTD( iQueuedSelections.Count() == iQueuedTypes.Count(),
+ __FILE__, __LINE__ );
+ }
+
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::\
+ChangeSharedContentL end" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::RefreshSharedContentL()
+// Updates shared objects in mediaserver
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::RefreshSharedContentL(
+ UpnpContentServer::TUpnpMediaType aType )
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::\
+RefreshSharedContentL begin" );
+ if ( !IsActive() )
+ {
+ __ASSERTD( iQueuedTypes.Count() == 0, __FILE__, __LINE__ );
+ iContentServer.RefreshSharedContentL( aType, iStatus );
+ iStatus = KRequestPending;
+ SetActive();
+ }
+ else
+ {
+ //remove all queued requests with this type
+ RemoveQueuedObjectByType( aType );
+
+ //queue this request
+ CArrayFix<TInt>* selections( NULL );
+ AppendQueuedObjectL( aType, selections );
+ __ASSERTD( iQueuedSelections.Count() == iQueuedTypes.Count(),
+ __FILE__, __LINE__ );
+ }
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::\
+RefreshSharedContentL end" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::DoCancel
+// Cancel the operation
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::DoCancel()
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::DoCancel" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::RunL
+// Function is called when active request is ready
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::RunL()
+ {
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::RunL begin" );
+ __LOG1( "[UPNP_ENGINE]\t\t status: %d", iStatus.Int() );
+
+ TInt err = iStatus.Int();
+ if ( err &&
+ err != KErrServerBusy )
+ {
+ // KErrServerBusy is a response to the
+ // CUpnpContentServer::RefreshSharedContentL call. Therefore we must
+ // not leave without cleaning queued objects.
+ // Otherwise next call to CUpnpContentShareAO::RefreshSharedContentL
+ // will panic (in UDEB builds only!!!!).
+
+ // Clears queued objects and leaves.
+ iQueuedSelections.ResetAndDestroy();
+ iQueuedTypes.Reset();
+ User::Leave( err );
+ }
+
+ //When get the responce from the content server then change the UI
+ iEngine.RequestSharingProgressL();
+
+ if ( iQueuedTypes.Count() )
+ {
+ // Get next queued objects
+ UpnpContentServer::TUpnpMediaType type = iQueuedTypes[ 0 ];
+ CArrayFix<TInt>* selections = iQueuedSelections[ 0 ];
+
+ // Clear arrays.
+ iQueuedSelections.Remove( 0 );
+ iQueuedTypes.Remove( 0 );
+
+ if ( selections )
+ {
+ //share request
+ CleanupStack::PushL( selections );
+ iContentServer.ChangeSharedContentL( type, *selections, iStatus );
+ CleanupStack::PopAndDestroy( selections );
+ }
+ else
+ {
+ //refresh request
+ iContentServer.RefreshSharedContentL( type, iStatus );
+ }
+
+ iStatus = KRequestPending;
+ SetActive();
+ }
+ __LOG( "[UPNP_ENGINE]\t CUpnpContentShareAO::RunL end" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::RunError
+// Handles a leave occurring in the request completion
+// --------------------------------------------------------------------------
+//
+TInt CUpnpContentShareAO::RunError( TInt aError )
+ {
+ __LOG( "CUpnpContentShareAO::RunError" );
+ if ( iEngine.Observer() )
+ {
+ iEngine.Observer()->HandleSharingDone( iEngine, aError );
+ }
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::RemoveQueuedObjects
+// Removed queued objects by index.
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::RemoveQueuedObject( TInt aIndex )
+ {
+ // Checks argument in udeb build.
+ // USER 130 panic will occure in urel builds if argument is
+ // incorrent.
+ TInt count = iQueuedTypes.Count();
+ __ASSERTD( aIndex >= 0 && aIndex < iQueuedTypes.Count(),
+ __FILE__, __LINE__ );
+
+ iQueuedTypes.Remove( aIndex );
+ if ( iQueuedSelections[ aIndex ] )
+ {
+ delete iQueuedSelections[ aIndex ];
+ }
+ iQueuedSelections.Remove( aIndex );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::RemoveQueuedObjectByType
+// Removed queued objects by type.
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::RemoveQueuedObjectByType(
+ UpnpContentServer::TUpnpMediaType aType )
+ {
+ //remove all queued requests with this type
+ for ( TInt i( iQueuedTypes.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( iQueuedTypes[ i ] == aType )
+ {
+ RemoveQueuedObject( i );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentShareAO::AppendQueuedObjectL
+// Appends given objects.
+// --------------------------------------------------------------------------
+//
+void CUpnpContentShareAO::AppendQueuedObjectL(
+ UpnpContentServer::TUpnpMediaType aType,
+ CArrayFix<TInt>* aSelections )
+ {
+ iQueuedTypes.AppendL( aType );
+ TRAPD( err, iQueuedSelections.AppendL( aSelections ) );
+ if ( err )
+ {
+ // Couldn't append array to the iQueuedSelections array.
+ // Removes the type and leaves.
+ iQueuedTypes.Remove( iQueuedTypes.Count() - 1 );
+ User::Leave( err );
+ }
+ }