diff -r 000000000000 -r 7f85d04be362 upnpmediaserver/mediaserverengine/src/upnpmediaserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpmediaserver/mediaserverengine/src/upnpmediaserversession.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,1055 @@ +/** @file +* Copyright (c) 2005-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: Media Server Session +* +*/ + + +// INCLUDE FILES +#include "upnpmediaserversession.h" +#include "upnpmediaservereventhandler.h" +#include "upnpmediaserver.pan" +#include "upnpitem.h" +#include "upnpicon.h" +#include "upnpcontainer.h" +#include "upnpitemlist.h" +#include "upnpcontainerlist.h" +#include "upnpbrowsecriteria.h" +#include "upnpmediaserverclient.h" +#include +#include + + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::CUpnpMediaServerSession +// ----------------------------------------------------------------------------- +// +CUpnpMediaServerSession::CUpnpMediaServerSession(CUpnpMediaServer* aServer) + : CSession2(), iRespLengthPkg(iRespLength), iRespExecStatusPkg(iRespExecStatus) + { + iMediaServer = aServer; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ConstructL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ConstructL() + { + iEventHandler = CUpnpMediaServerEventHandler::NewL(this->iMediaServer); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::~CUpnpMediaServerSession +// ----------------------------------------------------------------------------- +// +CUpnpMediaServerSession::~CUpnpMediaServerSession() + { + delete iResponseBuffer; + delete iEventHandler; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ServiceL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ServiceL( const RMessage2& aMessage ) + { + // first of all server must be started + if( iMediaServer->Status() == RUpnpMediaServerClient::EStopped && + aMessage.Function() != EMediaServerStatus && + aMessage.Function() != EMediaServerStart && + aMessage.Function() != EMediaServerStartOffline && + aMessage.Function() != EMediaServerSubscribeEvents && + aMessage.Function() != EMediaServerUnsubscribeEvents && + aMessage.Function() != EMediaServerListenTransferEvent && + aMessage.Function() != EMediaServerGetTransferEventBody && + aMessage.Function() != EMediaServerStatusChange && + aMessage.Function() != EMediaServerStatusChangeCancel && + aMessage.Function() != EMediaServerAddIcon && + aMessage.Function() != EMediaServerRemoveIcon && + aMessage.Function() != EMediaServerRemoveIcons && + aMessage.Function() != EMediaServerUpdateIcon + ) + { + User::Leave( KErrNotReady ); + } + + switch ( aMessage.Function() ) + { + case EMediaServerStatus: + EventMediaServerStatusL( aMessage ); + break; + case EMediaServerStartOffline: + EventMediaServerStartOfflineL(aMessage); + break; + case EMediaServerStart: + EventMediaServerStartL( aMessage ); + break; + case EMediaServerStop: + EventMediaServerStop( aMessage ); + break; + case EMediaServerStopSilent: + EventMediaServerStopSilent( aMessage ); + break; + case EMediaServerRestart: + EventMediaServerRestartL( aMessage ); + break; + case EMediaServerShareItem: + EventMediaServerShareItemL( aMessage ); + break; + case EMediaServerShareItemResult: + EventMediaServerGetShareItemResultL( aMessage ); + break; + case EMediaServerShareContainer: + EventMediaServerShareContainerL( aMessage ); + break; + case EMediaServerShareContainerResult: + EventMediaServerGetShareContainerResultL(aMessage); + break; + case EMediaServerShareItemList: + EventMediaServerShareItemListL( aMessage ); + break; + case EMediaServerShareItemListResult: + EventMediaServerGetShareItemListResultL( aMessage ); + break; + case EMediaServerUnshareItem: + EventMediaServerUnshareItemL( aMessage ); + break; + case EMediaServerUnshareRoot: + EventMediaServerUnshareRootL( aMessage ); + break; + case EMediaServerUnshareContainer: + EventMediaServerUnshareContainerL( aMessage ); + break; + case EMediaServerGetSharedItem: + EventMediaServerGetSharedItemL( aMessage ); + break; + case EMediaServerGetSharedItemResult: + EventMediaServerGetGetSharedItemResultL( aMessage ); + break; + case EMediaServerGetSharedContainer: + EventMediaServerGetSharedContainerL( aMessage ); + break; + case EMediaServerGetSharedContainerResult: + EventMediaServerGetGetSharedContainerResultL( aMessage ); + break; + case EMediaServerUnshareItemList: + EventMediaServerUnshareItemListL( aMessage ); + break; + case EMediaServerGetSharedItemList: + EventMediaServerGetSharedItemListL(aMessage); + break; + case EMediaServerGetSharedItemListResult: + EventMediaServerGetGetSharedItemListResultL(aMessage); + break; + case EMediaServerGetSharedContainerList: + EventMediaServerGetSharedContainerListL(aMessage); + break; + case EMediaServerGetSharedContainerListResult: + EventMediaServerGetGetSharedContainerListResultL(aMessage); + break; + case EMediaServerSubscribeEvents: + iEventHandler->EventMediaServerSubscribeEvents(aMessage); + break; + case EMediaServerUnsubscribeEvents: + iEventHandler->EventMediaServerUnsubscribeEvents(aMessage); + break; + case EMediaServerListenTransferEvent: + iEventHandler->EventMediaServerServerListenTransferEventL(aMessage); + break; + case EMediaServerGetTransferEventBody: + iEventHandler->EventMediaServerGetTransferEventBodyL(aMessage); + break; + case EMediaServerGetIpAndPort: + EventMediaServerGetIpAndPortL(aMessage); + break; + case EMediaServerSetUploadDirectory: + EventSetUploadDirectoryL( aMessage ); + break; + case EMediaServerAddIcon: + EventAddIconL( aMessage ); + break; + case EMediaServerRemoveIcon: + EventRemoveIconL( aMessage ); + break; + case EMediaServerRemoveIcons: + EventRemoveIconsL( aMessage ); + break; + case EMediaServerUpdateIcon: + EventUpdateIconL( aMessage ); + break; + case EMediaServerShareReference: + EventMediaServerShareReferenceL( aMessage ); + break; + case EMediaServerShareReferenceList: + EventMediaServerShareReferenceListL( aMessage ); + break; + case EMediaServerStatusChange: + EventMediaServerStatusChange( aMessage ); + break; + case EMediaServerStatusChangeCancel: + EventMediaServerStatusChangeCancel( aMessage ); + break; + default : + PanicClient( aMessage, EMediaServerBadRequest ); + break; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::PanicClient +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::PanicClient( const RMessage2 &aMessage, TInt aPanic ) const + { + static_cast( Server() )->PanicClient( aMessage, aPanic ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::NewL +// ----------------------------------------------------------------------------- +// +CUpnpMediaServerSession* CUpnpMediaServerSession::NewL(CUpnpMediaServer* aServer) + { + CUpnpMediaServerSession* self = CUpnpMediaServerSession::NewLC(aServer); + CleanupStack::Pop( self ) ; + return self ; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::NewLC +// ----------------------------------------------------------------------------- +// +CUpnpMediaServerSession* CUpnpMediaServerSession::NewLC(CUpnpMediaServer* aServer) + { + CUpnpMediaServerSession* self = new (ELeave) CUpnpMediaServerSession(aServer); + CleanupStack::PushL( self ); + self->ConstructL() ; + return self ; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStartL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStatusL( const RMessage2& aMessage ) + { + TPckgBuf status( iMediaServer->Status() ); + aMessage.WriteL( 0, status ); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStartL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStartL( const RMessage2& aMessage ) + { + iMediaServer->CancelAVMediaServerStop();//if stop was scheduled - cancel it + + if ( iMediaServer->Status() != RUpnpMediaServerClient::EStartedOnline ) + { + TRAPD( err, iMediaServer->StartAVMediaServerL() ); + + if ( err == KErrNotFound // files not found + || err == KErrArgument // empty or improper one of description files + || (err >= EXmlParserError && err <= EXmlFeatureLockedWhileParsing) // description malformed + || err == KErrNoMemory // problem with start because of memory usage + ) + { + iMediaServer->InitializeL( ETrue ); + iMediaServer->RestartAVMediaServerL(); + iMediaServer->StartAVMediaServerL(); + } + else if (err == KErrCorrupt || err == KErrEof || err == KErrNotSupported) + { + iMediaServer->ResetDbL(); + iMediaServer->StartAVMediaServerL(); + } + else + { + User::LeaveIfError(err); + } + } + + if ( !aMessage.IsNull() ) + { + aMessage.Complete( KErrNone ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStartOfflineL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStartOfflineL( const RMessage2& aMessage ) + { + iMediaServer->CancelAVMediaServerStop();//if stop was scheduled cancel it + if( iMediaServer->Status() != RUpnpMediaServerClient::EStartedOffline ) + { + TRAPD(err, iMediaServer->StartAVMediaServerOfflineL()); + if ( err == KErrNotFound // files not found + || err == KErrArgument // empty or improper one of description files + || (err >= EXmlParserError && err <= EXmlFeatureLockedWhileParsing) // description malformed + || err == KErrNoMemory // problem with start because of memory usage + ) + { + iMediaServer->InitializeL( ETrue ); + iMediaServer->StartAVMediaServerOfflineL(); + } + else if (err == KErrCorrupt || err == KErrEof) + { + iMediaServer->ResetDbL(); + iMediaServer->StartAVMediaServerOfflineL(); + } + else + { + User::LeaveIfError(err); + } + + } + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStop +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStop( const RMessage2& aMessage ) + { + if ( iMediaServer->Status() != RUpnpMediaServerClient::EStopped ) + { + iMediaServer->StopAVMediaServer(EFalse); + } + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStopSilent +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStopSilent( const RMessage2& aMessage ) + { + if ( iMediaServer->Status() != RUpnpMediaServerClient::EStopped ) + { + iMediaServer->StopAVMediaServer(ETrue); + } + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerRestartL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerRestartL( const RMessage2& aMessage ) + { + iMediaServer->RestartAVMediaServerL(); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetShareItemResultL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetShareItemResultL( const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetShareContainerResultL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetShareContainerResultL( const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerShareItemL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerShareItemL( const RMessage2& aMessage ) + { + // get object from message + CUpnpItem* item = CUpnpItem::NewL(); + CleanupStack::PushL(item); + ReadObjFromMessageL(aMessage, 0, item); + + // perform action + iMediaServer->ShareObjectL(item); + + // prepare response + iResponseBuffer = item->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(item); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetSharedItemL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetSharedItemL( + const RMessage2& aMessage ) + { + // perform action + CUpnpItem* item = iMediaServer->GetSharedItemL(aMessage.Int0()); + CleanupStack::PushL(item); + + // prepare response + iResponseBuffer = item->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(item); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetGetSharedItemResultL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetGetSharedItemResultL( + const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetSharedContainerL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetSharedContainerL( + const RMessage2& aMessage ) + { + // perform action + CUpnpContainer* cont = iMediaServer->GetSingleContainerL(aMessage.Int0()); + CleanupStack::PushL(cont); + + // prepare response + iResponseBuffer = cont->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(cont); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetShareContainerListResultL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetGetSharedContainerResultL( + const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerShareContainerL +// Stops the server. +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerShareContainerL( + const RMessage2& aMessage ) + { + // get object from message + CUpnpContainer* cont = CUpnpContainer::NewL(); + CleanupStack::PushL(cont); + ReadObjFromMessageL(aMessage, 0, cont); + + // perform action + iMediaServer->ShareObjectL(cont); + + // prepare response + iResponseBuffer = cont->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(cont); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetShareItemListResultL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetGetSharedItemListResultL( + const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.WriteL( 1, iRespExecStatusPkg ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetGetSharedContainerListResultL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetGetSharedContainerListResultL( + const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.WriteL( 1, iRespExecStatusPkg ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetShareItemListResultL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetShareItemListResultL( const RMessage2& aMessage ) + { + ASSERT(aMessage.GetDesMaxLength(0) >= iRespLength); + + // Write result back to client + aMessage.WriteL( 0, *iResponseBuffer ); + aMessage.WriteL( 1, iRespExecStatusPkg ); + aMessage.Complete( KErrNone ); + + // clean up + delete iResponseBuffer; + iResponseBuffer = NULL; + } +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerUnshareRootL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerUnshareRootL( + const RMessage2& aMessage ) + { + iMediaServer->UnshareRootL(); + aMessage.Complete( KErrNone ); + } +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerUnshareItemL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerUnshareItemL( + const RMessage2& aMessage ) + { + iMediaServer->UnshareItemL(aMessage.Int0()); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerUnshareContainerL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerUnshareContainerL( + const RMessage2& aMessage ) + { + iMediaServer->UnshareContainerL(aMessage.Int0()); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetSharedItemListL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetSharedItemListL( + const RMessage2& aMessage ) + { + // get object from message + CUpnpBrowseCriteria* bc = CUpnpBrowseCriteria::NewL(); + CleanupStack::PushL(bc); + ReadObjFromMessageL(aMessage, 1, bc); + + // item list + CUpnpItemList* il = CUpnpItemList::NewL(); + CleanupStack::PushL(il); + + // perform action + iMediaServer->GetSharedItemListL(aMessage.Int0(), bc, &iRespExecStatus, il); + + // prepare response + iResponseBuffer = il->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(2, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(il); + CleanupStack::PopAndDestroy(bc); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetSharedContainerListL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetSharedContainerListL( + const RMessage2& aMessage ) + { + // get object from message + CUpnpBrowseCriteria* bc = CUpnpBrowseCriteria::NewL(); + CleanupStack::PushL(bc); + ReadObjFromMessageL(aMessage, 1, bc); + + // item list + CUpnpContainerList* cl = CUpnpContainerList::NewL(); + CleanupStack::PushL(cl); + + // perform action + iMediaServer->GetSharedContainerListL(aMessage.Int0(), + bc, &iRespExecStatus, cl); + + // prepare response + iResponseBuffer = cl->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(2, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(cl); + CleanupStack::PopAndDestroy(bc); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerShareItemListL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerShareItemListL( + const RMessage2& aMessage ) + { + // get object from message + CUpnpItemList* il = CUpnpItemList::NewL(); + CleanupStack::PushL(il); + ReadObjFromMessageL(aMessage, 0, il); + + // perform action + iMediaServer->ShareItemListL(il, &iRespExecStatus); + + // prepare response + iResponseBuffer = il->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(il); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerUnshareItemListL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerUnshareItemListL( + const RMessage2& aMessage ) + { + // get ids from message + RArray il; + CleanupClosePushL(il); + ReadIdsFromMessageL(aMessage, 0, il); + + // perform action + iMediaServer->UnshareItemListL(il, &iRespExecStatus); + + // prepare response + aMessage.WriteL( 1, iRespExecStatusPkg ); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(&il); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerGetIpAndPortL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerGetIpAndPortL( + const RMessage2& aMessage ) + { + // response + TInetAddr address = iMediaServer->GetAddress(); + if (address.Match(TInetAddr(INET_ADDR(0, 0, 0, 0)))) + { + User::Leave( KErrNotReady ); + } + aMessage.WriteL( 0, TPckgBuf( address ) ); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventSetUploadDirectoryL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventSetUploadDirectoryL( const RMessage2& aMessage ) + { + HBufC* buf = HBufC::NewLC( aMessage.GetDesLength( 0 ) ); + TPtr ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( 0, ptr ) ); + iMediaServer->SetUploadDirToCDL( ptr ); + CleanupStack::PopAndDestroy(buf); + aMessage.Complete( KErrNone ); + } +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventAddIcon +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventAddIconL( const RMessage2& aMessage) + { + HBufC8* buf = HBufC8::NewLC( aMessage.GetDesLength( 0 ) ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( 0, ptr ) ); + + iMediaServer->AddIconL(ptr); + CleanupStack::PopAndDestroy(buf); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventUpdateIcon +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventUpdateIconL( const RMessage2& aMessage) + { + HBufC8* buf0 = HBufC8::NewLC( aMessage.GetDesLength( 0 ) ); + TPtr8 ptr0( buf0->Des() ); + User::LeaveIfError( aMessage.Read( 0, ptr0 ) ); + + HBufC8* buf1 = HBufC8::NewLC( aMessage.GetDesLength( 1 ) ); + TPtr8 ptr1( buf1->Des() ); + User::LeaveIfError( aMessage.Read( 1, ptr1 ) ); + + iMediaServer->UpdateIconL(ptr0, ptr1); + + CleanupStack::PopAndDestroy(buf1); + CleanupStack::PopAndDestroy(buf0); + + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventRemoveIcon +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventRemoveIconL( const RMessage2& aMessage) + { + //Remove icon + HBufC8* buf = HBufC8::NewLC( aMessage.GetDesLength( 0 ) ); + TPtr8 ptr( buf->Des() ); + User::LeaveIfError( aMessage.Read( 0, ptr ) ); + + iMediaServer->RemoveIconL(ptr); + CleanupStack::PopAndDestroy(buf); + + aMessage.Complete( KErrNone ); + } +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventRemoveIcons +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventRemoveIconsL( const RMessage2& aMessage ) + { + iMediaServer->RemoveIconsL(); + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ObjFromMessageL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ReadIdsFromMessageL( const RMessage2& aMessage, + TInt aSlot, RArray& aObjIds ) + { + // 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); + + // number of elements + TInt n = stream.ReadInt32L(); + + // variables used to retrieve integers + HBufC8* tmpId; + TLex8 lex; + TInt tmpIdNum; + // read elements + while( n-- ) + { + tmpId = HBufC8::NewLC(stream, KMaxUpnpObjStringLen); + if ( tmpId->Des() == KNullDesC8() ) + { + User::Leave( KErrNotFound ); + } + lex.Assign(tmpId->Des()); + if( lex.Val( tmpIdNum ) < KErrNone ) + { + User::Leave( KErrNotFound ); + } + aObjIds.AppendL( tmpIdNum); + CleanupStack::PopAndDestroy(tmpId); + } + + // clean up + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(buf); + } +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ObjFromMessageL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::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); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ReadItemFromMessageL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ReadItemFromMessageL( const RMessage2& aMessage, + TInt aSlot, CUpnpItem* aItem ) + { + // 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 >> *aItem; + + // clean up + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(buf); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ReadObjFromMessageL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ReadObjFromMessageL( const RMessage2& aMessage, + TInt aSlot, CUpnpItemList* aItemList ) + { + // 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 >> *aItemList; + + // clean up + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(buf); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::ReadObjFromMessageL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::ReadObjFromMessageL( const RMessage2& aMessage, + TInt aSlot, CUpnpBrowseCriteria* aBrowseCriteria ) + { + // 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 >> *aBrowseCriteria; + + // clean up + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(buf); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerShareReferenceL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerShareReferenceL( const RMessage2& aMessage ) + { + // get 'reference object' from message + CUpnpItem* ref = CUpnpItem::NewL(); + CleanupStack::PushL(ref); + ReadItemFromMessageL(aMessage, 0, ref); + + // perform sharing + iMediaServer->ShareReferenceL(ref); + + // prepare response + iResponseBuffer = ref->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(ref); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerShareReferenceListL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerShareReferenceListL( const RMessage2& aMessage ) + { + // get 'reference item' list from message + CUpnpItemList* refList = CUpnpItemList::NewL(); + CleanupStack::PushL(refList); + ReadObjFromMessageL(aMessage, 0, refList); + + // perform sharing + iMediaServer->ShareReferenceListL(refList, &iRespExecStatus); + + // prepare response + iResponseBuffer = refList->ToDes8L(); + iRespLength = iResponseBuffer->Length(); + aMessage.WriteL(1, iRespLengthPkg); + aMessage.Complete( KErrNone ); + + // clean up + CleanupStack::PopAndDestroy(refList); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStatusChangeL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStatusChange( const RMessage2& aMessage ) + { + if ( !iStatusMessage.IsNull() ) + { + aMessage.Complete( KErrInUse ); + } + else + { + iStatusMessage = aMessage; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::EventMediaServerStatusChangeCancelL +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::EventMediaServerStatusChangeCancel( const RMessage2& aMessage ) + { + if ( !iStatusMessage.IsNull() ) + { + iStatusMessage.Complete( KErrCancel ); + } + aMessage.Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CUpnpMediaServerSession::StatusChanged +// ----------------------------------------------------------------------------- +// +void CUpnpMediaServerSession::StatusChanged() + { + if ( !iStatusMessage.IsNull() ) + { + iStatusMessage.Complete( KErrNone ); + } + } + +// End of File