ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/inc/cbtsoapcodec.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:38 +0100
branchRCL_3
changeset 28 d59c248c9d36
parent 0 d11fb78c4374
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* Copyright (c) 2004-2007 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:  Defines the CBtSoapCodec class to create and read SOAP-encoded messages.
*
*/


#ifndef CBTSOAPCODEC_H
#define CBTSOAPCODEC_H

#include <e32base.h>
#include <f32file.h>
#include <e32math.h>

#include "cxmlhandler.h"
#include "tprintcapability.h"
#include "btprotocolconsts.h"

/** @name Constants */
/** Template file to use to create the XML soap-encoded messages  */
	_LIT( KBtXmlTemplate, "z:\\resource\\imageprintdata\\protocols\\btxmltemplate.txt" );	


/** general tags */
_LIT8(KBtEnvelopeStartTag, "<s:Envelope");
_LIT8(KBtEnvelopeEndTag, 	"</s:Envelope>");
_LIT8(KBtBodyStartTag, 	"<s:Body>");
_LIT8(KBtBodyEndTag, 		"</s:Body>");

_LIT8(KBtAction,			"[Action]");
_LIT8(KBtActionData,		"[ActionData]");
_LIT8(KBtBytesInBody,		"[BytesInBody]");

/** Create job tags */
_LIT8(KBtCreateJobStart,			"[CreateJobStart]");
_LIT8(KBtCreateJobEnd,				"[CreateJobEnd]");

/** Get printer attributes tags */
_LIT8(KBtGetPrinterAttributesAllStart,	"[GetPrinterAttributesAllStart]");
_LIT8(KBtGetPrinterAttributesAllEnd,	"[GetPrinterAttributesAllEnd]");
_LIT8(KBtGetPrinterAttributesStart,		"[GetPrinterAttributesStart]");
_LIT8(KBtGetPrinterAttributesEnd,		"[GetPrinterAttributesEnd]");
_LIT8(KBtGetPrinterCapabilitiesStart,	"[GetPrinterCapabilitiesStart]");
_LIT8(KBtGetPrinterCapabilitiesEnd,		"[GetPrinterCapabilitiesEnd]");
_LIT8(KBtGetPrinterStateStart,			"[GetPrinterStateStart]");
_LIT8(KBtGetPrinterStateEnd,			"[GetPrinterStateEnd]");


/** Get printer attributes tags */
_LIT8(KBtGetJobAttributesStart,		"[GetJobAttributesStart]");
_LIT8(KBtGetJobAttributesEnd,		"[GetJobAttributesEnd]");

/** Get margins tags */
_LIT8(KBtGetMarginsStart,	"[GetMarginsStart]");
_LIT8(KBtGetMarginsEnd,		"[GetMarginsEnd]");
_LIT8(KBtMediaSizeData,		"[MediaSizeData]");
_LIT8(KBtMediaTypeData,		"[MediaTypeData]");

/** Job related */
_LIT8(KBtJobIdStart,	"[JobIdStart]");
_LIT8(KBtJobIdEnd,		"[JobIdEnd]");

/** Actions */
enum TBtSoapActions
{
	EBtUnknownAction = -1,
	EBtCreateJob,
	EBtCreateJobResponse,
	EBtGetPrinterAttributes,
	EBtGetPrinterAttributesResponse,
	EBtGetJobAttributes,
	EBtGetJobAttributesResponse,
	EBtCancelJob,
	EBtCancelJobResponse,
	EBtGetEvent,
	EBtGetEventResponse,
	EBtGetMargins,
	EBtGetMarginsResponse,
	// Not actual actions but identifiers as sub for EBtGetPrinterAttributes
	EBtGetPrinterCapabilities,
	EBtGetPrinterState
};

_LIT8(KBtCreateJob,						"CreateJob");
_LIT8(KBtCreateJobResponse,				"CreateJobResponse");
_LIT8(KBtGetPrinterAttributes,			"GetPrinterAttributes");
_LIT8(KBtGetPrinterAttributesResponse,	"GetPrinterAttributesResponse");
_LIT8(KBtGetJobAttributes,				"GetJobAttributes");
_LIT8(KBtGetJobAttributesResponse,		"GetJobAttributesResponse");
_LIT8(KBtCancelJob,						"CancelJob");
_LIT8(KBtCancelJobResponse,				"CancelJobResponse");
_LIT8(KBtGetEvent,						"GetEvent");
_LIT8(KBtGetEventResponse,				"GetEventResponse");
_LIT8(KBtGetMargins,					"GetMargins");
_LIT8(KBtGetMarginsResponse,			"GetMarginsResponse");

