diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/Client/upnpplugin/src/cpnpservicepublisher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/Client/upnpplugin/src/cpnpservicepublisher.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,138 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// cupnpservicepublisherimpl.cpp +// +// + + +#include "cupnpservicepublisherimpl.h" +#include "pnputils.h" + +CUPnPServicePublisherImpl::CUPnPServicePublisherImpl () + { + } +CUPnPServicePublisherImpl* CUPnPServicePublisherImpl::NewL() + { + return new ( ELeave ) CUPnPServicePublisherImpl; + } +CUPnPServicePublisherImpl::~CUPnPServicePublisherImpl () + { + delete iEventNotifier; + delete iUPnPEventHandler; + delete iUPnPPublisher; + + iSubConnection.Close(); + iConnection.Close(); + iSocketServer.Close(); + } + +void CUPnPServicePublisherImpl::Publish ( const RPnPParameterBundle& aServiceInfo ) + { + __ASSERT_DEBUG( !iUPnPPublisher, User::Panic( KUPnPAlreadyPublished, KUPnPErrPublish)); + TRAPD(err, PublishL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + } + +void CUPnPServicePublisherImpl::PublishL ( const RPnPParameterBundle& aServiceInfo ) + { + iUPnPPublisher = CUPnPPublisher::NewL( iSubConnection ); + iUPnPPublisher->SubmitRequestL( aServiceInfo ); + } + +void CUPnPServicePublisherImpl::SendNotify ( const RPnPParameterBundle& aServiceInfo ) + { + __ASSERT_DEBUG( iUPnPPublisher, User::Panic(KUPnPServiceNotPublished,KUPnPErrPublish)); + __ASSERT_DEBUG( iUPnPPublisher->IsService(), User::Panic(KUPnPDeviceSendingNotification,KUPnPErrPublish)); + TRAPD( err, SendNotifyL( aServiceInfo )); + if ( err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + } +void CUPnPServicePublisherImpl::SendNotifyL ( const RPnPParameterBundle& aServiceInfo ) + { + if( !iUPnPEventHandler ) + iUPnPEventHandler = new (ELeave) CUPnPEventHandler(iSubConnection); + iUPnPEventHandler->SubmitRequestL( aServiceInfo ); + } +// Explicitly start the connection +TInt CUPnPServicePublisherImpl::Construct(TUint aTierId ) + { + TInt err; + //Connect the Socket Server + if((err = iSocketServer.Connect()) != KErrNone) + return err; + + // Open the connection passing the socket server and the tier Id + if((err = iConnection.Open( iSocketServer, aTierId )) != KErrNone) + return err; + + //Start the connection using the given preferences + TConnSnapPref prefs ( KPublishConnPref ); + if((err = iConnection.Start( prefs )) != KErrNone) + return err; + + //Create a new sub-connection on the started connection + err = iSubConnection.Open(iSocketServer, RSubConnection::ECreateNew, iConnection); + if ( err != KErrNone ) + return err ; + + iEventNotifier = new CUPnPEventNotifier ( *this , iSubConnection ); + if( !iEventNotifier ) + return KErrNoMemory ; + + iEventNotifier->Notify(); + return KErrNone; + } + + +// Invoke NotifyResults of respective classes +void CUPnPServicePublisherImpl::OnNotificationL (TUint32 aFamilyId) + { + RPnPParameterBundleBase pnpBundle; + CleanupClosePushL(pnpBundle); + // Get the subcon parameters + User::LeaveIfError(iSubConnection.GetParameters(pnpBundle)); + + // Send a clear request + RPnPParameterBundleBase pBundle; + User::LeaveIfError(pBundle.Open()); + CleanupClosePushL(pBundle); + RParameterFamily family = pBundle.CreateFamilyL(EUPnPClearParamSet); + User::LeaveIfError ( iSubConnection.SetParameters(pBundle) ); + CleanupStack::PopAndDestroy(&pBundle); + CleanupStack::Pop(&pnpBundle); + + switch( aFamilyId ) + { + case EUPnPPublishResponseParamSet: + iUPnPPublisher->NotifyResultsL(pnpBundle); + break; + + default: + __ASSERT_DEBUG(0, User::Panic(KUPnPInvalidFamily,KUPnPErrInvalidFamily)); + break; + } + } + +TInt CUPnPServicePublisherImpl::InitiateControl ( RControlChannel& /*aControlChannel*/ ) + { + TSockAddr sockAddr; + TConnectionDetails connInfo ( &sockAddr, KNullDesC8 () ); // Note! dummy connect will happen in control channel + // so it will be able to recv request packets, or else + // immediate recv call after socket open will fail with KErrNotReady + //return aControlChannel.Open ( iSocketServer, iSubConnection, KAfInet, ETrue, KProtocolInetTcp, connInfo ); + return KErrNone; + } + +