servicediscoveryandcontrol/pnp/test/upnp/Client/upnpplugin/src/cpnpservicediscovery.cpp
--- /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;
+ }
+ }