_LIT8(KBtNumberUpSupported,			"NumberUpSupported");
_LIT8(KBtMediaTypesSupported,		"MediaTypesSupported");
_LIT8(KBtMediaSizesSupported,		"MediaSizesSupported");
_LIT8(KBtPrintQualitySupported,		"PrintQualitySupported");
_LIT8(KBtMediaLoaded,				"MediaLoaded");
_LIT8(KBtLoadedMediumDetails,		"LoadedMediumDetails");

/** Attributes */
_LIT8(KBtOperationStatus,			"OperationStatus");
_LIT8(KBtJobId,						"JobId");
_LIT8(KBtJobName,					"JobName");
_LIT8(KBtJobState,					"JobState");
_LIT8(KBtJobOriginatingUserName,	"JobOriginatingUserName");
_LIT8(KBtJobMediaSheetsCompleted,	"JobMediaSheetsCompleted");
_LIT8(KBtJobPending,				"NumberOfInterveningJobs");

_LIT8(KBtPrinterName,				"PrinterName");
_LIT8(KBtPrinterState,				"PrinterState");
_LIT8(KBtPrinterStateReasons,		"PrinterStateReasons");

_LIT8(KBtDocumentFormat,			"DocumentFormat");
_LIT8(KBtCopies,					"Copies");
_LIT8(KBtSides,						"Sides");
_LIT8(KBtNumberUp,					"NumberUp");
_LIT8(KBtOrientationRequest,		"OrientationRequest");
_LIT8(KBtMediaSize,					"MediaSize");
_LIT8(KBtMediaType,					"MediaType");
_LIT8(KBtPrintQuality,				"PrintQuality");
_LIT8(KBtLoadedMediumSize,			"LoadedMediumSize");
_LIT8(KBtLoadedMediumType,			"LoadedMediumType");

_LIT8(KBtStartTag, 			"<%S>");
_LIT8(KBtEndTag, 			"</%S>");
_LIT8(KBtValueTemplate, 	"[%S]");

static const TInt KAttrStrLen = 0x100;
typedef TBuf8<KAttrStrLen> TBtAttrString8;
typedef TBuf8<KDefaultRealWidth> TBtIntString8;

