homescreensrv_plat/sapi_menucontent/src/mcsdsinterface.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:13:44 +0300
branchRCL_3
changeset 111 053c6c7c14f3
parent 0 79c6a41cd166
permissions -rw-r--r--
Revision: 201026 Kit: 201033

/*
* 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:  
*
*/
 

#include <e32base.h>
#include <e32def.h>
#include "mcsdef.h"
#include "mcsmenufilter.h"
#include "mcsmenuitem.h"
#include "mcsmenunotifier.h"

#include "serviceerrno.h"
#include "mcsservice.h"
#include "mcsdsinterface.h"
#include "mcscallback.h"
#include "mcsconstants.h"


// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CMCSDSInterface* CMCSDSInterface::NewL(const TDesC& aContent)
	{
  	CMCSDSInterface* self = new (ELeave) CMCSDSInterface();
  	CleanupStack::PushL( self );
  	self->ConstructL(aContent);
  	CleanupStack::Pop( self );
	return self;
	}
// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//	
CMCSDSInterface::~CMCSDSInterface()
	{
	delete iMCSService;
	}

// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
CMCSDSInterface::CMCSDSInterface()
	{
	}

// ---------------------------------------------------------------------------
// Symbian Constructor
// ---------------------------------------------------------------------------
//	
void CMCSDSInterface::ConstructL(const TDesC& aContent)
	{
	iMCSService = CMCSService::NewL(aContent);	
	}

// ---------------------------------------------------------------------------
//  Executes the SAPI as per params
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::ExecuteCmdL( const TDesC8& aCmdName,
					             const CLiwGenericParamList& aInParamList,
					             CLiwGenericParamList& aOutParamList,
					             TUint aCmdOptions,
					             MLiwNotifyCallback* aCallback )
	{
	TInt errcode = KErrNotSupported;
	TInt32 transactionId = -1; 
		
	aOutParamList.AppendL(TLiwGenericParam( KErrorCode, 
							TLiwVariant( ErrCodeConversion( KErrNone ))));		
	
	if ( !aCallback )
		{
		// Callback is a null pointer
		errcode = KErrArgument;
		}
	else
		{
	
		if ( aCmdName.CompareF( KCmdAdd ) == 0 ) 
			{
			TRAP(errcode, AddItemL( aInParamList, aCallback ));
			}
		else if ( aCmdName.CompareF( KCmdDelete ) == 0 ) 
			{
			  TRAP(errcode, DeleteL( aInParamList, aCallback ));
			}
		else if ( aCmdName.CompareF( KCmdGetList ) == 0 ) 
			{
			TRAP(errcode, GetListL( aInParamList, aCallback ));
			}
		else if ( aCmdName.CompareF( KCmdReqNotification ) == 0 ) 
			{
			if( aCallback && !(aCmdOptions & KLiwOptCancel) )
	            {
	            TRAP(errcode, RequestNotificationL(aInParamList, aCallback));
	            }
	        if ( aCmdOptions & KLiwOptCancel )
	            {
	            TRAP(errcode, iMCSService->UnRegisterObserverL());
	            }
			
			}
		
		// Append transaction id in case of asynchronous requests 
		if( ( KLiwOptASyncronous & aCmdOptions ) &&  
							( errcode == KErrNone ) && ( transactionId != -1 ) )
			{
			aOutParamList.AppendL(TLiwGenericParam( KTransactionID, 
									TLiwVariant( TInt32( transactionId ))));		
			}	
		}
	
	if( errcode != KErrNone )
		{
		aOutParamList.Reset();
		aOutParamList.AppendL(TLiwGenericParam( KErrorCode, 
									TLiwVariant(ErrCodeConversion(errcode))));		
		}
	}

// ---------------------------------------------------------------------------
// Closes the interface
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::Close()
	{
	delete this;
	}

