diff -r 3785f754ee62 -r 5360b7ddc251 upnpavcontroller/upnpavcontrollerserver/src/upnpbrowsingsession.cpp --- a/upnpavcontroller/upnpavcontrollerserver/src/upnpbrowsingsession.cpp Fri Sep 17 08:31:21 2010 +0300 +++ b/upnpavcontroller/upnpavcontrollerserver/src/upnpbrowsingsession.cpp Mon Nov 01 12:37:49 2010 +0200 @@ -1,2618 +1,1297 @@ -/* -* Copyright (c) 2006 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: server impl. of session against media server -* -*/ - - - - - - -// INCLUDE FILES -// System -#include -#include -#include - -// upnp stack api -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -// upnpframework / avcontroller api -#include "upnpavrenderingsessionobserver.h" - -// upnpframework / avcontroller helper api -#include "upnpconstantdefs.h" // for upnp-specific stuff -#include "upnpfileutility.h" -#include "upnpitemutility.h" - -// upnpframework / xml parser api -#include "upnpxmlparser.h" - -// upnpframework / internal api's -#include "upnpcontentservercrkeys.h" -#include "upnpcommonutils.h" -#include "upnpcdsreselementutility.h" -#include "upnpmetadatafetcher.h" - -// avcontroller internal -#include "upnpfilesharingactive.h" -#include "upnpavdispatcher.h" -#include "upnpavbrowserequest.h" -#include "upnpavrequest.h" -#include "upnpaverrorhandler.h" -#include "upnpavdeviceextended.h" -#include "upnpdevicerepository.h" -#include "upnpavbrowserespparams.h" -#include "upnpavcontrollerserver.h" -#include "upnpbrowsingsession.h" - -// CONSTANTS -_LIT8( KDirectChildren, "BrowseDirectChildren" ); -_LIT8( KMetaData, "BrowseMetadata" ); -_LIT8( KImportUri, "importUri" ); -_LIT8( KCreateClass, "upnp:createClass" ); -_LIT8( KBrowseMetadata, "BrowseMetadata" ); -const TInt KDefaultInstanceId = 0; -const TInt KExpectedCount = 1; - -_LIT( KComponentLogfile, "upnpavcontrollerserver.txt"); -#include "upnplog.h" - - -// ======== MEMBER FUNCTIONS ======== - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::NewL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -CUPnPBrowsingSession* CUPnPBrowsingSession::NewL - ( - RUpnpMediaServerClient& aClient, - CUpnpAVControllerServer& aServer, - TInt aSessionId, - const TDesC8& aUuid - ) - { - CUPnPBrowsingSession* self = new (ELeave) CUPnPBrowsingSession( - aClient, aServer, aSessionId ); - CleanupStack::PushL( self ); - - self->ConstructL( aUuid ); - CleanupStack::Pop( self ); - return self; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CUPnPBrowsingSession -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -CUPnPBrowsingSession::CUPnPBrowsingSession - ( - RUpnpMediaServerClient& aClient, - CUpnpAVControllerServer& aServer, - TInt aSessionId - ): - iMediaServer( aClient ), - iServer( aServer ), - iSessionId( aSessionId ), - - iInstanceId( KDefaultInstanceId ), - iIPSessionId( KErrNotFound ), - - iTransferId( KErrNotFound ), - - iTransferEventReceived( EFalse ), - iInternalState( ENone ), - iCopyState( EIdle ) - { - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::~CUPnPBrowsingSession -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -CUPnPBrowsingSession::~CUPnPBrowsingSession() - { - iIPSessionId = KErrNotFound; - - delete iDevice; - delete iRespBuf; - delete iRespBuf2; - - delete iImportURI; - delete iSourceURI; - - delete iItemId; - - delete iContainerId; - - delete iSharedItem; - - delete iMediaServerNotifier; - - delete iFileSharing; - - delete iLocalMediaServerUuid; - - delete iOriginalLocation; - - delete iFilePath; - - delete iMSSettings; - delete iAppSettings; - - delete iActionMessage; - delete iDeviceMessage; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ConstructL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::ConstructL( const TDesC8& aUuid ) - { - __LOG( "CUPnPBrowsingSession::ConstructL" ); - - iMediaServerNotifier = CUpnpMediaServerNotifier::NewL( this ); - iFileSharing = CUPnPFileSharingActive::NewL(); - - // Get the local Media Server Uuid, if available - const RPointerArray& devList = - iServer.DeviceRepository().DeviceList(); - TInt count = devList.Count(); - TInt i; - for( i = 0; i < count; i++ ) - { - if( devList[ i ]->Local() ) - { - __ASSERTD( !iLocalMediaServerUuid, __FILE__, __LINE__ ); - iLocalMediaServerUuid = devList[i]->Uuid().AllocL(); - } - if( devList[ i ]->Uuid() == aUuid ) - { - __ASSERTD( !iDevice, __FILE__, __LINE__ ); - iDevice = CUpnpAVDeviceExtended::NewL( *devList[ i ] ); - } - } - if( !iDevice ) - { - if( aUuid == KNullDesC8 ) // Fix to enable AV Controller helper usage - { - iDevice = CUpnpAVDeviceExtended::NewL(); - } - else - { - User::Leave( KErrNotFound ); - } - } - - iMSSettings = CUpnpMediaServerSettings::NewL(); - iAppSettings = CRepository::NewL( KCrUidUpnpContentserver ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RcSetVolumeResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::RcSetVolumeResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstance*/, - const TDesC8& /*aChannel*/, - const TDesC8& /*aDesiredVolume*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RcVolumeResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::RcVolumeResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstance*/, - const TDesC8& /*aChannel*/, - const TDesC8& /*aCurrentVolume*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RcSetMuteResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::RcSetMuteResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstance*/, - const TDesC8& /*aChannel*/, - const TDesC8& /*aDesiredMute*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RcMuteResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::RcMuteResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstance*/, - const TDesC8& /*aChannel*/, - const TDesC8& /*aCurrentMute*/ ) - { - // No implementation required - } - - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtSetTransportUriResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtSetTransportUriResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aCurrentUri*/, - const TDesC8& /*aCurrentUriMetaData*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtSetNextTransportUriResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtSetNextTransportUriResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aNextUri*/, - const TDesC8& /*aNextUriMetaData*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtMediaInfoResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtMediaInfoResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aNrTracks*/, - const TDesC8& /*aMediaDuration*/, - const TDesC8& /*aCurrentUri*/, - const TDesC8& /*aCurrentUriMetaData*/, - const TDesC8& /*aNextUri*/, - const TDesC8& /*aNextUriMetaData*/, - const TDesC8& /*aPlayMedium*/, - const TDesC8& /*aRecordMedium*/, - const TDesC8& /*aWriteStatus*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtGetTransportInfoResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtGetTransportInfoResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aCurrenTransportState*/, - const TDesC8& /*aCurrentTransportStatus*/, - const TDesC8& /*aCurrentSpeed*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtPositionInfoResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtPositionInfoResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aTrack*/, - const TDesC8& /*aTrackDuration*/, - const TDesC8& /*aTrackMetaData*/, - const TDesC8& /*aTrackURI*/, - const TDesC8& /*aRelTime*/, - const TDesC8& /*aAbsTime*/, - const TDesC8& /*aRelCount*/, - const TDesC8& /*aAbsCount*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtDeviceCapabilitiesResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtDeviceCapabilitiesResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aPlayMedia*/, - const TDesC8& /*aRecMedia*/, - const TDesC8& /*aRecQualityMode*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtTransportSettingsResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtTransportSettingsResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aPlayMode*/, - const TDesC8& /*aRecQualityMode*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtStopResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtStopResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtPlayResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtPlayResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aSpeed*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtPauseResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtPauseResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtRecordResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtRecordResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtSeekResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtSeekResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aUnit*/, - const TDesC8& /*aTarget*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtNextResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtNextResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtPreviousResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtPreviousResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtSetPlayModeResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtSetPlayModeResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aNewPlayMode*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtSetRecordModeResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtSetRecordModeResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aInstanceId*/, - const TDesC8& /*aNewRecordQuality*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsSearchCapabilitiesResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsSearchCapabilitiesResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& aSearchCaps) - { - __LOG1( "CUPnPBrowsingSession::CdsSearchCapabilitiesResponse: %d", - aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - iIPSessionId = KErrNotFound; - //iActionPending = EFalse; - - if( iActionMessage ) - { - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - if( aSearchCaps != KNullDesC8 ) - { - delete iRespBuf; iRespBuf = NULL; - iRespBuf = aSearchCaps.Alloc(); - if( iRespBuf ) - { - TPckg resp1( aSearchCaps.Length() ); - iActionMessage->Write( 1, resp1 ); - } - else - { - TPckg resp1( 0 ); - iActionMessage->Write( 1, resp1 ); - } - - iActionMessage->Complete( - EAVControllerGetSearchCapabilitiesSizeCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - else - { - TPckg resp1( 0 ); - iActionMessage->Write( 1, resp1 ); - - iActionMessage->Complete( - EAVControllerGetSearchCapabilitiesSizeCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - __LOG( "CdsSearchCapabilitiesResponse - no msg" ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsSortCapabilitiesResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsSortCapabilitiesResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aSortCaps*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsSystemUpdateIdResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsSystemUpdateIdResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - TInt /*aSystemUpdateId*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsBrowseResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsBrowseResponse( - const TDesC8& aUuid, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aObjectID*/, - const TDesC8& aBrowseFlag, - const TDesC8& /*aFilter*/, - TInt /*aIndex*/, - TInt /*aRequest*/, - const TDesC8& /*aSortCriteria*/, - const TDesC8& aResult, - TInt aReturned, - TInt aMatches, - const TDesC8& aUpdateID ) - { - __LOG1( "CUPnPBrowsingSession::CdsBrowseResponse: %d", aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - iIPSessionId = KErrNotFound; - - if( iActionMessage ) - { - if ( aBrowseFlag.CompareF( KBrowseMetadata ) == 0 && aReturned == 0 - && aErr != KErrCouldNotConnect && aErr != KErrHostUnreach ) - { - aErr = ENoSuchObject; //the file not exist; - } - - if ( aErr != KErrCouldNotConnect && aErr != KErrHostUnreach ) - { - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - __LOG1( "CUPnPBrowsingSession::CdsBrowseResponse:001 %d", aErr ); - } - - if( aErr == KErrNone ) - { - if( aResult != KNullDesC8 ) - { - - if( iInternalState == ECopyToPhone ) - { - TRAP( aErr, SendCreateObjectActionL( - *iLocalMediaServerUuid, KContainerIdAny, aResult ) ); - if( aErr ) - { - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else if( iInternalState == ECopyLocal ) - { - TRAP( aErr, CheckAndSendCreateObjectActionL( aResult ) ); - if( aErr ) - { - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else if( iInternalState == EDestroyObject ) - { - TRAP( aErr, CheckAndSendDestroyObjectActionL( aResult) ); - if( aErr ) - { - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else // Browse - { - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - iRespBuf = aResult.Alloc(); - iRespBuf2 = aUpdateID.Alloc(); - - if( iRespBuf && iRespBuf2 ) - { - TUpnpAVBrowseRespParams params; - TPckg resp2( params ); - params.iMatches = aReturned ; - params.iTotalCount = aMatches; - params.iResponseSize = aResult.Length(); - params.iUpdateIdSize = aUpdateID.Length(); - iActionMessage->Write( 2, resp2 ); - iActionMessage->Complete( - EAVControllerGetBrowseResponseSizeCompleted ); - } - else - { - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - iActionMessage->Complete( KErrNoMemory ); - } - iInternalState = ENone; - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - if( iInternalState == EBrowse ) - { - TUpnpAVBrowseRespParams params; - TPckg resp2( params ); - params.iMatches = 0; - params.iTotalCount = 0; - params.iResponseSize = 0; - params.iUpdateIdSize = 0; - iActionMessage->Write( 2, resp2 ); - - iInternalState = ENone; - iActionMessage->Complete( - EAVControllerGetBrowseResponseSizeCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - else - { - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - } - else - { - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - if ( KErrCouldNotConnect == aErr || KErrHostUnreach == aErr ) - { - iServer.DeviceDisappearedL( aUuid ); - } - } - } - else - { - __LOG( "CdsBrowseResponse - no msg" ); - } - - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsSearchResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsSearchResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aContainerId*/, - const TDesC8& /*aSearchCriteria*/, - const TDesC8& /*aFilter*/, - TInt /*aIndex*/, - TInt /*aRequest*/, - const TDesC8& /*aSortCriteria*/, - const TDesC8& aResult, - TInt aReturned, - TInt aMatches, - const TDesC8& aUpdateID ) - { - __LOG1( "CUPnPBrowsingSession::CdsSearchResponse: %d", aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - //iActionPending = EFalse; - iIPSessionId = KErrNotFound; - - if( iActionMessage ) - { - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - if( aResult != KNullDesC8 ) - { - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - iRespBuf = aResult.Alloc(); - iRespBuf2 = aUpdateID.Alloc(); - - if( iRespBuf && iRespBuf2 ) - { - TUpnpAVBrowseRespParams params; - TPckg resp2( params ); - params.iMatches = aReturned ; - params.iTotalCount = aMatches; - params.iResponseSize = aResult.Length(); - params.iUpdateIdSize = aUpdateID.Length(); - iActionMessage->Write( 2, resp2 ); - iActionMessage->Complete( - EAVControllerGetSearchResponseSizeCompleted ); - } - else - { - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - iActionMessage->Complete( KErrNoMemory ); - } - delete iActionMessage; iActionMessage = NULL; - } - else - { - TUpnpAVBrowseRespParams params; - TPckg resp2( params ); - params.iMatches = 0; - params.iTotalCount = 0; - params.iResponseSize = 0; - params.iUpdateIdSize = 0; - iActionMessage->Write( 2, resp2 ); - - iActionMessage->Complete( - EAVControllerGetSearchResponseSizeCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - __LOG( "CdsSearchResponse - no msg" ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsDestroyObjectResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsDestroyObjectResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aObjectId*/ ) - { - __LOG1( "CUPnPBrowsingSession::CdsDestroyObjectResponse: %d", aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - iIPSessionId = KErrNotFound; - - iInternalState = ENone; - - if( iActionMessage ) - { - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - iActionMessage->Complete( EAVControllerDeleteObjectCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - else - { - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - __LOG( "CdsDestroyObjectResponse - no msg" ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsUpdateObjectResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsUpdateObjectResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aObjectId*/, - const TDesC8& /*aCurrentTagValue*/, - const TDesC8& /*aNewTagValue*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsImportResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsImportResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aSourceURI*/, - const TDesC8& /*aDestinationURI*/, - const TDesC8& aTransferId ) - { - __LOG1( "CUPnPBrowsingSession::CdsImportResponse: %d", aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - iIPSessionId = KErrNotFound; - - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - - TLex8 lex( aTransferId ); - aErr = lex.Val( iTransferId ); - - CopyFinished( aErr, EFalse ); - } - else - { - CopyFinished( aErr, EFalse ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsExportResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsExportResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aSourceURI*/, - const TDesC8& /*aDestinationURI*/, - const TDesC8& aTransferId ) - { - __LOG1( "CUPnPBrowsingSession::CdsExportResponse: %d", aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - iIPSessionId = KErrNotFound; - - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - TLex8 lex( aTransferId ); - aErr = lex.Val( iTransferId ); - - CopyFinished( aErr, EFalse ); - } - else - { - - CopyFinished( aErr, EFalse ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsStopTransferResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsStopTransferResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aTransferId*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsCTransferProgressResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsCTransferProgressResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aTransferId*/, - const TDesC8& /*aTransferStatus*/, - const TDesC8& /*aTransferLength*/, - const TDesC8& /*aTransferTotal*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsDeleteResourceResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsDeleteResourceResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aResourceUri*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsCreateReferenceResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsCreateReferenceResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aContainerId*/, - const TDesC8& /*aObjectId*/, - const TDesC8& /*aNewId*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsCreateObjectResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsCreateObjectResponse( - const TDesC8& /*aUuid*/, - TInt aSessionId, - TInt aErr, - const TDesC8& /*aContainerID*/, - const TDesC8& /*aElements*/, - const TDesC8& aObjectID, - const TDesC8& aResult ) - { - __LOG1( "CUPnPBrowsingSession::CdsCreateObjectResponse: %d" , aErr ); - - __ASSERTD( iIPSessionId == aSessionId, __FILE__, __LINE__ ); - - iServer.Dispatcher().UnRegister( iIPSessionId ); - //iActionPending = EFalse; - iIPSessionId = KErrNotFound; - - aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, - EUPnPContentDirectoryError ); - - if( aErr == KErrNone ) - { - if( iInternalState == ECopyLocal || - iInternalState == ECopyToPhone ) - { - delete iImportURI; iImportURI = NULL; - TRAP( aErr, iImportURI = ParseCreateObjectResponseL( aResult ) ); - if( aErr == KErrNone ) - { - if( iSourceURI ) - { - if( iInternalState == ECopyLocal ) - { - // Export from the local Media Server to the - // Remote Media Server - delete iItemId; - iItemId = aObjectID.Alloc(); // Null ok at this point - - TRAP( aErr, SendExportActionL() ); - if( aErr ) - { - CopyFinished( aErr, EFalse ); - } - } - else // iInternalState == ECopyToPhone - { - TRAP( aErr, SendImportActionL() ); - if( aErr ) - { - CopyFinished( aErr, EFalse ); - } - } - } - else - { - CopyFinished( KErrGeneral, EFalse ); - } - } - else - { - CopyFinished( aErr, EFalse ); - } - } - else // Create container - { - if( iActionMessage ) - { - HBufC8* objectID = HBufC8::New( aObjectID.Length() ); - if( objectID ) - { - objectID->Des().Copy( aObjectID ); - iActionMessage->Write( 1, *objectID ); - iActionMessage->Complete( - EAVControllerCreateContainerCompleted ); - delete objectID; - } - else - { - iActionMessage->Write( 1, KNullDesC8 ); - iActionMessage->Complete( KErrNoMemory ); - } - delete iActionMessage; iActionMessage = NULL; - } - iInternalState = ENone; - } - } - else - { - if( iInternalState == ECopyLocal || - iInternalState == ECopyToPhone ) - { - CopyFinished( aErr, EFalse ); - } - else - { - // Create container failed - iInternalState = ENone; - iActionMessage->Complete( aErr ); - delete iActionMessage; iActionMessage = NULL; - } - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmProtocolInfoResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmProtocolInfoResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aSource*/, - const TDesC8& /*aSink*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmPrepareResponse -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmPrepareResponse( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aRemoteProtocolInfo*/, - const TDesC8& /*aPeerConnectionManager*/, - const TDesC8& /*aPeerConnectionId*/, - const TDesC8& /*aDirection*/, - TInt /*aConnection*/, - TInt /*aTransport*/, - TInt /*aRsc*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmComplete -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmComplete( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - TInt /*aConnection*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmCurrentConnections -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmCurrentConnections( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - const TDesC8& /*aConnections*/) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmCurrentInfo -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmCurrentInfo( - const TDesC8& /*aUuid*/, - TInt /*aSessionId*/, - TInt /*aErr*/, - TInt /*rscId*/, - TInt /*transportId*/, - const TDesC8& /*aProtocolInfo*/, - const TDesC8& /*aPeerConnectionManager*/, - TInt /*peerId*/, - const TDesC8& /*aDirection*/, - const TDesC8& /*aStatus*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsUpdateEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsUpdateEvent( - const TDesC8& /*aUuid*/, - TInt /*aSystemUpdateId*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsContainerEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsContainerEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aConteinerIds*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CdsTransferEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CdsTransferEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aTransferIds*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RcLastChangeEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::RcLastChangeEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aLastChange*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::AvtLastChangeEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::AvtLastChangeEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aLastChange*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmSourceEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmSourceEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aSource*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmSinkEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmSinkEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aSink*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CmConnectionsEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CmConnectionsEvent( - const TDesC8& /*aUuid*/, - const TDesC8& /*aConnections*/ - ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::HttpResponseL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::HttpResponseL( CUpnpHttpMessage* /*aMessage*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::DeviceDiscoveredL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::DeviceDiscoveredL( CUpnpDevice* /*aDevice*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::DeviceDisappearedL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::DeviceDisappearedL( CUpnpDevice* /*aDevice*/ ) - { - // No implementation required - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::FileTransferEvent -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::FileTransferEvent( - CUpnpFileTransferEvent *aEvent ) - { - __ASSERTD( aEvent, __FILE__, __LINE__ ); - - __LOG1( "CUPnPBrowsingSession::FileTransferEvent, %d", - aEvent->ErrorCode() ); - - TInt err = UPnPAVErrorHandler::ConvertToSymbianErrorCode( - aEvent->ErrorCode(), EUPnPContentDirectoryError ); - - if( aEvent->TransferId() == iTransferId ) - { - iTransferId = KErrNotFound; - if( iInternalState == ECopyLocal ) - { - if( iActionMessage ) - { - CopyFinished( err, ETrue ); - } - else - { - // Msg not received, set the flag instead - iAsyncErr = err; - iTransferEventReceived = ETrue; - } - } - else if( iInternalState == ECopyToPhone ) - { - TRAPD( err, HandleCopyToPhoneEventL( *aEvent, err ) ); - if ( err ) - { - __LOG1( "CUPnPBrowsingSession::FileTransferEvent, %d", - err ); - } - } - } - - delete aEvent; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::HandleCopyToPhoneEventL -// Handle CopyToPhoneEvent,and all leave function will move -// to this function -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::HandleCopyToPhoneEventL( - CUpnpFileTransferEvent& aEvent, - TInt aError ) - { - HBufC8* filepath = HBufC8::NewL( KMaxPath ); - CleanupStack::PushL( filepath ); - - HBufC8* eventpath = CnvUtfConverter::ConvertFromUnicodeToUtf8L( - aEvent.FilePath() ); - filepath->Des().Copy( *eventpath ); - delete eventpath; - eventpath = NULL; - - if ( iActionMessage ) - { - TInt res = iActionMessage->Write( 1, *filepath ); - if ( res ) - { - __LOG1( "CUPnPBrowsingSession::HandleCopyToPhoneEventL, %d", - res ); - } - // clean up - CleanupStack::PopAndDestroy( filepath ); - } - else - { - iFilePath = filepath; - - // clean up - CleanupStack::Pop( filepath ); - } - - if ( iActionMessage ) - { - CopyFinished( aError, ETrue ); - } - else - { - // Msg not received yet, set the flag instead - iAsyncErr = aError; - iTransferEventReceived = ETrue; - } - - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::NotifierError -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::NotifierError( TInt aError ) - { - __LOG( "CUPnPBrowsingSession::NotifierError" ); - - if( iActionMessage ) - { - if( iInternalState == ECopyLocal || - iInternalState == ECopyToPhone ) - { - CopyFinished( aError, ETrue ); - } - } - else - { - // Msg not received yet, set the flag instead - iAsyncErr = aError; - iTransferEventReceived = ETrue; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::DeviceDisappearedL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::DeviceDisappearedL( - CUpnpAVDeviceExtended& aDevice ) - { - __LOG( "CUPnPBrowsingSession::DeviceDisappearedL" ); - - if( aDevice.Local() ) - { - delete iLocalMediaServerUuid; iLocalMediaServerUuid = NULL; - } - else if( iDeviceMessage ) // Target device - { - iDeviceMessage->Complete( KErrNone ); - delete iDeviceMessage; iDeviceMessage = NULL; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SetLocalMSUuidL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::SetLocalMSUuidL( const TDesC8& aUuid ) - { - HBufC8* tmp = aUuid.AllocL(); - delete iLocalMediaServerUuid; - iLocalMediaServerUuid = tmp; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SessionId -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -TInt CUPnPBrowsingSession::SessionId() const - { - return iSessionId; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::Uuid -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -const TDesC8& CUPnPBrowsingSession::Uuid() const - { - if( iDevice ) - { - return iDevice->Uuid(); - } - else - { - return KNullDesC8; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetBrowseResponseSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetBrowseResponseSizeL( - const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetBrowseResponseSizeL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - ResetL(); - - CUpnpAVBrowseRequest* tmpRequest = CUpnpAVBrowseRequest::NewLC(); - - ReadBrowseReqFromMessageL( aMessage, 1, tmpRequest ); - - if( tmpRequest->BrowseFlag() == MUPnPAVBrowsingSession::EDirectChildren ) - { - iIPSessionId = iServer.ControlPoint().CdsBrowseActionL( - iDevice->Uuid(), - tmpRequest->Id(), - KDirectChildren, - tmpRequest->Filter(), - tmpRequest->StartIndex(), - tmpRequest->RequestedCount(), - tmpRequest->SortCriteria() ); - } - else - { - iIPSessionId = iServer.ControlPoint().CdsBrowseActionL( - iDevice->Uuid(), - tmpRequest->Id(), - KMetaData, - tmpRequest->Filter(), - tmpRequest->StartIndex(), - tmpRequest->RequestedCount(), - tmpRequest->SortCriteria() ); - } - - - CleanupStack::PopAndDestroy( tmpRequest ); - - if( iIPSessionId > 0 ) - { - // Register - iInternalState = EBrowse; - iServer.Dispatcher().RegisterL( iIPSessionId, *this ); - } - else - { - User::Leave( iIPSessionId ); - } - - iActionMessage = new (ELeave) RMessage2( aMessage ); - } - - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelGetBrowseResponseSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelGetBrowseResponseSizeL() - { - __LOG( "CUPnPBrowsingSession::CancelGetBrowseResponseSizeL" ); - - if( iActionMessage ) - { - iServer.Dispatcher().UnRegister( iIPSessionId ); - iActionMessage->Complete( KErrCancel ); - delete iActionMessage; iActionMessage = NULL; - } - } - - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetBrowseResponseL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetBrowseResponseL( const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetBrowseResponseL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - iIPSessionId = KErrNotFound; - if( iRespBuf && iRespBuf2 ) - { - aMessage.WriteL( 1, *iRespBuf ); - aMessage.WriteL( 2, *iRespBuf2 ); - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - aMessage.Complete( EAVControllerGetBrowseResponseCompleted ); - } - else - { - //Memory allocaton failed - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - User::Leave( KErrNoMemory ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetSearchResponseSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetSearchResponseSizeL( - const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetSearchResponseSizeL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - ResetL(); - - - CUpnpAVBrowseRequest* tmpRequest = CUpnpAVBrowseRequest::NewLC(); - - ReadBrowseReqFromMessageL( aMessage, 1, tmpRequest ); - - iIPSessionId = iServer.ControlPoint().CdsSearchActionL( - iDevice->Uuid(), - tmpRequest->Id(), - tmpRequest->SearchCriteria(), - tmpRequest->Filter(), - tmpRequest->StartIndex(), - tmpRequest->RequestedCount(), - tmpRequest->SortCriteria() ); - - CleanupStack::PopAndDestroy( tmpRequest ); - - if( iIPSessionId > 0 ) - { - // Register - iServer.Dispatcher().RegisterL( iIPSessionId, *this ); - } - else - { - User::Leave( iIPSessionId ); - } - iActionMessage = new (ELeave) RMessage2( aMessage ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelGetSearchResponseSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelGetSearchResponseSizeL() - { - __LOG( "CUPnPBrowsingSession::CancelGetSearchResponseSizeL" ); - - if( iActionMessage ) - { - iServer.Dispatcher().UnRegister( iIPSessionId ); - iActionMessage->Complete( KErrCancel ); - delete iActionMessage; iActionMessage = NULL; - } - - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetSearchResponseL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetSearchResponseL( const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetSearchResponseL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - iIPSessionId = KErrNotFound; - if( iRespBuf && iRespBuf2 ) - { - aMessage.WriteL( 1, *iRespBuf ); - aMessage.WriteL( 2, *iRespBuf2 ); - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - aMessage.Complete( EAVControllerGetSearchResponseCompleted ); - } - else - { - //Memory allocaton failed - delete iRespBuf; iRespBuf = NULL; - delete iRespBuf2; iRespBuf2 = NULL; - User::Leave( KErrNoMemory ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetSearchCapabitiesSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetSearchCapabitiesSizeL( - const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetSearchCapabitiesSizeL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - ResetL(); - - iIPSessionId = iServer.ControlPoint().CdsSearchCapabilitiesActionL( - iDevice->Uuid() ); - - if( iIPSessionId > 0 ) - { - // Register - iServer.Dispatcher().RegisterL( iIPSessionId, *this ); - } - else - { - User::Leave( iIPSessionId ); - } - iActionMessage = new (ELeave) RMessage2( aMessage ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL() - { - __LOG( "CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL" ); - - if( iActionMessage ) - { - iServer.Dispatcher().UnRegister( iIPSessionId ); - iActionMessage->Complete( KErrCancel ); - delete iActionMessage; iActionMessage = NULL; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::GetSearchCapabitiesL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::GetSearchCapabitiesL( const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::GetSearchCapabitiesL" ); - - iIPSessionId = KErrNotFound; - - aMessage.WriteL( 1, *iRespBuf ); - aMessage.Complete( EAVControllerGetSearchCapabilitiesCompleted ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CreateContainerL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CreateContainerL( const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::CreateContainerL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - ResetL(); - - // Title - TInt len = aMessage.GetDesMaxLength( 1 ); - HBufC8* tempTitle = HBufC8::NewLC( len ); - TPtr8 ptr( tempTitle->Des() ); - aMessage.ReadL( 1, ptr ); - - // Container ID - len = aMessage.GetDesMaxLength( 2 ); - HBufC8* tempId = HBufC8::NewLC( len ); - ptr.Set( tempId->Des() ); - aMessage.ReadL( 2, ptr ); - - if( iDevice->DlnaCompatible() && !iDevice->CreateChildContainer() - && *tempId != KContainerIdAny ) - { - // The device is DLNA compatible and does not support creation - // of a child container - User::Leave( KErrNotSupported ); - } - - // Container type - MUPnPAVBrowsingSession::TContainerType type = - (MUPnPAVBrowsingSession::TContainerType)aMessage.Int3(); - - // Create a container object - CUpnpContainer* tmpContainer = CUpnpContainer::NewL(); - CleanupStack::PushL( tmpContainer ); - - // Set the title and the parent ID - tmpContainer->SetTitleL( *tempTitle ); - tmpContainer->SetParentIdL( *tempId ); - - // Set the object type - if( type == MUPnPAVBrowsingSession::EPlaylistContainer ) - { - tmpContainer->SetObjectClassL( KClassPlaylist() ); - } - else - { - tmpContainer->SetObjectClassL( KClassStorage() ); - } - - HBufC8* xmlDoc = CUPnPXMLParser::ContainerToXmlLC( *tmpContainer ); - - iIPSessionId = iServer.ControlPoint().CdsCreateObjectActionL( - iDevice->Uuid(), *tempId, *xmlDoc ); - - - CleanupStack::PopAndDestroy( xmlDoc ); - CleanupStack::PopAndDestroy( tmpContainer ); - CleanupStack::PopAndDestroy( tempId ); - CleanupStack::PopAndDestroy( tempTitle ); - - if( iIPSessionId > 0 ) - { - // Register - iServer.Dispatcher().RegisterL( iIPSessionId, *this ); - iInternalState = ECreateContainer; - } - else - { - User::Leave( iIPSessionId ); - } - iActionMessage = new (ELeave) RMessage2( aMessage ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelCreateContainerL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelCreateContainerL() - { - __LOG( "CUPnPBrowsingSession::CancelCreateContainerL" ); - - if( iActionMessage ) - { - iServer.Dispatcher().UnRegister( iIPSessionId ); - iActionMessage->Complete( KErrCancel ); - delete iActionMessage; iActionMessage = NULL; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::DeleteObjectL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::DeleteObjectL( const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::DeleteObjectL" ); - - __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); - - ResetL(); - - TInt len = aMessage.GetDesMaxLength( 1 ); - HBufC8* tempId = HBufC8::NewLC( len ); - TPtr8 ptr( tempId->Des() ); - aMessage.ReadL( 1, ptr ); - - CleanupStack::Pop( tempId ); - delete iItemId; - iItemId = tempId; - - - iIPSessionId = iServer.ControlPoint().CdsBrowseActionL( - iDevice->Uuid(), *iItemId, KMetaData, KFilterCommon, 0, 1, - KNullDesC8 ); - - if( iIPSessionId > 0 ) - { - // Register - iInternalState = EDestroyObject; - iServer.Dispatcher().RegisterL( iIPSessionId, *this ); - } - else - { - User::Leave( iIPSessionId ); - } - iActionMessage = new (ELeave) RMessage2( aMessage ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelDeleteObjectL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelDeleteObjectL() - { - __LOG( "CUPnPBrowsingSession::CancelDeleteObjectL" ); - - if( iActionMessage ) - { - iServer.Dispatcher().UnRegister( iIPSessionId ); - iActionMessage->Complete( KErrCancel ); - delete iActionMessage; iActionMessage = NULL; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::DeviceDisappearedRequestL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::DeviceDisappearedRequestL( - const RMessage2& aMessage ) - { - __LOG( "CUPnPBrowsingSession::DeviceDisappearedRequestL" ); - - __ASSERTD( !iDeviceMessage, __FILE__, __LINE__ ); - - iDeviceMessage = new (ELeave) RMessage2( aMessage ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CancelDeviceDisappearedRequestL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CancelDeviceDisappearedRequestL() - { - __LOG( "CUPnPBrowsingSession::CancelDeviceDisappearedRequestL" ); - - if( iDeviceMessage ) - { - iDeviceMessage->Complete( KErrCancel ); - delete iDeviceMessage; iDeviceMessage = NULL; - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ParseCreateObjectResponseL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -HBufC8* CUPnPBrowsingSession::ParseCreateObjectResponseL( - const TDesC8& aResponse ) - { - __LOG( "CUPnPBrowsingSession::ParseCreateObjectResponseL" ); - - HBufC8* importURI = NULL; - - CUPnPXMLParser* parser = CUPnPXMLParser::NewL(); - CleanupStack::PushL( parser ); - - RPointerArray array; - CleanupResetAndDestroyPushL( array ); - - parser->ParseResultDataL( array, aResponse ); - - if( array.Count() == KExpectedCount ) - { - if( array[ 0 ]->ObjectType() == EUPnPItem ) - { - HBufC8* tmp = array[ 0 ]->Id().AllocL(); - delete iItemId; - iItemId = tmp; - - if( array[ 0 ]->ObjectClass().Find( KClassAudio ) - != KErrNotFound ) - { - iMusic = ETrue; - } - - // Get the res-elements - RUPnPElementsArray elArray; - CleanupClosePushL( elArray ); - UPnPItemUtility::GetResElements( *array[ 0 ], elArray ); - - // Find the import uri - for( TInt i = 0; i < elArray.Count(); i++ ) - { - const CUpnpAttribute* attribute = NULL; - TRAPD( err, attribute = - &UPnPItemUtility::FindAttributeByNameL( - *elArray[ i ], KImportUri ) ); - if( err == KErrNone ) - { - // import uri found! - i = elArray.Count(); - importURI = attribute->Value().AllocL(); - } - } - - CleanupStack::PopAndDestroy( &elArray ); - } - else - { - User::Leave( KErrGeneral ); - } - } - else - { - User::Leave( KErrGeneral ); - } - - CleanupStack::PopAndDestroy( &array ); - CleanupStack::PopAndDestroy( parser ); - - if( !importURI ) - { - User::Leave( KErrGeneral ); - } - - if( !UpnpCdsResElementUtility::IsUriAbsolute( *importURI ) ) - { - // Import uri is not absolute - delete importURI; importURI = NULL; - User::Leave( KErrGeneral ); - } - - return importURI; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CheckIsCreateObjectSupportedL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CheckIsCreateObjectSupportedL( - const TDesC8& aResponse ) - { - __LOG( "CUPnPBrowsingSession::CheckIsCreateObjectSupportedL" ); - - CUPnPXMLParser* parser = CUPnPXMLParser::NewL(); - CleanupStack::PushL( parser ); - - RPointerArray array; - CleanupResetAndDestroyPushL( array ); - - parser->ParseResultDataL( array, aResponse ); - - if( array.Count() == KExpectedCount ) - { - if( array[ 0 ]->ObjectType() == EUPnPContainer ) - { - // Try to get upnp:createClass elements - const CUpnpElement* elem = UPnPItemUtility::FindElementByName( - *array[ 0 ], KCreateClass ); - - if ( !elem ) - { - // No createClass elements, copy not supported - User::Leave( KErrNotSupported ); - } - - RUPnPElementsArray resultArray; - CleanupClosePushL( resultArray ); - UPnPItemUtility::GetResElements( *array[ 0 ], resultArray ); - TInt count = resultArray.Count(); - - for( TInt i = 0; i < count; i++ ) - { - if( iSharedItem->ObjectClass().Find( KClassAudio ) != - KErrNotFound ) - { - // We are going to create a music item, check that the - // target container supports that - if( resultArray[ i ]->Value().Find( KClassAudio ) == - KErrNotFound ) - { - User::Leave( KErrNotSupported ); - } - } - else if( iSharedItem->ObjectClass().Find( KClassImage ) != - KErrNotFound ) - { - // We are going to create an image item, check that the - // target container supports that - if( resultArray[ i ]->Value().Find( KClassImage ) == - KErrNotFound ) - { - User::Leave( KErrNotSupported ); - } - } - else if( iSharedItem->ObjectClass().Find( KClassVideo ) != - KErrNotFound ) - { - // We are going to create a video item, check that the - // target container supports that - if( resultArray[ i ]->Value().Find( KClassVideo ) == - KErrNotFound ) - { - User::Leave( KErrNotSupported ); - } - } - else - { - // Unknown object class, leave - User::Leave( KErrNotSupported ); - } - } - CleanupStack::PopAndDestroy( &resultArray ); - } - else - { - User::Leave( KErrNotSupported ); - } - } - else - { - User::Leave( KErrGeneral ); - } - CleanupStack::PopAndDestroy( &array ); - CleanupStack::PopAndDestroy( parser ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL( - const TDesC8& aResponse ) - { - __LOG( "CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL" ); - - CUPnPXMLParser* parser = CUPnPXMLParser::NewL(); - CleanupStack::PushL( parser ); - - RPointerArray array; - CleanupResetAndDestroyPushL( array ); - - parser->ParseResultDataL( array, aResponse ); - - if( array.Count() == KExpectedCount ) - { - if( array[ 0 ]->Restricted() ) - { - User::Leave( KErrArgument ); - } - else - { - // Not restricted, ok to destroy - TInt sessionId = iServer.ControlPoint().CdsDestroyObjectActionL( - iDevice->Uuid(), *iItemId ); - if( sessionId > 0 ) - { - iServer.Dispatcher().RegisterL( sessionId, *this ); - iIPSessionId = sessionId; - } - else - { - User::Leave( sessionId ); - } - } - } - else - { - User::Leave( KErrGeneral ); - } - CleanupStack::PopAndDestroy( &array ); - CleanupStack::PopAndDestroy( parser ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CheckAndSendCreateObjectActionL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CheckAndSendCreateObjectActionL( - const TDesC8& aResponse ) - { - __LOG( "CUPnPBrowsingSession::CheckAndSendCreateObjectActionL" ); - - CheckIsCreateObjectSupportedL( aResponse ); - - HBufC8* xmlDoc = CUPnPXMLParser::XmlForCreateObjectLC( *iSharedItem ); - SendCreateObjectActionL( iDevice->Uuid(), *iContainerId, *xmlDoc ); - CleanupStack::PopAndDestroy( xmlDoc ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SendCreateObjectActionL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::SendCreateObjectActionL( const TDesC8& aUUid, - const TDesC8& aContainerId, const TDesC8& aResponse ) - { - __LOG( "CUPnPBrowsingSession::SendCreateObjectActionL" ); - - TInt sessionId = iServer.ControlPoint().CdsCreateObjectActionL( aUUid, - aContainerId, aResponse ); - - if( sessionId > 0 ) - { - iServer.Dispatcher().RegisterL( sessionId, *this ); - iIPSessionId = sessionId; - } - else - { - User::Leave( sessionId ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SendExportActionL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::SendExportActionL() - { - __LOG( "CUPnPBrowsingSession::SendExportActionL" ); - //__LOG8( *iSourceURI ); - //__LOG8( *iImportURI ); - - HBufC8* tempSourceUri = UpnpString::EncodeXmlStringL( - iSourceURI ); - delete iSourceURI; - iSourceURI = tempSourceUri; - tempSourceUri = NULL; - - TInt sessionId = iServer.ControlPoint().CdsExportResourceActionL( - *iLocalMediaServerUuid, *iSourceURI, *iImportURI ); - if( sessionId > 0 ) - { - iServer.Dispatcher().RegisterL( sessionId, *this ); - iIPSessionId = sessionId; - } - else - { - User::Leave( sessionId ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SendImportActionL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::SendImportActionL() - { - __LOG( "CUPnPBrowsingSession::SendImportActionL" ); - //__LOG8( *iSourceURI ); - //__LOG8( *iImportURI ); - - HBufC8* tempSourceUri = UpnpString::EncodeXmlStringL( - iSourceURI ); - delete iSourceURI; - iSourceURI = tempSourceUri; - tempSourceUri = NULL; - - TInt sessionId = iServer.ControlPoint().CdsImportResourceActionL( - *iLocalMediaServerUuid, *iSourceURI, *iImportURI ); - if( sessionId > 0 ) - { - iServer.Dispatcher().RegisterL( sessionId, *this ); - iIPSessionId = sessionId; - } - else - { - User::Leave( sessionId ); - } - } - - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CopyFinished -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::CopyFinished( TInt aError, TBool aFinished ) - { - __LOG( "CUPnPBrowsingSession::CopyFinished" ); - - if( iInternalState == ECopyLocal ) // Local to remote copy - { - if( aError == KErrNone ) - { - if( aFinished ) - { - // Local to remote copy completed successfully! - - if( iSharedItem ) - { - // Remove shared item - TRAP_IGNORE( iFileSharing->UnShareItemL( - iSharedItem->Id() ) ); - delete iSharedItem; iSharedItem = NULL; - } - - iInternalState = ENone; - if( iActionMessage ) - { - iActionMessage->Complete( - EAVControllerCopyLocalItemFinishCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - // First phase of copy completed (export action succeeded) - if( iActionMessage ) - { - iActionMessage->Complete( - EAVControllerCopyLocalItemStartCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - } - else // Error occured, cleanup. - { - if( iSharedItem ) - { - // Remove shared item - TRAP_IGNORE( iFileSharing->UnShareItemL( - iSharedItem->Id() ) ); - } - delete iSharedItem; iSharedItem = NULL; - if( iItemId ) - { - // Destroy object from the remote media server - TRAP_IGNORE( iServer.ControlPoint().CdsDestroyObjectActionL( - iDevice->Uuid(), *iItemId ) ); - delete iItemId; iItemId = NULL; - } - - iInternalState = ENone; - if( iActionMessage ) - { - iActionMessage->Complete( aError ); - delete iActionMessage; iActionMessage = NULL; - } - - } - } - else if( iInternalState == ECopyToPhone ) // Remote to local copy - { - if( aError == KErrNone ) - { - if( aFinished ) - { - // Remote to local copy successful, check sharing status - CheckSharingStatus(); - - // Restore original download settings - RestoreDownloadSettings(); // ignore error - - iInternalState = ENone; - if( iActionMessage ) - { - iActionMessage->Complete( - EAVControllerCopyToPhoneFinishCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - else - { - // First phase of copy completed (import action succeeded) - if( iActionMessage ) - { - iActionMessage->Complete( - EAVControllerCopyToPhoneStartCompleted ); - delete iActionMessage; iActionMessage = NULL; - } - } - } - else // Error occured, cleanup. - { - // Restore original download settings - RestoreDownloadSettings(); // ignore error - - if( iItemId ) - { - // Destroy object from the local media server - TRAP_IGNORE( iServer.ControlPoint().CdsDestroyObjectActionL( - *iLocalMediaServerUuid, *iItemId ) ); - delete iItemId; iItemId = NULL; - } - - iInternalState = ENone; - if( iActionMessage ) - { - iActionMessage->Complete( aError ); - delete iActionMessage; iActionMessage = NULL; - } - } - } - else - { - __PANICD( __FILE__, __LINE__ ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ResetL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::ResetL() - { - __LOG( "CUPnPBrowsingSession::ResetL" ); - - iIPSessionId = KErrNotFound; - - if( !iServer.DeviceRepository().IsWlanActive() ) - { - __LOG( "Reset - disconnected" ); - User::Leave( KErrDisconnected ); - } - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ReadObjFromMessageL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::ReadObjFromMessageL( const RMessage2& aMessage, - TInt aSlot, CUpnpObject* aObj ) - { - // create buffer - TInt len = aMessage.GetDesMaxLength( aSlot ); - HBufC8* buf = HBufC8::NewLC( len ); - TPtr8 ptr( buf->Des() ); - User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); - - // read stream - RDesReadStream stream( *buf ); - CleanupClosePushL( stream ); - - // internalize object - stream >> *aObj; - - // clean up - CleanupStack::PopAndDestroy( &stream ); - CleanupStack::PopAndDestroy( buf ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ReadReqFromMessageL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::ReadReqFromMessageL( const RMessage2& aMessage, - TInt aSlot, CUpnpAVRequest* aReq ) - { - // create buffer - TInt len = aMessage.GetDesMaxLength( aSlot ); - HBufC8* buf = HBufC8::NewLC( len ); - TPtr8 ptr( buf->Des() ); - User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); - - // read stream - RDesReadStream stream( *buf ); - CleanupClosePushL( stream ); - - // internalize object - stream >> *aReq; - - // clean up - CleanupStack::PopAndDestroy( &stream ); - CleanupStack::PopAndDestroy( buf ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ReadBrowseReqFromMessageL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::ReadBrowseReqFromMessageL( - const RMessage2& aMessage, TInt aSlot, CUpnpAVBrowseRequest* aReq ) - { - // create buffer - TInt len = aMessage.GetDesMaxLength( aSlot ); - HBufC8* buf = HBufC8::NewLC( len ); - TPtr8 ptr( buf->Des() ); - User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); - - // read stream - RDesReadStream stream( *buf ); - CleanupClosePushL( stream ); - - // internalize object - stream >> *aReq; - - // clean up - CleanupStack::PopAndDestroy( &stream ); - CleanupStack::PopAndDestroy( buf ); - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::ReadBufFromMessageLC -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -HBufC8* CUPnPBrowsingSession::ReadBufFromMessageLC( - const RMessage2& aMessage, TInt aSlot ) - { - // create buffer - TInt len = aMessage.GetDesMaxLength( aSlot ); - HBufC8* buf = HBufC8::NewLC( len ); - TPtr8 ptr( buf->Des() ); - User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); - return buf; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::SetDownloadSettingsL -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -void CUPnPBrowsingSession::SetDownloadSettingsL( - MUPnPAVBrowsingSession::TMemoryType aType ) - { - if( aType == MUPnPAVBrowsingSession::EDefault ) - { - // Downloading to default location is the only supported target - } - else - { - User::Leave( KErrNotSupported ); - } - - // EMemoryCard, ERAMDrive or EPhone are not supported, but the code is - // left in place for possible future use - /* - // Read the original download location and store it - HBufC8* buf = iMSSettings->GetL( - UpnpMediaServerSettings::EUploadDirectory ); - delete iOriginalLocation; - iOriginalLocation = buf; - - // Set the new download location - if( aType == MUPnPAVBrowsingSession::EMemoryCard ) - { - User::LeaveIfError( iMSSettings->SetL( - UpnpMediaServerSettings::EUploadDirectory, - KDownloadMemoryCard ) ); - } - else if( aType == MUPnPAVBrowsingSession::ERAMDrive ) - { - User::LeaveIfError( iMSSettings->SetL( - UpnpMediaServerSettings::EUploadDirectory, - KDownloadRAMDrive ) ); - } - else if( aType == MUPnPAVBrowsingSession::EPhone ) - { - User::LeaveIfError( iMSSettings->SetL( - UpnpMediaServerSettings::EUploadDirectory, - KDownloadPhoneMemory ) ); - } - else - { - // Default, no change needed - } - */ - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::RestoreDownloadSettings -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -TInt CUPnPBrowsingSession::RestoreDownloadSettings() - { - // Restore the download settings - TInt err = KErrNone; - - if( iOriginalLocation && iShareFlag != - MUPnPAVBrowsingSession::EDefault ) - { - TRAP( err, err = iMSSettings->SetL( - UpnpMediaServerSettings::EUploadDirectory, - *iOriginalLocation ) ); - } - else - { - err = KErrGeneral; - } - - return err; - } - -// -------------------------------------------------------------------------- -// CUPnPBrowsingSession::CheckSharingStatus -// See upnpbrowsingsession.h -// -------------------------------------------------------------------------- -TInt CUPnPBrowsingSession::CheckSharingStatus() - { - TInt err = KErrNone; - - if( iShareFlag == MUPnPAVBrowsingSession::EFileIsNotShared ) - { - // Unshare the item - if( iItemId ) - { - TRAP( err, iFileSharing->UnShareItemL( *iItemId ) ); - delete iItemId; iItemId = NULL; - } - } - else if( MUPnPAVBrowsingSession::EShareBySettings ) - { - // Check settings to determine should we keep the item shared or not - TInt share = 0; - if( iMusic ) // It's a music item - { - err = iAppSettings->Get( KUPnPAppShareAllMusicFiles, share ); - } - else // Image or video item - { - err = iAppSettings->Get( KUPnPAppShareAllVisualFiles, share ); - } - - if( err == KErrNone && !share ) - { - if( iItemId ) - { - TRAP( err, iFileSharing->UnShareItemL( *iItemId ) ); - delete iItemId; iItemId = NULL; - } - } - } - else - { - // File is shared already, do nothing - } - - return err; - } - -// End of file +/* +* Copyright (c) 2006 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: server impl. of session against media server +* +*/ + + +// INCLUDE FILES +// System +#include +#include +#include + +// upnp stack api +#include +#include +#include + +// dlnasrv / mediaserver api +#include +#include +#include +#include +#include +#include +#include + +// dlnasrv / avcontroller api +#include "upnpavrenderingsessionobserver.h" + +// dlnasrv / avcontroller helper api +#include "upnpconstantdefs.h" // for upnp-specific stuff +#include "upnpfileutility.h" +#include "upnpitemutility.h" + +// dlnasrv / xmlparser api +#include "upnpxmlparser.h" + +// dlnasrv / internal api's +#include "upnpcdsreselementutility.h" +#include "upnpmetadatafetcher.h" + +// dlnasrv / avcontroller internal +#include "upnpavdispatcher.h" +#include "upnpavbrowserequest.h" +#include "upnpavrequest.h" +#include "upnpaverrorhandler.h" +#include "upnpavdeviceextended.h" +#include "upnpdevicerepository.h" +#include "upnpavbrowserespparams.h" +#include "upnpavcontrollerserver.h" +#include "upnpavcpstrings.h" +#include "upnpbrowsingsession.h" +#include "upnpavcontrolpoint.h" + +using namespace UpnpAVCPStrings; + + +// CONSTANTS +_LIT8( KDirectChildren, "BrowseDirectChildren" ); +_LIT8( KMetaData, "BrowseMetadata" ); +_LIT8( KBrowseMetadata, "BrowseMetadata" ); +_LIT8( KDefaultStartingIndex, "0" ); +_LIT8( KDefaultRequestedCount, "1" ); + +const TInt KDefaultInstanceId = 0; +const TInt KExpectedCount = 1; +const TInt KMaxIntLength = 10; + +_LIT( KComponentLogfile, "upnpavcontrollerserver.txt"); +#include "upnplog.h" + + +// ======== MEMBER FUNCTIONS ======== + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::NewL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +CUPnPBrowsingSession* CUPnPBrowsingSession::NewL + ( + CUpnpAVControllerServer& aServer, + TInt aSessionId, + const TDesC8& aUuid + ) + { + CUPnPBrowsingSession* self = new (ELeave) CUPnPBrowsingSession( + aServer, aSessionId ); + CleanupStack::PushL( self ); + + self->ConstructL( aUuid ); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CUPnPBrowsingSession +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +CUPnPBrowsingSession::CUPnPBrowsingSession + ( + CUpnpAVControllerServer& aServer, + TInt aSessionId + ): + iServer( aServer ), + iSessionId( aSessionId ), + + iInstanceId( KDefaultInstanceId ), + iIPSessionId( KErrNotFound ), + + iInternalState( ENone ) + { + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::~CUPnPBrowsingSession +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +CUPnPBrowsingSession::~CUPnPBrowsingSession() + { + iIPSessionId = KErrNotFound; + + delete iDevice; + delete iRespBuf; + delete iRespBuf2; + + delete iItemId; + + delete iLocalMediaServerUuid; + + delete iActionMessage; + delete iDeviceMessage; + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ConstructL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ConstructL( const TDesC8& aUuid ) + { + __LOG( "CUPnPBrowsingSession::ConstructL" ); + + // Get the local Media Server Uuid, if available + const RPointerArray& devList = + iServer.DeviceRepository().DeviceList(); + TInt count = devList.Count(); + TInt i; + for( i = 0; i < count; i++ ) + { + if( devList[ i ]->Local() ) + { + __ASSERT( !iLocalMediaServerUuid, __FILE__, __LINE__ ); + iLocalMediaServerUuid = devList[i]->Uuid().AllocL(); + } + if( devList[ i ]->Uuid() == aUuid ) + { + __ASSERT( !iDevice, __FILE__, __LINE__ ); + iDevice = CUpnpAVDeviceExtended::NewL( *devList[ i ] ); + } + } + if( !iDevice ) + { + if( aUuid == KNullDesC8 ) // Fix to enable AV Controller helper usage + { + iDevice = CUpnpAVDeviceExtended::NewL(); + } + else + { + User::Leave( KErrNotFound ); + } + } + else + { + // + // Gets related control point device (CUpnpDevice) only if aUuid + // is provided. It is needed when CUpnpAVControlPoint is really + // used. + // + // In some cases CUPnPBrowsingSession is be instantiated with dummy + // device uuid (KNullDesC8). In these cases we shouldn't leave nor + // get the control point device. + iCpDevice = iServer.ControlPoint().Device( aUuid ); + if ( !iCpDevice ) + { + User::Leave( KErrNotFound ); + } + } + } + + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ActionResponseL +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ActionResponseL(CUpnpAction* aAction) + { + __ASSERT( aAction->SessionId()==iIPSessionId, __FILE__, __LINE__ ); + + if (aAction->Name().Compare(KGetSearchCapabilities) == 0) + { + CdsSearchCapabilitiesResponse( + aAction->Error(), + aAction->ArgumentValue( KSearchCaps ) ); + } + else if (aAction->Name().Compare(KBrowse) == 0) + { + const TDesC8& numberReturned = aAction->ArgumentValue( + KNumberReturned ); + TLex8 returnedLex( numberReturned ); + TInt numberReturnedInt; + User::LeaveIfError( returnedLex.Val( numberReturnedInt ) ); + + const TDesC8& totalmatches = aAction->ArgumentValue( KTotalMatches ); + TLex8 matchesLex( totalmatches ); + TInt totalMatchesInt; + User::LeaveIfError( matchesLex.Val( totalMatchesInt ) ); + + CdsBrowseResponseL( + aAction->Error(), + aAction->ArgumentValue( KBrowseFlag ), + aAction->ArgumentValue( KResult ), + numberReturnedInt, + totalMatchesInt, + aAction->ArgumentValue( KUpdateID ) ); + } + else if (aAction->Name().Compare(KSearch) == 0) + { + const TDesC8& numberReturned = aAction->ArgumentValue( + KNumberReturned ); + TLex8 returnedLex( numberReturned ); + TInt numberReturnedInt; + User::LeaveIfError( returnedLex.Val( numberReturnedInt ) ); + + const TDesC8& totalmatches = aAction->ArgumentValue( KTotalMatches ); + TLex8 matchesLex( totalmatches ); + TInt totalMatchesInt; + User::LeaveIfError( matchesLex.Val( totalMatchesInt ) ); + + CdsSearchResponse( + aAction->Error(), + aAction->ArgumentValue( KResult ), + numberReturnedInt, + totalMatchesInt, + aAction->ArgumentValue( KUpdateID ) + ); + } + else if (aAction->Name().Compare(KDestroyObject) == 0) + { + CdsDestroyObjectResponse( + aAction->Error() ); + } + else if (aAction->Name().Compare(KCreateObject) == 0) + { + CdsCreateObjectResponse( + aAction->Error(), + aAction->ArgumentValue(KObjectID), + aAction->ArgumentValue(KResult) + ); + } + else + { + __LOG( "response not expected, ignore" ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::StateUpdatedL +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::StateUpdatedL(CUpnpService* /*aService*/) + { + // No implementation required + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::HttpResponseL +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::HttpResponseL(CUpnpHttpMessage* /*aMessage*/) + { + // No implementation required + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::DeviceDiscoveredL +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::DeviceDiscoveredL(CUpnpDevice* /*aDevice*/) + { + // No implementation required + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::DeviceDisappearedL +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::DeviceDisappearedL(CUpnpDevice* /*aDevice*/) + { + // No implementation required + } + + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CdsSearchCapabilitiesResponse +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CdsSearchCapabilitiesResponse( + TInt aErr, + const TDesC8& aSearchCaps) + { + __LOG1( "CUPnPBrowsingSession::CdsSearchCapabilitiesResponse: %d", + aErr ); + + iServer.Dispatcher().UnRegister( iIPSessionId ); + iIPSessionId = KErrNotFound; + + if( iActionMessage ) + { + aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, + EUPnPContentDirectoryError ); + + if( aErr == KErrNone ) + { + if( aSearchCaps != KNullDesC8 ) + { + delete iRespBuf; iRespBuf = NULL; + iRespBuf = aSearchCaps.Alloc(); + if( iRespBuf ) + { + TPckgBuf resp1( aSearchCaps.Length() ); + iActionMessage->Write( 1, resp1 ); + } + else + { + TPckgBuf resp1( 0 ); + iActionMessage->Write( 1, resp1 ); + } + + iActionMessage->Complete( + EAVControllerGetSearchCapabilitiesSizeCompleted ); + delete iActionMessage; iActionMessage = NULL; + } + else + { + TPckgBuf resp1( 0 ); + iActionMessage->Write( 1, resp1 ); + + iActionMessage->Complete( + EAVControllerGetSearchCapabilitiesSizeCompleted ); + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + __LOG( "CdsSearchCapabilitiesResponse - no msg" ); + } + } + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CdsBrowseResponseL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CdsBrowseResponseL( + TInt aErr, + const TDesC8& aBrowseFlag, + const TDesC8& aResult, + TInt aReturned, + TInt aMatches, + const TDesC8& aUpdateID ) + { + __LOG1( "CUPnPBrowsingSession::CdsBrowseResponseL: %d", aErr ); + + iServer.Dispatcher().UnRegister( iIPSessionId ); + iIPSessionId = KErrNotFound; + + if( iActionMessage ) + { + if ( aBrowseFlag.CompareF( KBrowseMetadata ) == 0 && aReturned == 0 + && aErr != KErrCouldNotConnect && aErr != KErrHostUnreach ) + { + aErr = ENoSuchObject; //the file not exist; + } + + if ( aErr != KErrCouldNotConnect && aErr != KErrHostUnreach ) + { + aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, + EUPnPContentDirectoryError ); + __LOG1( "CUPnPBrowsingSession::CdsBrowseResponseL:001 %d", + aErr ); + } + + if( aErr == KErrNone ) + { + if( aResult != KNullDesC8 ) + { + if( iInternalState == EDestroyObject ) + { + TRAP( aErr, CheckAndSendDestroyObjectActionL( aResult) ); + if( aErr ) + { + iInternalState = ENone; + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + else // Browse + { + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + iRespBuf = aResult.Alloc(); + iRespBuf2 = aUpdateID.Alloc(); + + if( iRespBuf && iRespBuf2 ) + { + TUpnpAVBrowseRespParams params; + TPckg resp2( params ); + params.iMatches = aReturned ; + params.iTotalCount = aMatches; + params.iResponseSize = aResult.Length(); + params.iUpdateIdSize = aUpdateID.Length(); + iActionMessage->Write( 2, resp2 ); + iActionMessage->Complete( + EAVControllerGetBrowseResponseSizeCompleted ); + } + else + { + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + iActionMessage->Complete( KErrNoMemory ); + } + iInternalState = ENone; + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + if( iInternalState == EBrowse ) + { + TUpnpAVBrowseRespParams params; + TPckg resp2( params ); + params.iMatches = 0; + params.iTotalCount = 0; + params.iResponseSize = 0; + params.iUpdateIdSize = 0; + iActionMessage->Write( 2, resp2 ); + + iInternalState = ENone; + iActionMessage->Complete( + EAVControllerGetBrowseResponseSizeCompleted ); + delete iActionMessage; iActionMessage = NULL; + } + else + { + iInternalState = ENone; + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + } + else + { + iInternalState = ENone; + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + if ( KErrCouldNotConnect == aErr || KErrHostUnreach == aErr ) + { + iServer.DeviceDisappearedL( iDevice->Uuid() ); + } + } + } + else + { + __LOG( "CdsBrowseResponseL - no msg" ); + } + + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CdsSearchResponse +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CdsSearchResponse( + TInt aErr, + const TDesC8& aResult, + TInt aReturned, + TInt aMatches, + const TDesC8& aUpdateID ) + { + __LOG1( "CUPnPBrowsingSession::CdsSearchResponse: %d", aErr ); + + iServer.Dispatcher().UnRegister( iIPSessionId ); + iIPSessionId = KErrNotFound; + + if( iActionMessage ) + { + aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, + EUPnPContentDirectoryError ); + + if( aErr == KErrNone ) + { + if( aResult != KNullDesC8 ) + { + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + iRespBuf = aResult.Alloc(); + iRespBuf2 = aUpdateID.Alloc(); + + if( iRespBuf && iRespBuf2 ) + { + TUpnpAVBrowseRespParams params; + TPckg resp2( params ); + params.iMatches = aReturned ; + params.iTotalCount = aMatches; + params.iResponseSize = aResult.Length(); + params.iUpdateIdSize = aUpdateID.Length(); + iActionMessage->Write( 2, resp2 ); + iActionMessage->Complete( + EAVControllerGetSearchResponseSizeCompleted ); + } + else + { + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + iActionMessage->Complete( KErrNoMemory ); + } + delete iActionMessage; iActionMessage = NULL; + } + else + { + TUpnpAVBrowseRespParams params; + TPckg resp2( params ); + params.iMatches = 0; + params.iTotalCount = 0; + params.iResponseSize = 0; + params.iUpdateIdSize = 0; + iActionMessage->Write( 2, resp2 ); + + iActionMessage->Complete( + EAVControllerGetSearchResponseSizeCompleted ); + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + __LOG( "CdsSearchResponse - no msg" ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CdsDestroyObjectResponse +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CdsDestroyObjectResponse( + TInt aErr ) + { + __LOG1( "CUPnPBrowsingSession::CdsDestroyObjectResponse: %d", aErr ); + + iServer.Dispatcher().UnRegister( iIPSessionId ); + iIPSessionId = KErrNotFound; + + iInternalState = ENone; + + if( iActionMessage ) + { + aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, + EUPnPContentDirectoryError ); + + if( aErr == KErrNone ) + { + iActionMessage->Complete( EAVControllerDeleteObjectCompleted ); + delete iActionMessage; iActionMessage = NULL; + } + else + { + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + else + { + __LOG( "CdsDestroyObjectResponse - no msg" ); + } + } + + + + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CdsCreateObjectResponse +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CdsCreateObjectResponse( + TInt aErr, + const TDesC8& aObjectID, + const TDesC8& /*aResult*/ ) + { + __LOG1( "CUPnPBrowsingSession::CdsCreateObjectResponse: %d" , aErr ); + + iServer.Dispatcher().UnRegister( iIPSessionId ); + iIPSessionId = KErrNotFound; + + aErr = UPnPAVErrorHandler::ConvertToSymbianErrorCode( aErr, + EUPnPContentDirectoryError ); + + if( aErr == KErrNone ) + { + if( iActionMessage ) + { + HBufC8* objectID = HBufC8::New( aObjectID.Length() ); + if( objectID ) + { + objectID->Des().Copy( aObjectID ); + iActionMessage->Write( 1, *objectID ); + iActionMessage->Complete( + EAVControllerCreateContainerCompleted ); + delete objectID; + } + else + { + iActionMessage->Write( 1, KNullDesC8 ); + iActionMessage->Complete( KErrNoMemory ); + } + delete iActionMessage; iActionMessage = NULL; + } + iInternalState = ENone; + } + else + { + // Create container failed + iInternalState = ENone; + iActionMessage->Complete( aErr ); + delete iActionMessage; iActionMessage = NULL; + } + } + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::DeviceDisappearedL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::DeviceDisappearedL( + CUpnpAVDeviceExtended& aDevice ) + { + __LOG( "CUPnPBrowsingSession::DeviceDisappearedL" ); + + if( aDevice.Local() ) + { + delete iLocalMediaServerUuid; iLocalMediaServerUuid = NULL; + } + else if( iDeviceMessage ) // Target device + { + iDeviceMessage->Complete( KErrNone ); + delete iDeviceMessage; iDeviceMessage = NULL; + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::SetLocalMSUuidL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::SetLocalMSUuidL( const TDesC8& aUuid ) + { + HBufC8* tmp = aUuid.AllocL(); + delete iLocalMediaServerUuid; + iLocalMediaServerUuid = tmp; + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::SessionId +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +TInt CUPnPBrowsingSession::SessionId() const + { + return iSessionId; + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::Uuid +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +const TDesC8& CUPnPBrowsingSession::Uuid() const + { + if( iDevice ) + { + return iDevice->Uuid(); + } + else + { + return KNullDesC8; + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetBrowseResponseSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetBrowseResponseSizeL( + const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetBrowseResponseSizeL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + ResetL(); + + CUpnpAVBrowseRequest* tmpRequest = CUpnpAVBrowseRequest::NewLC(); + + ReadBrowseReqFromMessageL( aMessage, 1, tmpRequest ); + + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KBrowse ); + + TBuf8 startingIndexStr; + startingIndexStr.Num(tmpRequest->StartIndex()); + TBuf8 requestedCountStr; + requestedCountStr.Num(tmpRequest->RequestedCount()); + action->SetArgumentL( KObjectID, tmpRequest->Id() ); + if( tmpRequest->BrowseFlag() == MUPnPAVBrowsingSession::EDirectChildren ) + { + action->SetArgumentL( KBrowseFlag, KDirectChildren ); + } + else + { + action->SetArgumentL( KBrowseFlag, KMetaData ); + } + action->SetArgumentL( KFilter, tmpRequest->Filter() ); + action->SetArgumentL( KStartingIndex, startingIndexStr ); + action->SetArgumentL( KRequestedCount, requestedCountStr ); + action->SetArgumentL( + UpnpAVCPStrings::KSortCriteria, + tmpRequest->SortCriteria() ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) User::Leave( action->SessionId() ); + iIPSessionId = action->SessionId(); + CleanupStack::PopAndDestroy( tmpRequest ); + + // Register + iInternalState = EBrowse; + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + iActionMessage = new (ELeave) RMessage2( aMessage ); + } + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelGetBrowseResponseSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelGetBrowseResponseSizeL() + { + __LOG( "CUPnPBrowsingSession::CancelGetBrowseResponseSizeL" ); + + if( iActionMessage ) + { + iServer.Dispatcher().UnRegister( iIPSessionId ); + iActionMessage->Complete( KErrCancel ); + delete iActionMessage; iActionMessage = NULL; + } + } + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetBrowseResponseL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetBrowseResponseL( const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetBrowseResponseL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + iIPSessionId = KErrNotFound; + if( iRespBuf && iRespBuf2 ) + { + aMessage.WriteL( 1, *iRespBuf ); + aMessage.WriteL( 2, *iRespBuf2 ); + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + aMessage.Complete( EAVControllerGetBrowseResponseCompleted ); + } + else + { + //Memory allocaton failed + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + User::Leave( KErrNoMemory ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetSearchResponseSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetSearchResponseSizeL( + const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetSearchResponseSizeL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + ResetL(); + + CUpnpAVBrowseRequest* tmpRequest = CUpnpAVBrowseRequest::NewLC(); + + ReadBrowseReqFromMessageL( aMessage, 1, tmpRequest ); + + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KSearch ); + + TBuf8 startingIndexStr; + startingIndexStr.Num(tmpRequest->StartIndex()); + TBuf8 requestedCountStr; + requestedCountStr.Num(tmpRequest->RequestedCount()); + action->SetArgumentL( KContainerID, tmpRequest->Id() ); + action->SetArgumentL( KSearchCriteria, tmpRequest->SearchCriteria() ); + action->SetArgumentL( KFilter, tmpRequest->Filter() ); + action->SetArgumentL( KStartingIndex, startingIndexStr ); + action->SetArgumentL( KRequestedCount, requestedCountStr ); + action->SetArgumentL( + UpnpAVCPStrings::KSortCriteria, + tmpRequest->SortCriteria() ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) User::Leave( action->SessionId() ); + iIPSessionId = action->SessionId(); + CleanupStack::PopAndDestroy( tmpRequest ); + + // Register + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + iActionMessage = new (ELeave) RMessage2( aMessage ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelGetSearchResponseSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelGetSearchResponseSizeL() + { + __LOG( "CUPnPBrowsingSession::CancelGetSearchResponseSizeL" ); + + if( iActionMessage ) + { + iServer.Dispatcher().UnRegister( iIPSessionId ); + iActionMessage->Complete( KErrCancel ); + delete iActionMessage; iActionMessage = NULL; + } + + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetSearchResponseL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetSearchResponseL( const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetSearchResponseL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + iIPSessionId = KErrNotFound; + if( iRespBuf && iRespBuf2 ) + { + aMessage.WriteL( 1, *iRespBuf ); + aMessage.WriteL( 2, *iRespBuf2 ); + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + aMessage.Complete( EAVControllerGetSearchResponseCompleted ); + } + else + { + //Memory allocaton failed + delete iRespBuf; iRespBuf = NULL; + delete iRespBuf2; iRespBuf2 = NULL; + User::Leave( KErrNoMemory ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetSearchCapabitiesSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetSearchCapabitiesSizeL( + const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetSearchCapabitiesSizeL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + ResetL(); + + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KGetSearchCapabilities ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) User::Leave( action->SessionId() ); + iIPSessionId = action->SessionId(); + + // Register + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + iActionMessage = new (ELeave) RMessage2( aMessage ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL() + { + __LOG( "CUPnPBrowsingSession::CancelGetSearchCapabitiesSizeL" ); + + if( iActionMessage ) + { + iServer.Dispatcher().UnRegister( iIPSessionId ); + iActionMessage->Complete( KErrCancel ); + delete iActionMessage; iActionMessage = NULL; + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::GetSearchCapabitiesL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::GetSearchCapabitiesL( const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::GetSearchCapabitiesL" ); + + iIPSessionId = KErrNotFound; + + aMessage.WriteL( 1, *iRespBuf ); + aMessage.Complete( EAVControllerGetSearchCapabilitiesCompleted ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CreateContainerL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CreateContainerL( const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::CreateContainerL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + ResetL(); + + // Title + TInt len = aMessage.GetDesMaxLength( 1 ); + HBufC8* tempTitle = HBufC8::NewLC( len ); + TPtr8 ptr( tempTitle->Des() ); + aMessage.ReadL( 1, ptr ); + + // Container ID + len = aMessage.GetDesMaxLength( 2 ); + HBufC8* tempId = HBufC8::NewLC( len ); + ptr.Set( tempId->Des() ); + aMessage.ReadL( 2, ptr ); + + if( iDevice->DlnaCompatible() && !iDevice->CreateChildContainer() + && *tempId != KContainerIdAny ) + { + // The device is DLNA compatible and does not support creation + // of a child container + User::Leave( KErrNotSupported ); + } + + // Container type + MUPnPAVBrowsingSession::TContainerType type = + (MUPnPAVBrowsingSession::TContainerType)aMessage.Int3(); + + // Create a container object + CUpnpContainer* tmpContainer = CUpnpContainer::NewL(); + CleanupStack::PushL( tmpContainer ); + + // Set the title and the parent ID + tmpContainer->SetTitleL( *tempTitle ); + tmpContainer->SetParentIdL( *tempId ); + + // Set the object type + if( type == MUPnPAVBrowsingSession::EPlaylistContainer ) + { + tmpContainer->SetObjectClassL( KClassPlaylist() ); + } + else + { + tmpContainer->SetObjectClassL( KClassStorage() ); + } + + HBufC8* xmlDoc = CUPnPXMLParser::ContainerToXmlLC( *tmpContainer ); + + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KCreateObject ); + + action->SetArgumentL( KContainerID, *tempId ); + action->SetArgumentL( KElements, *xmlDoc ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) User::Leave( action->SessionId() ); + iIPSessionId = action->SessionId(); + + CleanupStack::PopAndDestroy( xmlDoc ); + CleanupStack::PopAndDestroy( tmpContainer ); + CleanupStack::PopAndDestroy( tempId ); + CleanupStack::PopAndDestroy( tempTitle ); + + // Register + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + iInternalState = ECreateContainer; + iActionMessage = new (ELeave) RMessage2( aMessage ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelCreateContainerL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelCreateContainerL() + { + __LOG( "CUPnPBrowsingSession::CancelCreateContainerL" ); + + if( iActionMessage ) + { + iServer.Dispatcher().UnRegister( iIPSessionId ); + iActionMessage->Complete( KErrCancel ); + delete iActionMessage; iActionMessage = NULL; + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::DeleteObjectL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::DeleteObjectL( const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::DeleteObjectL" ); + + __ASSERTD( !iActionMessage, __FILE__, __LINE__ ); + + ResetL(); + + TInt len = aMessage.GetDesMaxLength( 1 ); + HBufC8* tempId = HBufC8::NewLC( len ); + TPtr8 ptr( tempId->Des() ); + aMessage.ReadL( 1, ptr ); + + CleanupStack::Pop( tempId ); + delete iItemId; + iItemId = tempId; + + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KBrowse ); + + action->SetArgumentL( KObjectID, *iItemId ); + action->SetArgumentL( KBrowseFlag, KMetaData ); + action->SetArgumentL( KFilter, KFilterCommon ); + action->SetArgumentL( KStartingIndex, KDefaultStartingIndex ); + action->SetArgumentL( KRequestedCount, KDefaultRequestedCount ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) User::Leave( action->SessionId() ); + iIPSessionId = action->SessionId(); + + // Register + iInternalState = EDestroyObject; + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + iActionMessage = new (ELeave) RMessage2( aMessage ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelDeleteObjectL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelDeleteObjectL() + { + __LOG( "CUPnPBrowsingSession::CancelDeleteObjectL" ); + + if( iActionMessage ) + { + iServer.Dispatcher().UnRegister( iIPSessionId ); + iActionMessage->Complete( KErrCancel ); + delete iActionMessage; iActionMessage = NULL; + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::DeviceDisappearedRequestL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::DeviceDisappearedRequestL( + const RMessage2& aMessage ) + { + __LOG( "CUPnPBrowsingSession::DeviceDisappearedRequestL" ); + + __ASSERTD( !iDeviceMessage, __FILE__, __LINE__ ); + + iDeviceMessage = new (ELeave) RMessage2( aMessage ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CancelDeviceDisappearedRequestL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CancelDeviceDisappearedRequestL() + { + __LOG( "CUPnPBrowsingSession::CancelDeviceDisappearedRequestL" ); + + if( iDeviceMessage ) + { + iDeviceMessage->Complete( KErrCancel ); + delete iDeviceMessage; iDeviceMessage = NULL; + } + } + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL( + const TDesC8& aResponse ) + { + __LOG( "CUPnPBrowsingSession::CheckAndSendDestroyObjectActionL" ); + + CUPnPXMLParser* parser = CUPnPXMLParser::NewL(); + CleanupStack::PushL( parser ); + + RPointerArray array; + CleanupResetAndDestroyPushL( array ); + + parser->ParseResultDataL( array, aResponse ); + + if( array.Count() == KExpectedCount ) + { + if( array[ 0 ]->Restricted() ) + { + User::Leave( KErrArgument ); + } + else + { + // Not restricted, ok to destroy + CUpnpAction* action = iServer.ControlPoint().CreateActionLC( + iCpDevice, KContentDirectory, KDestroyObject ); + + action->SetArgumentL( KObjectID, *iItemId ); + + iServer.ControlPoint().SendL( action ); + CleanupStack::Pop( action ); + if (action->SessionId() < 0) + { + User::Leave( action->SessionId() ); + } + iIPSessionId = action->SessionId(); + iServer.Dispatcher().RegisterL( iIPSessionId, *this ); + } + } + else + { + User::Leave( KErrGeneral ); + } + CleanupStack::PopAndDestroy( &array ); + CleanupStack::PopAndDestroy( parser ); + } + + + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ResetL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ResetL() + { + __LOG( "CUPnPBrowsingSession::ResetL" ); + + iIPSessionId = KErrNotFound; + + if( !iServer.DeviceRepository().IsWlanActive() ) + { + __LOG( "Reset - disconnected" ); + User::Leave( KErrDisconnected ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ReadObjFromMessageL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ReadObjFromMessageL( const RMessage2& aMessage, + TInt aSlot, CUpnpObject* aObj ) + { + // create buffer + TInt len = aMessage.GetDesMaxLength( aSlot ); + HBufC8* buf = HBufC8::NewLC( len ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); + + // read stream + RDesReadStream stream( *buf ); + CleanupClosePushL( stream ); + + // internalize object + stream >> *aObj; + + // clean up + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buf ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ReadReqFromMessageL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ReadReqFromMessageL( const RMessage2& aMessage, + TInt aSlot, CUpnpAVRequest* aReq ) + { + // create buffer + TInt len = aMessage.GetDesMaxLength( aSlot ); + HBufC8* buf = HBufC8::NewLC( len ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); + + // read stream + RDesReadStream stream( *buf ); + CleanupClosePushL( stream ); + + // internalize object + stream >> *aReq; + + // clean up + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buf ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ReadBrowseReqFromMessageL +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +void CUPnPBrowsingSession::ReadBrowseReqFromMessageL( + const RMessage2& aMessage, TInt aSlot, CUpnpAVBrowseRequest* aReq ) + { + // create buffer + TInt len = aMessage.GetDesMaxLength( aSlot ); + HBufC8* buf = HBufC8::NewLC( len ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); + + // read stream + RDesReadStream stream( *buf ); + CleanupClosePushL( stream ); + + // internalize object + stream >> *aReq; + + // clean up + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::PopAndDestroy( buf ); + } + +// -------------------------------------------------------------------------- +// CUPnPBrowsingSession::ReadBufFromMessageLC +// See upnpbrowsingsession.h +// -------------------------------------------------------------------------- +HBufC8* CUPnPBrowsingSession::ReadBufFromMessageLC( + const RMessage2& aMessage, TInt aSlot ) + { + // create buffer + TInt len = aMessage.GetDesMaxLength( aSlot ); + HBufC8* buf = HBufC8::NewLC( len ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( aSlot, ptr ) ); + return buf; + } + +// End of file