/**
 * \class CClientXML  
 *  <b>XML Message formation class</b><br>
 *  Used to format an XML message into a string object for sending back to the QML MQ Server.
 *  This is client specific code.
 *
 *
 *
 *  Description:
 *
 *    Given a string, create an XML messages for the selected function.
 *
 *  History
 *  =======
 *  20-09-2001  sidy  Began with msgKeyUpgrade()
 *  05-10-2001        Added msgRequestUpgrade()
 *  12-02-2002        Changed the source files so that client based XML processing is seperate
 *                    From base XML handling code.
 *  01-04-2002        Added Server Public Key and ID messages.
 */

#include <string>
#include <time.h>

using namespace std;


#include "ClientXML.h"
#include "MD5Hash.h"
#include "BaseXML.h"
#include "Configuration.h"
#include "CommonFileDefs.h"



CClientXML::CClientXML()
{
	pCfg = new CConfiguration();
}

CClientXML::~CClientXML()
{
	delete pCfg;
}


/**
 *  msgKeyUpgrade()
 *
 *  
 *  Site has performed a key upgrade. Format a message.
 *
 *
 *  @pre    site code is defined
 *  @return string - XML Msg
 */
string CClientXML::msgKeyUpgrade(string site, string ID)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	string BodyXml="<KeyUpgrade site=\""+site+"\"  keyID=\""+ID+"\" />\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}





/**
 *  msgPITack()
 *
 *  
 *  Format an acknowledgement message for a PIT file for this site.
 *
 *
 *  @pre    site code is defined
 *  @return string - XML Msg
 */
string CClientXML::msgPITack(string realSite, string fileSite, string runID)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode());
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<Acknowledgement type=\"PIT\" >";
	addBodyMessage( BodyXml );
	BodyXml ="<RunDetails site=\""+realSite+"\" extractedSite=\""+fileSite+"\" runNumber=\""+runID+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</Acknowledgement>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}




/**
 *  msgRequestUpgrade()
 *
 *  
 *  Format a request for upgrade of MQLink software.  Server will check version and
 *  decide if Request is valid.
 *
 *  @pre    site code is defined
 *  @return string - XML Msg
 */
string CClientXML::msgRequestUpgrade(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	char tmpBuff[32];
	sprintf(tmpBuff,"%d", PROG_VERSION);
	string tmp="";
	tmp.assign(tmpBuff);
	clearBodyMessages();
	string BodyXml ="<RequestUpgrade app=\"MQLink\"  version=\""+tmp+"\">\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</RequestUpgrade>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}






/**
 *  msgRevokeKeyID()
 *
 *  
 *  Format a request for the server to revoke the current key ID assigned to this site
 *  
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgRevokeKeyID(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<RevokeKeyRequest>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</RevokeKeyRequest>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}





/**
 *  msgLogin()
 *
 *  
 *  Format a request for the server to record a login by this site, 
 *  should be sent at the beginnning of the state machine run() method.
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgLogin(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<LoginRequest>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</LoginRequest>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}






/**
 *  msgLogout()
 *
 *  
 *  Format a request for the server to record a logout by this site, 
 *  should be sent at the beginnning of the state machine run() method.
 *  
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgLogout(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<LogoutRequest>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</LogoutRequest>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}







/**
 *  msgUploadedOrders()
 *
 *
 *  Build an XML message containing the count of Orders Uploaded
 *
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgUploadedOrders(string siteCode, int count)
{
	char buff[20];
	string sCount="";
	sCount.append(itoa(count,buff,10));

	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<Stats>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<OrderUploads site=\""+siteCode+"\" count=\""+sCount+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</Stats>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}




/**
 *  msgUploadedOrders()
 *
 *
 *  Build an XML message containing the count of Orders Uploaded
 *
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgUploadedPMSAcks(string siteCode, int count)
{
	char buff[20];
	string sCount="";
	sCount.append(itoa(count,buff,10));

	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<Stats>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<HL7AckUploads site=\""+siteCode+"\" count=\""+sCount+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</Stats>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}





/**
 *  msgRequestServerPublicKey()
 *
 *
 *  Ask the server to send us it's public key.
 *
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgRequestServerPublicKey(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<RequestPubKey>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</RequestPubKey>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}






/**
 *  msgRequestServerKeyID()
 *
 *
 *  Ask the server to send us it's public key ID. We can check it against what we
 *  have and if we do not have this ID in our key ring then we can get it and record it.
 *
 *
 *  @pre    site code is defined
 *  @return string, XML Msg
 */
string CClientXML::msgRequestServerKeyID(string siteCode)
{
	pCfg->read();
	string xml = getClientWrapper();
	string Hdr = getMessageHeader( "MQLink" );
	string HdrSig = getMsgHdrSig( Hdr,pCfg->getChallengeCode() );
	xml += HdrSig + Hdr;

	clearBodyMessages();
	string BodyXml ="<RequestKeyID>\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="<SiteDetails site=\""+siteCode+"\" />\r\n";
	addBodyMessage( BodyXml );
	BodyXml ="</RequestKeyID>\r\n";
	addBodyMessage( BodyXml );

	BodyXml = getBodyMessage();

	string BodySig = getMsgBodySig( BodyXml, pCfg->getChallengeCode() );
	xml += BodySig + BodyXml;
	xml += getClientTail();
	return xml;
}


// end of file
