upnpmediaserver/mediaserverengine/src/upnpmediaserverdescriptionprovider.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/** @file
* Copyright (c) 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:  CUpnpMediaServerDescriptionProvider implementation
*
*/

#include "upnpmediaserverdescriptionprovider.h"
#include "upnpsecuritymanager.h"
#include "upnpfileutils.h"
#include "upnpstring.h"
#include "upnpcons.h"
#include "upnphttpmessage.h"
#include "upnpdevicedescriptionrequest.h"

// CONSTANTS

// -----------------------------------------------------------------------------
//  TBufC8Hash
//  Hash function for RHashMap.
// -----------------------------------------------------------------------------
TUint32 TBufC8Hash( const TBufC8<KMaxUriLength>& aPtr )
    {
    return DefaultHash::Des8( aPtr );
    }

// -----------------------------------------------------------------------------
//  TBufC8Ident
//  Identity function for RHashMap.
// -----------------------------------------------------------------------------
TBool TBufC8Ident( const TBufC8<KMaxUriLength>& aFirst, 
                   const TBufC8<KMaxUriLength>& aSecond )
    {
    return DefaultIdentity::Des8( aFirst, aSecond );
    }


// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::CUpnpMediaServerDescriptionProvider
//
// -----------------------------------------------------------------------------
//
CUpnpMediaServerDescriptionProvider::CUpnpMediaServerDescriptionProvider()
    : iUriMap( &TBufC8Hash, &TBufC8Ident )
    {
    // No implementation required
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::~CUpnpMediaServerDescriptionProvider
//
// -----------------------------------------------------------------------------
//
CUpnpMediaServerDescriptionProvider::~CUpnpMediaServerDescriptionProvider()
    {
    iFs.Close();
    delete iSecurityManager;
    iUriMap.Close();
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::NewLC
//
// -----------------------------------------------------------------------------
//
CUpnpMediaServerDescriptionProvider* CUpnpMediaServerDescriptionProvider::NewLC()
    {
    CUpnpMediaServerDescriptionProvider* self =
            new (ELeave) CUpnpMediaServerDescriptionProvider();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::NewL
//
// -----------------------------------------------------------------------------
//
CUpnpMediaServerDescriptionProvider* CUpnpMediaServerDescriptionProvider::NewL()
    {
    CUpnpMediaServerDescriptionProvider* self =
            CUpnpMediaServerDescriptionProvider::NewLC();
    CleanupStack::Pop(); // self;
    return self;
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::ConstructL
//
// -----------------------------------------------------------------------------
//
void CUpnpMediaServerDescriptionProvider::ConstructL()
    {
    User::LeaveIfError( iFs.Connect() );        
    iSecurityManager = CUpnpSecurityManager::NewInstanceFromUpnpSettingsL();
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::AddUriToFileMapL
//
// -----------------------------------------------------------------------------
//
void CUpnpMediaServerDescriptionProvider::AddUriToFileMapL( const TDesC8& aUri, 
                                                            const TDesC16& aFile )
    {
    HBufC8* buf = HBufC8::NewLC( aUri.Length() );
    buf->Des().CopyLC( aUri ); // change to lower characters

    iUriMap.InsertL( buf->Des().Left( KMaxUriLength ), aFile );
    
    CleanupStack::PopAndDestroy( buf );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::RemoveUriToFileMapL
//
// -----------------------------------------------------------------------------
//
void CUpnpMediaServerDescriptionProvider::RemoveUriToFileMapL( const TDesC8& aUri )
    {
    HBufC8* buf = HBufC8::NewLC( aUri.Length() );
    buf->Des().CopyLC( aUri ); // change to lower characters

    iUriMap.Remove( buf->Des() );
    
    CleanupStack::PopAndDestroy( buf );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::OnDeviceDescription
//
// -----------------------------------------------------------------------------
//
TInt CUpnpMediaServerDescriptionProvider::OnDeviceDescription( 
                                           CUpnpDeviceDescriptionRequest& aRequest )
    {
    return OnRequest( aRequest );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::OnServiceDescription
//
// -----------------------------------------------------------------------------
//
TInt CUpnpMediaServerDescriptionProvider::OnServiceDescription( 
                                           CUpnpDeviceDescriptionRequest& aRequest )
    {
    return OnRequest( aRequest );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::OnIcon
//
// -----------------------------------------------------------------------------
//
TInt CUpnpMediaServerDescriptionProvider::OnIcon( CUpnpDeviceDescriptionRequest& aRequest )
    {
    return OnRequest( aRequest );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::GetFile
//
// -----------------------------------------------------------------------------
//
TInt CUpnpMediaServerDescriptionProvider::GetFile( const TDesC8& aUri, RFile& aFile )
    {    
    TRAPD( error, GetFileFromUriL( aUri, iFileName ) );
    if ( error != KErrNone )
        {
        return error;
        }
    
    return aFile.Open( iFs, iFileName, EFileShareReadersOnly | EFileRead );  
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::OnRequestL
//
// -----------------------------------------------------------------------------
//
TInt CUpnpMediaServerDescriptionProvider::OnRequest( CUpnpDeviceDescriptionRequest& aRequest )
    {
    TInetAddr addr;
    aRequest.InetAddress( addr );

    TRAPD( error, GetFileFromUriL( aRequest.Uri(), iFileName ) );
    
    if ( KErrNone == error )
        {
        if ( 0 == iFileName.Length() )
            {
            return KErrNotFound;
            }
        else
            {
            TRAP( error, AuthorizeRequestL( iFileName, addr ) );
            }
        }
    
    return error;            
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::ExtractPathAndFileFromUriL
//
// -----------------------------------------------------------------------------
//
HBufC8* CUpnpMediaServerDescriptionProvider::ExtractPathAndFileFromUriL( const TDesC8& aUri )
    {
    TPtrC8 fileName;
    TInt parseError;
    TPtrC8 urlPath = UpnpFileUtil::ExtractUrlPath( aUri, fileName, parseError);
    User::LeaveIfError( parseError );
    
    HBufC8* buf = HBufC8::NewLC( urlPath.Length() + fileName.Length() + 
                                 2 * UpnpString::KSlash().Length() );
    buf->Des().Copy( UpnpString::KSlash() );
    buf->Des().Append( urlPath );
    buf->Des().Append( UpnpString::KSlash() );
    buf->Des().Append( fileName );
    
    HBufC8* buf2 = HBufC8::NewL( buf->Length() );
    buf2->Des().CopyLC( buf->Des() );   // convert to lower characters
    CleanupStack::PopAndDestroy( buf );
    
    return buf2;
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::GetFileFromUriL
//
// -----------------------------------------------------------------------------
//
void CUpnpMediaServerDescriptionProvider::GetFileFromUriL( const TDesC8& aUri, TDes& aPath )
    {
    HBufC8* pathAndFile = ExtractPathAndFileFromUriL( aUri );
    
    TFileName* file = iUriMap.Find( pathAndFile->Des() );
    
    delete pathAndFile;
    pathAndFile = NULL;
    
    if ( !file )
        {
        User::Leave( KErrNotFound );
        }
    
    aPath.Copy( *file );
    }

// -----------------------------------------------------------------------------
//  CUpnpMediaServerDescriptionProvider::AuthorizeRequestL
//
// -----------------------------------------------------------------------------
//
void CUpnpMediaServerDescriptionProvider::AuthorizeRequestL(
    const TDesC& aFileName, const TInetAddr& aSender )
    {
    CUpnpHttpMessage* tempMessage = CUpnpHttpMessage::NewL( aSender );
    CleanupStack::PushL( tempMessage );
    if ( iSecurityManager
            && iSecurityManager->AuthorizeMessage( tempMessage,
                    (TFileName&) aFileName  ) != KErrNone )
        { //not showing why resource is refused
        User::Leave( -EHttpNotFound );
        }
    CleanupStack::PopAndDestroy( tempMessage );
    }