bluetoothengine/bthid/manager/src/mapping.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bthid/manager/src/mapping.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,226 @@
+/*
+* 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:  This is the implementation of application class
+*
+*/
+
+
+#include <e32std.h>
+#include <e32svr.h>
+
+#include "hidlayoutids.h"
+#include "mapping.h"
+#include "layout.h"
+#include "debug.h"
+
+// ----------------------------------------------------------------------
+
+const TInt TFindLayoutId::KDefaultLayoutId = EUnitedKingdom;
+
+// ----------------------------------------------------------------------
+// Map a HID country ID to a keyboard layout ID:
+//
+const TFindLayoutId::TCountryMapEntry TFindLayoutId::KMapCountryToLayout[] =
+    {
+        // HID ID -> Standard layout ID
+        //
+        {  2, EBelgian               }, // Belgian
+        {  6, EDanish                }, // Danish
+        {  7, EFinnishSwedish        }, // Finnish
+        {  8, EFrench                }, // French
+        {  9, EGerman                }, // German
+        { 14, EItalian               }, // Italian
+        { 18, EDutch                 }, // Netherlands/Dutch
+        { 19, ENorwegian             }, // Norwegian
+        { 22, EPortuguese            }, // Portuguese
+        { 25, ESpanish               }, // Spanish
+        { 26, EFinnishSwedish        }, // Swedish
+        { 32, EUnitedKingdom         }, // UK
+        { 33, EUnitedStates          }, // US
+        //
+        // Not in requirements, but layouts do exist. (Note that it
+        // doesn't matter if a layout is listed here but isn't installed,
+        // as the default layout will be used instead.)
+        //
+        { 4, ECanadianFrench         }, // Canadian-French
+        {  3, ECanadianMultilingual  }, // Canadian-Bilingual
+        { 13, EUSInternational       }, // International (ISO)
+        { 17, ELatinAmerican         }, // Latin American
+        { 27, ESwissFrench           }, // Swiss/French
+        { 28, ESwissGerman           }, // Swiss/German
+    };
+
+const TInt TFindLayoutId::KCountryMapSize =
+    (sizeof (KMapCountryToLayout)) / (sizeof (TCountryMapEntry));
+
+// ----------------------------------------------------------------------
+// Map a HID country ID (Nokia SU-8) to a keyboard layout ID:
+//
+const TFindLayoutId::TCountryMapEntry TFindLayoutId::KMapSu8CountryToLayout[] =
+    {
+    // HID ID -> Nokia SU-8 layout ID
+    //
+    // We don't know what language code the SU-8 keyboards will return,
+    // so we'll include them all for now:
+    //
+    { 33, ESu8USEnglish       },  // US
+    {  7, ESu8FinnishSwedish  },  // Finnish
+    { 26, ESu8FinnishSwedish  },  // Swedish
+    {  6, ESu8DanishNorwegian },  // Danish
+    { 19, ESu8DanishNorwegian },  // Norwegian
+    {  9, ESu8German          }   // German
+    };
+
+const TInt TFindLayoutId::KSu8CountryMapSize =
+    (sizeof (KMapSu8CountryToLayout)) / (sizeof (TCountryMapEntry));
+
+// ----------------------------------------------------------------------
+// Map a TLanguage enum, as returned by User::Language(), to a
+// keyboard layout ID:
+//
+const TFindLayoutId::TLanguageMapEntry TFindLayoutId::KMapLanguageToLayout[] =
+    {
+        // TLanguage ID           ->  Standard layout ID,  Nokia SU-8 layout ID
+        //
+        { ELangEnglish,               EUnitedKingdom,      ESu8USEnglish },
+        { ELangFrench,                EFrench,             0 },
+        { ELangGerman,                EGerman,             ESu8German },
+        { ELangSpanish,               ESpanish,            0 },
+        { ELangItalian,               EItalian,            0 },
+        { ELangSwedish,               EFinnishSwedish,     ESu8FinnishSwedish },
+        { ELangDanish,                EDanish,             ESu8DanishNorwegian },
+        { ELangNorwegian,             ENorwegian,          ESu8DanishNorwegian },
+        { ELangFinnish,               EFinnishSwedish,     ESu8FinnishSwedish },
+        { ELangAmerican,              EUnitedStates,       ESu8USEnglish },
+        { ELangSwissFrench,           ESwissFrench,        0 },
+        { ELangSwissGerman,           ESwissGerman,        0 },
+        { ELangPortuguese,            EPortuguese,         0 },
+        { ELangIcelandic,             EIcelandic,          0 },
+        { ELangDutch,                 EDutch,              0 },
+        { ELangBelgianFlemish,        EBelgian,            0 },
+        { ELangBelgianFrench,         EBelgian,            0 },
+        { ELangInternationalEnglish,  EUSInternational,    ESu8USEnglish },
+        { ELangCanadianFrench,        ECanadianFrench,     0 },
+        { ELangLatinAmericanSpanish,  ELatinAmerican,      0 },
+        { ELangFinlandSwedish,        EFinnishSwedish,     ESu8FinnishSwedish },
+        { ELangRussian,				  			ERussian,			   		 ESu8Russian }
+
+        //    	}
+    };
+
+const TInt TFindLayoutId::KLanguageMapSize =
+    (sizeof (KMapLanguageToLayout)) / (sizeof (TLanguageMapEntry));
+
+// ----------------------------------------------------------------------
+
+TFindLayoutId::TFindLayoutId(TInt aHidCountryId,
+                             TInt aVendorId, TInt aProductCode)
+    {
+    TRACE_INFO( (_L("TFindLayoutId(Country %d, Vendor %d, Product %d)"),
+                 aHidCountryId, aVendorId, aProductCode));
+
+    const TInt KNokiaVendorId = 0x5555;
+    const TInt KSu8ProductCode = 0x00dd;
+
+    iIsNokiaSu8 = (aVendorId == KNokiaVendorId)
+                  && (aProductCode == KSu8ProductCode);
+
+    //Used to identify the NOKIA SU8 PROTOTYPE
+    if ((aVendorId == 0x5555) && (aProductCode == 0x5555))
+        {
+        iIsNokiaSu8 = ETrue;
+        }
+
+    iLayout = 0; // 0 = invalid layout ID = "unknown"
+
+    iFoundLayout = EFalse;
+
+    if (aHidCountryId != 0)
+        {
+        // Use the look-up table to find the most appropriate keyboard
+        // layout for this country code:
+        //
+        TRACE_INFO( (_L("TFindLayoutId(): country %d"),
+                     aHidCountryId));
+        iLayout = CountryToLayout(aHidCountryId, iIsNokiaSu8);
+
+        if (iLayout != 0)
+            {
+            iFoundLayout = ETrue;
+            }
+        }
+
+    if (iLayout == 0)
+        {
+        // Either no country code was specified, or we couldn't find
+        // an appropriate layout listed in the look-up table.
+        // Instead, attempt to infer the layout using the current
+        // phone language setting:
+        //
+        TRACE_INFO( (_L("TFindLayoutId(): language %d"),
+                     User::Language()));
+        iLayout = LanguageToLayout(User::Language(), iIsNokiaSu8);
+        }
+
+    if (iLayout == 0)
+        {
+        iLayout = KDefaultLayoutId;
+        TRACE_INFO( (_L("TFindLayoutId(): default layout")));
+        }
+
+    TRACE_INFO( (_L("TFindLayoutId(): layout is %d"), iLayout));
+    }
+
+// ----------------------------------------------------------------------
+
+TInt TFindLayoutId::CountryToLayout(TInt aHidCountryId, TBool aIsNokiaSu8)
+    {
+    const TCountryMapEntry* table =
+        aIsNokiaSu8 ? KMapSu8CountryToLayout : KMapCountryToLayout;
+    const TInt size =
+        aIsNokiaSu8 ? KSu8CountryMapSize : KCountryMapSize;
+
+    TInt layout = 0;
+
+    for (TInt i=0; (i<size) && (layout == 0); ++i)
+        {
+        const TCountryMapEntry& entry = table[i];
+
+        if (entry.iHidCountryId == aHidCountryId)
+            {
+            layout = entry.iLayoutId;
+            }
+        }
+
+    return layout;
+    }
+
+TInt TFindLayoutId::LanguageToLayout(TLanguage aLanguage, TBool aIsNokiaSu8)
+    {
+    TInt layout = 0;
+
+    for (TInt i=0; (i<KLanguageMapSize) && (layout == 0); ++i)
+        {
+        const TLanguageMapEntry& entry = KMapLanguageToLayout[i];
+
+        if (entry.iLanguage == aLanguage)
+            {
+            layout = aIsNokiaSu8 ? entry.iSu8LayoutId : entry.iLayoutId;
+            }
+        }
+
+    return layout;
+    }
+
+// ----------------------------------------------------------------------