languageinterworkingfw/servicehandler/src/liwmenu.cpp
changeset 0 99ef825efeca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/languageinterworkingfw/servicehandler/src/liwmenu.cpp	Mon Mar 30 12:51:20 2009 +0300
@@ -0,0 +1,276 @@
+/*
+* Copyright (c) 2003-2005 Nokia Corporation and/or its subsidiary(-ies).
+* 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:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:       Implements LIW Menu utilities for providers to access consumer menu.
+*
+*/
+
+
+
+
+
+
+#include <barsread.h> 
+#include <barsc.h> 
+#include <bautils.h>
+#include "liwmenu.h"
+#include "liwcommon.hrh"
+
+// This is needed for resource reading.
+const TInt KCCMask(0x00000fff);
+
+
+EXPORT_C CLiwMenuPane::CLiwMenuPane(CEikMenuPane& aMenuPane, TInt aBaseCmdId) 
+: iMenuPane(&aMenuPane), iBaseCmdId(aBaseCmdId)
+    {
+    iNextCmdId = aBaseCmdId;
+    }
+
+
+EXPORT_C CLiwMenuPane::~CLiwMenuPane()
+    {   
+    delete iMenuPane;
+    
+    for(TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        iIdMap[i].extraText.Close();
+        }
+    
+    iIdMap.Reset();
+    }
+
+
+EXPORT_C void CLiwMenuPane::AddMenuItemL(
+    TInt aServiceCmd,
+    CEikMenuPaneItem::SData& aMenuItem, 
+    TInt aIndex)
+    {
+    AddMenuItemL(aServiceCmd, aMenuItem, aIndex, KNullDesC());
+    }
+    
+    
+EXPORT_C void CLiwMenuPane::AddMenuItemL(
+    TInt aServiceCmd,
+    CEikMenuPaneItem::SData& aMenuItem, 
+    TInt aIndex,
+    const TDesC& aExtraText)
+    {
+    SMenuIdMap map;
+
+    map.dynMenuCmdId = iNextCmdId + iPaneOffset;
+    map.serviceCmdId = aServiceCmd;
+    map.origCmdId = aMenuItem.iCommandId;
+    map.owner = iInitializingOwner;
+    map.extraText.Assign(aExtraText.AllocL());
+    CleanupClosePushL(map.extraText);
+
+    aMenuItem.iCommandId = iNextCmdId + iPaneOffset;
+    iNextCmdId++;
+
+    iMenuPane->InsertMenuItemL(aMenuItem, aIndex); 
+    User::LeaveIfError(iIdMap.Append( map ));
+    CleanupStack::Pop(&(map.extraText)); // map.extraText
+    }    
+
+
+    
+EXPORT_C void CLiwMenuPane::AddMenuItemsL(
+    TResourceReader& aReader,
+    TInt aServiceCmd,
+    TInt aIndex,
+    TBool /*aAddSeperator*/)
+    {
+    CEikMenuPaneItem::SData data;
+
+    TInt index = aIndex;
+   
+    TInt count = aReader.ReadInt16();
+    for (TInt i = 0; i < count; i++)
+        {
+        data.iCommandId = aReader.ReadInt32();
+        data.iCascadeId = aReader.ReadInt32();  
+        data.iFlags = aReader.ReadInt32();
+        data.iText.Copy(aReader.ReadTPtrC());
+        
+        // Extra text (additional submenu text) must be handled separately
+        // because SData doesn't offer space for it.
+        TPtrC extraText = aReader.ReadTPtrC();
+        
+        aReader.ReadTPtrC(); // Skip bmpfile.
+        aReader.ReadInt16(); // Skip bmpid.
+        aReader.ReadInt16(); // Skip bmpmask. 
+        aReader.ReadInt32(); // Skip extension.   
+
+        if (data.iCommandId == LIW_SUBMENU_TITLE)
+            {
+            AddTitleItemL(data.iText, index);
+            }
+        else
+            {
+            AddMenuItemL(aServiceCmd, data, index++, extraText);
+            }
+        } 
+    }
+
+
+  
+EXPORT_C void CLiwMenuPane::AddMenuItemsL(
+    TFileName& aFileName,
+    TInt aResId,
+    TInt aServiceCmd,
+    TInt aIndex,
+    TBool aAddSeparator)
+    {
+    TResourceReader reader; 
+
+    RFs fsSession;
+    User::LeaveIfError( fsSession.Connect() );
+    CleanupClosePushL( fsSession );
+
+    BaflUtils::NearestLanguageFile(fsSession, aFileName);
+
+    RResourceFile rsFile;
+    rsFile.OpenL( fsSession, aFileName );
+    CleanupClosePushL( rsFile );
+
+    // Read multitapping resource.
+    HBufC8* rBuffer = rsFile.AllocReadLC(aResId & KCCMask); // Remove offset from id
+    reader.SetBuffer( rBuffer );
+
+    AddMenuItemsL(reader, aServiceCmd, aIndex, aAddSeparator);
+
+    CleanupStack::PopAndDestroy(rBuffer);  // rBuffer, rsFile, fsSession
+    CleanupStack::PopAndDestroy(&rsFile);
+    CleanupStack::PopAndDestroy(&fsSession);
+    }
+
+
+
+EXPORT_C TInt CLiwMenuPane::MenuCmdId(TInt aDynCmdId) const
+    {
+    for (TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        if (iIdMap[i].dynMenuCmdId == aDynCmdId)
+            {
+            return iIdMap[i].origCmdId;
+            }
+        }
+
+    return 0;
+    }
+
+    
+
+EXPORT_C TInt CLiwMenuPane::DynCmdId(TInt aMenuCmdId) const
+    {
+    for (TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        if (iIdMap[i].origCmdId == aMenuCmdId)
+            {
+            return iIdMap[i].dynMenuCmdId;
+            }
+        }
+
+    return 0;
+    }
+
+
+
+EXPORT_C TInt CLiwMenuPane::ServiceCmdId(TInt aDynCmdId) const
+    {
+    for (TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        if (iIdMap[i].dynMenuCmdId == aDynCmdId)
+            {
+            return iIdMap[i].serviceCmdId;
+            }
+        }
+
+    return 0; 
+    }
+
+
+
+TInt CLiwMenuPane::FindCmdId(TInt aIndex)
+    {
+    TInt index;
+
+    for (TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        if (iMenuPane->MenuItemExists(iIdMap[i].dynMenuCmdId, index))   
+            {
+            if (aIndex == index)
+                {
+                return iIdMap[i].dynMenuCmdId;
+                }
+            }
+        }
+
+    return -1;
+    }
+
+
+
+EXPORT_C void CLiwMenuPane::AddTitleItemL(const TDesC& aTitle, TInt aIndex) 
+    {
+    CEikMenuPaneItem::SData data;
+    
+    data.iCommandId = LIW_SUBMENU_TITLE;
+    data.iCascadeId = 0;  
+    data.iFlags = 0;
+    data.iText.Copy(aTitle);
+
+    iMenuPane->InsertMenuItemL(data, aIndex);       
+    }
+
+
+TBool CLiwMenuPane::IsCmdInRange(TInt aCmdSpaceSize, TInt aCmd)
+    {
+    if ((aCmd >= iPaneOffset + iBaseCmdId) &&
+        (aCmd < iPaneOffset + iBaseCmdId + aCmdSpaceSize))
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+
+CLiwServiceIfBase* CLiwMenuPane::CommandOwner(TInt aDynCmd) const
+    {
+    for (TInt i = 0; i < iIdMap.Count(); i++)
+        {
+        if (iIdMap[i].dynMenuCmdId == aDynCmd)
+            {
+            return iIdMap[i].owner;
+            }
+        }   
+
+    return NULL;
+    }
+    
+    
+const TDesC& CLiwMenuPane::ExtraText(TInt aDynMenuCmdId)
+    {
+    TInt count = iIdMap.Count();
+    for(TInt i = 0; i < count; i++)
+        {
+        if(iIdMap[i].dynMenuCmdId == aDynMenuCmdId)
+            {
+            return iIdMap[i].extraText;
+            }
+        }
+    return KNullDesC;        
+    }
+
+// End of file