homesync/contentmanager/cmserver/cmfillmanager/src/cmfmmpxnotifier.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

/*
* Copyright (c) 2008 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:  Notifies mpx
*
*/


class MMPXCollection;

#include <mpxcollectionmediator.h>
#include <mpxharvesterutility.h>
#include <mpxcollectionutility.h>
#include <mpxmediageneraldefs.h> // for KMPXMediaGeneralCollectionId
#include <mpxmediamusicdefs.h> // music-specific attribute keys
#include <upnpitem.h> // s60 upnp stack
#include <escapeutils.h> // for unicode conversion
#include "upnpitemutility.h" // for FindElementByName & ResourceFromItemL
#include "upnpconstantdefs.h" // for element names
#include "cmfmmpxnotifier.h"
#include "msdebug.h"    

// CONSTANTS
const TUid KMpxLocalCollectionUid = { 0x101FFC3A };
const TUid KCmServerUid = { 0x10281FA7 };


// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::NewL
// ---------------------------------------------------------------------------
// 
CCmFmMpxNotifier* CCmFmMpxNotifier::NewL( )
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::NewL() start"));    
    CCmFmMpxNotifier* self = CCmFmMpxNotifier::NewLC( );
    CleanupStack::Pop( self );
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::NewL() end"));
    return self;
    }

// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::NewLC
// ---------------------------------------------------------------------------
//    
CCmFmMpxNotifier* CCmFmMpxNotifier::NewLC( )
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::NewLC() start"));    
    CCmFmMpxNotifier* self = new ( ELeave ) CCmFmMpxNotifier( );
    CleanupStack::PushL( self );
    self->ConstructL();
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::NewLC() end"));
    return self;  
    }    

// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::~CCmFmMpxNotifier
// ---------------------------------------------------------------------------
// 
CCmFmMpxNotifier::~CCmFmMpxNotifier()
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::~CCmFmMpxNotifier()"));
    if( iHarvester )
        {
        iHarvester->Close();
        }
    if( iCollectionUtil )
        {
        iCollectionUtil->Close(); 
        }         
    delete iMediator;  
    }

// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::CCmFmMpxNotifier
// ---------------------------------------------------------------------------
// 
CCmFmMpxNotifier::CCmFmMpxNotifier( )
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::CCmFmMpxNotifier"));    
    }

// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::ConstructL
// ---------------------------------------------------------------------------
//     
void CCmFmMpxNotifier::ConstructL()
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::ConstructL"));    
    
    iHarvester = CMPXHarvesterFactory::NewL();
    iCollectionUtil = MMPXCollectionUtility::NewL( 0, KCmServerUid );
        
    iMediator = CMPXCollectionMediator::NewL( 
        iCollectionUtil->Collection(), this );    
    }  
      