// ---------------------------------------------------------------------------
// Issues Add a new Item request to MCSService
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::AddItemL( const CLiwGenericParamList& aInParamList, 
                              MLiwNotifyCallback* aCallback )
    {
    TInt32 itemId = 0;
    TInt32 parentId = 0;
    TInt32 beforeId = 0;    
    TInt pos = 0;
    TPtrC paramvalue;

    TBuf16<KMenuMaxAttrValueLen> paramValStr;
    TBuf16<KMenuMaxAttrNameLen> attrname16;
    TBuf8<KMenuMaxAttrNameLen> attrname;
    TBuf16<KMenuMaxAttrValueLen> paramType;
    TLiwVariant param;    
    
    const TLiwGenericParam* inParam = aInParamList.FindFirst( pos, KInData );
    if (inParam)
        {
        CLiwMap* inputMap = (CLiwMap*)inParam->Value().AsMap();
        if ( inputMap )
           {
           attrname.Copy(KMenuAttrId());
           if( inputMap->FindL( attrname, param))
        	   {
        	   param.Get(itemId);
        	   inputMap->Remove( attrname );
        	   }
           param.Reset();
           if( inputMap->FindL( KParentId, param))
        	   {
        	   param.Get(parentId);
        	   inputMap->Remove( KParentId );
        	   }
           param.Reset();

           if( inputMap->FindL( KBeforeId, param))
        	   {
        	   param.Get(beforeId);
        	   inputMap->Remove(KBeforeId);
        	   }
           param.Reset();
           if( inputMap->FindL( KType, param))
        	   {
        	   paramType.Copy(param.AsDes());
        	   inputMap->Remove( KType ); 
        	   }
           param.Reset();
           
           CMCSCallback* cb = CMCSCallback::NewL(aCallback, aInParamList, 
                   aCallback->GetTransactionID(), *iMCSService,CMCSCallback::EAddORChange );
           CleanupStack::PushL(cb);
           iMCSService->UpdateItemL(cb, paramType, itemId, parentId, beforeId, *inputMap);
           CleanupStack::Pop(cb);
           }
        else
        	{
        	User::Leave(KErrArgument);
        	}
        }
    else
        {             
       User::Leave(KErrArgument);
        }
    }
           
// ---------------------------------------------------------------------------
// Issues GetList request to MCSService
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::GetListL( const CLiwGenericParamList& aInParamList, 
		                      MLiwNotifyCallback* aCallback )
	{
	CheckGetListInputListL( aInParamList );
    CMCSCallback* cb = CMCSCallback::NewL(aCallback, aInParamList, 
    		aCallback->GetTransactionID(), *iMCSService,CMCSCallback::EGetList );
    CleanupStack::PushL(cb);
    iMCSService->GetListL( aInParamList, cb );
    CleanupStack::Pop(cb);
	}
// ---------------------------------------------------------------------------
// Check if inputlist for getlist is proper
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::CheckGetListInputListL( const CLiwGenericParamList&
			aInParamList )
	{
	TInt pos( 0 );
	const TLiwGenericParam* inParam = aInParamList.FindFirst( pos, KInData );
	if (inParam)
		{
		const CLiwMap* inputMap = inParam->Value().AsMap();
		if ( inputMap )
	        {
	        TLiwVariant param;
	        // Folder Id
	        if( !inputMap->FindL( KMenuAttrId8, param ) )
	                {
	            	User::Leave( KErrArgument );
	                }
            }
	    else
		   	{
        	User::Leave( KErrArgument );
		   	}
		}
	else
		{
    	User::Leave( KErrArgument );
		}
	}

