sapi_landmarks/src/landmarkinterface.cpp
changeset 0 14df0fbfcc4e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sapi_landmarks/src/landmarkinterface.cpp	Mon Mar 30 12:51:10 2009 +0300
@@ -0,0 +1,2447 @@
+/*
+* Copyright (c) 2002 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:  CLandmarkInterface class implementation
+ *
+*/
+
+//INCLUDES
+#include <e32math.h>
+#include <liwcommon.h>
+#include <epos_cposlandmarkparser.h>
+#include <epos_cposlandmarkencoder.h>
+#include <epos_cposlandmarksearch.h>
+#include <epos_cposlmcompositecriteria.h>
+#include <epos_cposlmnearestcriteria.h>
+#include <epos_cposlmtextcriteria.h>
+#include <epos_cposlmareacriteria.h>
+#include <epos_cposlmcategorycriteria.h>
+#include <epos_cposlmcatnamecriteria.h>
+#include <epos_cposlmdatabasemanager.h>
+#include <epos_tposlmdatabasesettings.h>
+#include <utf.h>
+#include "landmarkliwparams.hrh"
+#include "landmarkinterface.h"
+#include "landmarkservice.h"
+#include "clandmarkfilter.h"
+#include "clandmarkiterable.h"
+#include "clandmarkcategoryiterable.h"
+#include "clandmarkdatabaseiterable.h"
+#include "clandmarkobserver.h"
+#include "clandmarkcallbackmap.h"
+#include "../../inc/serviceerrno.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CLandmarkInterface* CLandmarkInterface::NewL( )
+    {
+    CLandmarkInterface* self = new (ELeave) CLandmarkInterface();
+    CleanupStack::PushL (self );
+    self->ConstructL ( );
+    CleanupStack::Pop (self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::~CLandmarkInterface()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CLandmarkInterface::~CLandmarkInterface( )
+    {
+    delete iService;
+    delete iObserver;
+    delete iErrMsg;
+    delete iId;
+    iCallbackMap.ResetAndDestroy ( );
+    iCallbackMap.Close ( );
+    ReleaseLandmarkResources ( );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::CLandmarkInterface()
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CLandmarkInterface::CLandmarkInterface( )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkFilter::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::ConstructL( )
+    {
+    //instantiate the service class
+    iService = CLandmarkService::NewL ( );
+    //register observer for async requests
+    iObserver = CLandmarkObserver::NewL ( this );
+    iService->RegisterObserver (iObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::ExecuteCmdL( const TDesC8& aCmdName,
+//                           const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This function is called by the user to handle the service commands.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::ExecuteCmdL( const TDesC8& aCmdName,
+        const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint aCmdOptions,
+        MLiwNotifyCallback* aCallback )
+    {
+    if ( iErrMsg )
+        {
+        delete iErrMsg;
+        iErrMsg = NULL;
+        }
+    if( iId )
+    	{
+    	delete iId;
+    	iId = NULL;
+    	}
+    //check if any of the service API's leave
+    TRAPD(err,SwitchCmdL(aCmdName,aInParamList,aOutParamList,
+                    aCmdOptions,aCallback))
+    ;
+    TInt SapiErr = SErrNone;
+    if (err )
+        {
+        SapiErr = SapiError (err );
+        }
+
+    aOutParamList.AppendL (TLiwGenericParam (KErrorCode, TLiwVariant ((TInt32)SapiErr ) ) );
+    if ( iErrMsg )
+        {
+        aOutParamList.AppendL (TLiwGenericParam (KErrorMsg,
+                TLiwVariant (iErrMsg ) ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::SapiError( )
+// This function is called by the user to get mapped SAPI generic error code
+// from symbian error codes .
+// ---------------------------------------------------------------------------
+//
+TInt CLandmarkInterface::SapiError( TInt aSymbianErr )
+    {
+    TInt sapiErr(aSymbianErr);
+
+    switch ( sapiErr )
+        {
+        //case EPosLmInvalidArgument:
+        case KErrBadName:
+        case KErrArgument:
+            {
+            sapiErr = SErrBadArgumentType;
+            break;
+            }
+        case KErrNotSupported:
+            {
+            sapiErr = SErrServiceNotSupported;
+            break;
+            }
+        case KErrLocked:
+        case KErrInUse:
+            {
+            sapiErr = SErrServiceInUse;
+            break;
+            }
+        case KErrAccessDenied:
+            {
+            sapiErr = SErrAccessDenied;
+            break;
+            }
+        case KErrAlreadyExists:
+            {
+            sapiErr = SErrEntryExists;
+            break;
+            }
+        case KErrNotReady:
+            {
+            sapiErr = SErrServiceNotReady;
+            break;
+            }
+        case KErrNotFound:
+            {
+            sapiErr = SErrNotFound;
+            break;
+            }
+        case KErrPosLmUnknownFormat:
+            {
+            sapiErr = SErrUnknownFormat;
+            break;
+            }
+        case KErrPathNotFound:
+            {
+            sapiErr = SErrPathNotFound;
+            break;
+            }
+        case KErrGeneral:
+            {
+            sapiErr = SErrGeneralError;
+            break;
+            }
+        case SErrInvalidServiceArgument:
+            break;
+        case SErrMissingArgument:
+            break;
+        default:
+            sapiErr = SErrGeneralError;
+            break;
+        }
+    return sapiErr;
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::Close( )
+// This function is called by the user to close the interface.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::Close( )
+    {
+    delete this;
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::Callback( TInt32 aTransactionId )
+// This function returns the callback for the given transaction id and removes it from the list.
+// ---------------------------------------------------------------------------
+//
+MLiwNotifyCallback* CLandmarkInterface::Callback( TInt32 aTransactionId )
+    {
+    MLiwNotifyCallback* callback=  NULL;
+    TInt count = iCallbackMap.Count ( );
+    for (TInt i = 0; i < count; ++i )
+        {
+        if ( iCallbackMap[i]->Get (aTransactionId, callback ) )
+            {
+            delete(iCallbackMap[i]);
+            iCallbackMap.Remove (i );
+            break;
+            }
+        }
+    return callback;
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::SetActiveL( const CLiwGenericParamList& aInParamList )
+// This calls the appropriate service function for setting active database.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::SetActiveL( const CLiwGenericParamList& aInParamList )
+    {
+    TInt index = 0;
+    const TLiwGenericParam* database = aInParamList.FindFirst ( index, KDbUri );
+    if ( !database )
+        {
+        // If position based parsing is implemented then
+        // the name of parameter will be empty CHECK
+        index = 0;
+        database = aInParamList.FindFirst ( index, KNullDesC8 );
+        }
+    if ( database )
+        {
+        const TLiwVariant& variant = database->Value ( );
+        if ( variant.TypeId ( )== LIW::EVariantTypeDesC )
+            {
+            iService->SetActiveL ( variant.AsDes ( ) );
+            }
+        else
+            {
+            User::Leave (SErrBadArgumentType );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::SwitchCmdL( const TDesC8& aCmdName,
+//                           const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This function calls the appropriate functions based on the command id.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::SwitchCmdL( const TDesC8& aCmdName,
+        const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint aCmdOptions,
+        MLiwNotifyCallback* aCallback )
+    {
+    if ( ( (KLiwOptASyncronous & aCmdOptions) && !aCallback) ||( !(KLiwOptASyncronous & aCmdOptions) && aCallback) )
+        {
+        iErrMsg = KIncorrectAsyncReq().AllocL ( );
+        User::Leave (SErrInvalidServiceArgument );
+        }
+
+    if ( aCmdName == KCancel && (KLiwOptCancel & aCmdOptions) )
+        {
+        Cancel (aInParamList, aOutParamList, aCmdOptions, aCallback );
+        }
+    else
+        if ( aCmdName == KGetList )
+            {
+            GetListL (aInParamList, aOutParamList, aCmdOptions, aCallback );
+            }
+        else
+            //since no other APIs support async return error if callback is 
+            //provide
+            if ( aCallback )
+                {
+                iErrMsg = KAsyncNotSupported().AllocL ( );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+            else
+                if ( aCmdName == KAdd )
+                    {
+                    AddL (aInParamList, aOutParamList, aCmdOptions, aCallback );
+                    }
+                else
+                    if ( aCmdName == KRemove )
+                        {
+                        RemoveL (aInParamList, aOutParamList, aCmdOptions,
+                                aCallback );
+                        }
+                    else
+                        if ( aCmdName == KOrganise )
+                            {
+                            OrganiseL (aInParamList, aOutParamList,
+                                    aCmdOptions, aCallback );
+                            }
+                        else
+                            if ( aCmdName == KImport )
+                                {
+                                ImportL (aInParamList, aOutParamList,
+                                        aCmdOptions, aCallback );
+                                }
+                            else
+                                if ( aCmdName == KExport )
+                                    {
+                                    ExportL (aInParamList, aOutParamList,
+                                            aCmdOptions, aCallback );
+                                    }
+                                else
+                                    if ( aCmdName == KNew )
+                                        {
+                                        NewTemplateL (aInParamList,
+                                                aOutParamList, aCmdOptions,
+                                                aCallback );
+                                        }
+                                    else
+                                        {
+                                        // invalid command return error in outparam list
+                                        iErrMsg = KInvalidServiceCmd().AllocL ( );
+                                        User::Leave (SErrInvalidServiceArgument );
+                                        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::GetListL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This function calls the appropriate functions based on the content type.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::GetListL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint aCmdOptions,
+        MLiwNotifyCallback* aCallback )
+    {
+    //Input param List must have Type specified
+    if ( !aInParamList.Count() )
+        {
+        ErrorMessageL (KGetList, KContentType );
+        iErrMsg->Des().Append ( KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+    //position to start search in input params
+    TInt index = 0;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KGetList, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KGetList, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+
+    //Content type is Landmark.
+    if ( contentType == KLandmark )
+        {
+        GetLandmarksL (aInParamList, aOutParamList, aCmdOptions, aCallback );
+        }
+    //Content type is Category.
+    else
+        if ( contentType == KCategory )
+            {
+            GetCategoriesL (aInParamList, aOutParamList, aCmdOptions, aCallback );
+            }
+        //Content type is Database.
+        else
+            if ( contentType == KDatabase )
+                {
+                //Async not supported for databases
+                if( !aCallback )
+                	GetListDatabasesL (aInParamList, aOutParamList );
+              	else
+              		{
+              		iErrMsg = KAsyncNotSupported().AllocL ( );
+                	User::Leave (SErrInvalidServiceArgument );
+              		}
+                }
+            else
+                {
+                ErrorMessageL (KGetList, KContentType );
+                iErrMsg->Des().Append (KInvalid );
+                //leave since argument is improper
+                User::Leave (SErrInvalidServiceArgument );
+                }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::AddL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* /*aCallback*/ )
+// This function calls the appropriate functions based on the content type.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::AddL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have contentType and data specified
+    if ( aInParamList.Count ( )< EIndex2 )
+        {
+        ErrorMessageL (KAdd, KArgsMissing );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+
+    //position to start search in input params
+    TInt index = 0;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KAdd, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KAdd, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+
+    //Content type is Landmark
+    if ( contentType == KLandmark )
+        {
+        AddLandmarksL (aInParamList,aOutParamList );
+        }
+    //Content type is Category.
+    else
+        if ( contentType == KCategory )
+            {
+            AddCategoryL (aInParamList,aOutParamList );
+            }
+        else
+            {
+            ErrorMessageL (KAdd, KContentType );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+            }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::RemoveL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& /*aOutParamList*/,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* /*aCallback*/ )
+// This calls the appropriate service function based on the content type.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::RemoveL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have contentType and data specified
+    if ( aInParamList.Count ( )< EIndex2 )
+        {
+        ErrorMessageL (KAdd, KArgsMissing );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )== KNullDesC8 )
+        {
+        posBased = ETrue;
+        }
+    else
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KRemove, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KRemove, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+
+    TPtrC dbUri;
+    //Content type is Landmark.
+    if ( contentType == KLandmark )
+        {
+        index = 0;
+        if ( posBased )
+            {
+            param = &aInParamList[EIndex1];
+            }
+        else
+            {
+            param = aInParamList.FindFirst (index, KDataFields );
+            if ( !param )
+                {
+                ErrorMessageL (KRemove, KDataFields );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+        variant = param->Value ( );
+        ValidateParamL (KRemove, KDataFields, variant, LIW::EVariantTypeMap );
+        const CLiwMap* landmarkMap = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        ValidateParamL (KRemove, KId, landmarkMap,
+                LIW::EVariantTypeDesC, ETrue, variant );
+        TPtrC lmPtr(variant.AsDes ( ));
+        TLex lmparseString(lmPtr); //Get Id as string and convert to TUint32
+        TPosLmItemId lmid;
+        TInt parseErr = lmparseString.Val (lmid, EDecimal );
+        TBuf<KMaxIDStringLength> lmIdString(KNullDesC ( ));
+        if ( !parseErr )
+            {
+            lmIdString.Num (lmid );
+            }
+        if ( parseErr || lmIdString != lmPtr )
+            {
+            ErrorMessageL (KRemove, KId );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+
+        if (ValidateParamL (KRemove, KDbUri, landmarkMap,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            dbUri.Set (variant.AsDes ( ) );
+            }
+        iService->RemoveItemL (lmid, CLandmarkService::ELandmark, dbUri );
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    //Content type is Category.
+    else
+        if ( contentType == KCategory )
+            {
+            index = 0;
+            if ( posBased )
+                {
+                param = &aInParamList[EIndex1];
+                }
+            else
+                {
+                param = aInParamList.FindFirst (index, KDataFields );
+                if ( !param )
+                    {
+                    ErrorMessageL (KRemove, KDataFields );
+                    iErrMsg->Des().Append (KMissing );
+                    //leave since argument is improper
+                    User::Leave (SErrMissingArgument );
+                    }
+                }
+            variant = param->Value ( );
+            ValidateParamL (KRemove, KDataFields, variant, LIW::EVariantTypeMap );
+            const CLiwMap* categoryMap = variant.AsMap ( );
+            CleanupStack::PushL( 
+                    TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+            ValidateParamL (KRemove, KId, categoryMap,
+                    LIW::EVariantTypeDesC, ETrue, variant );
+            TPtrC catPtr(variant.AsDes ( ));
+            TLex catparseString(catPtr); //Get Id as string and convert to TUint32
+            TPosLmItemId catid;
+            TInt parseErr = catparseString.Val (catid, EDecimal );
+            TBuf<KMaxIDStringLength> catIdString(KNullDesC ( ));
+            if ( !parseErr )
+                {
+                catIdString.Num (catid );
+                }
+            if ( parseErr || catIdString != catPtr )
+                {
+                ErrorMessageL (KRemove, KId );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+
+            if (ValidateParamL (KRemove, KDbUri, categoryMap,
+                    LIW::EVariantTypeDesC, EFalse, variant ) )
+                {
+                dbUri.Set (variant.AsDes ( ) );
+                }
+            iService->RemoveItemL (catid, CLandmarkService::ECategory, dbUri );
+            CleanupStack::PopAndDestroy(&variant);
+            }
+        else
+            {
+            ErrorMessageL (KRemove, KContentType );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+            }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::ImportL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& /*aOutParamList*/,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* /*aCallback*/ )
+// This calls the appropriate service function for importing landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::ImportL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have contentType and importData specified
+    if ( aInParamList.Count ( )< EIndex2 )
+        {
+        ErrorMessageL (KAdd, KArgsMissing );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )== KNullDesC8 )
+        {
+        posBased = ETrue;
+        }
+    else
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KImport, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KImport, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+    //Content type is Landmark.
+    if ( contentType == KLandmark )
+        {
+        index = 0;
+        if ( posBased )
+            {
+            param = &aInParamList[EIndex1];
+            }
+        else
+            {
+            param = aInParamList.FindFirst (index, KDataFields );
+            if ( !param )
+                {
+                ErrorMessageL (KImport, KDataFields );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+        variant = param->Value ( );
+        ValidateParamL (KImport, KDataFields, variant, LIW::EVariantTypeMap );
+        const CLiwMap* importData = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        ValidateParamL (KImport, KMimeType, importData, LIW::EVariantTypeDesC,
+                ETrue, variant );
+		if( variant.AsDes() == KNullDesC )
+			{
+			ErrorMessageL (KImport, KMimeType );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+			}
+        //Construct the parser
+        HBufC8* mimeType8 = 
+            CnvUtfConverter::ConvertFromUnicodeToUtf8L ( variant.AsDes ( ) );
+        CleanupStack::PushL( mimeType8 );       
+        CPosLandmarkParser* parser = CPosLandmarkParser::NewL (*mimeType8 );
+        CleanupStack::PushL (parser );
+
+        ValidateParamL (KImport, KSourceFile, importData,
+                LIW::EVariantTypeDesC, ETrue, variant );
+		if( variant.AsDes() == KNullDesC )
+			{
+			ErrorMessageL (KImport, KSourceFile );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+			}
+        parser->SetInputFileL (variant.AsDes ( ) );
+        //check if complete file is ok
+        CPosLmOperation* op = parser->ParseContentL ( );
+        CleanupStack::PushL (op );
+        op->ExecuteL ( );
+        CleanupStack::PopAndDestroy (op );
+        //getdb
+        TPtrC dbUri;
+        if (ValidateParamL (KImport, KDbUri, importData, LIW::EVariantTypeDesC,
+                EFalse, variant ) )
+            {
+            dbUri.Set (variant.AsDes ( ) );
+            }
+        CPosLmItemIterator* iterator=  NULL;
+        //call the service function for import
+        iService->ImportL (iterator, *parser, dbUri );
+        CleanupStack::PopAndDestroy (parser );
+        CleanupStack::PopAndDestroy (mimeType8 );
+        CleanupStack::PushL(iterator);
+        // if dbURI is not specified retrieve default databse URI
+        if ( dbUri == KNullDesC )
+            {
+            iService->GetDefaultDbUriL (dbUri );
+            }
+        //instantiate CLandmarkIterable
+        CLiwIterable* iterable = CLandmarkIterable::NewL (iterator, dbUri );
+        CleanupStack::Pop(iterator);
+        CleanupClosePushL(*iterable);
+        aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+                TLiwVariant (iterable ) ) );
+        CleanupStack::PopAndDestroy(iterable);
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    else
+        {
+        ErrorMessageL (KImport, KContentType );
+        iErrMsg->Des().Append (KInvalid );
+        //leave since argument is improper
+        User::Leave (SErrInvalidServiceArgument );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::ExportL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& /*aOutParamList*/,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* /*aCallback*/ )
+// This calls the appropriate service function for exporting landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::ExportL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have contentType and exportData specified
+    if ( aInParamList.Count ( )< EIndex2 )
+        {
+        ErrorMessageL (KAdd, KArgsMissing );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )== KNullDesC8 )
+        {
+        posBased = ETrue;
+        }
+    else
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KExport, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KExport, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+    //Content type is Landmark.
+    if ( contentType == KLandmark )
+        {
+        index = 0;
+        if ( posBased )
+            {
+            param = &aInParamList[EIndex1];
+            }
+        else
+            {
+            param = aInParamList.FindFirst (index, KDataFields );
+            if ( !param )
+                {
+                ErrorMessageL (KExport, KDataFields );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+        variant = param->Value ( );
+        ValidateParamL (KExport, KDataFields, variant, LIW::EVariantTypeMap );
+        const CLiwMap* exportData = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        ValidateParamL (KExport, KDestinationFile, exportData,
+                LIW::EVariantTypeDesC, ETrue, variant );
+		if( variant.AsDes() == KNullDesC )
+			{
+			ErrorMessageL (KExport, KDestinationFile );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+			}
+        ValidateParamL (KExport, KMimeType, exportData, LIW::EVariantTypeDesC,
+                ETrue, variant );
+		if( variant.AsDes() == KNullDesC )
+			{
+			ErrorMessageL (KExport, KMimeType );
+            iErrMsg->Des().Append (KInvalid );
+            //leave since argument is improper
+            User::Leave (SErrInvalidServiceArgument );
+			}
+        //instantiate CPosLandmarkEncoder based on mime type.
+        HBufC8* mimeType8 = 
+            CnvUtfConverter::ConvertFromUnicodeToUtf8L ( variant.AsDes ( ) );
+        CleanupStack::PushL( mimeType8 );       
+        CPosLandmarkEncoder* encoder = CPosLandmarkEncoder::NewL ( *mimeType8 );
+        CleanupStack::PushL (encoder );
+        CBufBase* exportBuffer = encoder->SetUseOutputBufferL();
+        CleanupStack::PushL(exportBuffer);
+        ValidateParamL (KExport, KIdList, exportData,
+                LIW::EVariantTypeList, ETrue, variant );
+        const CLiwList* lmList = variant.AsList ( );
+        TInt lmcount = lmList->Count ( );
+        if ( !lmcount )
+            {
+            ErrorMessageL (KExport, KIdList );
+            iErrMsg->Des().Append (KEmpty );
+            //leave since argument is improper
+            User::Leave (KErrNotFound );
+            }
+        //array of landmark ids to be exported.
+        RArray<TPosLmItemId> landmarkIdArray;
+        CleanupClosePushL (landmarkIdArray );
+        for (TInt index = 0; index < lmcount; ++index )
+            {
+            if ( lmList->AtL (index, variant ) )
+                {
+                ValidateParamL (KExport, KId, variant,
+                        LIW::EVariantTypeDesC );
+                TPtrC lmPtr(variant.AsDes ( ));
+                TLex lmparseString(lmPtr); //Get Id as string and convert to TUint32
+                TPosLmItemId lmid;
+                TInt parseErr = lmparseString.Val (lmid, EDecimal );
+
+                TBuf<KMaxIDStringLength> lmIdString(KNullDesC ( ));
+                if ( !parseErr )
+                    {
+                    lmIdString.Num (lmid );
+                    }
+                if ( parseErr || lmIdString != lmPtr )
+                    {
+                    ErrorMessageL (KExport, KId );
+                    iErrMsg->Des().Append (KInvalid );
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+                landmarkIdArray.AppendL (lmid );
+                }
+            }
+        TPtrC dbUri;
+        if (ValidateParamL (KExport, KDbUri, exportData, LIW::EVariantTypeDesC,
+                EFalse, variant ) )
+            {
+            dbUri.Set (variant.AsDes ( ) );
+            }
+        iService->ExportL (*encoder, landmarkIdArray, dbUri );
+        ExecuteAndDeleteLD (encoder->FinalizeEncodingL ( ) );
+        //Write to file
+        ValidateParamL (KExport, KDestinationFile, exportData,
+                        LIW::EVariantTypeDesC, ETrue, variant );
+        RFs fs;
+        User::LeaveIfError(fs.Connect());
+        CleanupClosePushL(fs);
+        RFile file;
+        CleanupClosePushL(file);
+        User::LeaveIfError(file.Create(fs, variant.AsDes(), 
+                EFileShareExclusive | EFileStreamText | EFileWrite));
+        TInt size = exportBuffer->Size();
+        for( TInt i = 0; i < size; ++i )
+            {
+            file.Write(i,exportBuffer->Ptr(i));
+            }
+        CleanupStack::PopAndDestroy(&file);
+        CleanupStack::PopAndDestroy(&fs);
+        CleanupStack::PopAndDestroy (&landmarkIdArray );
+        CleanupStack::PopAndDestroy (exportBuffer);
+        CleanupStack::PopAndDestroy (encoder );
+        CleanupStack::PopAndDestroy (mimeType8 );
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    else
+        {
+        ErrorMessageL (KExport, KContentType );
+        iErrMsg->Des().Append (KInvalid );
+        //leave since argument is improper
+        User::Leave (SErrInvalidServiceArgument );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::OrganiseL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& /*aOutParamList*/,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* /*aCallback*/ )
+// This calls the appropriate service function for organising landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::OrganiseL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& /*aOutParamList*/, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have contentType, filter and operationType specified
+    if ( aInParamList.Count ( )< EIndex3 )
+        {
+        ErrorMessageL (KAdd, KOrganiseArgsMissing );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )== KNullDesC8 )
+        {
+        posBased = ETrue;
+        }
+    else
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KOrganise, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KOrganise, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+
+    //Content type is Landmark
+    if ( contentType == KLandmark )
+        {
+        index = 0;
+        if ( posBased )
+            {
+            param = &aInParamList[EIndex1];
+            }
+        else
+            {
+            param = aInParamList.FindFirst (index, KDataFields );
+            if ( !param )
+                {
+                ErrorMessageL (KOrganise, KDataFields );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+        variant = param->Value ( );
+        ValidateParamL (KOrganise, KDataFields, variant, LIW::EVariantTypeMap );
+        const CLiwMap* filter = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        ValidateParamL (KOrganise, KId, filter, LIW::EVariantTypeDesC,
+                ETrue, variant );
+        TPtrC catPtr(variant.AsDes ( ));
+        TLex catparseString(catPtr); //Get Id as string and convert to TUint32
+        TPosLmItemId catid;
+        TInt parseErr = catparseString.Val (catid, EDecimal );
+
+        TBuf<KMaxIDStringLength> catIdString(KNullDesC ( ));
+        if ( !parseErr )
+            {
+            catIdString.Num (catid );
+            }
+        if ( parseErr || catIdString != catPtr )
+            {
+            ErrorMessageL (KOrganise, KId );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        ValidateParamL (KOrganise, KIdList, filter,
+                LIW::EVariantTypeList, ETrue, variant );
+        const CLiwList* lmList = variant.AsList ( );
+        TInt count = lmList->Count ( );
+        if ( !count )
+            {
+            ErrorMessageL (KOrganise, KIdList );
+            iErrMsg->Des().Append (KEmpty );
+            //leave since argument is improper
+            User::Leave (KErrNotFound );
+            }
+        //array of landmark ids to be organised.
+        RArray<TPosLmItemId> landmarkIdArray;
+        CleanupClosePushL (landmarkIdArray );
+        for (TInt pos = 0; pos < count; ++pos )
+            {
+            if ( lmList->AtL (pos, variant ) )
+                {
+                ValidateParamL (KOrganise, KId, variant,
+                        LIW::EVariantTypeDesC );
+                TPtrC lmPtr(variant.AsDes ( ));
+                TLex lmparseString(lmPtr); //Get Id as string and convert to TUint32
+                TPosLmItemId lmid;
+                TInt parseErr = lmparseString.Val (lmid, EDecimal );
+
+                TBuf<KMaxIDStringLength> lmIdString(KNullDesC ( ));
+                if ( !parseErr )
+                    {
+                    lmIdString.Num (lmid );
+                    }
+                if ( parseErr || lmIdString != lmPtr )
+                    {
+                    ErrorMessageL (KOrganise, KId );
+                    iErrMsg->Des().Append (KInvalid );
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+                landmarkIdArray.AppendL (lmid );
+                }
+            }
+        TPtrC dbUri;
+        TLiwVariant variantDb;
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup , &variantDb ) );
+        if (ValidateParamL (KOrganise, KDbUri, filter, LIW::EVariantTypeDesC,
+                EFalse, variantDb ) )
+            {
+            variantDb.Get (dbUri );
+            }
+        index = 0;
+        if ( posBased )
+            {
+            //Position based parsing
+            param = &aInParamList[EIndex2];
+            }
+        else
+            {
+            param = aInParamList.FindFirst (index, KOperationType );
+            if ( !param )
+                {
+                ErrorMessageL (KOrganise, KOperationType );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+        variant = param->Value ( );
+        ValidateParamL (KOrganise, KOperationType, variant,
+                LIW::EVariantTypeDesC );
+        TPtrC operationType = variant.AsDes ( );
+        if ( operationType == KAssociate )
+            {
+            iService->LinkCategoryToLandmarksL (catid, landmarkIdArray, dbUri );
+            }
+        else
+            if ( operationType == KDisassociate )
+                {
+                iService->UnlinkCategoryToLandmarksL (catid, landmarkIdArray,
+                        dbUri );
+                }
+            else
+                {
+                ErrorMessageL (KOrganise, KOperationType );
+                iErrMsg->Des().Append (KInvalid );
+                //leave since argument is improper
+                User::Leave (SErrInvalidServiceArgument );
+                }
+        CleanupStack::PopAndDestroy(&variantDb);
+        CleanupStack::PopAndDestroy (&landmarkIdArray );        
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    else
+        {
+        ErrorMessageL (KOrganise, KContentType );
+        iErrMsg->Des().Append (KInvalid );
+        //leave since argument is improper
+        User::Leave (SErrInvalidServiceArgument );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::Cancel(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& /*aOutParamList*/,
+//                           TUint /*aCmdOptions*/,
+//                           MLiwNotifyCallback* aCallback )
+// This cancels the ongoing async call.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::Cancel( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* aCallback )
+    {
+    //Input param List must have transactionID specified
+    if ( aInParamList.Count ( ) )
+        {
+        //position to start search in input params
+        TInt index = 0;
+        //get content type
+        const TLiwGenericParam* param = &aInParamList[EIndex0];
+        //check whether pos based or value based
+        if ( param->Name ( )!= KNullDesC8 )
+            {
+            param = aInParamList.FindFirst (index, KTransactionId );
+            if ( !param )
+                {
+                ErrorMessageL (KCancel, KTransactionId );
+                iErrMsg->Des().Append (KMissing );
+                //leave since argument is improper
+                User::Leave (SErrMissingArgument );
+                }
+            }
+
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KCancel, KTransactionId, variant,
+                LIW::EVariantTypeTInt32 );
+        TInt32 transactionId = variant.AsTInt32 ( );
+        iService->Cancel (transactionId );
+        if (!aCallback )
+            {
+            //retrieve the stored callback if callback not explicitly passed
+            aCallback = Callback (transactionId );
+            }
+        else
+            {
+            // remove the stored callback since the async request has been cancelled
+            Callback (transactionId );
+            }
+        if ( aCallback )
+            {
+            TRAP_IGNORE(aCallback->HandleNotifyL(transactionId,KLiwEventCanceled,aOutParamList,aInParamList));
+            }
+        }
+    else
+        {
+        ErrorMessageL (KCancel, KTransactionId );
+        iErrMsg->Des().Append (KMissing );
+        User::Leave (SErrMissingArgument );
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::NewTemplateL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This function calls the appropriate functions based on the content type.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::NewTemplateL(const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* /*aCallback*/)
+    {
+    //Input param List must have Type specified
+    if ( !aInParamList.Count() )
+        {
+        ErrorMessageL (KNew, KContentType );
+        iErrMsg->Des().Append (KMissing );
+        //leave since argument is improper
+        User::Leave (SErrMissingArgument );
+        }
+    //position to start search in input params
+    TInt index = 0;
+    //get content type
+    const TLiwGenericParam* param = &aInParamList[EIndex0];
+    //check whether pos based or value based
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KContentType );
+        if ( !param )
+            {
+            ErrorMessageL (KNew, KContentType );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+
+    TLiwVariant variant(param->Value ( ));
+    ValidateParamL (KNew, KContentType, variant, LIW::EVariantTypeDesC );
+    TPtrC contentType(variant.AsDes ( ));
+
+    CLiwMap* contentMap = CLiwDefaultMap::NewL ( );
+    CleanupClosePushL ( *contentMap );
+    //Content type is Landmark.
+    if ( contentType == KLandmark )
+        {
+        contentMap->InsertL (KLandmarkName, TLiwVariant (KNullDesC ) );
+        contentMap->InsertL (KLandmarkDesc, TLiwVariant (KNullDesC ) );
+
+        CLiwMap* location = CLiwDefaultMap::NewL ( );
+        CleanupClosePushL(*location);
+        location->InsertL (KDbUri, TLiwVariant (KNullDesC ) );
+        location->InsertL (KLatitude, TLiwVariant (TReal64 (0.0 ) ) );
+        location->InsertL (KLongitude, TLiwVariant (TReal64 (0.0 ) ) );
+        location->InsertL (KAltitude, TLiwVariant (TReal32 (0.0 ) ) );
+        location->InsertL (KHAccuracy, TLiwVariant (TReal32 (0.0 ) ) );
+        location->InsertL (KVAccuracy, TLiwVariant (TReal32 (0.0 ) ) );
+        //location->InsertL (KTStamp, TLiwVariant (TInt32 (0 ) ) );
+        contentMap->InsertL (KLandmarkPosition, TLiwVariant (location ) );
+        CleanupStack::PopAndDestroy (location );
+
+        contentMap->InsertL (KCoverageRadius, TLiwVariant (TReal32 (0.0 ) ) );
+
+        CLiwList* categoryInfo = CLiwDefaultList::NewL ( );
+        CleanupClosePushL ( *categoryInfo );
+        contentMap->InsertL (KCategoryInfo, TLiwVariant (categoryInfo ) );
+        CleanupStack::PopAndDestroy (categoryInfo );;
+
+        contentMap->InsertL (KIconFile, TLiwVariant (KNullDesC ) );
+        contentMap->InsertL (KIconIndex, TLiwVariant (TInt32 (0 ) ) );
+        contentMap->InsertL (KIconMaskIndex,
+                TLiwVariant (KPosLmIconMaskNotUsed ) );
+
+        CLiwMap* landmarkFields = CLiwDefaultMap::NewL ( );
+        CleanupClosePushL ( *landmarkFields );
+        landmarkFields->InsertL (KLandmarkCountry, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkAreaCode, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkCity, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkDistrict, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkBuildingName, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkStreet, TLiwVariant (KNullDesC ) );
+        landmarkFields->InsertL (KLandmarkTelephone, TLiwVariant (KNullDesC ) );
+        contentMap->InsertL (KLandmarkFields, TLiwVariant (landmarkFields ) );
+        CleanupStack::PopAndDestroy (landmarkFields );
+        }
+    //Content type is Category.
+    else
+        if ( contentType == KCategory )
+            {
+            contentMap->InsertL (KCategoryName, TLiwVariant (KNullDesC ) );
+            contentMap->InsertL (KIconFile, TLiwVariant (KNullDesC ) );
+            contentMap->InsertL (KIconIndex, TLiwVariant (TInt32 (0 ) ) );
+            contentMap->InsertL (KIconMaskIndex,
+                    TLiwVariant (KPosLmIconMaskNotUsed ) );
+            }
+        //Content type is Database.
+        else
+            if ( contentType == KDatabase )
+                {
+                contentMap->InsertL (KDbUri, TLiwVariant (KNullDesC ) );
+                contentMap->InsertL (KDbName, TLiwVariant (KNullDesC ) );
+                }
+            else
+                {
+
+                //leave since argument is improper
+                ErrorMessageL (KNew, KContentType );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+
+    aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+            TLiwVariant (contentMap ) ) );
+	CleanupStack::PopAndDestroy (contentMap );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::GetLandmarksL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This calls the appropriate service function for retrieving landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::GetLandmarksL(
+        const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* aCallback )
+    {
+    CLandmarkFilter
+            * lmFilter = CLandmarkFilter::NewLC (CLandmarkFilter::ELandmark );
+    TLiwVariant variantDb;
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variantDb ) );
+    TPtrC dbUri;
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get filter if specified
+    const TLiwGenericParam* param=  NULL;
+    if ( aInParamList.Count ( )> EIndex1 )
+        {
+        param = &aInParamList[EIndex1];
+        //check whether pos based or value based
+        if ( param->Name ( )== KNullDesC8 )
+            {
+            posBased = ETrue;
+            }
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KFilter );
+        }
+
+    if ( param )
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KFilter, variant, LIW::EVariantTypeMap );
+        const CLiwMap* filter = variant.AsMap ( );
+        if ( filter->Count ( ) )
+            {
+            CPosLmCompositeCriteria* criteria = CPosLmCompositeCriteria::NewLC (CPosLmCompositeCriteria::ECompositionAND );
+            //for different criteria create and append to composite criteria class.
+            CleanupStack::PushL( 
+                    TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+            if ( ValidateParamL (KGetList, KLandmarkName, filter,
+                    LIW::EVariantTypeDesC, EFalse, variant ) )
+                {
+                TPtrC name( variant.AsDes ( ) );
+                if( name != KNullDesC )
+                	{
+                	CPosLmTextCriteria* crit = CPosLmTextCriteria::NewLC ( );
+                    crit->SetTextL(name);
+                    crit->SetAttributesToSearch (CPosLandmark::ELandmarkName );
+                    User::LeaveIfError (criteria->AddArgument (crit ) );
+                    CleanupStack::Pop (crit );
+                	}
+                else
+                	{
+                	//Do whatever is default
+                	}
+                }
+            if ( ValidateParamL (KGetList, KCategoryName, filter,
+                    LIW::EVariantTypeDesC, EFalse, variant ) )
+                {
+                TPtrC name( variant.AsDes( ) );
+                if( name != KNullDesC )
+                	{
+	                CPosLmCategoryCriteria* crit = CPosLmCategoryCriteria::NewLC ( );
+	                crit->SetCategoryNameL (name);
+	                User::LeaveIfError (criteria->AddArgument (crit ) );
+	                CleanupStack::Pop (crit );
+                	}
+                else
+                	{
+                	//Do whatever is default
+                	}
+                }
+            if ( ValidateParamL (KGetList, KLandmarkDesc, filter,
+                    LIW::EVariantTypeDesC, EFalse, variant ) )
+                {
+                TPtrC description( variant.AsDes( ) );
+                if( description != KNullDesC )
+                	{
+	                CPosLmTextCriteria* crit = CPosLmTextCriteria::NewLC ( );
+	                crit->SetTextL (variant.AsDes ( ) );
+	                crit->SetAttributesToSearch (CPosLandmark::EDescription );
+	                User::LeaveIfError (criteria->AddArgument (crit ) );
+	                CleanupStack::Pop (crit );
+                	}
+                else
+                	{
+                	//Do whatever is default
+                	}
+                }
+            if ( ValidateParamL (KGetList, KLandmarkPosition, filter,
+                    LIW::EVariantTypeMap, EFalse, variant ) )
+                {
+                const CLiwMap* position = variant.AsMap ( );
+                TReal64 latitude(0);
+                TReal64 longitude(0);
+                TBool coverageRadiusOption = EFalse;
+                ValidateParamL (KGetList, KLatitude, position,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                latitude = variant.AsTReal ( );
+                ValidateParamL (KGetList, KLongitude, position,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                longitude = variant.AsTReal ( );
+                if ( ValidateParamL (KGetList, KCoverageRadiusOption, filter,
+                        LIW::EVariantTypeTBool, EFalse, variant ) )
+                    {
+                    coverageRadiusOption = variant.AsTBool ( );
+                    }
+                CPosLmNearestCriteria* crit = CPosLmNearestCriteria::NewLC (
+                        TCoordinate (latitude, longitude ),
+                        coverageRadiusOption );
+                if ( ValidateParamL (KGetList, KMaximumDistance, filter,
+                        LIW::EVariantTypeTReal, EFalse, variant ) )
+                    {
+                    TReal maxDist = variant.AsTReal ( );
+                    if ( maxDist < 0 )
+                        {
+                        ErrorMessageL (KGetList, KMaximumDistance );
+                        iErrMsg->Des().Append (KInvalid );
+                        User::Leave (SErrInvalidServiceArgument );
+                        }
+                    crit->SetMaxDistance (maxDist );
+                    }
+                User::LeaveIfError (criteria->AddArgument (crit ) );
+                CleanupStack::Pop (crit );
+                }
+            if ( ValidateParamL (KGetList, KBoundedArea, filter,
+                    LIW::EVariantTypeMap, EFalse, variant ) )
+                {
+                const CLiwMap* boundedArea = variant.AsMap ( );
+                TReal northLatitude;
+                TReal southLatitude;
+                TReal eastLongitude;
+                TReal westLongitude;
+                ValidateParamL (KGetList, KNorthLatitude, boundedArea,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                northLatitude = variant.AsTReal ( );
+                ValidateParamL (KGetList, KSouthLatitude, boundedArea,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                southLatitude = variant.AsTReal ( );
+                ValidateParamL (KGetList, KEastLongitude, boundedArea,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                eastLongitude = variant.AsTReal ( );
+                ValidateParamL (KGetList, KWestLongitude, boundedArea,
+                        LIW::EVariantTypeTReal, ETrue, variant );
+                westLongitude = variant.AsTReal ( );
+                CPosLmAreaCriteria* crit = CPosLmAreaCriteria::NewLC (
+                        southLatitude,northLatitude,westLongitude, 
+						eastLongitude );
+                User::LeaveIfError (criteria->AddArgument (crit ) );
+                CleanupStack::Pop (crit );
+                }
+            if ( ValidateParamL (KGetList, KMaximumMatches, filter,
+                    LIW::EVariantTypeTInt32, EFalse, variant ) )
+                {
+                TInt32 count = variant.AsTInt32 ( );
+                if ( count > 0 )
+                    {
+                    lmFilter->SetMaximumMatches (count );
+                    }
+                else
+                    {
+                    ErrorMessageL (KGetList, KMaximumMatches );
+                    iErrMsg->Des().Append (KInvalid );
+                    //leave since argument is improper
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+                }
+            if ( ValidateParamL (KGetList, KPrevMatchesOnly, filter,
+                    LIW::EVariantTypeTBool, EFalse, variant ) )
+                {
+                lmFilter->SetPreviousMatches (variant.AsTBool ( ) );
+                }
+            
+            CleanupStack::PopAndDestroy(&variant);
+            //Set criteria only if it contains one or more criterion
+            if ( criteria->NumOfArguments ( ) )
+                {
+                lmFilter->SetCriteria (criteria );
+                CleanupStack::Pop (criteria );
+                }
+            else
+	            {
+	            CleanupStack::PopAndDestroy( criteria );
+	            }
+            
+            
+            if ( ValidateParamL (KGetList, KDbUri, filter,
+                    LIW::EVariantTypeDesC, EFalse, variantDb ) )
+                {
+                variantDb.Get (dbUri );
+                }
+            
+            }
+        }
+    param = NULL;
+    index = 0;
+    if ( posBased && aInParamList.Count ( )> EIndex2 )
+        {
+        param = &aInParamList[EIndex2];
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KSort );
+        }
+    if ( param )
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KSort, variant, LIW::EVariantTypeMap );
+        const CLiwMap* sort = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        if ( ValidateParamL (KGetList, KSortOrder, sort, LIW::EVariantTypeDesC,
+                ETrue, variant ) )
+            {
+            //by default sort is ascending
+            if ( variant.AsDes() == KDescending )
+                {
+                lmFilter->SetLmSortPref (TPosLmSortPref (
+                        CPosLandmark::ELandmarkName,
+                        TPosLmSortPref::EDescending ) );
+                }
+            else
+                if ( variant.AsDes() != KAscending  && variant.AsDes() != KNullDesC )
+                    {
+                    ErrorMessageL (KGetList, KSortOrder );
+                    iErrMsg->Des().Append (KInvalid );
+                    //leave since argument is improper
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+            }
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    //Async Call
+    if ( aCallback )
+        {
+        //Get the transaction ID
+        TInt32 transactionId(aCallback->GetTransactionID ( ));
+        CLandmarkCallbackMap* map = new (ELeave) CLandmarkCallbackMap(transactionId,aCallback);
+        CleanupStack::PushL (map );
+        iCallbackMap.AppendL (map );
+        CleanupStack::Pop (map );
+        iService->GetListL (transactionId, *lmFilter, dbUri );
+        aOutParamList.AppendL (TLiwGenericParam (KTransactionId,
+                TLiwVariant (TInt32 (transactionId ) ) ) );
+        }
+    else //sync call
+        {
+        CPosLmItemIterator* iterator = NULL;
+        iService->GetListL (iterator, *lmFilter, dbUri );
+        CleanupStack::PushL (iterator );
+        // if dbURI is not specified retrieve default databse URI
+        if ( dbUri == KNullDesC )
+            {
+            iService->GetDefaultDbUriL (dbUri );
+            }
+        
+        //instantiate CLandmarkIterable
+        CLiwIterable* iterable = CLandmarkIterable::NewL (iterator, dbUri );
+        CleanupStack::Pop (iterator );
+        CleanupClosePushL(*iterable);
+        //pack to aOutParamList
+        aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+                TLiwVariant (iterable ) ) );
+        CleanupStack::PopAndDestroy(iterable);
+        }
+    CleanupStack::PopAndDestroy(&variantDb);
+    CleanupStack::PopAndDestroy (lmFilter );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::GetCategoriesL(const CLiwGenericParamList& aInParamList,
+//                           CLiwGenericParamList& aOutParamList,
+//                           TUint aCmdOptions,
+//                           MLiwNotifyCallback* aCallback )
+// This calls the appropriate service function for retrieving landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::GetCategoriesL(
+        const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList, TUint /*aCmdOptions*/,
+        MLiwNotifyCallback* aCallback )
+    {
+    CLandmarkFilter
+            * lmFilter = CLandmarkFilter::NewLC (CLandmarkFilter::ECategory );
+    TLiwVariant variantDb;
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variantDb ) );
+    TPtrC dbUri;
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get filter if specified
+    const TLiwGenericParam* param=  NULL;
+    if ( aInParamList.Count ( )> EIndex1 )
+        {
+        param = &aInParamList[EIndex1];
+        //check whether pos based or value based
+        if ( param->Name ( )== KNullDesC8 )
+            {
+            posBased = ETrue;
+            }
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KFilter );
+        }
+
+    if ( param )
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KFilter, variant, LIW::EVariantTypeMap );
+        const CLiwMap* filter = variant.AsMap ( );
+
+        if ( filter->Count ( ) )
+            {
+            CleanupStack::PushL( 
+                    TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+            if ( ValidateParamL (KGetList, KCategoryName, filter,
+                    LIW::EVariantTypeDesC, EFalse, variant ) )
+                {
+                TPtrC name( variant.AsDes ( ) );
+                if( name != KNullDesC )
+                	{
+	                CPosLmCatNameCriteria* criteria = CPosLmCatNameCriteria::NewLC ( );
+	                criteria->SetSearchPatternL (variant.AsDes ( ) );
+	                lmFilter->SetCriteria (criteria );
+	                CleanupStack::Pop (criteria );
+                	}
+                }
+            if ( ValidateParamL (KGetList, KMaximumMatches, filter,
+                    LIW::EVariantTypeTInt32, EFalse, variant ) )
+                {
+                TInt32 count = variant.AsTInt32 ( );
+                if ( count > 0 )
+                    {
+                    lmFilter->SetMaximumMatches (count );
+                    }
+                else
+                    {
+                    ErrorMessageL (KGetList, KMaximumMatches );
+                    iErrMsg->Des().Append (KInvalid );
+                    //leave since argument is improper
+                    User::Leave ( SErrInvalidServiceArgument );
+                    }
+                }
+            if ( ValidateParamL (KGetList, KPrevMatchesOnly, filter,
+                    LIW::EVariantTypeTBool, EFalse, variant ) )
+                {
+                lmFilter->SetPreviousMatches (variant.AsTBool ( ) );
+                }
+            if ( ValidateParamL (KGetList, KDbUri, filter,
+                    LIW::EVariantTypeDesC, EFalse, variantDb ) )
+                {
+                variantDb.Get (dbUri );
+                }
+            CleanupStack::PopAndDestroy(&variant);
+            }
+        }
+
+    param = NULL;
+    index = 0;
+    if ( posBased && aInParamList.Count ( )> EIndex2 )
+        {
+        param = &aInParamList[EIndex2];
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KSort );
+        }
+
+    if ( param )
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KSort, variant, LIW::EVariantTypeMap );
+        const CLiwMap* sort = param->Value().AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        if ( ValidateParamL (KGetList, KSortOrder, sort, LIW::EVariantTypeDesC,
+                ETrue, variant ) )
+            {
+            TPtrC sortOrder = variant.AsDes ( );
+            if ( sortOrder == KDescending )
+                {
+                lmFilter->SetCatSortPref (CPosLmCategoryManager::ECategorySortOrderNameDescending );
+                }
+            else
+                if ( sortOrder == KAscending )
+                    {
+                    lmFilter->SetCatSortPref (CPosLmCategoryManager::ECategorySortOrderNameAscending );
+                    }
+                else
+                    {
+                    ErrorMessageL (KGetList, KSortOrder );
+                    iErrMsg->Des().Append (KInvalid );
+                    //leave since argument is improper
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+            }
+        CleanupStack::PopAndDestroy(&variant);
+        }
+
+    //Async Call
+    if ( aCallback )
+        {
+        //Get the transaction ID
+        TInt32 transactionId(aCallback->GetTransactionID ( ));
+        CLandmarkCallbackMap* map = new (ELeave) CLandmarkCallbackMap(transactionId,aCallback);
+        CleanupStack::PushL (map );
+        iCallbackMap.AppendL (map );
+        CleanupStack::Pop (map );
+        iService->GetListL (transactionId, *lmFilter, dbUri );
+
+        aOutParamList.AppendL (TLiwGenericParam (KTransactionId,
+                TLiwVariant (TInt32 (transactionId ) ) ) );
+        }
+    else //sync call
+        {
+        CPosLmItemIterator* iterator = NULL;
+        iService->GetListL (iterator, *lmFilter, dbUri );
+        CleanupStack::PushL (iterator );
+        // if dbURI is not specified retrieve default databse URI
+        if ( dbUri == KNullDesC )
+            {
+            iService->GetDefaultDbUriL (dbUri );
+            }
+        
+        //instantiate CLandmarkIterable
+        CLiwIterable* iterable = CLandmarkCategoryIterable::NewL (iterator,
+                dbUri );
+        CleanupStack::Pop (iterator );
+        CleanupClosePushL (*iterable );
+        //pack to aOutParamList
+        aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+                TLiwVariant (iterable ) ) );
+        CleanupStack::PopAndDestroy(iterable);
+        }
+    CleanupStack::PopAndDestroy(&variantDb);
+    CleanupStack::PopAndDestroy (lmFilter );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::GetListDatabasesL(const CLiwGenericParamList& aInParamList
+//                CLiwGenericParamList& aOutParamList)
+// This calls the appropriate service function for Getting List of
+// available Databases.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::GetListDatabasesL(
+        const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList )
+    {
+    CDesCArray* DbList=  NULL;
+    //position to start search in input params
+    TInt index = 0;
+    //Flag for pos based
+    TBool posBased = EFalse;
+    //get filter if specified
+    const TLiwGenericParam* param=  NULL;
+    if ( aInParamList.Count ( )> EIndex1 )
+        {
+        param = &aInParamList[EIndex1];
+        //check whether pos based or value based
+        if ( param->Name ( )== KNullDesC8 )
+            {
+            posBased = ETrue;
+            }
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KFilter );
+        }
+    if ( !param )
+        {
+        iService->GetListL (DbList );
+        }
+    else
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KFilter, variant, LIW::EVariantTypeMap );
+        const CLiwMap* CriteriaMap = variant.AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        if ( ValidateParamL (KGetList, KDbProtocol, CriteriaMap,
+                LIW::EVariantTypeDesC, ETrue, variant ) )
+            {
+            iService->GetListL (DbList, variant.AsDes ( ) );
+            }
+        else
+            {
+            iService->GetListL (DbList );
+            }
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    CleanupStack::PushL (DbList );
+ 	param = NULL;
+    index = 0;
+    if ( posBased && aInParamList.Count ( )> EIndex2 )
+        {
+        param = &aInParamList[EIndex2];
+        }
+    if ( !posBased )
+        {
+        param = aInParamList.FindFirst (index, KSort );
+        }
+
+    if ( param )
+        {
+        TLiwVariant variant(param->Value ( ));
+        ValidateParamL (KGetList, KSort, variant, LIW::EVariantTypeMap );
+        const CLiwMap* sort = param->Value().AsMap ( );
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+        if ( ValidateParamL (KGetList, KSortOrder, sort, LIW::EVariantTypeDesC,
+                ETrue, variant ) )
+            {
+            TPtrC sortOrder = variant.AsDes ( );
+            TBool compare = EFalse;
+            if ( sortOrder == KDescending )
+                {
+                index = DbList->Count();
+                for(TInt i = 0 ; i<index ; i++)
+	                {
+	                compare = EFalse;
+                	for(TInt j = 0; j<(index-1); j++ )
+	                	{
+	                	TPtrC temp1(DbList->MdcaPoint(j));
+	                	TPtrC temp2(DbList->MdcaPoint(j+1));
+                		if(temp1.Compare(temp2) < 1 )
+	                		{
+                			DbList->InsertL(j,temp2);
+                			DbList->InsertL(j+1,temp1);
+                			DbList->Delete(j+2,2);
+                			DbList->Compress();
+                			compare = ETrue;
+	                		}
+	                	}
+	                if( !compare )
+		                {
+		                break;	
+		                }
+	                }
+                }
+            else
+                if ( sortOrder != KAscending )
+                    {
+                    ErrorMessageL (KGetList, KSortOrder );
+                    iErrMsg->Des().Append (KInvalid );
+                    //leave since argument is improper
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+                    else
+	                    {
+	                    index = DbList->Count();
+                		for(TInt i = 0 ; i<index ; i++)
+			                {
+			                compare = EFalse;
+		                	for(TInt j = 0; j<(index-1); j++ )
+			                	{
+		                		TPtrC temp1(DbList->MdcaPoint(j));
+			                	TPtrC temp2(DbList->MdcaPoint(j+1));
+		                		if(temp1.Compare(temp2) > 1 )
+			                		{
+		                			DbList->InsertL(j,temp2);
+                					DbList->InsertL(j+1,temp1);
+                					DbList->Delete(j+2,2);
+                					DbList->Compress();
+                					compare = ETrue;
+			                		}
+			                	}
+			                if( !compare )
+				                {
+				                break;	
+				                }	
+			                }
+	                	}
+            }	
+        CleanupStack::PopAndDestroy(&variant);
+        }
+    
+    CLiwIterable* iterable = CDatabaseIterable::NewL (DbList );
+    CleanupStack::Pop (DbList );
+    CleanupClosePushL(*iterable);
+    aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+            TLiwVariant (iterable ) ) );
+    CleanupStack::PopAndDestroy(iterable);
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::AddLandmarksL(const CLiwGenericParamList& aInParamList )
+// This calls the appropriate service function for adding landmarks.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::AddLandmarksL( const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList )
+    {
+    //position to start search in input params
+    TInt index = 0;
+    //find if filter is specified
+    const TLiwGenericParam* param = &aInParamList[EIndex1];
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KDataFields );
+        if ( !param )
+            {
+            ErrorMessageL (KAdd, KDataFields );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+    TLiwVariant variant = param->Value ( );
+    ValidateParamL (KAdd, KDataFields, variant, LIW::EVariantTypeMap );
+    const CLiwMap* dataFields = variant.AsMap ( );
+    CPosLandmark* landmark =  NULL;
+    TBool update = EFalse;
+    TPtrC dbUri;
+    TLiwVariant variantDb;
+    TPosLmItemId lmid;
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variantDb ) );
+    if ( ValidateParamL (KAdd, KDbUri, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variantDb ) )
+        {
+        variantDb.Get (dbUri );
+        }
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+    if ( ValidateParamL (KAdd, KId, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variant ) )
+        {
+        update = ETrue;
+        TPtrC lmPtr(variant.AsDes ( ));
+        TLex lmparseString(lmPtr); //Get Id as string and convert to TUint32
+        TInt parseErr = lmparseString.Val (lmid, EDecimal );
+        TBuf<KMaxIDStringLength> lmIdString(KNullDesC ( ));
+        if ( !parseErr )
+            {
+            lmIdString.Num (lmid );
+            }
+        if ( parseErr || lmIdString != lmPtr )
+            {
+            ErrorMessageL (KAdd, KId );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        landmark = iService->LandmarkLC (lmid, dbUri );
+        if ( !landmark )
+            {
+            //leave since landmark not found
+            User::Leave (KErrNotFound );
+            }
+        }
+    else
+        {
+        landmark = CPosLandmark::NewLC ( );
+        }
+    if ( ValidateParamL (KAdd, KLandmarkName, dataFields,
+            LIW::EVariantTypeDesC, EFalse, variant ) )
+        {
+        landmark->SetLandmarkNameL (variant.AsDes ( ) );
+        }
+    if ( ValidateParamL (KAdd, KLandmarkPosition, dataFields,
+            LIW::EVariantTypeMap, EFalse, variant ) )
+        {
+        const CLiwMap* location = variant.AsMap ( );
+        TLocality locale;
+        TReal latitude(0);
+        TReal longitude(0);
+        ValidateParamL (KAdd, KLatitude, location, LIW::EVariantTypeTReal,
+                ETrue, variant );
+        latitude = variant.AsTReal ( );
+        ValidateParamL (KAdd, KLongitude, location,
+                LIW::EVariantTypeTReal, ETrue, variant );
+        longitude = variant.AsTReal ( );
+        
+        if ( ValidateParamL (KAdd, KAltitude, location, LIW::EVariantTypeTReal,
+                EFalse, variant ) )
+            {
+            locale.SetCoordinate (latitude, longitude, variant.AsTReal ( ) );
+            }
+        else
+            {
+            locale.SetCoordinate (latitude, longitude );
+            }
+        if ( ValidateParamL (KAdd, KHAccuracy, location,
+                LIW::EVariantTypeTReal, EFalse, variant ) )
+            {
+            TReal hacc(variant.AsTReal ( ));
+            if ( hacc < 0 )
+                {
+                ErrorMessageL (KAdd, KHAccuracy );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+            locale.SetHorizontalAccuracy (hacc );
+            }
+        if ( ValidateParamL (KAdd, KVAccuracy, location,
+                LIW::EVariantTypeTReal, EFalse, variant ) )
+            {
+            TReal vacc(variant.AsTReal ( ));
+            if ( vacc < 0 )
+                {
+                ErrorMessageL (KAdd, KVAccuracy );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+            locale.SetVerticalAccuracy (vacc );
+            }
+        landmark->SetPositionL (locale );
+        }
+    if ( ValidateParamL (KAdd, KCoverageRadius, dataFields,
+            LIW::EVariantTypeTReal, EFalse, variant ) )
+        {
+        TReal covRad = variant.AsTReal ( );
+        if ( covRad < 0 )
+            {
+            ErrorMessageL (KAdd, KCoverageRadius );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        landmark->SetCoverageRadius (covRad );
+        }
+    if ( ValidateParamL (KAdd, KCategoryInfo, dataFields,
+            LIW::EVariantTypeList, EFalse, variant ) )
+        {
+        const CLiwList* category = variant.AsList ( );
+        TInt count = category->Count ( );
+        for (TInt index = 0; index < count; ++index )
+            {
+            if ( category->AtL (index, variant ) )
+                {
+                ValidateParamL (KAdd, KId, variant,
+                        LIW::EVariantTypeDesC );
+                TPtrC catPtr(variant.AsDes ( ));
+                TLex catparseString(catPtr); //Get Id as string and convert to TUint32
+                TPosLmItemId catid;
+                TInt parseErr = catparseString.Val (catid, EDecimal );
+                TBuf<KMaxIDStringLength> catIdString(KNullDesC ( ));
+                if ( !parseErr )
+                    {
+                    catIdString.Num (catid );
+                    }
+                if ( parseErr || catIdString != catPtr )
+                    {
+                    ErrorMessageL (KAdd, KId );
+                    iErrMsg->Des().Append (KInvalid );
+                    User::Leave (SErrInvalidServiceArgument );
+                    }
+                landmark->AddCategoryL (catid );
+                }
+            }
+        }
+    if ( ValidateParamL (KAdd, KIconFile, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variant ) )
+        {
+        TPtrC iconFile = variant.AsDes ( );
+        if ( iconFile == KNullDesC )
+            {
+            ErrorMessageL (KAdd, KIconFile );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        TLiwVariant iconVariant;
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &iconVariant ) );
+        ValidateParamL (KAdd, KIconIndex, dataFields, LIW::EVariantTypeTInt32,
+                ETrue, iconVariant );
+        TInt32 iconIndex = iconVariant.AsTInt32 ( );
+        if ( iconIndex < 0 )
+            {
+            ErrorMessageL (KAdd, KIconIndex );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        TInt32 iconMaskIndex = KPosLmIconMaskNotUsed;
+        if ( ValidateParamL (KAdd, KIconMaskIndex, dataFields,
+                LIW::EVariantTypeTInt32, ETrue, iconVariant ) )
+            {
+            iconMaskIndex = iconVariant.AsTInt32 ( );
+            if ( iconMaskIndex < KPosLmIconMaskNotUsed )
+                {
+                ErrorMessageL (KAdd, KIconMaskIndex );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+            }
+        landmark->SetIconL (iconFile, iconIndex, iconMaskIndex );
+        CleanupStack::PopAndDestroy(&iconVariant);
+        }
+    if ( ValidateParamL (KAdd, KLandmarkDesc, dataFields,
+            LIW::EVariantTypeDesC, EFalse, variant ) )
+        {
+        landmark->SetLandmarkDescriptionL (variant.AsDes ( ) );
+        }
+    if ( ValidateParamL (KAdd, KLandmarkFields, dataFields,
+            LIW::EVariantTypeMap, EFalse, variant ) )
+        {
+        const CLiwMap* lmFields = variant.AsMap ( );
+        if ( ValidateParamL (KAdd, KLandmarkCountry, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldCountry,
+                    variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkAreaCode, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldPostalCode,
+                    variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkCity, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldCity, variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkDistrict, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldDistrict,
+                    variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkBuildingName, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldBuildingName,
+                    variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkStreet, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldStreet, variant.AsDes ( ) );
+            }
+        if ( ValidateParamL (KAdd, KLandmarkTelephone, lmFields,
+                LIW::EVariantTypeDesC, EFalse, variant ) )
+            {
+            landmark->SetPositionFieldL (EPositionFieldBuildingTelephone,
+                    variant.AsDes ( ) );
+            }
+        }
+    //checks if the landmark passed is to update an existing lanmark or add a
+    //new landmark.
+    if ( update )
+        {
+        iService->UpdateItemL (*landmark, dbUri );
+        }
+    else
+        {
+        lmid = iService->AddItemL (*landmark, dbUri );
+        }
+    CleanupStack::PopAndDestroy (landmark );
+    CleanupStack::PopAndDestroy(&variant);
+    CleanupStack::PopAndDestroy(&variantDb);
+    
+    iId = HBufC::NewL(KMaxIDStringLength);
+    iId->Des().Num(lmid,EDecimal);
+    aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+            TLiwVariant (iId ) ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::AddCategoryL(const CLiwGenericParamList& aInParamList)
+// This calls the appropriate service function for adding a category.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::AddCategoryL(const CLiwGenericParamList& aInParamList,
+        CLiwGenericParamList& aOutParamList )
+    {
+    //position to start search in input params
+    TInt index = 0;
+    //find if filter is specified
+    const TLiwGenericParam* param = &aInParamList[EIndex1];
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KDataFields );
+        if ( !param )
+            {
+            ErrorMessageL (KAdd, KDataFields );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+    TLiwVariant variant = param->Value ( );
+    ValidateParamL (KAdd, KDataFields, variant, LIW::EVariantTypeMap );
+    const CLiwMap* dataFields = variant.AsMap ( );
+    CPosLandmarkCategory* category=  NULL;
+    TBool update = EFalse;
+    TPtrC dbUri;
+    TLiwVariant variantDb;
+    TPosLmItemId catid;
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variantDb ) );
+    if ( ValidateParamL (KAdd, KDbUri, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variantDb ) )
+        {
+        variantDb.Get (dbUri );
+        }
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &variant ) );
+    /*if ( ValidateParamL (KAdd, KGlobalCategory, dataFields,
+            LIW::EVariantTypeDesC, EFalse, variant ) )
+        {
+        ErrorMessageL (KAdd, KGlobalCategory );
+        iErrMsg->Des().Append (KInvalid );
+        //leave since argument is improper
+        User::Leave (SErrInvalidServiceArgument );
+        }*/
+    if ( ValidateParamL (KAdd, KId, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variant ) )
+        {
+        update = ETrue;
+        TPtrC catPtr(variant.AsDes ( ));
+        TLex catparseString(catPtr); //Get Id as string and convert to TUint32
+        TInt parseErr = catparseString.Val (catid, EDecimal );
+
+        TBuf<KMaxIDStringLength> catIdString(KNullDesC ( ));
+        if ( !parseErr )
+            {
+            catIdString.Num (catid );
+            }
+        if ( parseErr || catIdString != catPtr )
+            {
+            ErrorMessageL (KAdd, KId );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        category = iService->CategoryLC (catid, dbUri );
+        if ( !category )
+            {
+            //leave since landmark not found
+            User::Leave (KErrNotFound );
+            }
+        }
+    else
+        {
+        category = CPosLandmarkCategory::NewLC ( );
+        }
+    ValidateParamL (KAdd, KCategoryName, dataFields, LIW::EVariantTypeDesC,
+            ETrue, variant );
+    category->SetCategoryNameL (variant.AsDes ( ) );
+    if ( ValidateParamL (KAdd, KIconFile, dataFields, LIW::EVariantTypeDesC,
+            EFalse, variant ) )
+        {
+        TPtrC iconFile = variant.AsDes ( );
+        if ( iconFile == KNullDesC )
+            {
+            ErrorMessageL (KAdd, KIconFile );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        TLiwVariant iconVariant;
+        CleanupStack::PushL( 
+                TCleanupItem( TLiwVariant::VariantCleanup, &iconVariant ) );
+        ValidateParamL (KAdd, KIconIndex, dataFields, LIW::EVariantTypeTInt32,
+                ETrue, iconVariant );
+        TInt32 iconIndex = iconVariant.AsTInt32 ( );
+        if ( iconIndex < 0 )
+            {
+            ErrorMessageL (KAdd, KIconIndex );
+            iErrMsg->Des().Append (KInvalid );
+            User::Leave (SErrInvalidServiceArgument );
+            }
+        TInt32 iconMaskIndex = KPosLmIconMaskNotUsed;
+        if ( ValidateParamL (KAdd, KIconMaskIndex, dataFields,
+                LIW::EVariantTypeTInt32, ETrue, iconVariant ) )
+            {
+            iconMaskIndex = iconVariant.AsTInt32 ( );
+            if ( iconMaskIndex < KPosLmIconMaskNotUsed )
+                {
+                ErrorMessageL (KAdd, KIconMaskIndex );
+                iErrMsg->Des().Append (KInvalid );
+                User::Leave (SErrInvalidServiceArgument );
+                }
+            }
+        category->SetIconL (iconFile, iconIndex, iconMaskIndex );
+        CleanupStack::PopAndDestroy(&iconVariant);
+        }
+
+    if ( update )
+        {
+        iService->UpdateItemL (*category, dbUri );
+        }
+    else
+        {
+        catid = iService->AddItemL (*category, dbUri );
+        }
+
+    CleanupStack::PopAndDestroy (category );
+    CleanupStack::PopAndDestroy(&variant);
+    CleanupStack::PopAndDestroy(&variantDb);
+    
+    iId = HBufC::NewL(KMaxIDStringLength);
+    iId->Des().Num(catid,EDecimal);
+    aOutParamList.AppendL (TLiwGenericParam (KReturnValue,
+            TLiwVariant (iId ) ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CLandmarkInterface::AddDatabaseL(const CLiwGenericParamList& aInParamList)
+// This calls the appropriate service function for adding a database.
+// ---------------------------------------------------------------------------
+//
+void CLandmarkInterface::AddDatabaseL(const CLiwGenericParamList& aInParamList )
+    {
+    //position to start search in input params
+    TInt index = 0;
+    //find if filter is specified
+    const TLiwGenericParam* param = &aInParamList[EIndex1];
+    if ( param->Name ( )!= KNullDesC8 )
+        {
+        param = aInParamList.FindFirst (index, KDataFields );
+        if ( !param )
+            {
+            ErrorMessageL (KAdd, KDataFields );
+            iErrMsg->Des().Append (KMissing );
+            //leave since argument is improper
+            User::Leave (SErrMissingArgument );
+            }
+        }
+    TLiwVariant variant = param->Value ( );
+    ValidateParamL (KAdd, KDataFields, variant, LIW::EVariantTypeMap );
+    const CLiwMap* dataFields = variant.AsMap ( );
+    TLiwVariant dbname;
+    TLiwVariant dburi;
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &dburi ) );
+    ValidateParamL (KAdd, KDbUri, dataFields, LIW::EVariantTypeDesC, ETrue,
+            dburi );
+    TRAPD(err,iService->AddItemL (dburi.AsDes()));
+    if ( err && (err != KErrAlreadyExists) )
+        {
+        User::Leave (err );
+        }
+    //existing database will be updated.
+    CleanupStack::PushL( 
+            TCleanupItem( TLiwVariant::VariantCleanup, &dbname ) );
+    if ( ValidateParamL (KAdd, KDbName, dataFields, LIW::EVariantTypeDesC,
+            EFalse, dbname ) )
+        {
+        TPosLmDatabaseSettings settings;
+        TPosLmDatabaseName name(dbname.AsDes ( ));
+        settings.SetDatabaseName (name );
+        iService->UpdateItemL (settings, dburi.AsDes ( ) );
+        }
+    CleanupStack::PopAndDestroy(&dbname);
+    CleanupStack::PopAndDestroy(&dburi);
+    }
+
+void CLandmarkInterface::ErrorMessageL( const TDesC8& aServiceCmd,
+        const TDesC8& aKey )
+    {
+    iErrMsg = HBufC::NewL (KMaxMsgSize );
+    *iErrMsg = KModule ( );
+    TPtr ptr(iErrMsg->Des ( ));
+    TBuf<KMaxKeySize> buf;
+    buf.Copy (aServiceCmd );
+    ptr.Append (buf );
+    ptr.Append (KColon ( ) );
+    buf.Copy (aKey );
+    ptr.Append (buf );
+    }
+
+void CLandmarkInterface::ValidateParamL( const TDesC8& aServiceCmd,
+        const TDesC8& aKey, const TLiwVariant& aVariant,
+        LIW::TVariantTypeId aType )
+    {
+    if ( aVariant.TypeId ( )!= aType )
+        {
+        //Number handling relaxation 
+        if( !(LIW::EVariantTypeTReal == aType && LIW::EVariantTypeTInt32 == aVariant.TypeId ()) )
+		    {
+	        ErrorMessageL ( aServiceCmd, aKey );
+	        TPtr ptr(iErrMsg->Des ( ));
+	        ptr.Append (KInvalid ( ) );
+	        User::Leave (KErrArgument );
+		    }
+        }
+    }
+
+TBool CLandmarkInterface::ValidateParamL( const TDesC8& aServiceCmd,
+        const TDesC8& aKey, const CLiwMap* aMap, LIW::TVariantTypeId aType,
+        TBool isMandatory, TLiwVariant& aOutVariant )
+    {
+    TBool status = ETrue;
+    TBool present = aMap->FindL (aKey, aOutVariant );
+    if ( !present && isMandatory )
+        {
+        ErrorMessageL ( aServiceCmd, aKey );
+        TPtr ptr(iErrMsg->Des ( ));
+        ptr.Append (KMissing ( ) );
+        User::Leave (SErrMissingArgument );
+        }
+    else
+        if ( !present && !isMandatory )
+            {
+            status = EFalse;
+            }
+    if ( status )
+        {
+        ValidateParamL (aServiceCmd, aKey, aOutVariant, aType );
+        }
+    return status;
+    }
+
+//end of file