// ---------------------------------------------------------------------------
// CCmFmMpxNotifier::NotifyMpxL
// ---------------------------------------------------------------------------
//
void CCmFmMpxNotifier::NotifyMpxL( const TDesC& aTrackPath,
    const CUpnpItem& aTrackMetadata )
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::NotifyMpxL"));    
    
    CMPXMedia* item = CMPXMedia::NewL();
    CleanupStack::PushL( item );
    item->SetTObjectValueL<TUid>(
        KMPXMediaGeneralCollectionId, KMpxLocalCollectionUid );
    item->SetTObjectValueL<TMPXGeneralType>(
        KMPXMediaGeneralType, EMPXItem );
    item->SetTObjectValueL<TMPXGeneralCategory>(
        KMPXMediaGeneralCategory, EMPXSong );
    item->SetTextValueL(
        KMPXMediaGeneralUri, aTrackPath );
    // Insert metadata
    HBufC16* buf = NULL;
    // title
    buf = EscapeUtils::ConvertToUnicodeFromUtf8L( aTrackMetadata.Title() );
    CleanupStack::PushL( buf );
    if( buf )
        {
        item->SetTextValueL(
            KMPXMediaGeneralTitle, *buf );        
        }
    CleanupStack::PopAndDestroy( buf );
    // artist
    if ( ( buf = GetElementL( aTrackMetadata, KElementCreator ) ) != 0 )
        {
        CleanupStack::PushL( buf );
        item->SetTextValueL(
            KMPXMediaMusicArtist, *buf );
        CleanupStack::PopAndDestroy( buf );
        }
    else if ( ( buf = GetElementL( aTrackMetadata, KElementArtist ) ) != 0 )
        {
        CleanupStack::PushL( buf );
        item->SetTextValueL(
            KMPXMediaMusicArtist, *buf );
        CleanupStack::PopAndDestroy( buf );
        }
    // album
    if ( ( buf = GetElementL( aTrackMetadata, KElementAlbum ) ) != 0 )
        {
        CleanupStack::PushL( buf );
        item->SetTextValueL(
            KMPXMediaMusicAlbum, *buf );
        CleanupStack::PopAndDestroy( buf );
        }
    // genre
    if ( ( buf = GetElementL( aTrackMetadata, KElementGenre ) ) != 0 )
        {
        CleanupStack::PushL( buf );
        item->SetTextValueL(
            KMPXMediaMusicGenre, *buf );
        CleanupStack::PopAndDestroy( buf );
        }

    // tracknumber
    if ( ( buf = GetElementL( aTrackMetadata, KElementTrackNumber ) ) != 0 )
        {
        CleanupStack::PushL( buf );
        TLex16 iLex(*buf);
        TInt tracknumber(0);
        iLex.Val(tracknumber);
        item->SetTObjectValueL<TInt>(
                KMPXMediaMusicAlbumTrack, tracknumber );
        CleanupStack::PopAndDestroy( buf );
        }


    // year
    const CUpnpElement* elem = UPnPItemUtility::FindElementByName(
        aTrackMetadata, KElementDate );
    if ( elem != 0 )
        {
        TTime timestamp;
        TInt err = 
            UPnPItemUtility::UPnPDateAsTTime( elem->Value(), timestamp );
        if( err == KErrNone )
            {
            item->SetTObjectValueL<TInt64>(
                    KMPXMediaMusicYear, timestamp.Int64() );
            }
        }
        
    // duration
    const CUpnpElement* trackResource = 
        &UPnPItemUtility::ResourceFromItemL( aTrackMetadata );
     
    if( trackResource != 0 )
        {
        const CUpnpAttribute* attr = UPnPItemUtility
            ::FindAttributeByName( *trackResource, KAttributeDuration );

        if ( attr != 0 )
            {
            TInt ms = 0;
            UPnPItemUtility
                ::UPnPDurationAsMilliseconds( attr->Value(), ms );
            
            item->SetTObjectValueL<TInt>(
                KMPXMediaGeneralDuration, ms );
            }
        }

    // Add to harvester
    TRACE(Print(_L("[FILL MNGR]\t iHarvester->AddFileL ")));
    TInt colUid = iHarvester->AddFileL( item );

    // Add to collection, make sure we set the collection ID
    item->SetTObjectValueL<TUid>(
        KMPXMediaGeneralCollectionId, TUid::Uid( colUid ) );

    TRACE(Print(_L("[FILL MNGR]\t iMediator->AddItemL ")));
    iMediator->AddItemL( item );

    CleanupStack::PopAndDestroy( item );
    TRACE(Print(_L("[FILL MNGR]\t CCmFmMpxNotifier::NotifyMpxL end")));    
    }

// --------------------------------------------------------------------------
// CCmFmMpxNotifier::GetElementL
// --------------------------------------------------------------------------
//
HBufC16* CCmFmMpxNotifier::GetElementL(
    const CUpnpItem& aSource, const TDesC8& aSourceField ) const
    {
    LOG(_L("[FILL MNGR]\t CCmFmMpxNotifier::GetElementL"));    
    HBufC16* result = 0;
    const CUpnpElement* elem = UPnPItemUtility::FindElementByName(
        aSource, aSourceField );
    if ( elem != 0 )
        {
        result = EscapeUtils::ConvertToUnicodeFromUtf8L( elem->Value() );
        }
    return result;
    }
        
// End of file