// ---------------------------------------------------------------------------
// Issues Change Notification request to MCSService
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::RequestNotificationL( const CLiwGenericParamList& aInParamList, 
					                       			MLiwNotifyCallback* aCallback)
													
	{
	TInt pos = 0;
	TInt events = 0;
    TBuf8<KMenuMaxAttrNameLen> attrname;
    TInt paramFolderId = 0;
    TLiwVariant param;
	const TLiwGenericParam* inParam = aInParamList.FindFirst( pos, KInData );
	if (inParam)
	        {
	        const CLiwMap* inputMap = inParam->Value().AsMap();
	        if ( inputMap )
	            {
	            // Folder Id
	            attrname.Copy(KMenuAttrId());
	            if( inputMap->FindL( attrname, param))
	                {
	                paramFolderId = param.AsTInt32();
	                }
	            param.Reset();
	            if( inputMap->FindL( KAddRemove, param))
                   {
                   if (param.AsTBool())
                       {
                        events =  events  | RMenuNotifier::EItemsAddedRemoved;
                       }
                   }
                param.Reset();
                if( inputMap->FindL( KReorder, param))
                   {
                   if (param.AsTBool())
                      {
                       events =  events  | RMenuNotifier::EItemsReordered;
                      }
                   }
                param.Reset();
                if( inputMap->FindL( KAttributeChange, param))
                   {
                   if (param.AsTBool())
                     {
                      events =  events  | RMenuNotifier::EItemAttributeChanged;
                     }
                   }
                param.Reset();
	            }
	        }
	
	CMCSCallback* cb = CMCSCallback::NewL(aCallback, aInParamList, 
	                aCallback->GetTransactionID(), *iMCSService,  CMCSCallback::ERequestNotification );
	CleanupStack::PushL( cb );
		
	// Issue request
	if(events)
		{
		iMCSService->RegisterObserverL(paramFolderId, events, cb );
		}
	else
		{
        User::Leave(KErrArgument);
		}
	CleanupStack::Pop( cb );
	}

// ---------------------------------------------------------------------------
// Issues Delete an item  request to MCSService
// ---------------------------------------------------------------------------
//
void CMCSDSInterface::DeleteL( const CLiwGenericParamList& aInParamList, 
                              MLiwNotifyCallback* aCallback )
    {
    TInt pos = 0;    
    TBuf8<KMenuMaxAttrNameLen> attrname;
    TInt itemId = -1;
    TLiwVariant param;
    const TLiwGenericParam* inParam = aInParamList.FindFirst( pos, KInData );
    if (inParam)
            {
            const CLiwMap* inputMap = inParam->Value().AsMap();
            if ( inputMap )
                {
                // Item Id
                attrname.Copy(KMenuAttrId());
                if( inputMap->FindL( attrname, param))
                    {
                    itemId = param.AsTInt32();
                    }
                param.Reset();
                }
            }

    if (itemId == -1)
        {
        User::Leave(KErrArgument);
        }
    else
        {
        CMCSCallback* cb = CMCSCallback::NewL(aCallback, aInParamList, 
                aCallback->GetTransactionID(), *iMCSService,CMCSCallback::EDelete );
        CleanupStack::PushL(cb);
    
        iMCSService->DeleteL( cb, itemId );
        CleanupStack::Pop(cb);
        }
    }


// ---------------------------------------------------------------------------
// ErrCode Conversion
// ---------------------------------------------------------------------------
//
TInt32 CMCSDSInterface::ErrCodeConversion(TInt code)
	{
	TInt32 err;
	switch (code)
		{
		case KErrCancel:
						// Returning KErrNone incase of KErrCancel
		case KErrNone:
			err= SErrNone;
			break;

		case KErrNotFound:
			err= SErrNotFound;
			break;

		case KErrNoMemory:
			err = SErrNoMemory;
			break;

		case KErrInUse:
			err = SErrServiceInUse;
			break;

		case KErrNotSupported:
			err = SErrServiceNotSupported;
			break;

		case KErrBadName:
			err = SErrBadArgumentType;
			break;
						
		case KErrArgument: 
			err = SErrInvalidServiceArgument;
			break;
			
		case KErrAccessDenied: 
				err = SErrAccessDenied;
				break;
	
		default:
			err = SErrGeneralError;
			break;
		}
	
    return err;
	}

// End of file