DirectPrint/DirectPrintApp/engine/src/directprintsettingsconverter.cpp
changeset 19 2275db202402
parent 11 613a5ff70823
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DirectPrint/DirectPrintApp/engine/src/directprintsettingsconverter.cpp	Tue May 11 14:10:02 2010 +0800
@@ -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 <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