/*
* Copyright (c) 2006-2007 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:  Header file for location SAPI core implementation.
*
*/

#ifndef C_LOGINTERFACE_H
#define C_LOGINTERFACE_H

#include <LiwCommon.h>
#include "serviceerrno.h"

/**
* Forward Declarations
*/
class CLoggingService ;

/**
* error message
*/

const TInt KMaxMsgSize = 256;
const TInt KMaxKeySize = 128;                                                                                                                                                                                                                                                                                     
_LIT( KInvalid, "Invalid" );
_LIT( KMissing, " Missing" );
_LIT( KMsgErr, "Logging:");
_LIT( KColon, ":");
_LIT8( KErrorMessage, "ErrorMessage");
_LIT( KErrLogCmdName, "Invalid commandName" );	
_LIT( KErrMissingCallback, "Missing Callback" );	
_LIT(KInterfaceMissing,"Logging: Interface name missing");


/**
* Content Type
*/
_LIT(KContentType , "Log") ;

/**
* ContentType Key
*/
_LIT8(KContentTypeKey , "Type") ;
/**
* Error Indntifier in Output parameter list
*/
_LIT8(KErrorCode , "ErrorCode") ; 


/**
* Operations on the IDatasource(Logging) interface
*/
_LIT8(KCmdAdd , "Add") ;
_LIT8(KCmdDelete , "Delete") ; 
_LIT8(KCmdGetList ,"GetList") ;
_LIT8(KCmdRequestNotification ,"RequestNotification") ;
_LIT8(KCmdCancel ,"Cancel") ;


/**
* Transaction id, which will be part of outparamlist for asynchronous request
*/
_LIT8(KTransactionId, "TransactionID"); 

/**
* Event map that contains the details of the event to be logged 
*/
_LIT8(KEventDetails , "Item") ;

/**
* Filter for getlist operation
*/
_LIT8(KFilter , "Filter") ; 

/**
* DelayInterval
*/
_LIT8(KDelayTime , "DelayTime") ;

/**
* Key for identifying the type of the event in event map
*/
_LIT8(KEventTypeKey , "EventType") ;

/**
* Key for identifying the remote party in event map
*/
_LIT8(KRemotePartyKey , "RemoteParty") ;

/**
* Key for identifying the direction in event map
*/
_LIT8(KDirectionKey , "Direction") ;

/**
* Key for identifying the time in event map
*/
_LIT8(KEventTimeKey , "EventTime") ;

/**
* Key for identifying the duration in event map
*/
_LIT8(KEventDurationKey , "EventDuration") ;

/**
* Key for identifying the deliverystatus in event map
*/
_LIT8(KDeliveryStatusKey , "DeliveryStatus") ;

/**
* Key for identifying the subject in event map
*/
_LIT8(KSubjectKey , "Subject") ;

/**
* Key for identifying the phonenumber in event map
*/
_LIT8(KPhoneNumberKey , "PhoneNumber") ;

/**
* Key for identifying the description in event map
*/
_LIT8(KDescriptionKey , "Description") ;

/**
* Key for identifying the eventdata in event map
*/
_LIT8(KEventDataKey , "EventData") ;

/**
* Key for identifying the link in event map
*/
_LIT8(KLinkKey , "Link") ;

/**
* Key for the flags fields
*/
_LIT8(KFlagsKey , "LogFlags") ;

/**
* EndTime Key, for getlist filter
*/
_LIT8(KEndTimeKey , "EndTime") ;

/**
* Error Code
*/
_LIT8(KErrCode , "ErrorCode") ;

/**
* Key for RecentList for Filter 
*/
_LIT8(KRecentListKey , "RecentList") ; 

/**
* Key for id
*/
_LIT8(KLogId , "id") ;

/**
* Key for Data Map
*/
_LIT8(KData , "Data") ;

/**
* output returnvalue key
*/
_LIT8(KResponse,"ReturnValue");


/**
* Forward declarations
*/
class MLiwInterface ;
class CLogIter ;

