diff -r 000000000000 -r 7f85d04be362 upnpsharing/upnpcontentserver/src/upnpcontentserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpsharing/upnpcontentserver/src/upnpcontentserversession.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,438 @@ +/* +* 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: CUpnpContentServerSession class implementation +* +*/ + + + + + +#include +#include //CArrayFix +#include //RDesReadStream +#include "upnpcontentserverdefs.h" +#include "upnpcontentserversession.h" +#include "upnpcontentserverclient.h" + +_LIT( KComponentLogfile, "contentserver.txt"); +#include "upnplog.h" + +using namespace UpnpContentServer; + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::NewL +// 2-phased constructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServerSession* CUpnpContentServerSession::NewL( + CUpnpContentServer* aServer ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + CUpnpContentServerSession* self = + new (ELeave) CUpnpContentServerSession(); + CleanupStack::PushL( self ); + self->ConstructL( aServer ); + CleanupStack::Pop( self ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + return self; + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::CUpnpContentServerSession +// C++ constructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServerSession::CUpnpContentServerSession( ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// void CUpnpContentServerSession::ConstructL +// 2nd phase constructor. +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::ConstructL( CUpnpContentServer* aServer ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + if ( !aServer ) + { + User::Leave( KErrArgument ); + } + iServer = aServer; + iHandler = iServer->Handler(); + iServer->AddSession(); + if ( iHandler ) + { + iHandler->SetContentSharingObserverL( this ); + } + else + { + User::Leave( KErrBadHandle ); + } + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::~CUpnpContentServerSession +// C++ destructor. +// -------------------------------------------------------------------------- +// +CUpnpContentServerSession::~CUpnpContentServerSession() + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + // Sharing is off, client is disconnected, no sharing operation is ongoing + // -> close the server + if( iServer && iHandler ) + { + iServer->RemoveSession(); + if ( iHandler->CanStop() && iServer->CanStop() ) + { + iServer->Stop(); + __LOG("CUpnpContentServerSession::~CUpnpContentServerSession, \ +CActiveScheduler stopped"); + } + TRAP_IGNORE( iHandler->SetContentSharingObserverL( NULL ) ) + } + delete iResultBuffer; + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::ServiceL +// From CSession2, passes the request forward to DispatchMessageL. +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::ServiceL( const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + TRAPD(err,DispatchMessageL(aMessage)); + if ( err != KErrNone ) + { + __LOG1( "Error: %d", err ); + aMessage.Complete( err ); + } + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::DispatchMessageL +// Handles the request from client. +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::DispatchMessageL( const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + iHandler->SetContentSharingObserverL( this ); + switch( aMessage.Function() ) + { + case ERequestSelectionContent : + { + GetSelectionContentL( aMessage ); + // completed separately + } + break; + case EGetSelectionIndexes : + { + GetSelectionIndexesL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case EChangeShareContent : + { + ChangeShareContentL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case ERefreshShareContent : + { + RefreshShareContentL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case ERequestProgressInfo : + { + RequestProgressInfoL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case EStartConnectionMonitor : + { + StartConnectionMonitorL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case EStopConnectionMonitor : + { + StopConnectionMonitorL(); + aMessage.Complete( KErrNone ); + } + break; + + default: + { + aMessage.Complete( KErrArgument ); + } + break; + } + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::GetSelectionContentL +// asynchronous +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::GetSelectionContentL( + const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + TInt len( aMessage.GetDesLength(0) ); + + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr( buffer->Des() ); + aMessage.ReadL( 0, ptr ); + RDesReadStream stream; + stream.Open( ptr ); + CleanupClosePushL( stream ); + + TInt mediaType( stream.ReadInt32L() ); + iSelectionContentMsg = aMessage; + + // call to server + iHandler->GetSelectionContentL( mediaType ); + + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::GetSelectionIndexesL +// synchronous +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::GetSelectionIndexesL( + const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + TInt len( aMessage.GetDesLength(0) ); + + RArray* selections = new ( ELeave ) + RArray( 5 ); + CleanupClosePushL( *selections ); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr( buffer->Des() ); + aMessage.ReadL( 0, ptr ); + RDesReadStream stream; + stream.Open( ptr ); + CleanupClosePushL( stream ); + + TInt mediaType( stream.ReadInt32L() ); + // call to server + iHandler->GetSelectionIndexesL( *selections, mediaType ); + + TInt objectCount( selections->Count() ); + + delete iResultBuffer; + iResultBuffer = NULL; + + iResultBuffer = CBufFlat::NewL( KTintSize + KTintSize*objectCount ); + RBufWriteStream wstream; + wstream.Open( *iResultBuffer ); + CleanupClosePushL( wstream ); + + // append count and ints + wstream.WriteInt32L( objectCount ); + for( TInt i(0); i < objectCount; i++ ) + { + wstream.WriteInt32L( selections->operator[]( i ) ); + } + + // Write result back to client + aMessage.WriteL( 1, iResultBuffer->Ptr(0) ); + + CleanupStack::PopAndDestroy( &wstream ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( selections ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::ChangeShareContentL +// Handles the async request from client. +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::ChangeShareContentL( + const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + TInt len( aMessage.GetDesLength(0) ); + RArray selections( len ); + CleanupClosePushL( selections ); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr( buffer->Des() ); + aMessage.ReadL( 0, ptr ); + RDesReadStream stream; + stream.Open( ptr ); + CleanupClosePushL( stream ); + + TInt mediaType( stream.ReadInt32L() ); + TInt objCount( stream.ReadInt32L() ); + + // loop the TInt from stream + for( TInt i(0); i< objCount; i++) + { + selections.AppendL( stream.ReadInt32L() ); + } + + iHandler->ChangeShareContentL( selections, mediaType ); + + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &selections ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::RequestProgressInfoL +// synchronous +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::RequestProgressInfoL( + const RMessage2& /*aMessage*/ ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + // The progress should be read using pubsub + // This call will be removed in upnpfw 2.1 + User::Leave( KErrNotSupported ); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::RefreshShareContentL +// asynchronous +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::RefreshShareContentL( + const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + TInt len( aMessage.GetDesLength(0) ); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr( buffer->Des() ); + aMessage.ReadL( 0, ptr ); + RDesReadStream stream; + stream.Open( ptr ); + CleanupClosePushL( stream ); + + TInt mediaType( stream.ReadInt32L() ); + + // The sharing and refresh cannot be used simultaneously + // Using the same place to store message for completion + // + iChangeShareContentMsg = aMessage; + // call to handler. + iHandler->RefreshShareContentL( mediaType ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::CompleteSelectionContentL +// Completes the async GetSelectionContentL call +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::CompleteSelectionContentL( + const CDesCArray& aMarkedItems ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + + TInt objectCount( aMarkedItems.MdcaCount() ); + + delete iResultBuffer; + iResultBuffer = NULL; + + iResultBuffer = CBufFlat::NewL( KTintSize + KTintSize*objectCount ); + RBufWriteStream wstream; + wstream.Open( *iResultBuffer ); + CleanupClosePushL( wstream ); + + // append count + wstream.WriteInt32L( objectCount ); + // append descriptors + for( TInt i(0); iPtr(0) ); + iSelectionContentMsg.Complete( KErrNone ); + CleanupStack::PopAndDestroy( &wstream ); + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::StartConnectionMonitorL +// synchronous +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::StartConnectionMonitorL( + const RMessage2& aMessage ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + TInt len( aMessage.GetDesLength(0) ); + HBufC8* buffer = HBufC8::NewLC( len ); + TPtr8 ptr( buffer->Des() ); + aMessage.ReadL( 0, ptr ); + RDesReadStream stream; + stream.Open( ptr ); + CleanupClosePushL( stream ); + + TInt iapId( stream.ReadInt32L() ); + + // call to server + iServer->RequestConnectionLostL( iapId ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buffer ); + + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// -------------------------------------------------------------------------- +// CUpnpContentServerSession::StopConnectionMonitorL +// cancel connection lost +// -------------------------------------------------------------------------- +// +void CUpnpContentServerSession::StopConnectionMonitorL( ) + { + __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ ); + iServer->CancelConnectionLostL(); + __LOG8_1( "%s end.", __PRETTY_FUNCTION__ ); + } + +// End of file