diff -r 3f1fec088555 -r 613a5ff70823 DirectPrint/DirectPrintApp/engine/src/directprintsettingsconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DirectPrint/DirectPrintApp/engine/src/directprintsettingsconverter.cpp Wed Mar 31 00:04:55 2010 +0900 @@ -0,0 +1,240 @@ +/* +* 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 + +// 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