servicediscoveryandcontrol/pnp/test/upnp/Client/upnpplugin/src/cpnpservicediscovery.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/Client/upnpplugin/src/cpnpservicediscovery.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,240 @@
+// 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:
+// cupnpservicediscoveryimpl.cpp
+// 
+//
+
+#include <connpref.h>
+#include "cupnpservicediscoveryimpl.h"
+#include <upnp/upnpconstants.h>
+
+CUPnPServiceDiscoveryImpl::CUPnPServiceDiscoveryImpl ()
+	{
+	}
+CUPnPServiceDiscoveryImpl* CUPnPServiceDiscoveryImpl::NewL()
+	{
+	CUPnPServiceDiscoveryImpl* self = new (ELeave) CUPnPServiceDiscoveryImpl;
+	return self;
+	}
+CUPnPServiceDiscoveryImpl::~CUPnPServiceDiscoveryImpl ()
+	{
+
+	delete	iEventNotifier;
+	delete 	iUPnPSearch;
+	delete 	iUPnPDescribe;
+	delete 	iUPnPSubscribe;
+	delete 	iUPnPRegister;
+
+	iHostResolver.Close();
+	iSubConnection.Close();
+	iConnection.Close();	
+	iSocketServer.Close();
+	}
+
+// Explicitly start the connection
+TInt CUPnPServiceDiscoveryImpl::Construct( TUint aTierId )
+	{	
+	TInt err;
+	//Connect the Socket Server
+	if((err = iSocketServer.Connect()) != KErrNone)
+		return err;
+
+	//const TUint KUPnPTierId = 0x2000D054;
+	// 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 ( KDiscoveryConnPref );
+	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;
+
+	err = iHostResolver.Open( iSocketServer, KAfInet , KProtocolInetTcp);// , iConnection);
+	if (err != KErrNone )
+		return err;
+	
+	iEventNotifier = new CUPnPEventNotifier ( *this , iSubConnection );
+	if( !iEventNotifier )
+		return KErrNoMemory ;
+	
+	iEventNotifier->Notify();
+	return KErrNone;
+	}
+
+// Sends the M-SEARCH request
+void CUPnPServiceDiscoveryImpl::Discover ( const RPnPParameterBundle& aServiceInfo )
+	{
+	TRAPD( err, DiscoverL( aServiceInfo ));
+	if(err != KErrNone )
+		aServiceInfo.PnPObserver()->OnPnPError(err);
+	}
+
+void CUPnPServiceDiscoveryImpl::DiscoverL ( const RPnPParameterBundle& aServiceInfo )
+	{
+	if( !iUPnPSearch )
+		iUPnPSearch = CUPnPSearch::NewL( iSubConnection );
+	
+	__ASSERT_DEBUG( iUPnPSearch->DiscoverInProgress()== EFalse,User::Panic(KUPnPDiscoveryInProgress,KUPnPErrDiscoveryInProgress) );
+	iUPnPSearch->SubmitRequestL( aServiceInfo );
+	}
+
+
+void CUPnPServiceDiscoveryImpl::Describe(  const RPnPParameterBundle& aServiceInfo )
+	{
+	TRAPD( err, DescribeL( aServiceInfo ));
+	if(err != KErrNone )
+		aServiceInfo.PnPObserver()->OnPnPError(err);
+	}
+// Sends the Describe request
+void CUPnPServiceDiscoveryImpl::DescribeL ( const RPnPParameterBundle& aServiceInfo )
+	{
+	if( !iUPnPDescribe )
+		iUPnPDescribe = new (ELeave) CUPnPDescribe(iSubConnection ,iHostResolver);
+	iUPnPDescribe->SubmitRequestL(aServiceInfo);
+	}
+//Sends the Subscribe request
+void CUPnPServiceDiscoveryImpl::Subscribe ( const RPnPParameterBundle& aServiceInfo )
+	{
+	TRAPD( err, SubscribeL( aServiceInfo ));
+	if(err != KErrNone )
+		aServiceInfo.PnPObserver()->OnPnPError(err);
+	}
+
+void CUPnPServiceDiscoveryImpl::SubscribeL ( const RPnPParameterBundle& aServiceInfo )
+	{
+	if( !iUPnPSubscribe )
+		iUPnPSubscribe = CUPnPSubscribe::NewL( iSubConnection,  iHostResolver );
+	
+	iUPnPSubscribe->SubmitRequestL( aServiceInfo );
+	}
+
+void CUPnPServiceDiscoveryImpl::RegisterNotify(  const RPnPParameterBundle& aServiceInfo )//done
+	{
+	TRAPD( err, RegisterNotifyL( aServiceInfo ));
+	if(err != KErrNone )
+		aServiceInfo.PnPObserver()->OnPnPError(err);
+	}
+// Used to register for advertisements of specific service type or ssdp:all
+void CUPnPServiceDiscoveryImpl::RegisterNotifyL ( const RPnPParameterBundle& aServiceInfo )//done
+	{
+	if( !iUPnPRegister )
+		iUPnPRegister = new (ELeave) CUPnPRegisterNotify(iSubConnection );
+	iUPnPRegister->SubmitRequestL(aServiceInfo);
+	}
+
+/* Used to cancel previous requests of control point */
+void CUPnPServiceDiscoveryImpl::Cancel ( const RPnPParameterBundle& aServiceInfo )//done
+	{
+	//Ignore the error.
+	TRAP_IGNORE(ProcessCancelL(aServiceInfo));
+	}
+
+/* Used to call the NotifyResults method (which sends the responses back to the
+  callback of the respective classes. In case , responses are coming for requests
+  then they're ignored as they'll mostly be acknowlegements.
+ @param afamilyId The family according to which NotifyResults of respective class
+ 				  is called
+ */
+void CUPnPServiceDiscoveryImpl::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 EUPnPDiscoverResponseParamSet:
+			iUPnPSearch->NotifyResultsL(pnpBundle);
+		break;
+
+		case EUPnPDescribeResponseParamSet:
+			iUPnPDescribe->NotifyResultsL(pnpBundle);
+		break;
+
+		case EUPnPPresenceAnnouncementParamSet:
+		case EUPnPAbsenceAnnouncementParamSet:
+			iUPnPRegister->NotifyResultsL(afamilyId, pnpBundle);
+		break;
+		
+		case EUPnPSubscribeResponseParamSet:
+		case EUPnPNotifyEventParamSet:
+			iUPnPSubscribe->NotifyResultsL(afamilyId, pnpBundle);
+		break;
+		
+		default:
+		__ASSERT_DEBUG(0, User::Panic(KUPnPInvalidFamily,KUPnPErrInvalidFamily));	
+		break;
+		}	
+	}
+
+TInt CUPnPServiceDiscoveryImpl::InitiateControl ( RControlChannel& /*aControlChannel*/, const TDesC8& aUri )
+	{
+	TInetAddr addr;
+	TRAPD ( err, CUPnPUtils::ResolveHostAddressL ( iHostResolver, aUri, addr ) );
+	
+	if ( err == KErrNone )
+		{
+		TConnectionDetails connDetails ( &addr, aUri );
+		//err = aControlChannel.Open ( iSocketServer, iSubConnection, KAfInet, EFalse, KProtocolInetTcp, connDetails );
+		}
+		
+	return err;
+	}
+
+void CUPnPServiceDiscoveryImpl::ProcessCancelL( const RPnPParameterBundle& aServiceInfo)
+	{
+	RParameterFamily family=const_cast<RPnPParameterBundle&>(aServiceInfo).GetFamilyAtIndex(0);
+	
+	switch(family.Id())
+		{
+		case EUPnPCancelDiscoverParamSet:
+		if( iUPnPSearch )
+			iUPnPSearch->CancelSearchL( aServiceInfo );
+		break;
+
+		case EUPnPCancelDescribeParamSet:
+		if ( iUPnPDescribe )
+			iUPnPDescribe->CancelDescribeL( aServiceInfo );
+		break;
+
+		case EUPnPCancelRegisterNotifyParamSet:
+		if( iUPnPRegister )
+			iUPnPRegister->CancelNotifyAnnouncementL( aServiceInfo );
+		break;
+
+		case EUPnPCancelSubscribeParamSet:
+		if ( iUPnPSubscribe )
+			iUPnPSubscribe->CancelSubscribeL( aServiceInfo );
+		break;
+
+		default:
+		__ASSERT_DEBUG(0, User::Panic(KUPnPInvalidFamily,KUPnPErrInvalidFamily));	
+		break;
+		}
+	}