DirectPrint/DirectPrintApp/engine/src/directprintsettingsconverter.cpp
author msekine <m.sekine@kthree.co.jp>
Wed, 31 Mar 2010 00:04:55 +0900
branchRCL_3
changeset 11 613a5ff70823
child 19 2275db202402
permissions -rw-r--r--
transfer from SFL repo (sfl/FCL/sf/app/printing/DirectPrint)

/*
* Copyright (c) 2010 Kanrikogaku Kenkyusho, Ltd.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:
* Kanrikogaku Kenkyusho, Ltd. - Initial contribution
*
* Contributors:
*
* Description:
* {Description of the file}
*
*/

// System include files
#include <stringloader.h>

// User include files
#include "directprintsettingsconverter.h"
#include "directprinttintcapability.h"
#include "directprintlistcapability.h"
#include "directprintfloatcapability.h"
#include "directprinttextcapability.h"
#include "directprintstringids.h"
#include "directprintcapability.h"
#include "directprintvariant.h"
#include "clog.h"

const TInt KEngineLimitValue( -1 );
const TInt KMenuItemsRequired( 2 );

// Converts TDirectPrintCapability to CDirectPrintTIntCapability
CDirectPrintTIntCapability* DirectPrintSettingsConverter::AddTIntCapabilityLC(
    TDirectPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("DirectPrintSettingsConverter::AddTIntCapabilityLC Begin");
    CDirectPrintTIntCapability* intC = new ( ELeave ) CDirectPrintTIntCapability;
    CleanupStack::PushL( intC );

    // If engine returns KEngineLimitValue as low/high limit then it means
    // that there is no minimum or maximum limit
    if ( aCapability.iLow == KEngineLimitValue )
        {
        intC->iMin = KMinTInt32;
        }
    else
        {
        intC->iMin = aCapability.iLow;
        }

    if ( aCapability.iHigh == KEngineLimitValue )
        {
        intC->iMax = KMaxTInt32;
        }
    else
        {
        intC->iMax = aCapability.iHigh;
        }

    // Initialize TInt capability and return it
    intC->iTitle = DirectPrintSettingsConverter::TextStringLC( aCapabUid )->Des();
    CleanupStack::PopAndDestroy();  // SettingsConverter text string
    intC->iIndexOnList = aIndexOnList;
    intC->iUid = aCapabUid;
    intC->iValue = aCapability.iDefaultValue;
	
	LOG("DirectPrintSettingsConverter::AddTIntCapabilityLC End");
    return intC;
    }

// Converts TDirectPrintCapability to CDirectPrintListCapability
CDirectPrintListCapability* DirectPrintSettingsConverter::AddListCapabilityLC(
    TDirectPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("DirectPrintSettingsConverter::AddListCapabilityLC Begin");
    CDirectPrintListCapability* listC = new ( ELeave ) CDirectPrintListCapability();
    CleanupStack::PushL( listC );
    listC->iIndexOnList = aIndexOnList;
    listC->iUid = aCapabUid;
 
	/* There's a problem with some usb printers:
	   They offer "normal" print quality twice and nothing else.
	   This has to be handled so that user is not shown the option
	   as he cannot change it anyway in this case */
	TBool qualityDuplicates = EFalse;
	if ( aCapabUid == EDirectPrintCapabQuality && 
		 aCapability.iEnumCount == KMenuItemsRequired )
		{
		if ( aCapability.iEnumCodes[0] == aCapability.iEnumCodes[1] )
			{
			LOG("DirectPrintSettingsConverter::AddListCapabilityLC duplicate quality detected!");
			qualityDuplicates = ETrue;
			}
		} 
		 
    // If there is only one value for certain capability, empty
    // title is added so the capability is not visible on the
    // settings menu.
    if( aCapability.iEnumCount < KMenuItemsRequired || qualityDuplicates )
        {
        listC->iTitle = DirectPrintSettingsConverter::TextStringLC( 0 )->Des();
        }
    else
        {
        listC->iTitle = DirectPrintSettingsConverter::TextStringLC( aCapabUid )->Des();
        }    

    CleanupStack::PopAndDestroy();  // SettingsConverter text string
    listC->iValue = aCapability.iDefaultValue;

    TBool enumLabels = listC->iTitle.CompareF( KNullDesC() ) !=  0;
    TInt i( 0 );
    TInt num( aCapability.iEnumCount );
    for ( i = 0; i < num; i++ )
        {
        User::LeaveIfError(
            listC->iEnumIDs.Append( aCapability.iEnumCodes[i] ) );

        // Find matching text for the enumeration if the capability is
        // visible on the settings view
#ifdef DIRECT_PRINT_DYNAMIC_PRINT_SETTINGS        
        if ( enumLabels || aCapability.iEnumCount < KMenuItemsRequired )
#else
		// Not for layout if no dynamic print settings
        if (( enumLabels || aCapability.iEnumCount < KMenuItemsRequired ) &&
            aCapabUid != EDirectPrintCapabLayout )
#endif
            {
            LOG("DirectPrintSettingsConverter::AddListCapabilityLC Adding real value");
            User::LeaveIfError( listC->iTexts.Append(
                DirectPrintSettingsConverter::TextStringLC( aCapability.iEnumCodes[i] )));
            CleanupStack::Pop();    // SettingsConverter text string 
            }
        else
            {
            LOG("DirectPrintSettingsConverter::AddListCapabilityLC Adding EMPTY value");
            User::LeaveIfError( listC->iTexts.Append(
                StringLoader::LoadLC( R_EMPTY ) ) );
            CleanupStack::Pop();	// SettingsConverter text string
            }
        }

    if ( aCapability.iEnumCount > 0 )
        {
        i = 0;
        // Check that current active capability code is found from the
        // list of codes and activate first one if not found
        TInt num( aCapability.iEnumCount );
        while ( i < num &&
                listC->iValue != aCapability.iEnumCodes[i] )
            {
            i++;
            }
        if ( i >= aCapability.iEnumCount )
            {
            listC->iValue = aCapability.iEnumCodes[0];
            }
        }

	LOG("DirectPrintSettingsConverter::AddListCapabilityLC End");
    return listC;
    }

