upnpavcontrolpoint/avcpengine/src/upnpmetadatacommand.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontrolpoint/avcpengine/src/upnpmetadatacommand.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,232 @@
+/** @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:  CUpnpMetadataCommand
+*
+*/
+
+
+#include "upnpmetadatacommand.h"
+
+#include "upnppathresolver.h"
+#include "upnppathelement.h"
+#include "upnpavcpmanager.h"
+#include "upnpavcontrolpoint.h"
+
+#include "upnpavcpenginehelper.h"
+using namespace UpnpAVCPEngine;
+
+#include "upnpstring.h"
+
+
+_LIT8(KFilterFlag, "*");
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadataCommand* CUpnpMetadataCommand::NewL(CUpnpAVCPManager& aAVCPManager, CUpnpAVCPEngineSession& aSession, const RMessage2& aMessage)
+	{
+    CUpnpMetadataCommand* self = new( ELeave ) CUpnpMetadataCommand(aAVCPManager, aSession, aMessage);
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;   
+	}	
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//     
+void CUpnpMetadataCommand::ConstructL() 
+	{
+ 	CUpnpCommand::BaseConstructL();
+	} 
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::CUpnpMetadataCommand
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------   
+//       
+CUpnpMetadataCommand::CUpnpMetadataCommand(CUpnpAVCPManager& aAVCPManager, 
+                   CUpnpAVCPEngineSession& aSession, 
+                   const RMessage2& aMessage):
+                   CUpnpCommand( aAVCPManager,
+                   		     aSession, 
+                   		     aMessage)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::~CUpnpMetadataCommand
+// desctructor
+// -----------------------------------------------------------------------------
+// 
+CUpnpMetadataCommand::~CUpnpMetadataCommand()
+	{
+    delete iObjectId;
+    delete iResult;
+    delete iOldMetadata;    
+    delete iNewMetadata;    
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::SessionId
+// -----------------------------------------------------------------------------
+// 
+TInt CUpnpMetadataCommand::SessionId() 
+{
+    return CUpnpCommand::SessionId();   
+}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::RunError
+// -----------------------------------------------------------------------------
+// 
+void CUpnpMetadataCommand::RunError(TInt aErrorCode) 
+	{
+    return CUpnpCommand::RunError(aErrorCode);   
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::ExecuteL
+// -----------------------------------------------------------------------------
+// 
+void CUpnpMetadataCommand::ExecuteL()
+	{
+	//ASSERT(iType == EPrepareMetadata || iType == ESetMetadata);
+    
+    HBufC8* uuid = NULL;
+    HBufC8* path = NULL;
+    if (iType == EPrepareMetadata) 
+    	{
+    	DEBUGSTRING(("Execute Metadata command (EPrepareMetadata)"));    	
+    	// set command id
+        TPckg<TInt> numPckg(iId);               
+        iMessage.WriteL(0, numPckg);            
+            	
+		uuid = ReadDes8FromMessageLC(2); 
+  		DEBUGSTRING8(("  uuid: %S",uuid));		           	
+		path = ReadDes8FromMessageLC(3);   
+		DEBUGSTRING8(("  path: %S",path));		         	    	    		
+    	}
+    else 
+    	{
+    	DEBUGSTRING(("Execute Metadata command (ESetMetadata)"));
+		uuid = ReadDes8FromMessageLC(0);          
+		DEBUGSTRING8(("  uuid: %S",uuid));		           	
+    	path = ReadDes8FromMessageLC(1);
+    	DEBUGSTRING8(("  path: %S",path));
+    	
+    	HBufC8* old =  ReadDes8FromMessageLC(2);
+		iOldMetadata = UpnpString::EncodeXmlStringL(old);  		
+		CleanupStack::PopAndDestroy( old );
+		
+		HBufC8* newXML =  ReadDes8FromMessageLC(3);
+		iNewMetadata = UpnpString::EncodeXmlStringL( newXML );  		
+		CleanupStack::PopAndDestroy( newXML);		  	  	    	    
+    	}
+    
+    iPathResolver = &(iAVCPManager.PathResolverL(*uuid, &iSession));
+    	 
+    iPathResolver->ResolveIdL(*path, *this);
+
+	CleanupStack::PopAndDestroy(path);        
+	CleanupStack::PopAndDestroy(uuid);          
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::SetResultL
+// -----------------------------------------------------------------------------
+// 
+void CUpnpMetadataCommand::SetResultL(const RMessage2& aMessage) 
+	{
+	//ASSERT(aMessage.Function() == EDownloadMetadata);
+	if (iResult) 
+		{        	        
+        TPtr8 result = iResult->Des();
+        aMessage.WriteL(1, result);          
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::Interpret
+// -----------------------------------------------------------------------------
+// 
+void CUpnpMetadataCommand::InterpretL(TInt aErrorCode, CUpnpAction* aAction) 
+	{
+	DEBUGSTRING(("Interpret action response %d", aErrorCode));	
+    if (aErrorCode == EHttp200Ok) 
+    	{
+
+        if (iType == EPrepareMetadata) 
+        	{
+            iResult = aAction->ArgumentValue( KResult ).AllocL();       
+            TInt num = iResult->Length();                                    
+            TPckg<TInt> numPckg(num);       
+            // size of  metadata information
+            iMessage.WriteL(1, numPckg); 
+            iMessage.Complete(KErrNone);
+            // don't destroy and wait for next command           
+        	}
+        else 
+        	{
+            // for set metadata
+            iMessage.Complete(KErrNone);  
+            delete this; 
+        	}
+                          
+    	}
+    else 
+    	{
+        iMessage.Complete(KErrAbort); 
+        delete this;
+    	}   
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadataCommand::ResolvedId
+// -----------------------------------------------------------------------------
+// 
+void CUpnpMetadataCommand::ResolvedIdL(TInt aErrCode, CUpnpPathElement* aIdElement)
+	{
+    
+    if (aErrCode == KErrNone)  
+    	{
+        iObjectId = aIdElement->Id().AllocL();       
+        if (iType == EPrepareMetadata) 
+        	{            
+            iSessionId = iAVCPManager.CdsBrowseActionL(iPathResolver->UUID(), *iObjectId, KBrowseMetadata, KFilterFlag, 0, 0, KNullDesC8);                
+        	}
+        else //set metadata 
+        	{            
+            iSessionId = iAVCPManager.CdsUpdateObjectActionL(iPathResolver->UUID(), *iObjectId, *iOldMetadata, *iNewMetadata);    
+            delete iOldMetadata;
+            iOldMetadata = NULL;
+            delete iNewMetadata;
+            iNewMetadata = NULL;
+        	}
+        iAVCPManager.RegisterForAction(*this);        
+    	}
+    else 
+    	{
+        iMessage.Complete(KErrNotFound);
+        delete this;
+    	}
+	}
+// End of File