upnpavcontrolpoint/avcpengineclient/src/upnpmetadata.cpp
changeset 0 7f85d04be362
child 25 52826dcbed74
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontrolpoint/avcpengineclient/src/upnpmetadata.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,556 @@
+/** @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:  Class for fetching and updating MS metadata
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "upnpmetadata.h"
+#include "upnpavcpenginemsclient.h"
+#include <upnpdominterface.h>
+#include <XmlEngDOMParser.h>
+#include <XmlEngSerializationOptions.h>
+#include <Uri16.h>
+
+
+_LIT(KUPnP16,    "upnp");
+
+_LIT8(KId,      "id");
+_LIT8(KUPnP,    "upnp");
+_LIT8(KDc,      "dc");
+_LIT8(KArtist,  "artist");
+_LIT8(KAlbum,   "album");
+_LIT8(KGenre,   "genre");
+_LIT8(KClass,   "class");
+_LIT8(KCreator, "creator");
+_LIT8(KTitle,   "title");
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::CUpnpMetadata
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpnpMetadata::CUpnpMetadata(RUpnpAVCPEngineMSClient& aSession): 
+	CActive(EPriorityStandard), 
+	iSession(aSession), 
+	iMetaDataPtr(NULL,0),	
+	iIdPckg(iId), 
+	iSizePckg(iSize)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::ConstructL()
+    {     		
+//    User::LeaveIfError( iRsfwControl.Connect() );
+    iDOMImpl.OpenL();
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpMetadata* CUpnpMetadata::NewL(RUpnpAVCPEngineMSClient& aSession)
+    {
+    CUpnpMetadata* self = new( ELeave ) CUpnpMetadata(aSession);
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::~CUpnpMetadata
+// Destructor
+// -----------------------------------------------------------------------------
+//    
+CUpnpMetadata::~CUpnpMetadata()
+    {
+	delete iUuid;
+	delete iPathName;
+	delete iMetaData;
+	delete iUpdatedMetaData;
+	iDocument.Close();    
+	iDOMImpl.Close();
+	//iRsfwControl.Close();   
+    }
+
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::FetchL
+// -----------------------------------------------------------------------------
+//   
+EXPORT_C void CUpnpMetadata::FetchL(const TDesC& aPathName ) 
+	{
+	
+	PrepareDataL(aPathName);
+	GetMetadataL();
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::FetchL
+// -----------------------------------------------------------------------------
+//   
+EXPORT_C void CUpnpMetadata::FetchL(const TDesC& aPathName, TRequestStatus& aStatus ) 
+	{
+	PrepareDataL(aPathName);
+	GetMetadataL(aStatus);
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::CommitL
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C void CUpnpMetadata::CommitL() 
+	{	        
+    //Dump XML tree into buffer
+    RBuf8 xmlBuf;
+    CleanupClosePushL(xmlBuf);
+    TXmlEngSerializationOptions options(TXmlEngSerializationOptions::KOptionIndent);
+      
+    iDocument.SaveL( xmlBuf, iDocument.DocumentElement(), options);
+    
+    iSession.SetMetadataL(*iUuid, *iPathName, *iMetaData, xmlBuf);    	    
+    
+	CleanupStack::PopAndDestroy(&xmlBuf); 
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::CommitL
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C void CUpnpMetadata::CommitL(TRequestStatus& aStatus) 
+	{	 
+	
+	iClientStatus = &aStatus;
+	*iClientStatus = KRequestPending;
+							
+    //Dump XML tree into buffer
+    RBuf8 xmlBuf;
+    CleanupClosePushL(xmlBuf);
+    TXmlEngSerializationOptions options(TXmlEngSerializationOptions::KOptionIndent);
+      
+    iDocument.SaveL( xmlBuf, iDocument.DocumentElement(), options);
+    delete iUpdatedMetaData;
+    iUpdatedMetaData = NULL;
+    
+    iUpdatedMetaData = xmlBuf.AllocL();
+    CleanupStack::PopAndDestroy(&xmlBuf);
+    
+    iSession.SetMetadata(iStatus, *iUuid, *iPathName, *iMetaData, *iUpdatedMetaData);    	    
+    SetActive();
+	iState = EUploadingMetadata;    	
+	}	
+		
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::PrepareData
+// -----------------------------------------------------------------------------
+//   
+void CUpnpMetadata::PrepareDataL(const TDesC& aPathName ) 
+	{
+
+	TParse parseFilename;
+	parseFilename.Set( aPathName, NULL, NULL );	
+	
+
+	TChar drive = parseFilename.Drive()[0];
+	drive.UpperCase();
+
+	CRsfwMountMan* mountman = NULL;
+			mountman = CRsfwMountMan::NewL(0, NULL);
+			User::LeaveIfNull(mountman);
+			CleanupStack::PushL(mountman);
+	
+			const CRsfwMountEntry* entry = 
+				mountman->MountEntryL(drive);
+
+			if (!entry)
+			  {
+			  CleanupStack::PopAndDestroy(mountman);
+			  User::Leave(KErrNotFound);
+			  }
+			  
+	HBufC* uri = entry->Item(EMountEntryItemUri)->Alloc();
+	
+	if (!uri)
+		User::Leave(KErrNoMemory);
+	
+	CleanupStack::PushL(uri);	
+	// parse URI 
+	TUriParser uriParser;
+	User::LeaveIfError( uriParser.Parse(*uri) );	
+	
+	if ( uriParser.Extract( EUriScheme ).Compare(KUPnP16) == 0) 
+		{
+		delete iUuid;
+		iUuid = NULL;
+		
+		delete iPathName;
+		iPathName = NULL;	
+			
+		// filename normalize		
+		iPathName = HBufC8::NewL( parseFilename.FullName().Length());
+		iPathName->Des().Append(parseFilename.Path());
+		TPtr8 path = iPathName->Des();
+		Normalize( path );		
+		iPathName->Des().Append(parseFilename.NameAndExt());				
+		
+		// uuid 
+		iUuid = HBufC8::NewL(uriParser.Extract( EUriHost ).Length());			
+		iUuid->Des().Copy(uriParser.Extract( EUriHost ));						
+		}
+	else 
+		{
+		CleanupStack::PopAndDestroy(uri);
+		CleanupStack::PopAndDestroy(mountman);
+		User::Leave( KErrNotFound );
+		}	
+	CleanupStack::PopAndDestroy(uri);
+	CleanupStack::PopAndDestroy(mountman);
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Normalize
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::Normalize(TDes8& aData)
+	{
+   	for (TInt i = 0; i < aData.Length(); i++)
+		{
+		if (aData[i] == '\\')
+    		{
+        	aData[i] = '/';
+     		}
+    	}
+ 	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::ParseMetadataL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::ParseMetadataL()
+	{
+	iDocument.Close();
+	// Create a parser
+	RXmlEngDOMParser parser;
+	User::LeaveIfError( parser.Open(iDOMImpl) );
+	CleanupClosePushL(parser);
+	// Handler to DOM document
+	iDocument = parser.ParseL( *iMetaData );     	
+	CleanupStack::PopAndDestroy(&parser);
+ 	} 		
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::GetMetadataL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::GetMetadataL()
+	{
+	iSession.PrepareMetadataL(*iUuid, *iPathName, iIdPckg, iSizePckg);
+	if (iSize > 0) 
+		{
+		delete iMetaData;
+		iMetaData = NULL;		
+		iMetaData = HBufC8::NewL(iSize);
+		iMetaDataPtr.Set(iMetaData->Des());
+		iSession.DownloadMetadataL(iId, iMetaDataPtr);
+		ParseMetadataL();
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::GetMetadataL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::GetMetadataL(TRequestStatus& aStatus)
+	{
+	iClientStatus = &aStatus;
+	*iClientStatus = KRequestPending;
+	iSession.PrepareMetadata(iStatus, *iUuid, *iPathName, iIdPckg, iSizePckg);
+	SetActive();
+	iState = EPreparingMetadata;	
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::DoCancel()
+	{
+	if (iClientStatus) 
+		{	
+		User::RequestComplete(iClientStatus, KErrCancel);			
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpMetadata::RunError( TInt aError ) 
+	{
+	if (iClientStatus) 
+		{
+		User::RequestComplete(iClientStatus, aError);			
+		}
+	return KErrNone;
+	}
+        		
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::RunL
+// -----------------------------------------------------------------------------
+//
+void CUpnpMetadata::RunL() 
+	{
+	if (iStatus.Int() == KErrNone) 
+		{
+		switch (iState) 
+			{
+			case EPreparingMetadata:
+			if (iSize > 0) 
+				{
+				delete iMetaData;
+				iMetaData = NULL;
+				iMetaData = HBufC8::NewL(iSize);
+				iMetaDataPtr.Set(iMetaData->Des());
+				iSession.DownloadMetadata(iStatus, iId, iMetaDataPtr);
+				SetActive();
+				iState = EDownloadingMetadata;				
+				}
+				break;
+			case EDownloadingMetadata:
+				ParseMetadataL();
+				User::RequestComplete(iClientStatus, iStatus.Int());
+				break;
+			case EUploadingMetadata:
+				delete iUpdatedMetaData;
+				iUpdatedMetaData = NULL;
+				User::RequestComplete(iClientStatus, iStatus.Int());
+				break;							
+			}		
+		} 
+	else 
+		{
+		User::RequestComplete(iClientStatus, iStatus.Int());		
+		}
+	}
+
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::ObjectL
+// -----------------------------------------------------------------------------
+//   
+TBool CUpnpMetadata::ObjectL(TXmlEngElement& aObject) 
+	{
+	TXmlEngElement root = iDocument.DocumentElement();
+	
+    RXmlEngNodeList<TXmlEngElement> argElems;
+    CleanupClosePushL(argElems);
+    root.GetChildElements( argElems ); 
+                
+    if ( argElems.Count() == 1 ) 
+    	{
+    	aObject = argElems.Next();
+    	
+    	} 
+    	
+    CleanupStack::PopAndDestroy(&argElems);
+    return !aObject.IsNull();	             	
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::GetElementL
+// -----------------------------------------------------------------------------
+//   
+TPtrC8 CUpnpMetadata::GetElementL( const TDesC8& aName) 	 
+	{
+	TXmlEngElement result;
+	TXmlEngElement object;
+	if (ObjectL(object) &&  UpnpDomInterface::GetElementL(  object, result, aName) ) 
+		{
+		return result.Value();	
+		}
+                                
+	return KNullDesC8();	
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetElementL
+// -----------------------------------------------------------------------------
+//   	
+void CUpnpMetadata::SetElementL( const TDesC8& aNamespace, const TDesC8& aName, const TDesC8& aValue) 	 
+	{
+	TXmlEngElement result;
+	TXmlEngElement object;
+	if (ObjectL(object))
+		{
+		if (!UpnpDomInterface::GetElementL(  object, result, aName) ) 
+			{			
+			result = object.AddNewElementUsePrefixL(aName, aNamespace);
+			}
+		result.SetTextL( aValue );
+		}
+	}	
+		
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Id
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C  TPtrC8 CUpnpMetadata::IdL() 
+	{ 	
+	TXmlEngElement object;
+	if (ObjectL(object)) 
+		{
+		return UpnpDomInterface::GetAttrValueL( object, KId );
+		} 
+	else 
+		{
+		return KNullDesC8();		
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Title
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C TPtrC8 CUpnpMetadata::TitleL() 
+	{
+	return GetElementL(KTitle);
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetTitleL
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C void CUpnpMetadata::SetTitleL(const TDesC8& aTitle) 
+	{
+	SetElementL(KDc, KTitle, aTitle);
+	}	
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Creator
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C TPtrC8 CUpnpMetadata::CreatorL() 
+	{
+	return GetElementL(KCreator);
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetCreator
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C void CUpnpMetadata::SetCreatorL(const TDesC8& aCreator)
+	{
+	SetElementL(KDc,KCreator, aCreator);	
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Class
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C TPtrC8 CUpnpMetadata::ClassL() 
+	{
+	return GetElementL(KClass);
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetClass
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C void CUpnpMetadata::SetClassL(const TDesC8& aClass)
+	{
+	SetElementL(KUPnP, KClass, aClass);	
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Artist
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C TPtrC8 CUpnpMetadata::ArtistL() 
+	{
+	return GetElementL(KArtist);
+	}
+		
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetArtist
+// -----------------------------------------------------------------------------
+//   			
+EXPORT_C void CUpnpMetadata::SetArtistL(const TDesC8& aArtist)
+	{
+	SetElementL(KUPnP, KArtist, aArtist);		
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Genre
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C TPtrC8 CUpnpMetadata::GenreL() 
+	{
+	return GetElementL(KGenre);
+	}
+	
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetGenre
+// -----------------------------------------------------------------------------
+//   			
+EXPORT_C void CUpnpMetadata::SetGenreL(const TDesC8& aGenre)
+	{
+	SetElementL(KUPnP, KGenre, aGenre);		
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::Album
+// -----------------------------------------------------------------------------
+//   			
+EXPORT_C TPtrC8 CUpnpMetadata::AlbumL() 
+	{
+	return GetElementL(KAlbum);
+	}		
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::SetAlbum
+// -----------------------------------------------------------------------------
+//   	
+EXPORT_C void CUpnpMetadata::SetAlbumL(const TDesC8& aAlbum)
+	{
+	SetElementL(KUPnP, KAlbum, aAlbum);	
+	}
+
+// -----------------------------------------------------------------------------
+// CUpnpMetadata::AsXmlL
+// -----------------------------------------------------------------------------
+//   		
+EXPORT_C RXmlEngDocument& CUpnpMetadata::AsXmlL() 
+	{
+	return iDocument;
+	}
+
+	
+	
+//  End of File