menucontentsrv/src/menu.cpp
changeset 60 f62f87b200ec
parent 4 1a2a00e78665
child 61 8e5041d13c84
--- a/menucontentsrv/src/menu.cpp	Tue Feb 02 00:23:10 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,416 +0,0 @@
-/*
-* Copyright (c) 2009 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:
-*
-*/
-#include "mcsdef.h"
-
-#include "mcsmenu.h"
-#include "menusrvdef.h"
-#include "menumsg.h"
-#include "menubuf.h"
-#include "menuutil.h"
-#include "menuclientoperation.h"
-#include "menuhandlereng.h"
-#include "mcsmenufilter.h"
-
-#include <s32strm.h>
-#include <e32debug.h>
-
-// ================= LOCAL FUNCTIONS =======================
-
-/**
-* Start the server executable.
-* @return Error code.
-*/
-LOCAL_C TInt StartServer()
-    {
-    TInt err( KErrNone );
-    RProcess server;
-    err = server.Create( KMenuSrvExe, KNullDesC, EOwnerThread );
-    if ( !err )
-        {
-        TRequestStatus status;
-        server.Rendezvous( status );
-        if ( status != KRequestPending )
-            {
-            server.Kill( 0 ); // Abort startup.
-            }
-        else
-            {
-            server.Resume(); // Logon OK - start the server.
-            }
-        User::WaitForRequest( status ); // Wait for start or death.
-        // We can't use the 'exit reason' if the server panicked as this
-        // is the panic 'reason' and may be '0' which cannot be distinguished
-        // from KErrNone.
-        err = (server.ExitType() == EExitPanic) ? KErrGeneral : status.Int();
-        server.Close();
-        }
-    return err;
-    }
-
-// ================= MEMBER FUNCTIONS =======================
-
-NONSHARABLE_CLASS( RMenu::TData )
-    {
-public:
-    // Transfer buffer. Size must be big enough to accomodate any object that
-    // will go through it: attribute, TMenuItem
-    TUint16 iBuf[KMenuMaxAttrValueLen];
-    // Handler engine.
-    CMenuHandlerEng* iHandler;
-    };
-
-// ================= MEMBER FUNCTIONS =======================
-
-// ---------------------------------------------------------
-// RMenu::Close
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::Close()
-    {
-    RSessionBase::Close();
-    if ( iData )
-        {
-        delete iData->iHandler; iData->iHandler = NULL;
-        delete iData; iData = NULL;
-        }
-    }
-
-// ---------------------------------------------------------
-// RMenu::OpenL
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::OpenL( const TDesC& aName )
-    {
-    __ASSERT_DEBUG( !iData, User::Invariant() );
-    User::LeaveIfError( ConnectSession() );
-    CleanupClosePushL( *this ); // Atomcic connect + local data + construct.
-    iData = new (ELeave) RMenu::TData();
-    iData->iHandler = NULL;
-    // We have a connected blank session, now construct it.
-    // It would be good to have a CreateSession which leaves us at least one
-    // IpcArg, so the name could be sent to session creation directly.
-    // Since having a fully constructed session needs this extra IPC, the
-    // server side session had to be cluttered with ASSERTS. (Almost all
-    // messages need to check that the session is fully constructed.)
-    //
-    // The reason for this is a design issue (we use the session as an object,
-    // and not just as a communication channel. But normally there is only one
-    // object used, so why complicate things for the client?
-    User::LeaveIfError
-        ( SendReceive( EMenuConstructSession, TIpcArgs( &aName ) ) );
-    CleanupStack::Pop( this );
-    }
-
-// ---------------------------------------------------------
-// RMenu::RootFolderL
-// ---------------------------------------------------------
-//
-EXPORT_C TInt RMenu::RootFolderL()
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    TPckgBuf<TInt> pckg;
-    User::LeaveIfError( SendReceive( EMenuRootFolder, TIpcArgs( &pckg ) ) );
-    return pckg();
-    }
-
-// ---------------------------------------------------------
-// RMenu::GetItemsL
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::GetItemsL(
-        RArray<TMenuItem>& aItemArray,
-        TInt aFolder,
-        const CMenuFilter* aFilter /*=NULL*/,
-        TBool aRecursive /*=EFalse*/ )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    if ( aFilter )
-        {
-        // Filtered query, 2+ more IPC.
-        // The buffer is opened empty, used to send the filter
-        // then the result is received into it.
-        RMenuBuf buf;
-        User::LeaveIfError( buf.Open( *this ) );
-        CleanupClosePushL( buf );
-        RWriteStream stream( &buf );
-        aFilter->ExternalizeL( stream );
-        stream.CommitL();
-        TIpcArgs args( aFolder, aRecursive, buf.SubSessionHandle() );
-        User::LeaveIfError( SendReceive( EMenuGetItemsFiltered, args ) );
-        RReadStream rs( &buf );
-        MenuUtil::InternalizeL( aItemArray, rs );
-        CleanupStack::PopAndDestroy( &buf );
-        }
-    else
-        {
-        // Unfiltered query.
-        // The buffer already contains the query result when Open() returns.
-        RMenuBuf buf;
-        TIpcArgs args( aFolder, aRecursive );
-        User::LeaveIfError( buf.Open( *this, EMenuGetItems, args ) );
-        CleanupClosePushL( buf );
-        RReadStream stream( &buf );
-        MenuUtil::InternalizeL( aItemArray, stream );
-        CleanupStack::PopAndDestroy( &buf );
-        }
-    }
-
-// ---------------------------------------------------------
-// RMenu::GetRunningAppsL
-// ---------------------------------------------------------
-//
-EXPORT_C  void RMenu::GetRunningAppsL( RArray<TUid>& aArray )
-	{
-    RMenuBuf buf;
-    TIpcArgs args( 0 );
-    User::LeaveIfError( buf.Open( *this, EMenuGetRunningApps, args ) );
-    CleanupClosePushL( buf );
-    RReadStream stream( &buf );
-    MenuUtil::InternalizeL( aArray, stream );
-    CleanupStack::PopAndDestroy( &buf );
-	}
-    
-
-// ---------------------------------------------------------
-// RMenu::RemoveL
-// ---------------------------------------------------------
-//
-EXPORT_C CMenuOperation* RMenu::RemoveL( TInt aId, TRequestStatus& aStatus )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    CMenuClientOperation* op = new (ELeave) CMenuClientOperation
-        ( *this, CActive::EPriorityStandard, aStatus );
-    CleanupStack::PushL( op );
-    op->RemoveL( aId );
-    CleanupStack::Pop( op );
-    return op;
-    }
-
-// ---------------------------------------------------------
-// RMenu::MoveToFolderL
-// ---------------------------------------------------------
-//
-EXPORT_C CMenuOperation* RMenu::MoveToFolderL(
-        const RArray<TInt>& aItems,
-        TInt aFolder,
-        TInt aMoveBefore,
-        TRequestStatus& aStatus )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    RMenuBuf buf;
-    User::LeaveIfError( buf.Open( *this ) );
-    CleanupClosePushL( buf );
-    RWriteStream stream( &buf );
-    MenuUtil::ExternalizeL( aItems, stream );
-    stream.CommitL();
-    CMenuClientOperation* op = new (ELeave) CMenuClientOperation
-        ( *this, CActive::EPriorityStandard, aStatus );
-    CleanupStack::PushL( op );
-    op->MoveToFolderL( buf, aFolder, aMoveBefore );
-    CleanupStack::Pop( op );
-    CleanupStack::PopAndDestroy( &buf );
-    return op;
-    }
-
-// ---------------------------------------------------------
-// RMenu::ReorderL
-// ---------------------------------------------------------
-//
-EXPORT_C CMenuOperation* RMenu::ReorderL
-( TInt aId, TInt aMoveBefore, TRequestStatus& aStatus )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    CMenuClientOperation* op = new (ELeave) CMenuClientOperation
-        ( *this, CActive::EPriorityStandard, aStatus );
-    CleanupStack::PushL( op );
-    op->ReorderL( aId, aMoveBefore );
-    CleanupStack::Pop( op );
-    return op;
-    }
-
-// ---------------------------------------------------------
-// RMenu::ResourceMark
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::ResourceMark()
-    {
-    SendReceive( EMenuResourceMarkStart );
-    }
-
-// ---------------------------------------------------------
-// RMenu::ResourceCheck
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::ResourceCheck()
-    {
-    SendReceive( EMenuResourceMarkEnd );
-    }
-
-// ---------------------------------------------------------
-// RMenu::ResourceCount
-// ---------------------------------------------------------
-//
-EXPORT_C TInt RMenu::ResourceCount()
-    {
-    return SendReceive( EMenuResourceCount );
-    }
-
-#ifdef _DEBUG
-
-// ---------------------------------------------------------
-// RMenu::__DbgSetAllocFail
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::__DbgSetAllocFail
-( RAllocator::TAllocFail aType, TInt aRate )
-    {
-    TInt type = STATIC_CAST( TInt, aType );
-    SendReceive( EMenuSetHeapFailure, TIpcArgs( type, aRate ) );
-    }
-
-#else /* not _DEBUG */
-
-// ---------------------------------------------------------
-// RMenu::__DbgSetAllocFail
-// ---------------------------------------------------------
-//
-EXPORT_C void RMenu::__DbgSetAllocFail
-( RAllocator::TAllocFail /*aType*/, TInt /*aRate*/ )
-    {
-    }
-
-#endif /* def _DEBUG */
-
-// ---------------------------------------------------------
-// RMenu::HandleCommandL
-// ---------------------------------------------------------
-//
-CMenuOperation* RMenu::HandleCommandL(
-        CMenuItem& aItem,
-        const TDesC8& aCommand,
-        const TDesC8& aParams,
-        TRequestStatus& aStatus )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    if ( !iData->iHandler )
-        {
-        // Create handler engine on demand - handlers not loaded unless needed.
-        iData->iHandler = CMenuHandlerEng::NewL( *this );
-        }
-    return iData->iHandler->HandleCommandL
-        ( aItem, aCommand, aParams, aStatus );
-    }
-
-// ---------------------------------------------------------
-// RMenu::ConnectSession
-// ---------------------------------------------------------
-//
-TInt RMenu::ConnectSession()
-    {
-    TVersion version( KMenuMajorVersion, KMenuMinorVersion, KMenuBuild );
-    TInt err = CreateSession( KMenuSrvName, version );
-    if ( KErrNotFound == err )
-        {
-        err = StartServer();
-        if ( !err || KErrAlreadyExists == err ) // Deal with race conditions.
-            {
-            err = CreateSession( KMenuSrvName, version );
-            }
-        }
-    return err;
-    }
-
-// ---------------------------------------------------------
-// RMenu::GetAttributeL
-// ---------------------------------------------------------
-//
-HBufC* RMenu::GetAttributeL( TInt aId, const TDesC& aAttrName )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    __ASSERT_DEBUG( sizeof( iData->iBuf ) >= 2 * KMenuMaxAttrValueLen, \
-        User::Invariant() ); // Must fit into the transfer buffer.
-    
-    RBuf ptr;
-    ptr.CleanupClosePushL();
-    ptr.CreateL(KMenuMaxAttrValueLen);
-    TPckgBuf<TBool> attrExists( EFalse );
-    TIpcArgs args( aId, &aAttrName, &attrExists, &ptr );
-    User::LeaveIfError( SendReceive( EMenuItemGetAttribute, args ) );
-    
-    if( attrExists() )
-    	{
-    	HBufC* ret = ptr.AllocL();
-    	CleanupStack::PopAndDestroy( &ptr );
-    	return ret;
-    	}
-    else
-    	{
-    	CleanupStack::PopAndDestroy( &ptr );
-    	return NULL;
-    	}
-    }
-    
-
-
-// ---------------------------------------------------------
-// RMenu::GetAttributeL
-// ---------------------------------------------------------
-void RMenu::GetAttributeListL( TInt aId, RArray<TAttributeName>& aList )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    __ASSERT_DEBUG( sizeof( iData->iBuf ) >= 2 * KMenuMaxAttrValueLen, \
-        User::Invariant() ); // Must fit into the transfer buffer.
-
-    RMenuBuf buf;
-    TIpcArgs args( aId );
-    User::LeaveIfError( buf.Open( *this, EMenuItemGetAttributeList, args ) );
-    CleanupClosePushL( buf );
-    RReadStream rs( &buf );
-    
-    TInt len;
-    TAttributeName name;
-    while ( ETrue )
-        {
-
-        len = rs.ReadInt32L();
-
-        if ( len == 0 )
-            {
-            break;
-            }
-
-        rs.ReadL( name, len );
-        aList.AppendL( name );
-        }
-
-    CleanupStack::PopAndDestroy( &buf );
-    }
-
-// ---------------------------------------------------------
-// RMenu::GetHdrL
-// ---------------------------------------------------------
-//
-const TMenuItem& RMenu::GetHdrL( TInt aId )
-    {
-    __ASSERT_DEBUG( iData, User::Invariant() );
-    __ASSERT_DEBUG( sizeof( iData->iBuf ) >= sizeof( TMenuItem ), \
-        User::Invariant() ); // Header must fit into the transfer buffer.
-    TPckg<TMenuItem> pckg( (TMenuItem&)iData->iBuf );
-    TIpcArgs args( aId, &pckg );
-    User::LeaveIfError( SendReceive( EMenuGetHdr, args ) );
-    return pckg(); // Returned object is in the transfer buffer.
-    }