/**
* This class provides the Calendar SAPI interface to LIW Framework 
*/
class CLoggingInterface : public CBase, public MLiwInterface
    {
    public :

        /**
        *Enums for position pased parsing
        */
        enum 
        {
        EIndex0 = 0 ,
        EIndex1 ,
        EIndex2 ,
        EIndex3 ,

        /**
        * Event Types
        */
        EKLogCallEventType  = 0,
        EKLogDataEventType , 
        EKLogFaxEventType ,
        EKLogShortMessageEventType ,
        EKLogPacketDataEventType ,
        EKEventTypeNotPresent =-1,
        /**
        * RecentList types 
        */
        EKLogNullRecentList = -1 ,
        EKLogRecentIncomingCalls = 1,
        EKLogRecentOutgoingCalls , 
        EKLogRecentMissedCalls ,
        

        /**
        * Event Status 
        */

        EStatusPending    = 0 ,                     
        EStatusSent,                    
        EStatusFalied,                  
        EStatusNone ,                  
        EStatusDone ,                  
        EStatusNotSent,                  
        EStatusScheduled,                 
        EStatusNotPresent =-1,
        /**
        * Event Flags
        */
        EKLogEventContactSearched  = 0 ,
        EKLogEventRead ,
        EFlagNotPresent =-1,

        /**
        * Direction flags
        */
        EIncomingEvent  = 0,
        EOutgoingEvent ,
        EIncomingEventAlternateline,                       
        EOutgoingEventAlternateline,                       
        EFetchedEvent ,                         
        EMissedEvent ,                         
        EMissedEventAlternateline,                     
        EDirectionNotPresent = -1,
        };

    public:
    
        /**
        * NewL: Two phased construction
        */
        static CLoggingInterface* NewL();

        /**
        * NewLC: Creates an instance of CLoggingServiceClass
        * Two Phased constructor
        * returns newly allocated object.
        */
        static CLoggingInterface* NewLC() ;

        /**
        * Destructor.
        */
        virtual ~CLoggingInterface(); 

        /**
        * ExecuteCmdL parses the input parameters and then calls an appropriate method on iLoggingServic
        *
        * @param aCmdName the name of the service command which the consumer wants to invoke
        * @param aInParamList the input parameter list, can be empty list
        * @param [in,out] aOutParamList the output parameter list, can be empty lis. The
        * service provider can use the output parameter list to fill in necessary return values
        * @param aCmdOptions Options for the command, see TLiwServiceCmdOptions in LiwCommon.hrh.
        * @param aCallback callback to be registered by consumer application
        *               
        * @see TLiwServiceCmdOptions
        * @see CLiwGenericParamList
        * @see MLiwNotifyCallback
        */

        virtual void ExecuteCmdL( const TDesC8& aCmdName,
                                  const CLiwGenericParamList& aInParamList,
                                  CLiwGenericParamList& aOutParamList,
                                  TUint aCmdOptions = 0,
                                  MLiwNotifyCallback* aCallback = 0 );
                                  
                                  
        /**
        * ConvertToSapiError function
        */                          
        static TInt ConvertToSapiError( TInt aSymbianErrorCode );
                
        /**
        * Closes the interface 
        */
        virtual void Close();
        
    protected:

        /**
        * ConstructL(): Internal method to construct members
        */
        void ConstructL() ;

        /**
        * Default constructor
        */
        CLoggingInterface() ;

        /**
        * Internal CmdExecute function which parses  the input parameters
        * this function is called by ExecuteCmdL() function 
        *
        * @param aCmdName the name of the service command which the consumer wants to invoke
        * @param aInParamList the input parameter list, can be empty list
        * @param [in,out] aOutParamList the output parameter list, can be empty lis. The
        * service provider can use the output parameter list to fill in necessary return values
        * @param aCmdOptions Options for the command, see TLiwServiceCmdOptions in LiwCommon.hrh.
        * @param aCallback callback to be registered by consumer application
        * @see TLiwServiceCmdOptions
        * @see CLiwGenericParamList
        * @see MLiwNotifyCallback
        *
        */

        void CmdExecuteL( const TDesC8& aCmdName,
                          const CLiwGenericParamList& aInParamList ,
                          CLiwGenericParamList& aOutParamList,
                          TUint aCmdOptions,
                          MLiwNotifyCallback* aCallback );

        /**
        * Internal utility method, used for Add from the core class
        *
        * @param aParam, input paramater containg the eventdetails. 
        * @param aCallback, callback address for notification requests.
        * @param aTransId, transaction id.
        */

        TInt32 AddEventL( const TLiwGenericParam *eventdetails ,
                          TUint& aTansId ,
                          TUint aCmdOptions, 
                          MLiwNotifyCallback *aCallBack = NULL ) ; 
                    
        /**
        * Internal utility method, used to getlist from the core class
        *
        * @param aFilter, filter for getlist on core class
        * @param aIter, Valure result argument(TransactionId for async calls) 
        * @param aCallback, callback method for async events
        */

        CLogIter*  GetListL( const TLiwGenericParam  *aFilter  , 
                             TUint& aTransId,
                             TUint aCmdOptions,
                             MLiwNotifyCallback  *aCallBack = NULL) ; 
                      
        /**
        * Internal utility method, used for notification registration
        *
        * @param aParam, input paramater containg the delay details/
        * @param aCallback, callback address for notification requests.
        * @param aTransId, transaction id.
        */
        TInt RequestNotificationsL( const TLiwGenericParam *aParam ,
                                    MLiwNotifyCallback *aCallback ,
        		                    TUint& aTransId,
        		                    TUint aCmdOptions ) ;

        /**
        * Internal utility method, used for Delete from the core class
        *
        * @param aParam, input paramater containg the logid 
        * @param aCallback, callback address for notification requests.
        * @param aTransId, transaction id.
        */
        	
        TInt DeleteEventL( const TLiwGenericParam *aParam,
                           TUint& aTansId,
                           TUint aCmdOptions,
                           MLiwNotifyCallback *aCallBack = NULL );
         
        /**
        * IncorrectValueL function
        */
        void IncorrectValueL( const TDesC8* aErrorArgument );

        /**
        * MissingValueL function
        */ 
        void MissingValueL( const TDesC8* aErrorArgument );   
                
        /**
        * CheckInputTypeL function
        */ 
        void CheckInputTypeL( const TLiwVariant* aSource,
                              LIW::TVariantTypeId aExpectedtype,
                              const TDesC8* aErrorArgument );  
 							
    private:

        /**
        * Handle to core location class for performing location operations
        */

        CLoggingService *iLogService ;
        
        /**
        * ErrorString
        */

        HBufC16* iErrorString;

    };


#endif //C_LOGINTERFACE_H