/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#ifndef __TESTHOSTLET_H__
#define __TESTHOSTLET_H__

//  EXTERNAL INCLUDES
#include <SenHostletConnectionBCTest.h>

#include <MSenProperties.h>

//  INTERNAL INCLUDES

//  FORWARD DECLARATIONS
class CHostletConnectionBCTest;

class CTestHostlet : public CBase, public MSenHostlet, public MSenHostletRequest
    {
    public:

        /**
         * Two phase construction
         */
        static CTestHostlet* NewL(CSenHostletConnectionBCTest* aTestSuite,
                                  TInt (*ap2ServiceL) (CSenHostletConnectionBCTest*, MSenHostletRequest&, MSenHostletResponse&) = NULL,
                                  TInt (*ap2OnServiceCompleteL) (CSenHostletConnectionBCTest*, const TInt, TInt, const TDesC8&) = NULL,
                                  void (*ap2DescribeServiceL) (CSenXmlServiceDescription&) = NULL);

        static CTestHostlet* NewLC(CSenHostletConnectionBCTest* aTestSuite,
                                   TInt (*ap2ServiceL) (CSenHostletConnectionBCTest*, MSenHostletRequest&, MSenHostletResponse&) = NULL,
                                   TInt (*ap2OnServiceCompleteL) (CSenHostletConnectionBCTest*, const TInt, TInt, const TDesC8&) = NULL,
                                   void (*ap2DescribeServiceL) (CSenXmlServiceDescription&) = NULL);

        /**
         * Destructor
         */
        ~CTestHostlet();
        virtual void DescribeServiceL(CSenXmlServiceDescription& aSD);

        virtual TPtrC8 Contract() const;

        virtual TPtrC8 Endpoint() const;

        virtual TInt ServiceL(MSenHostletRequest& aRequest, MSenHostletResponse& aResponse);
        virtual void OnServiceCompleteL(const TInt aTxnId, TInt aCompletionCode, const TDesC8& aDesc);

    public: // Public data => OK in testers, no benefit gained from getters => in real apps, these should be private:
        CSenXmlServiceDescription*  ipHostletDescription;
        RPointerArray<HBufC8>		iRequests;
        RPointerArray<HBufC8>		iResponses;
        RPointerArray<HBufC8>       iRequestProps;
        RArray<MSenProperties::TSenPropertiesClassType> iRequestPropTypes;
        RPointerArray<CSenTransportProperties> iResponseProps;
        RArray<TInt>				iResponseCodes;
        TInt                        iRespondRetCode; // direct retCode from RespondL (async)
        RArray<TInt>                iCompletionCodes; // from OnServiceCompleteL => indicates how Respond operation was delivered
        RArray<TInt>				iTxnIds;
    
    		inline virtual TPtrC8 FrameworkId() const 
    		{ 
    			return KDefaultRestServicesFrameworkID(); 
    		}
    //MSenHostletRequest
            inline virtual TPtrC8 RequestUtf8() const 
            {
            	return _L8("");
            }
            inline virtual TPtrC ThreadId() const 
            {
            	return _L("");
            }
            inline virtual TPtrC8 ConsumerId() const 
            {
            	return _L8("");
            }
			inline virtual TInt RequestId() const 
			{
				return KErrNone;
			}
			inline virtual TPtrC8 Properties(MSenProperties::TSenPropertiesClassType& aType) const 
			{
				return _L8("");
			}
    private:    // Constructor
        CTestHostlet(CSenHostletConnectionBCTest* aTestSuite,
                     TInt (*ap2ServiceL) (CSenHostletConnectionBCTest*, MSenHostletRequest&, MSenHostletResponse&),
                     TInt (*ap2OnServiceCompleteL) (CSenHostletConnectionBCTest*, const TInt, TInt, const TDesC8&),
                     void (*ap2DescribeServiceL) (CSenXmlServiceDescription&));
        void ConstructL();

    private:    // Data
        CSenHostletConnectionBCTest*       ipTestSuite;
        
    private:    // Function pointers
        TInt (*ip2ServiceL) (CSenHostletConnectionBCTest*, MSenHostletRequest&, MSenHostletResponse&);
        TInt (*ip2OnServiceCompleteL) (CSenHostletConnectionBCTest*, const TInt, TInt, const TDesC8&);
        void (*ip2DescribeServiceL)(CSenXmlServiceDescription&);
    };

#endif      //  __TESTHOSTLET_H__

// End of file
