upnpframework/upnpcommonui/src/upnpadvfindlist.cpp
author hgs
Mon, 04 Oct 2010 13:32:20 +0300
changeset 34 eab116a48b80
parent 30 5ec426854821
permissions -rw-r--r--
201039_02

/*
* 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:  List in advanced find results dialog
*
*/


// INCLUDE FILES
// System
#include <aknnotewrappers.h>
#include <aknlists.h>
#include <StringLoader.h>
#include <AknWaitDialog.h>
#include <akntextsettingpage.h> //for text editor flags
#include <upnpstring.h>

// upnp stack api's
#include <upnpitem.h>

// upnpframework / avcontroller api
#include "upnpavbrowsingsession.h"

// upnpramework / avcontroller helper api
#include "upnpconstantdefs.h" // upnp definitions

// upnpframework / xml parser api
#include "upnpxmlparser.h"

// common ui internal
#include "upnpcommonui.hrh"
#include <upnpcommonui.rsg>
#include "upnpadvfindresultwindow.h"
#include "upnpadvfindlist.h"
#include "upnpadvfinddialog.h"


_LIT( KComponentLogfile, "commonui.txt");
#include "upnplog.h"

//CONSTANTS
_LIT( KDate, "%d0000:" ); //Initial value for date elements
_LIT8( KAttributeRefID, "@refID" );
_LIT8( KTimeFormat8, "%d-%02d-%02d" );
const TInt KMaxRequestCount = 50;
const TInt KTmpDateFormatLength = 12;
// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::CUPnPAdvancedFindList
// C++ default constructor can NOT contain any code, that
// might leave.
// --------------------------------------------------------------------------
//
CUPnPAdvancedFindList::CUPnPAdvancedFindList(
                                    MUPnPAVController& aAVControl,
                                    MUPnPAVBrowsingSession& aBrowsingSession,
                                    CUPnPAdvancedFindDialog& aParent,
                                    CUPnPCommonUI& aCommonUI ):
                                    iAVControl(aAVControl),
                                    iCommonUI(aCommonUI),
                                    iAdvancedFindDialog(aParent),
                                    iBrowseSession(aBrowsingSession),
                                    iShowingErrorNote(EFalse)
    {
    
    // Set date to January first of current year
    iDateFrom.HomeTime();
    TInt year = iDateFrom.DateTime().Year();
    TBuf<10> tempBuf;
    tempBuf.Format( KDate(), year );
    iDateFrom.Set( tempBuf ); 
    
    iDateUntil.HomeTime();
    
    iDateInitial.Set( tempBuf );    
        
        
    
    // backup existing browsesession observer and set this as current observer
    iBrowseObserver = iBrowseSession.Observer();
    iBrowseSession.RemoveObserver();
    iBrowseSession.SetObserver( *this );
 
    iSearchResponseReceived = EFalse;
    
    iAction = CUPnPCommonUI::EUPnPNone;
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::ConstructL
// Symbian 2nd phase constructor can leave.
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::ConstructL()
    {
    }
// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::NewL
// Two-phased constructor.
// --------------------------------------------------------------------------
//
CUPnPAdvancedFindList* CUPnPAdvancedFindList::NewL(
                                    MUPnPAVController& aAVControl,
                                    MUPnPAVBrowsingSession& aBrowsingSession, 
                                    CUPnPAdvancedFindDialog& aParent,
                                    CUPnPCommonUI& aCommonUI )
    {
    __LOG( "CUPnPAdvancedFindList newL" ) ;
    CUPnPAdvancedFindList* self = new (ELeave) CUPnPAdvancedFindList(
                                                            aAVControl, 
                                                            aBrowsingSession,
                                                            aParent,
                                                            aCommonUI );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }
    
// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::NewL
// Destructor
// --------------------------------------------------------------------------
//
CUPnPAdvancedFindList::~CUPnPAdvancedFindList()
    {
    __LOG( "CUPnPAdvancedFindList::~CUPnPAdvancedFindList" );
    if ( iWaitNoteDialog ) 
        {
         // Stop showing wait note
        TRAP_IGNORE( iWaitNoteDialog->ProcessFinishedL() );
        delete iWaitNoteDialog;
        iWaitNoteDialog = NULL;
        }
        
    iBrowseSession.RemoveObserver();
    if( iBrowseObserver )
        {
        iBrowseSession.SetObserver( *iBrowseObserver );
        }
    
    iResultArray.ResetAndDestroy();
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::MediaServerDisappeared
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::MediaServerDisappeared( 
                                TUPnPDeviceDisconnectedReason aReason )
    {
    iClose = ETrue;
    iCloseReason = aReason;
    TRAP_IGNORE( MediaServerDisappearedL( aReason ) );
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::MediaServerDisappearedL
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::MediaServerDisappearedL( 
                                TUPnPDeviceDisconnectedReason aReason )
    {
    __LOG( "CUPnPAdvancedFindList::MediaServerDisappearedL" );
    
    if( aReason == EDisconnected )
        {
        iExitCode = KErrSessionClosed;
        }
    else if( aReason == EWLANLost)
        {
        iExitCode = KErrDisconnected;
        }
    else
        {
        __PANICD( __FILE__, __LINE__);
        }
    
    if( iWaitNoteDialog ) //if it is on searching
        {
        __LOG( "CUPnPAdvancedFindList::iWaitNoteDialog ETrue" );
        DialogDismissedL( EEikBidCancel );
        iWaitNoteDialog->ProcessFinishedL();
        //no need to call DialogDismissedL;
        delete iWaitNoteDialog;
        iWaitNoteDialog = NULL;
        }
    else
        {
        if( iFindResultWindow )
            {
            __LOG( "CUPnPAdvancedFindList::iFindResultWindow->DismissItselfL" );
            iFindResultWindow->DismissItselfL( iExitCode );
            iFindResultWindow = NULL;
            }
        else //notify AdvancedFindDialog to close itself
            {
            if ( !iShowingErrorNote )
                {
                iAdvancedFindDialog.DismissItselfL( iExitCode ); 
                }
            else
                {
                __LOG( "CUPnPAdvancedFindList::iShowingErrorNote ETrue" );
                }                      
            }      
        }
    __LOG( "CUPnPAdvancedFindList::MediaServerDisappearedL End" );
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::DialogDismissedL
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::DialogDismissedL( TInt aButtonId )
    {
    __LOG( "CUPnPBrowseDialog::DialogDismissedL" );

    // If button is cancel, inform observer parent class 
    // that cancel has been made
    if( aButtonId == EEikBidCancel )
        {
        __LOG( "CUPnPBrowseDialog::DialogDismissedL: \
                                             Cancel was pressed." );
        
        iAction = CUPnPCommonUI::EUPnPNone; 
        iBrowseSession.CancelSearch();
        }

    __LOG( "CUPnPBrowseDialog::DialogDismissedL end" );
    //Do nothing
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::SearchResponse
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::SearchResponse( const TDesC8& aSearchResponse,
    TInt aError, TInt /*aMatches*/, TInt /*aTotalCount*/, const TDesC8&
    /*aUpdateId*/ )
    {
    __LOG( "CUPnPBrowseDialog::SearchResponse" );
    RPointerArray<CUpnpObject> array;   
    
    if( aError == KErrNone )
        {
        CUPnPXMLParser* parser = NULL;
        TRAP( aError, parser = CUPnPXMLParser::NewL();
              parser->ParseResultDataL( array,
              aSearchResponse ) );
        
        delete parser;
        }
        
    TRAP_IGNORE( SearchResponseL( aError, array ) );
    
    array.ResetAndDestroy();
    
    __LOG( "CUPnPBrowseDialog::SearchResponse -end" );
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::SearchResponseL
// Response to FindMetadataL function.
// --------------------------------------------------------------------------
void CUPnPAdvancedFindList::SearchResponseL( 
                            TInt aError,
                            const RPointerArray<CUpnpObject>& aResultArray )
    {
    
    __LOG( "CUPnPBrowseDialog::SearchResponseL" );
    iExitCode = aError;    
    if( KErrNone == aError )
        {
        iSearchResponseReceived = ETrue;
        TBuf<KMaxNameLength> previousTitleName;
        previousTitleName.Zero();
        //Go through the search result and add data to database
        
        
        for( TInt count = 0; count < aResultArray.Count(); count++ )
            {    
            //If an Item is found
            CUpnpObject* tmpObject = aResultArray[count];

            //If it is right type and name is longer than zero
            if ( tmpObject->ObjectType() == EUPnPItem )
                {
                CUpnpItem* item = static_cast<CUpnpItem*>( tmpObject );

                if ( item->Title().Length() > 0 )
                    {
                    
                    //Copy the item
                    item = CUpnpItem::NewL();
                    CleanupStack::PushL( item );
                    item->CopyL( *aResultArray[count] );
                    //And if item is correct type
                    iResultArray.AppendL( item ); // item ownership transferred
                    CleanupStack::Pop( item );
                    }
                }
            }
        }
    else
        {
        iCommonUI.GetUpnpAction( iAction );
        iCommonUI.HandleCommonErrorL( aError, NULL );
        __LOG( "CUPnPAdvancedFindList: \
                SearchResponse operation failed!" );
        }
    if ( iWaitNoteDialog )
        {
        TRAP_IGNORE( iWaitNoteDialog->ProcessFinishedL() );
        }
   __LOG( "CUPnPBrowseDialog::SearchResponseL -end" );
   }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::CreateSettingItemL
// Creates list items
// --------------------------------------------------------------------------
//
CAknSettingItem* CUPnPAdvancedFindList::CreateSettingItemL( 
                                                           TInt aIdentifier )
    {    
    CAknSettingItem* settingItem = NULL;
    switch (aIdentifier)
        {
        case EAdvancedFindMediaType:
            {
            iMediatype = 0;
            settingItem = new (ELeave) CAknEnumeratedTextPopupSettingItem(
                                       aIdentifier, iMediatype ); 
            break;
            }
        case EAdvancedFindFileName:
            {            
            settingItem = new (ELeave) CAknTextSettingItem( aIdentifier, 
                                                            iFileName );
            settingItem->SetSettingPageFlags(
                                   CAknTextSettingPage::EZeroLengthAllowed );
            break;
            }
        case EAdvancedFindArtist:
            {                        
            settingItem = new (ELeave) CAknTextSettingItem( aIdentifier,
                                                            iArtistText );
            settingItem->SetSettingPageFlags(
                                   CAknTextSettingPage::EZeroLengthAllowed );
            settingItem->SetHidden( ETrue );                        
            break;
            }
        case EAdvancedFindAlbum:
            {            
            settingItem = new (ELeave) CAknTextSettingItem( aIdentifier,
                                                            iAlbumText );
            settingItem->SetSettingPageFlags(
                                   CAknTextSettingPage::EZeroLengthAllowed );
            settingItem->SetHidden( ETrue );
            break;
            }
        case EAdvancedFindGenre:
            {            
            settingItem = new (ELeave) CAknTextSettingItem( aIdentifier,
                                                            iGenreText );
            settingItem->SetSettingPageFlags(
                                   CAknTextSettingPage::EZeroLengthAllowed );
            settingItem->SetHidden( ETrue );
            break;
            }
        case EAdvancedFindDateFrom:
            {            
            settingItem = new (ELeave) CAknTimeOrDateSettingItem(
                                           aIdentifier, 
                                           CAknTimeOrDateSettingItem::EDate,
                                           iDateFrom );
            break;            
            }
        case EAdvancedFindDateUntil:
            {            
            settingItem = new (ELeave) CAknTimeOrDateSettingItem(
                                           aIdentifier, 
                                           CAknTimeOrDateSettingItem::EDate,
                                           iDateUntil );
            break;
            }                
        default:
            break;
        }            
    return settingItem;
    }
    
// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::EditItemL
// --------------------------------------------------------------------------
//
void  CUPnPAdvancedFindList::EditItemL ( TInt aIndex, TBool aCalledFromMenu )
    {
    CAknSettingItemArray* arrayForTrueIndex = 
                                CAknSettingItemList::SettingItemArray();
    TInt indexForEditing = arrayForTrueIndex->
                                        ItemIndexFromVisibleIndex( aIndex );
    arrayForTrueIndex = NULL;           
    switch ( indexForEditing )
        {
        case EAdvancedFindMediaType:
            {
            iSettingPageOpen = ETrue;        
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );
            CAknSettingItemArray* arrayForHideCommands = 
                                    CAknSettingItemList::SettingItemArray();
            StoreSettingsL();        
            if ( iMediatype == EAdvancedFindMusic )
                {
                CAknSettingItem* settingItem = 
                            arrayForHideCommands->At( EAdvancedFindArtist );
                settingItem->SetHidden( EFalse );
                settingItem = NULL;                
                CAknSettingItem* settingItem2 = 
                            arrayForHideCommands->At( EAdvancedFindAlbum );
                settingItem2->SetHidden( EFalse );
                settingItem2 = NULL;            
                CAknSettingItem* settingItem3 = 
                            arrayForHideCommands->At( EAdvancedFindGenre );
                settingItem3->SetHidden( EFalse );    
                settingItem3 = NULL;
                }
            else 
                {                
                CAknSettingItem* settingItem = 
                            arrayForHideCommands->At( EAdvancedFindArtist );
                settingItem->SetHidden( ETrue );
                settingItem = NULL;                
                CAknSettingItem* settingItem2 = 
                            arrayForHideCommands->At( EAdvancedFindAlbum );
                settingItem2->SetHidden(ETrue);
                settingItem2 = NULL;                
                CAknSettingItem* settingItem3 = 
                            arrayForHideCommands->At( EAdvancedFindGenre );
                settingItem3->SetHidden( ETrue );
                settingItem3 = NULL;
                }            
            arrayForHideCommands = NULL;            
            }
            break;
        case EAdvancedFindFileName:
            {
            iSettingPageOpen = ETrue;            
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );
            StoreSettingsL();            
            }
            break;            
        case EAdvancedFindArtist:
            {
            iSettingPageOpen = ETrue;
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );
            StoreSettingsL();             
            }
            break;
        case EAdvancedFindAlbum:
            {
            iSettingPageOpen = ETrue;
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );
            StoreSettingsL();            
            }
            break;
        case EAdvancedFindGenre:
            {
            iSettingPageOpen = ETrue;
            CAknSettingItemList::EditItemL( indexForEditing,
                                            aCalledFromMenu );
            StoreSettingsL();            
            }            
            break;
        case EAdvancedFindDateFrom:
            {           
            iSettingPageOpen = ETrue; 
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );            
            StoreSettingsL();
            }
            break;
        case EAdvancedFindDateUntil:
            {            
            iSettingPageOpen = ETrue;
            CAknSettingItemList::EditItemL( indexForEditing, 
                                            aCalledFromMenu );
            StoreSettingsL();
            
            }
            break;            
        default:
            break;
        }
    
    iSettingPageOpen = EFalse;    
    //load settings to screen
    CAknSettingItemList::LoadSettingsL();
    CAknSettingItemList::DrawDeferred();
    
    
    if( iClose )
        {
        MediaServerDisappearedL(iCloseReason);
        }
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::MakeQueryL
// --------------------------------------------------------------------------
//
TInt CUPnPAdvancedFindList::MakeQueryL()
    {
    //Search criteria string
    HBufC8* searchCriteria = BuildSearchCriteriaL();
    CleanupStack::PushL( searchCriteria );

    HBufC8* sortCriteria = KSortCriteria().AllocL();
    CleanupStack::PushL( sortCriteria );

    iAction = CUPnPCommonUI::EUPnPSearch;
    // Make the search request
    iBrowseSession.SearchL( 
                        KContainerIdRoot,     /* object id of the container */
                        *searchCriteria,      /* criteria */
                        KFilterCommon,        /* filter */
                        0,                    /* start index */
                        KMaxRequestCount + 1, /* request count + 1 */
                        *sortCriteria );      /* sort criteria */
    CleanupStack::PopAndDestroy( sortCriteria );
    CleanupStack::PopAndDestroy( searchCriteria );            

    TInt ret = KErrNone;
    iWaitNoteDialog = new(ELeave) CAknWaitDialog( (
                                  REINTERPRET_CAST( CEikDialog**,
                                                    &iWaitNoteDialog ) ),
                                                    ETrue );
    iWaitNoteDialog->SetCallback( this );
 
    ret = iWaitNoteDialog->ExecuteLD( 
                R_UPNPCOMMONUI_ADVANCEDFIND_WAIT_NOTE_DIALOG );

    //Make result window
    //ret is KErrNone only when the DialogDismissedL by the FW.
    // ( not canceling)
    if( ret != KErrNone && iExitCode == KErrNone )
        {
        //If there was more than request count received
        if( iResultArray.Count() > KMaxRequestCount )
            {
            //Delete Item from array
            delete iResultArray[KMaxRequestCount];
            //Remove from array
            iResultArray.Remove( KMaxRequestCount );

            iShowingErrorNote = ETrue;
            //Display error note
            iCommonUI.DisplayErrorTextL(
                        R_UPNPCOMMONUI_ADVANCED_FIND_TOO_MANY_RESULTS_ERROR,
                        KMaxRequestCount );
            iShowingErrorNote = EFalse;            
            }        
        
        // During running DisplayErrorTextL() 
        // We also need to care about whether iExitCode been changed or not.
        if ( iExitCode != KErrNone )
            {
            iResultArray.ResetAndDestroy();
            return iExitCode;
            }
        else
            {
            iFindResultWindow = CAdvancedFindResultWindow::NewL(
                    R_UPNPCOMMONUI_RESULT_WINDOW_MENUBAR,
                    iResultArray,
                    iAVControl,
                    iBrowseSession,
                    iCommonUI );

            iFindResultWindow->SetMopParent( this );
            
            iShowingErrorNote = ETrue;
            
            iExitCode = iFindResultWindow->ExecuteLD( 
                            R_UPNPCOMMONUI_ADVANCED_FIND_RESULT_DIALOG );
            iShowingErrorNote = EFalse;
            
            iFindResultWindow = NULL;
            }          
        }
    CAknSettingItemList::LoadSettingsL();
    CAknSettingItemList::DrawDeferred();

    //Delete result array
    iResultArray.ResetAndDestroy();
    iSearchResponseReceived = EFalse;
    
    if( iExitCode != KErrSessionClosed && 
        iExitCode != KErrDisconnected &&
        iExitCode != EAknCmdExit &&
        iExitCode != EEikCmdExit )
        {
        iExitCode = KErrNone;
        }
    __LOG( "CUPnPAdvancedFindList::MakeQueryL End" );
    return iExitCode;
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::HandleResourceChange
// --------------------------------------------------------------------------
//
void CUPnPAdvancedFindList::HandleResourceChange( TInt aType ) 
    {
    __LOG( "CUPnPAdvancedFindList::HandleResourceChange" );
    
    if ( aType == KEikDynamicLayoutVariantSwitch )
        {
        TRect mainPaneRect;
        AknLayoutUtils::LayoutMetricsRect(
            AknLayoutUtils::EMainPane, mainPaneRect );        
        
        TAknLayoutRect layoutRect;
        layoutRect.LayoutRect(
            TRect( TPoint( 0, 0 ), mainPaneRect.Size() ),
            AKN_LAYOUT_WINDOW_list_gen_pane( 0 ) );
                
        ListBox()->SetRect( layoutRect.Rect() );
        }
        
    // Base call
    CAknSettingItemList::HandleResourceChange( aType );
    }    
    
    
// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::BuildSearchCriteriaL
// --------------------------------------------------------------------------
//
HBufC8* CUPnPAdvancedFindList::BuildSearchCriteriaL() const
    {
    __LOG( "CUPnPAdvancedFindList::BuildSearchCriteriaL" );   
    //Search criteria string
    HBufC8* searchCriteria = NULL;
    HBufC8* tmpStr = NULL;

    //Date variables for handling date search
    TBuf8<KTmpDateFormatLength> tmpDateFormat;
    TDateTime tmpDate;

    searchCriteria = HBufC8::NewL(
        KElementClass().Length() +
        KCriteriaSpace().Length() +
        KCriteriaDerivedFrom().Length() +
        KCriteriaSpace().Length() +
        KCriteriaQuot().Length() +
        KClassVideo().Length() +
        KCriteriaQuot().Length() +
        KCriteriaSpace().Length() +
        KCriteriaAnd().Length() +
        KCriteriaSpace().Length() +
        KAttributeRefID().Length() +
        KCriteriaSpace().Length() +
        KCriteriaExists().Length() +
        KCriteriaSpace().Length() +
        KCriteriaFalse().Length() );
    TPtr8 strPtr = searchCriteria->Des();

    strPtr.Copy( KElementClass() );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KCriteriaDerivedFrom );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KCriteriaQuot );

    //Set search for the mediatype
    __LOG1( "iMediatype: %d", iMediatype );
    switch( iMediatype )
        {
        case EAdvancedFindAll:
            {
            strPtr.Append( KClassItem() );
            break;
            }
        case EAdvancedFindImages:
            {
            strPtr.Append( KClassImage() );
            break;
            }
        case EAdvancedFindVideo:
            {
            strPtr.Append( KClassVideo() );
            break;
            }
        case EAdvancedFindMusic:
            {
            strPtr.Append( KClassAudio() );
            break;
            }
        default:
            {
            __PANICD( __FILE__, __LINE__ );
            break;
            }
        }

    strPtr.Append( KCriteriaQuot );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KCriteriaAnd );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KAttributeRefID );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KCriteriaExists );
    strPtr.Append( KCriteriaSpace );
    strPtr.Append( KCriteriaFalse );
    CleanupStack::PushL( searchCriteria );

    //Check if filename has been entered to search criteria
    __LOG1( "iFileName.Length: %d", iFileName.Length() );
    if( iFileName.Length() > 0 )
        {  
        __LOG( "add name condition" );
        tmpStr = UpnpString::FromUnicodeL( iFileName );
        
        //If inserted, add to search string
        searchCriteria = searchCriteria->ReAllocL(
            searchCriteria->Length() +
            KCriteriaSpace().Length() +
            KCriteriaAnd().Length() +
            KCriteriaSpace().Length() +
            KElementTitle().Length() +
            KCriteriaSpace().Length() +
            KCriteriaContains().Length() +
            KCriteriaSpace().Length() +
            KCriteriaQuot().Length() +
            tmpStr->Length() +
            KCriteriaQuot().Length() 
            );
        
        //pop out the old searchCriteria
        CleanupStack::Pop();
        //push the new searchCriteria which is created by ReAllocL
        CleanupStack::PushL( searchCriteria );
        
        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KElementTitle() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaContains() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( *tmpStr );
        strPtr.Append( KCriteriaQuot() );
        delete tmpStr;
        tmpStr = NULL;
        
        }

    //Add possibly artists to search criteria
    if( iArtistText.Length() > 0 && iMediatype == EAdvancedFindMusic )
        {
        __LOG( "add artists condition" );
        tmpStr = UpnpString::FromUnicodeL( iArtistText );
        searchCriteria = searchCriteria->ReAllocL(
             searchCriteria->Length() +
             KCriteriaSpace().Length() +
             KCriteriaAnd().Length() +
             KCriteriaSpace().Length() +
             KCriteriaOB().Length() +
             KElementArtist().Length() +
             KCriteriaSpace().Length() +
             KCriteriaContains().Length() +
             KCriteriaSpace().Length() +
             KCriteriaQuot().Length() +
             tmpStr->Length() + 
             KCriteriaQuot().Length() +
             KCriteriaSpace().Length() +
             KCriteriaCB().Length()
             ); 

       //pop out the old searchCriteria
        CleanupStack::Pop();
        //push the new searchCriteria which is created by ReAllocL
        CleanupStack::PushL( searchCriteria ); 

        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaOB() );
        strPtr.Append( KElementArtist() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaContains() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( *tmpStr ); //Artist name
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaCB() );
        delete tmpStr;
        tmpStr = NULL;
        }

    //Add possibly albums to search criteria
    if( iAlbumText.Length() > 0 && iMediatype == EAdvancedFindMusic )
        {
        __LOG( "add albums condition" );
        tmpStr = UpnpString::FromUnicodeL( iAlbumText );
        searchCriteria = searchCriteria->ReAllocL(
            searchCriteria->Length() +
            KCriteriaSpace().Length() + 
            KCriteriaAnd().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaOB().Length() + 
            KElementAlbum().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaContains().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaQuot().Length() + 
            tmpStr->Length() + 
            KCriteriaQuot().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaCB().Length() 
            );

        //pop out the old searchCriteria
        CleanupStack::Pop();
        //push the new searchCriteria which is created by ReAllocL
        CleanupStack::PushL( searchCriteria );

        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaOB() );
        strPtr.Append( KElementAlbum() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaContains() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( *tmpStr ); //Artist name
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaCB() );
        delete tmpStr;
        tmpStr = NULL;
        }

    //Add possibly genres to search criteria
    if( iGenreText.Length() > 0 && iMediatype == EAdvancedFindMusic )
        {
        __LOG( "add genres condition" );
        tmpStr = UpnpString::FromUnicodeL( iGenreText );

        searchCriteria = searchCriteria->ReAllocL(
            searchCriteria->Length() +
            KCriteriaSpace().Length() + 
            KCriteriaAnd().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaOB().Length() + 
            KElementGenre().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaContains().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaQuot().Length() + 
            tmpStr->Length() + 
            KCriteriaQuot().Length() + 
            KCriteriaSpace().Length() + 
            KCriteriaCB().Length() 
            );

        //pop out the old searchCriteria
        CleanupStack::Pop();
        //push the new searchCriteria which is created by ReAllocL
        CleanupStack::PushL( searchCriteria );
                                                
        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaOB() );
        strPtr.Append( KElementGenre() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaContains() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( *tmpStr ); //Genre name
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaCB() );
        delete tmpStr;
        tmpStr = NULL;
        }

    // To check whether need to add time condition
    TBool addTimeCondition = ETrue;
    
    if( iFileName.Length() > 0 )
        {
        __LOG( "iFileName > 0" );
        
        // Make temp TDateTime item with current home time to compare with date
        // until.
        TTime tempTTimeforCurrent;
        tempTTimeforCurrent.HomeTime();
        TDateTime tempTDateTimeforCurrent = tempTTimeforCurrent.DateTime();
        TDateTime tempTDateTimeforUntil = iDateUntil.DateTime();
        TBuf8<KTmpDateFormatLength> tempDateFormatCurrent;
        TBuf8<KTmpDateFormatLength> tempDateFormatUntil;
        tempDateFormatCurrent.Format( KTimeFormat8(),
            tempTDateTimeforCurrent.Year(), 
            tempTDateTimeforCurrent.Month() + 1,
            tempTDateTimeforCurrent.Day() + 1 );
        tempDateFormatUntil.Format( KTimeFormat8(),
            tempTDateTimeforUntil.Year(),
            tempTDateTimeforUntil.Month() + 1,
            tempTDateTimeforUntil.Day() +1 );
                
        if( ( iDateFrom == iDateInitial ) && 
                ( tempDateFormatCurrent == tempDateFormatUntil ) )
            {
            // Time criterias are not included into the find query
            // if they are not altered when Title search
            __LOG( "time criterias are not altered" );
            addTimeCondition = EFalse;
            }
        }
    
    if ( addTimeCondition )    
        {
        __LOG( "add time conditions" );
        
        // Add time from
        tmpDate = iDateFrom.DateTime();
        //Format the date according to UPnP
        tmpDateFormat.Format( KTimeFormat8, 
            tmpDate.Year(), 
            tmpDate.Month() + 1,
            tmpDate.Day() + 1 );

        searchCriteria = searchCriteria->ReAllocL(
            searchCriteria->Length() +
            KCriteriaSpace().Length() +
            KCriteriaAnd().Length() +
            KCriteriaSpace().Length() +
            KElementDate().Length() +
            KCriteriaSpace().Length() +
            KCriteriaGTE().Length() +
            KCriteriaSpace().Length() +
            KCriteriaQuot().Length() +
            tmpDateFormat.Length() +
            KCriteriaQuot().Length()  
            );
        CleanupStack::Pop();
        CleanupStack::PushL( searchCriteria );
    
        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KElementDate() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaGTE() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( tmpDateFormat );
        strPtr.Append( KCriteriaQuot() );
    
        // Add time until
        tmpDate = iDateUntil.DateTime();
        tmpDateFormat.Format( KTimeFormat8,
            tmpDate.Year(), 
            tmpDate.Month() + 1, 
            tmpDate.Day() + 1 );
    
        searchCriteria = searchCriteria->ReAllocL(
            searchCriteria->Length() +
            KCriteriaSpace().Length() +
            KCriteriaAnd().Length() +
            KCriteriaSpace().Length() +
            KElementDate().Length() +
            KCriteriaSpace().Length() +
            KCriteriaLTE().Length() +
            KCriteriaSpace().Length() +
            KCriteriaQuot().Length() +
            tmpDateFormat.Length() +
            KCriteriaQuot().Length()  
            );
        CleanupStack::Pop();
        CleanupStack::PushL( searchCriteria );                            
    
        strPtr.Set( searchCriteria->Des() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaAnd() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KElementDate() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaLTE() );
        strPtr.Append( KCriteriaSpace() );
        strPtr.Append( KCriteriaQuot() );
        strPtr.Append( tmpDateFormat );
        strPtr.Append( KCriteriaQuot() );
        }

    //Encode the searchcriteria for xml compatibility
    HBufC8* xmlEncodedSearchCriteria = 
                            UpnpString::EncodeXmlStringL( searchCriteria );
    
    CleanupStack::PopAndDestroy( searchCriteria ); //searchCriteria
    
    __LOG( "CUPnPAdvancedFindList::BuildSearchCriteriaL - end" );
    return xmlEncodedSearchCriteria;
    }

// --------------------------------------------------------------------------
// CUPnPAdvancedFindList::IsSettingPageOpen
// --------------------------------------------------------------------------
//
TBool CUPnPAdvancedFindList::IsSettingPageOpen() const
    {
    return iSettingPageOpen;
    }

// End of file