upnpavcontrolpoint/avcpengine/src/upnpavcpmanager.cpp
changeset 0 7f85d04be362
child 30 5ec426854821
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontrolpoint/avcpengine/src/upnpavcpmanager.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,324 @@
+/** @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:  CUpnpAVCPManager
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "upnpavcpmanager.h"
+#include "upnpavcpenginehelper.h"
+#include "upnppathresolver.h"
+#include "upnpresponsehandler.h"
+#include "upnpmdebug.h"
+#include "upnpavcpenginecommon.h"
+
+
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::NewL
+// Creates an instance of the implementation.
+// -----------------------------------------------------------------------------
+CUpnpAVCPManager* CUpnpAVCPManager::NewL()
+	{ 
+	CUpnpAVCPManager* self = new (ELeave) CUpnpAVCPManager(NULL);
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::CUpnpAVCPManager
+// First phase construction.
+// -----------------------------------------------------------------------------
+CUpnpAVCPManager::CUpnpAVCPManager(MUpnpAVControlPointObserver* aObserver):CUpnpAVControlPoint((MUpnpAVControlPointObserver&)aObserver)
+	{
+    
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::ConstructL
+// Second phase construction.
+// -----------------------------------------------------------------------------
+void CUpnpAVCPManager::ConstructL()
+	{	    
+    
+    _LIT8( KMediaServer, "MediaServer" );
+	//CUpnpControlPoint::ConstructL( KMediaServer, value );	
+	CUpnpControlPoint::ConstructL( KMediaServer );	
+	InitializeCdsActionFactoryL();
+        
+	// maybe we should look for something different??
+	TPtrC8 devicePtr;
+    devicePtr.Set( UpnpSSDP::KSearchTargetAll );
+    //SSDP search for mediaserver UPnP devices
+	DEBUGSTRING(("Search for devices"));    
+	SearchL( devicePtr );
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+CUpnpAVCPManager::~CUpnpAVCPManager()
+	{
+	iPendingHandlers.Reset();
+	iHttpPendingHandlers.Reset();
+	iPathResolvers.ResetAndDestroy();    
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::NewCommandId
+// return new command id
+// -----------------------------------------------------------------------------	
+TInt CUpnpAVCPManager::NewCommandId() 
+	{
+	return ++iLastCommandId;
+	}	
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::PathResolver
+// return resolver or creates a new one
+// -----------------------------------------------------------------------------	
+CUpnpPathResolver& CUpnpAVCPManager::PathResolverL(const TDesC8& aUUID, CUpnpAVCPEngineSession* aSession) 
+    {
+	    
+    CUpnpPathResolver* resolver = CUpnpPathResolver::NewL(*this,aUUID);
+    CleanupStack::PushL(resolver);
+
+    TIdentityRelation<CUpnpPathResolver> matcher( CUpnpPathResolver::Match );
+	TInt idx = iPathResolvers.Find( resolver, matcher ); 
+	
+		
+	if (idx != KErrNotFound)   
+    	{
+	    CleanupStack::PopAndDestroy(resolver);	
+	    resolver = iPathResolvers[idx];
+    	}
+	else 
+    	{	    
+	    //subscribe
+	    CUpnpDevice* device = const_cast<CUpnpDevice*>(Device(aUUID));
+	    if (device) 
+	    	{
+	        CUpnpService* service  = Service(device, UpnpAVCPEngine::KContentDirectory);
+			DEBUGSTRING8(("Subscribe for events"));	        
+	        SubscribeL( service );
+	    	} 
+	    else 
+	    	{
+	    	User::Leave(KErrNotFound);
+	    	}
+	    CleanupStack::Pop(resolver);	
+	    iPathResolvers.Append(resolver);	    
+    	}  
+    	
+    resolver->RegisterSession(aSession);	
+    return *resolver;	
+    }
+    
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::CleanupSession
+// cleanup after closed client session
+// -----------------------------------------------------------------------------		
+void CUpnpAVCPManager::CleanupSessionL( CUpnpAVCPEngineSession* aSession) 
+	{
+	DEBUGSTRING8(("CleanupSessionL"));	        	
+    for (TInt i = 0; i < iPathResolvers.Count(); i++ ) 
+    {
+        if (iPathResolvers[i]->UnregisterSession(aSession) == 0 ) 
+        {
+            //unsubscribe
+            CUpnpDevice* device = const_cast<CUpnpDevice*>(Device(iPathResolvers[i]->UUID()));
+	        if (device) 
+	        {
+	            CUpnpService* service  = Service(device, UpnpAVCPEngine::KContentDirectory);
+	            DEBUGSTRING8(("UnsubscribeL for events"));
+	            UnsubscribeL( service );
+	        }
+	    
+            //remove
+            delete iPathResolvers[i];
+            iPathResolvers.Remove(i);
+            i--;
+        }
+    }    
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::RegisterForAction
+// register for get action responses
+// -----------------------------------------------------------------------------			
+void CUpnpAVCPManager::RegisterForAction(MUpnpResponseHandler& aHandler)	 
+  {
+      iPendingHandlers.Append(&aHandler);
+  }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::HandlerBySessionId
+// return index of handler for specific session
+// -----------------------------------------------------------------------------	
+TInt CUpnpAVCPManager::HandlerBySessionId(TInt aSessionId) 
+    {
+    TInt i = KErrNotFound;
+
+    for ( i=0; i < iPendingHandlers.Count() && iPendingHandlers[i]->SessionId() != aSessionId; i++ )
+    {}
+
+    if ( i != iPendingHandlers.Count() )
+        {
+        return i;
+        }
+    return KErrNotFound;   
+    }
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::HandlerBySessionId
+// return index of handler for specific session
+// -----------------------------------------------------------------------------	
+void CUpnpAVCPManager::RegisterForHttp(MUpnpHttpResponseHandler& aHandler)	 
+    {
+    iHttpPendingHandlers.Append(&aHandler);
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::HandlerBySessionId
+// return index of handler for specific session
+// -----------------------------------------------------------------------------	    
+void CUpnpAVCPManager::UnregisterForHttp(MUpnpHttpResponseHandler& aHandler)	 
+    {
+    TInt index = iHttpPendingHandlers.Find(&aHandler);
+    if (index != KErrNotFound) 
+        {
+        iHttpPendingHandlers.Remove(index);    
+        }        
+    }    
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::HandlerBySessionId
+// return index of handler for specific session
+// -----------------------------------------------------------------------------	
+TInt CUpnpAVCPManager::HttpHandlerBySessionId(TInt aSessionId) 
+    {
+    TInt i = KErrNotFound;
+
+    for ( i=0; i < iHttpPendingHandlers.Count() && iHttpPendingHandlers[i]->SessionId() != aSessionId; i++ )
+    {}
+
+    if ( i != iHttpPendingHandlers.Count() )
+        {
+            return i;
+        }
+    return KErrNotFound;   
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::HandlerBySessionId
+// return index of handler for specific session
+// -----------------------------------------------------------------------------	
+void CUpnpAVCPManager::ActionResponseReceivedL(CUpnpAction* aAction) 
+    {
+    TInt sessionId = aAction->SessionId();	
+    TInt index = HandlerBySessionId(sessionId);
+    if (index != KErrNotFound) 
+        {
+        MUpnpResponseHandler* handler = iPendingHandlers[index];
+        iPendingHandlers.Remove(index);        
+        handler->InterpretL(aAction->Error(), aAction);    
+        }
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpAVCPManager::StateUpdatedL
+//  Handles UPnP device events.
+// -----------------------------------------------------------------------------	
+void CUpnpAVCPManager::StateUpdatedL(CUpnpService*  aService) 
+    {
+    CUpnpPathResolver* resolver = CUpnpPathResolver::NewL(*this,aService->Device().Uuid());
+    CleanupStack::PushL(resolver);
+
+    TIdentityRelation<CUpnpPathResolver> matcher( CUpnpPathResolver::Match );
+	TInt idx = iPathResolvers.Find( resolver, matcher ); 
+	CleanupStack::PopAndDestroy(resolver);	    	    	
+	
+	if (idx != KErrNotFound)   
+    	{	   
+	    CUpnpStateVariable* systemUpdateId = aService->StateVariable( UpnpAVCPEngine::KSystemUpdateID );
+        if (systemUpdateId) 
+            {
+            (iPathResolvers[idx])->StateChangedL(systemUpdateId->Value()); 
+            }
+    	     
+    	}
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpAVCPManager::HttpResponseReceivedL
+// Handles HTTP messages.
+// --------------------------------------------------------------------------
+void CUpnpAVCPManager::HttpResponseReceivedL(CUpnpHttpMessage* aMessage)
+    {
+    TInt sessionId = aMessage->SessionId();    
+	
+    TInt index = HttpHandlerBySessionId(sessionId);
+    if (index != KErrNotFound) 
+        {
+        MUpnpHttpResponseHandler* handler = iHttpPendingHandlers[index];        
+        handler->InterpretL(aMessage->Error(), aMessage);    
+        } 
+    else 
+    	{
+    	index = index;
+       	}   
+    }
+    
+// --------------------------------------------------------------------------
+// CUpnpAVCPManager::DeviceDiscoveredL
+// Handles UPnP device discoveries.
+// --------------------------------------------------------------------------
+void CUpnpAVCPManager::DeviceDiscoveredL(CUpnpDevice* aDevice)
+    {
+	TPtrC8 uuid = aDevice->Uuid();    
+	TPtrC8 fn = aDevice->DescriptionProperty(KAVCPEngineFriendlyName);    	
+	DEBUGSTRING8(("DeviceDiscoveredL %S %S", &uuid, &fn));     
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpAVCPManager::DeviceDisappearedL(
+// Handles UPnP device disappears.
+// --------------------------------------------------------------------------
+void CUpnpAVCPManager::DeviceDisappearedL(CUpnpDevice* aDevice)
+    {
+	TPtrC8 uuid = aDevice->Uuid();
+	DEBUGSTRING8(("DeviceDiscoveredL %S", &uuid));     
+
+    CUpnpPathResolver* resolver = CUpnpPathResolver::NewL(*this,aDevice->Uuid());
+    CleanupStack::PushL(resolver);
+
+    TIdentityRelation<CUpnpPathResolver> matcher( CUpnpPathResolver::Match );
+	TInt idx = iPathResolvers.Find( resolver, matcher ); 
+	CleanupStack::PopAndDestroy(resolver);	    	    	
+	
+	if (idx != KErrNotFound)   
+		{    	    
+		   delete iPathResolvers[idx];   
+		   iPathResolvers.Remove(idx);
+		}	        
+    }
+    
+// end of file
+
+
+