/**
* @class 	CBtSoapCodec
* @brief	Class to create and read SOAP-encoded messages.
*
* Class defines methods to encode and decode BPP actions to SOAP-encoded messages.
* @n
* @b Usage:
* @n
* @b Creating a message:
* <OL>
* 1. Create an instance of the class
* 2. Create an encoded message by CreateSoapL
* </OL>
* @n
* After a message is created, it must be added in OBEX message body.
* @n
* @b Reading a message:
* After a OBEX message is received, a body from it can be given to
* CBtSoapCodec to decode the SOAP-encoded message.
* <OL>
* 1. Decode and the message by ReadSoapL
* 2. Get the attributes(s) of the message by GetAttributeL
* </OL>
*
*/
NONSHARABLE_CLASS( CBtSoapCodec ) : public CBase
	{
		public:

			/**  		NewL
			* @brief	Creates a new instance of SOAP codec class.
			* @return	Pointer to the instance.
			*/
			static CBtSoapCodec* NewL();

			/**  		NewLC
			* @brief	Creates a new instance of SOAP codec class and leaves it in the cleanup stack.
			* @return	Pointer to the instance.
			*/
			static CBtSoapCodec* NewLC();

			/**  		~CBtSoapCodec
			* @brief	Destructor.
			*/
			~CBtSoapCodec();


			/**  		Reset
			* @brief	Resets the member variables.
			*/
			void Reset();

			/**  		CreateSoapL
			* @brief	Creates the SOAP-encoded message.
			*			According to the action parameter given, the method reads
			*			the xml template for a named action from file @ref KBtXmlTemplate
			*			and decodes it with the data concerning.
			* @param	aAction Name of the action for the message to create.
			* @param	aJobId Jod identifier for the actions required.
			*			NOTE: for CreateJob operation the job id is the cumulative number
			*			of the created jobs during the session.
			* @return	Pointer to the SOAP-encoded message for the action
			*/
			TPtrC8 CreateSoapL(const TInt aAction, const TInt aJobId = KErrNotFound);

			/**   		SoapAction
			* @brief	Returns for the action of the SOAP-encoded message
			* @return	TBtSoapActions type action identifier
			*/
			TInt SoapAction();

			/**   		ReadSoapL
			* @brief	Reads the SOAP-encoded message.
			*			The message is read and the class is initialized with the data of the message.
			* @param	aAction	Returns the name of the action of the SOAP-encoded data
			* @param	aSoapBuffer	The buffer to read
			*/
			void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer);

			/** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
			void ReadSoapL(TInt& aAction, const CBufBase& aSoapBuffer);

			/** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
			void ReadSoapL(const TDesC8& aSoapBuffer);

			/** @overload void ReadSoapL(TInt& aAction, const TDesC8& aSoapBuffer) */
			void ReadSoapL(const CBufBase& aSoapBuffer);

		public:	
			void CreateJobResponseL(TInt& aJobId, TInt& aErrorCode);
			
			void GetPrinterAttributesResponseL(TInt& aState, TInt& aStateReasons,
								 			   RArray<TPrintCapability>& aCapabilities,
								 			   TInt& aOperationStatus);
											 			   
			void GetPrinterStateResponseL(TInt& aState, TInt& aStateReasons, TInt& aOperationStatus);

			void GetPrinterCapabilitiesResponseL(RArray<TPrintCapability>& aCapabilities,
								 			   TInt& aOperationStatus);

			void GetJobAttributesResponseL(const TInt  aJobId,
										   TInt& aJobState, 
										   TBtAttrString8& aJobName,
										   TBtAttrString8& aOriginator,
										   TInt& aSheetsCompleted, 
										   TInt& aPendingJobs,
										   TInt& aOperationStatus );
											   			
			void CancelJobResponseL(const TInt aJobId, TInt& aOperationStatus);
			
			void GetEventResponseL(const TInt aJobId,
								  TInt& aJobState,
								  TInt& aPrinterState,
								  TInt& aStateReasons,
								  TInt& aOperationStatus);
			TInt OperationStatusL();
		
		public:
			/**   		GetAttributeL
			* @brief	Reads the requested attributes's value.
			* @param	aName 	Name of the attribute
			* @param	aValue 	Returns the value of the attribute
			* @param	aError 	Returns the code for the occurred error or KErrNone
			*/
			void GetAttributeL(const TDesC8& aName, TDes8& aValue, TInt& aError);
			
			void GetAttributeListL(const TDesC8& aName, CDesC8ArrayFlat& aList, TInt& aError);

		public:
			/** TestMeL - Static test method
			* @brief Static method to test this class' public interface.
			*/
			static void TestMeL();
			static TPtrC8 CreateJobResponseTestSoap();
			static TPtrC8 CancelJobResponseTestSoap();
			static TPtrC8 GetPrinterAttributesResponseTestSoap();
			static TPtrC8 GetJobAttributesResponseTestSoap();
			static TPtrC8 GetEventsResponseTestSoap();
			static TPtrC8 GetMarginsResponseTestSoap();

		protected:

			/**  		ConstructL
			* @brief	Symbian second phase constructor.
			*/
			void ConstructL();

		private:

			/**  		CBtSoapCodec
			* @brief	C++ constructor
			*/
			CBtSoapCodec();

			/**  		CreateSoapTemplateL
			* @brief	Constructs a correct type message template.
			*			According to the given parameters method composes a template
			*			for the message with general headers and action specific data block.
			* @param	aStartTag 	Start tag for the action
			* @param	aEndTag 	End tag for the action
			*/
			void CreateSoapTemplateL(const TDesC8& aStartTag, const TDesC8& aEndTag);

			/**   		CreateJobSoapL
			* @brief	Composes the CreateJob action specific data in template.
			*/
			void CreateJobSoapL(const TInt aJobId);

			/**   		GetPrinterAttributesSoapL
			* @brief	Composes the GetPrinterAttributes action specific data in template.
			*/
			void GetPrinterAttributesSoapL();
			void GetCapabilitiesSoapL();
			void GetPrinterStateSoapL();

			void GetJobAttributesSoapL(const TDesC8&  aJobId);
			void CancelJobSoapL(const TDesC8&  aJobId);
			void GetEventSoapL(const TDesC8&  aJobId);
			void GetMarginsSoapL();

			TPrintCapability ParseLayoutL();
			TPrintCapability ParseQualityL();
			TPrintCapability ParsePaperSizeL();
			void ParseDefaultSizeL(TPrintCapability& aSize, TInt& aPos);
			TInt ValuePosition(TPrintCapability aCapab, TInt aValue);
			
		private:

			/** @var HBufC8* iActionBuffer
			 *  Buffer to store the action data */
			HBufC8* iActionBuffer;

			/** @var CXmlHandler* iXmlHandler
			 *  XML handler */
			CXmlHandler* iXmlHandler;

	};

#endif // CBTSOAPCODEC_H

//  End of File