// Converts TDirectPrintCapability to CDirectPrintFloatCapability
CDirectPrintFloatCapability* DirectPrintSettingsConverter::AddFloatCapabilityLC(
    TDirectPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("DirectPrintSettingsConverter::AddFloatCapabilityLC Begin");
    CDirectPrintFloatCapability* floatC = new ( ELeave ) CDirectPrintFloatCapability;
    CleanupStack::PushL( floatC );

    floatC->iIndexOnList = aIndexOnList;
    floatC->iUid = aCapabUid;
    floatC->iTitle = DirectPrintSettingsConverter::TextStringLC( aCapabUid )->Des();
    CleanupStack::PopAndDestroy();  // SettingsConverter text string

    floatC->SetValues( aCapability.iLow,
                       aCapability.iDefaultValue, aCapability.iHigh );
    
    LOG("DirectPrintSettingsConverter::AddFloatCapabilityLC End");
    return floatC;
    }

// Converts TDirectPrintCapability to CDirectPrintTextCapability
CDirectPrintTextCapability* DirectPrintSettingsConverter::AddTextCapabilityLC(
    TDirectPrintCapability& /*aCapability*/,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("DirectPrintSettingsConverter::AddTextCapabilityLC Begin");
    CDirectPrintTextCapability* textC = new ( ELeave ) CDirectPrintTextCapability;
    CleanupStack::PushL( textC );

    textC->iIndexOnList = aIndexOnList;
    textC->iUid = aCapabUid;
    textC->iTitle = DirectPrintSettingsConverter::TextStringLC( aCapabUid )->Des();
    CleanupStack::PopAndDestroy();  // SettingsConverter text string

    LOG("DirectPrintSettingsConverter::AddTextCapabilityLC End");
    return textC;
    }

// Fetches text string based on the enumeration ID
HBufC* DirectPrintSettingsConverter::TextStringLC(
    TInt aId )
    {
    LOG1("DirectPrintSettingsConverter::TextStringLC Begin: %d", aId );
    HBufC* buf = 0;
    TBool found( EFalse );

    TInt i( 0 );
    for ( i = 0; i < KConverterTableCount && !found; i++ )
        {
        if ( aId == KIDConverterTable[i][0] )
            {
            buf = StringLoader::LoadLC( KIDConverterTable[i][1] );
            found = ETrue;
            }
        }

    if ( !found )
        {
        User::Leave( KErrNotFound );
        }

	LOG("DirectPrintSettingsConverter::TextStringLC End");
    return buf;
    }

//  End of File