upnpframework/upnputilities/src/upnpcdsreselementutility.cpp
changeset 0 7f85d04be362
child 38 5360b7ddc251
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpframework/upnputilities/src/upnpcdsreselementutility.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,218 @@
+/*
+* Copyright (c) 2006-2007 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:  Utility class for meta data gathering for audio files
+*
+*/
+
+
+// INCLUDE FILES
+// System
+#include <e32std.h>
+#include <e32base.h>
+
+// upnp stack api
+#include <upnpitem.h> // CUpnpItem
+#include <upnpstring.h>
+#include <upnpelement.h>
+#include <upnpdlnaprotocolinfo.h>
+#include <upnpprotocolinfo.h>
+
+// upnpframework / avcontroller helper api
+#include <upnpconstantdefs.h> // for upnp class defs
+
+// upnpframework internal api's
+#include "upnpresresolver.h" // CUpnpResResolver
+#include "upnpresparameters.h"
+
+// utilities internal
+#include "upnpcommonutils.h"
+#include "upnpcdsreselementutility.h"
+
+_LIT( KHttp, "http://" );
+const TInt KColon = 58;
+const TInt KIpAddLen = 25;
+
+// ============================ MEMBER FUNCTIONS ============================
+
+// --------------------------------------------------------------------------
+// CUpnpCdsResElementUtility::AddResElementL
+// 
+// (other items were commented in a header).
+// --------------------------------------------------------------------------
+//
+EXPORT_C void UpnpCdsResElementUtility::AddResElementL( 
+                                                CUpnpItem& aItem, 
+                                                const TDesC& aFilename )
+    {
+
+    // Create CUpnpElement for res
+    CUpnpElement* elRes = CUpnpElement::NewL( KElementRes() );
+    CleanupStack::PushL( elRes );
+    elRes->SetFilePathL( aFilename );
+ 
+    // Create res resolver component and put it to CleanupStack
+    CUpnpResResolver* resolver = CUpnpResResolver::NewLC();
+    
+    // Obtain res element parameters using res resolver component.
+    CUpnpResParameters* resParameters = NULL;
+	TRAPD(err, resParameters = resolver->GetResParametersL( aFilename ) );
+
+   if (err == KErrGeneral)	
+    {
+	// File not recognized, handling it manually by adding
+	// following res-item:  'http-get:*:MIMETYPE:*'
+
+   		_LIT8( KProtInfo1, "http-get:");
+    	_LIT8( KStar8, "*");
+    	_LIT8( KColon8, ":");
+    	HBufC8* mimetype = UPnPCommonUtils::ResolveMimeTypeL(aFilename);
+    	mimetype->Des().Trim();		// needs to be trimmed
+
+        TInt resultLen = KProtInfo1().Length() + KStar8().Length() + 
+    	KColon8().Length() + mimetype->Des().Length() + KColon8().Length() +
+        KStar8().Length();
+    	HBufC8* resValue = HBufC8::NewLC( resultLen );
+
+    // construct final value
+	    resValue->Des().Append( KProtInfo1 );
+	    resValue->Des().Append( KStar8 );
+	    resValue->Des().Append( KColon8 );
+	    resValue->Des().Append( *mimetype );
+	    resValue->Des().Append( KColon8 );
+	    resValue->Des().Append( KStar8 );
+
+		CUpnpProtocolInfo* pInfo = CUpnpProtocolInfo::NewL(*resValue);
+		CUpnpAttribute* attribute = CUpnpAttribute::NewLC( KAttributeProtocolInfo() );
+		attribute->SetValueL( pInfo->ProtocolInfoL() );
+		elRes->AddAttributeL( attribute );    
+    	aItem.AddElementL(elRes);
+
+		CleanupStack::Pop( attribute );
+		CleanupStack::PopAndDestroy( resValue );
+		CleanupStack::PopAndDestroy( resolver );
+    	CleanupStack::Pop( elRes );
+  		resValue = NULL;
+    	mimetype = NULL;
+    	
+    	return;
+    }
+    // Fixes ESLX-7B7HBL
+    else if( err )
+        {
+        User::Leave( err );
+        }
+
+    CleanupStack::PushL( resParameters );
+
+    // Add protocolInfo parameter to res element.
+    if ( resParameters->ProtocolInfo().Length() > 0 ) 
+        {
+        CUpnpAttribute* prInfo = CUpnpAttribute::NewLC( KAttributeProtocolInfo() );
+        prInfo->SetValueL( resParameters->ProtocolInfo() );   
+        elRes->AddAttributeL( prInfo ); //transfer ownership
+        CleanupStack::Pop( prInfo );       
+        }
+
+    // Add size parameter to res element.
+
+    HBufC8* sizeString = resParameters->FileSizeL();
+    if ( sizeString ) 
+        {
+        CleanupStack::PushL( sizeString );
+        CUpnpAttribute* size =
+            CUpnpAttribute::NewLC( KAttributeSize() );
+        size->SetValueL( *sizeString );
+
+        elRes->AddAttributeL( size ); //transfer ownership
+        CleanupStack::Pop( size );        
+        CleanupStack::PopAndDestroy( sizeString );
+        sizeString = NULL;
+        }
+
+    if ( resParameters->IsImageFile() ) 
+        {
+        // In image case, add resolution parameter to res element.
+        HBufC8* resolutionString = resParameters->ResolutionL();
+        if ( resolutionString ) 
+            {
+            CleanupStack::PushL( resolutionString );
+            CUpnpAttribute* resolution = 
+                CUpnpAttribute::NewLC( KAttributeResolution() );
+            resolution->SetValueL( *resolutionString );
+            elRes->AddAttributeL( resolution ); //transfer ownership
+            CleanupStack::Pop( resolution );            
+            CleanupStack::PopAndDestroy( resolutionString );
+            resolutionString = NULL;
+            }
+        }
+    else if ( resParameters->IsAudioOrVideoFile() )
+        {
+        // In music or video case, add duration parameter to res element.
+        HBufC8* durationString = resParameters->DurationL();
+        if ( durationString ) 
+            {
+            CleanupStack::PushL( durationString );
+            CUpnpAttribute* duration =
+                CUpnpAttribute::NewLC( KAttributeDuration() );
+            duration->SetValueL( *durationString );
+            elRes->AddAttributeL( duration ); //transfer ownership
+            CleanupStack::Pop( duration );
+            CleanupStack::PopAndDestroy( durationString );
+            durationString = NULL;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( resParameters );
+    CleanupStack::PopAndDestroy( resolver );
+
+    // Attach res element to aItem.
+    aItem.AddElementL( elRes ); //transfer ownership
+    CleanupStack::Pop( elRes );
+    }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsResElementUtility::IsUriAbsolute
+// 
+// (other items were commented in a header).
+// --------------------------------------------------------------------------
+EXPORT_C TBool UpnpCdsResElementUtility::IsUriAbsolute( const TDesC8& aUri )
+    {
+    TInetAddr addr;
+    TBool retVal = EFalse;
+    TBuf<KIpAddLen> ipAddrBuf;
+    // if aUri.Length is less than KHttp().Length(),aUri is invalid
+    if ( aUri.Length() >= KHttp().Length() )
+		{
+		TPtrC8 right = aUri.Right( aUri.Length() - KHttp().Length() );
+
+		TInt posit = right.Locate( TChar( KColon ) );
+		if( posit != KErrNotFound )
+			{
+			TPtrC8 ipAddr = right.Left( posit );
+			if( ipAddr.Length() <= KIpAddLen )
+				{
+				ipAddrBuf.Copy( ipAddr );
+				}
+			}
+
+		if( addr.Input( ipAddrBuf ) == KErrNone )
+			{
+			retVal = ETrue;
+			}
+		}
+
+	return retVal;    
+    }
+
+//  End of File