messagingappbase/smsmtm/clientmtm/src/SMUTHDR.CPP
changeset 25 84d9eb65b26f
parent 23 238255e8b033
child 27 e4592d119491
child 37 518b245aa84c
child 79 2981cb3aa489
--- a/messagingappbase/smsmtm/clientmtm/src/SMUTHDR.CPP	Fri Apr 16 14:56:15 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1075 +0,0 @@
-// Copyright (c) 1999-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:
-//
-
-#include <smuthdr.h>
-#include <csmsemailfields.h>
-#include <gsmuieoperations.h>
-
-#include <gsmumsg.h>
-#include <msvstore.h>	
-#include <cntdb.h>
-#include <gsmunonieoperations.h>
-#include <gsmuelem.h>
-#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
-#include <tmsvsmsentry.h>
-#endif
-
-#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-#include <msvrcpt.h> 
-#endif
-	
-const TUid KUidMsvSMSHeaderStream		= {0x10001834};
-const TInt16 KMsvSmsHeaderVersion		= 1;
-const TInt KSmcmRecipientsGranularity	= 8;
-#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-_LIT16(KComma, ",");
-_LIT16(KDelimiter, ";");
-#endif
-
-/** 
-Allocates and constructs a new CSmsHeader object.
-
-Use this function to create a new SMS-SUBMIT, SMS-COMMAND, SMS-DELIVER or 
-SMS-STATUS-REPORT type message.
-
-@param	aType
-The Protocol Data Unit (PDU) type for the SMS message.
-
-@param	aText
-The message text.
-
-@return
-A new CSmsHeader object.
-*/
-EXPORT_C CSmsHeader* CSmsHeader::NewL(CSmsPDU::TSmsPDUType aType, CEditableText& aText)
-	{
-	CSmsHeader* self = new(ELeave) CSmsHeader();
-	CleanupStack::PushL(self);
-	self->ConstructL(aType, aText);
-	CleanupStack::Pop(self);
-	return self;
-	}
-	
-/** 
-Allocates and constructs a new CSmsHeader object.
-
-Use this function to create a new SMS-SUBMIT, SMS-COMMAND, SMS-DELIVER or 
-SMS-STATUS-REPORT type message. This version uses a previously connected
-file server session handle.
-
-@param	aType
-The Protocol Data Unit (PDU) type for the SMS message.
-
-@param	aText
-The message text.
-
-@param aFs
-Handle to an open file server session. CSmsHeader will not close the file session.
-
-@return
-A new CSmsHeader object.
-*/
-EXPORT_C CSmsHeader* CSmsHeader::NewL(CSmsPDU::TSmsPDUType aType, CEditableText& aText, RFs& aFs)
-	{
-	CSmsHeader* self = new(ELeave) CSmsHeader();
-	CleanupStack::PushL(self);
-	self->ConstructL(aType, aText, aFs);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-/** 
-Allocates and constructs a new CSmsHeader object.
-
-Use this function to create a new SMS-DELIVER type message.
-
-@param	aMessage
-The SMS message encapsulation from the SMS stack.
-
-@return
-A new CSmsHeader object.
-*/
-EXPORT_C CSmsHeader* CSmsHeader::NewL(CSmsMessage* aMessage)
-	{
-	CSmsHeader* self = new(ELeave) CSmsHeader(aMessage);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-/**
-Destructor.
-*/
-EXPORT_C CSmsHeader::~CSmsHeader()
-	{
-	iRecipients.ResetAndDestroy();
-	delete iMessage;
-	delete iEmailFields;
-	if(iCloseFs)
-		{
-		iFs.Close();
-		}
-	}
-
-/** 
-Sets the SMS message settings for the message.
-
-This can only be used on SMS-SUBMIT, SMS-COMMAND, SMS-DELIVER or SMS-STATUS-REPORT
-type messages.
-
-NOTE - if this is an Email over SMS message then the PID of is not changed. The
-PID would have been set correctly when the email fields were set.
-
-@param	aSmsSettings
-The SMS message settings for the message
-
-@leave	KErrNotSupported
-The message PDU type was not supported, or the message conversion value was not
-supported.
-
-@panic	SMCM	0
-The message PDU is not supported (debug only).
-*/
-EXPORT_C void CSmsHeader::SetSmsSettingsL(const CSmsMessageSettings& aSmsSettings)
-	{
-	__ASSERT_DEBUG( (Type()==CSmsPDU::ESmsSubmit) || (Type()==CSmsPDU::ESmsDeliver) || (Type()==CSmsPDU::ESmsStatusReport) || (Type()==CSmsPDU::ESmsCommand), Panic(ESmutPanicUnsupportedMsgType)); 
-
-	switch(Type())
-		{
-		case(CSmsPDU::ESmsSubmit):
-			{
-			Submit().SetRejectDuplicates(aSmsSettings.RejectDuplicate());
-			Submit().SetReplyPath(aSmsSettings.ReplyPath());
-			
-			//Check if delivery report for the last segment only is required . 
-			if(aSmsSettings.LastSegmentDeliveryReport())
-				{
-				CSmsTPSRROperations& tpSRROperations = static_cast<CSmsTPSRROperations&>(iMessage->GetOperationsForNonIEL(ESmsTPSRRParameter));
-				tpSRROperations.SetSchemeL();
-				tpSRROperations.SetLastSegmentStatusReportL(ETrue);
-				}
-			else
-				{
-				Submit().SetStatusReportRequest(aSmsSettings.DeliveryReport());	
-				}
-			Submit().SetValidityPeriod(aSmsSettings.ValidityPeriod());
-			Submit().SetValidityPeriodFormat(aSmsSettings.ValidityPeriodFormat());
-			break;
-			}
-		case(CSmsPDU::ESmsCommand):
-			{
-			Command().SetStatusReportRequest(aSmsSettings.DeliveryReport());
-			break;
-			}
-		case(CSmsPDU::ESmsDeliver):
-		case(CSmsPDU::ESmsStatusReport):
-			break;
-		default:
-			{			
-			User::Leave(KErrNotSupported);
-			break;
-			}
-		};
-
-	if (Message().TextPresent())
-		SetCanConcatenate(aSmsSettings.CanConcatenate());
-
-	CSmsPDU& pdu=Message().SmsPDU();
-	if (pdu.DataCodingSchemePresent())
-		pdu.SetAlphabet(aSmsSettings.CharacterSet());
-	if (pdu.ProtocolIdentifierPresent() && iEmailFields->Length() == 0 )
-		{
-		// The email fields object for this message is empty - therefore the
-		// PID can be set. With a non-empty email fields object the PID would
-		// have been set for interworking with email and MUST not be changed.
-		pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
-
-		// MessageConversion
-		switch(aSmsSettings.MessageConversion())
-			{
-			case(ESmsConvPIDNone):
-				{
-				pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsNoTelematicDevice);
-				break;
-				}
-			case ESmsConvFax:
-			case ESmsConvX400:
-			case ESmsConvPaging:
-			case ESmsConvMail:
-			case ESmsConvErmes:
-			case ESmsConvSpeech:
-				{
-				pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
-				pdu.SetTelematicDeviceType((TSmsProtocolIdentifier::TSmsTelematicDeviceType) aSmsSettings.MessageConversion());
-				break;
-				}
-			default:
-				{
-				User::Leave(KErrNotSupported);
-				break;
-				}
-			}; 
-		}
-	}
-
-/** 
-Gets the SMS message settings for the message.
-
-This can only be used on SMS-SUBMIT type messages.
-
-@param	aSmsSettings
-The output argument with the SMS message settings.
-
-@leave	KErrNotSupoprted
-The Telematic Device type is not supported.
-
-@panic	SMCM	0
-The message PDU is not supported (debug only).
-*/
-EXPORT_C void CSmsHeader::GetSmsSettingsL(CSmsMessageSettings& aSmsSettings) const
-	{
-	__ASSERT_DEBUG( Type()==CSmsPDU::ESmsSubmit, Panic(ESmutPanicUnsupportedMsgType)); 
-	switch(Type())
-		{
-		case(CSmsPDU::ESmsSubmit):
-			{
-			aSmsSettings.SetRejectDuplicate(Submit().RejectDuplicates());
-			aSmsSettings.SetReplyPath(Submit().ReplyPath());
-			TSmsStatusReportScheme scheme = iMessage->Scheme();
-			if (scheme == ETPSRRScheme)	
-				{
-				aSmsSettings.SetLastSegmentDeliveryReport(ETrue);
-				}
-			else
-				{
-				aSmsSettings.SetDeliveryReport(Submit().StatusReportRequest());
-				}
-			aSmsSettings.SetValidityPeriod(Submit().ValidityPeriod());
-			aSmsSettings.SetValidityPeriodFormat(Submit().ValidityPeriodFormat());
-			aSmsSettings.SetCharacterSet(Submit().Alphabet());
-		
-			if (iMessage->SmsPDU().PIDType() == TSmsProtocolIdentifier::ESmsPIDTelematicInterworking)
-				{
-				if (iMessage->SmsPDU().TelematicDeviceIndicator() == TSmsProtocolIdentifier::ESmsNoTelematicDevice)
-					{
-					aSmsSettings.SetMessageConversion(ESmsConvPIDNone);
-					}
-				else //if (iMessage->SmsPDU().TelematicDeviceIndicator() == TSmsProtocolIdentifier::ESmsTelematicDevice)
-					{
-					switch (iMessage->SmsPDU().TelematicDeviceType())
-						{
-						case TSmsProtocolIdentifier::ESmsGroup3TeleFax:
-						case TSmsProtocolIdentifier::ESmsX400MessageHandlingSystem:
-						case TSmsProtocolIdentifier::ESmsNationalPagingSystem:
-						case TSmsProtocolIdentifier::ESmsInternetElectronicMail:
-						case TSmsProtocolIdentifier::ESmsERMES:
-						case TSmsProtocolIdentifier::ESmsVoiceTelephone:
-							aSmsSettings.SetMessageConversion((TSmsPIDConversion) iMessage->SmsPDU().TelematicDeviceType());
-							break;
-						default:
-							User::Leave(KErrNotSupported);
-							break;
-						}
-					}
-				}
-
-			aSmsSettings.SetCanConcatenate(CanConcatenate());
-			break;
-			}
-		default:
-			{
-			break;
-			}
-		}
-	}
-	
-/**
-Sets the email fields for the message.
-
-If the supplied email fields is not empty then the PID of the PDU of the message
-is set for interworking with email.
-
-If the supplied email fields is empty and the PID of the PDU of the message is 
-set for interworking with email then the PID is set to the default value that
-indicates no telematic device. If the PID was not set for interworking with 
-email then it is left unchanged.
-
-@param	aEmailFields
-The email fields object. A copy is made of this object.
-*/	
-EXPORT_C void CSmsHeader::SetEmailFieldsL(const CSmsEmailFields& aEmailFields)
-	{
-	__ASSERT_DEBUG( Type()==CSmsPDU::ESmsSubmit, Panic(ESmutPanicUnsupportedMsgType)); 
-
-	CSmsEmailFields* temp = CSmsEmailFields::NewL(aEmailFields);
-	delete iEmailFields;
-	iEmailFields = temp;
-	
-	CSmsPDU& pdu = Message().SmsPDU();
-	if( pdu.ProtocolIdentifierPresent() )
-		{
-		if( iEmailFields->Length() > 0 )
-			{
-			// Set the PID for interworking with email.
-			pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
-			pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
-			pdu.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail);
-			}
-		else
-			{
-			// The email fields are empty - if the PID is set for interworking
-			// with email, set to indicate no telematic device.
-			if(	pdu.PIDType() == TSmsProtocolIdentifier::ESmsPIDTelematicInterworking &&
-				pdu.TelematicDeviceIndicator() == TSmsProtocolIdentifier::ESmsTelematicDevice &&
-				pdu.TelematicDeviceType() == TSmsProtocolIdentifier::ESmsInternetElectronicMail )
-				{
-				pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsNoTelematicDevice);
-				}
-			}
-		}
-	}
-	
-/**
-Sets the email fields for a reply message.
-
-The address field is copied from the specified email fields. The subject field 
-is formatted according to the specified subject format using the subject from 
-the specified email fields.
-
-The PID of the PDU of the message is set for interworking with email.
-
-@param	aEmailFields
-The email fields object.
-
-@param	aReplySubjectFormat
-The format of the subject field.
-
-@internalComponent
-*/
-void CSmsHeader::SetReplyEmailFieldsL(const CSmsEmailFields& aEmailFields, const TDesC& aReplySubjectFormat)
-	{
-	// Create the reply email fields - copy address and then format the subject,
-	// if one exists according to the reply prefix.
-	CSmsEmailFields* temp = CSmsEmailFields::NewL();
-	CleanupStack::PushL(temp);
-	temp->AddAddressL(aEmailFields.Addresses().MdcaPoint(0));
-	
-	SetEmailReplyForwardSubjectL(temp, aEmailFields.Subject(), aReplySubjectFormat);
-
-	CleanupStack::Pop(temp);
-	delete iEmailFields;
-	iEmailFields = temp;
-
-	// Set the PID for interworking with email.
-	CSmsPDU& pdu = Message().SmsPDU();
-	if( pdu.ProtocolIdentifierPresent() )
-		{
-		pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
-		pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
-		pdu.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail);
-		}
-	}
-
-/**
-Sets the email fields for a forward message.
-
-The address field is left empty. The subject field is formatted according to the
-specified subject format using the subject from the specified email fields.
-
-The PID of the PDU of the message is set for interworking with email.
-
-@param	aEmailFields
-The email fields object.
-
-@param	aForwardSubjectFormat
-The format of the subject field.
-
-@internalComponent
-*/
-void CSmsHeader::SetForwardEmailFieldsL(const CSmsEmailFields& aEmailFields, const TDesC& aForwardSubjectFormat)
-	{
-	// Create the reply email fields - copy address and then format the subject,
-	// if one exists according to the reply prefix.
-	CSmsEmailFields* temp = CSmsEmailFields::NewL();
-	CleanupStack::PushL(temp);
-	
-	SetEmailReplyForwardSubjectL(temp, aEmailFields.Subject(), aForwardSubjectFormat);
-
-	CleanupStack::Pop(temp);
-	delete iEmailFields;
-	iEmailFields = temp;
-
-	// Set the PID for interworking with email.
-	CSmsPDU& pdu = Message().SmsPDU();
-	if( pdu.ProtocolIdentifierPresent() )
-		{
-		pdu.SetPIDType(TSmsProtocolIdentifier::ESmsPIDTelematicInterworking);
-		pdu.SetTelematicDeviceIndicator(TSmsProtocolIdentifier::ESmsTelematicDevice);
-		pdu.SetTelematicDeviceType(TSmsProtocolIdentifier::ESmsInternetElectronicMail);
-		}
-	}
-	
-void CSmsHeader::SetEmailReplyForwardSubjectL(CSmsEmailFields* aEmailFields, const TDesC& aSubject, const TDesC& aSubjectFormat)
-	{
-	TInt length = aSubject.Length();
-	if( length > 0 )
-		{
-		// Prevent a chain of the format string appearing in the subject - check
-		// to see if the format string is already the prefix of the subject.
-		TInt formatPosInSubject = KErrNotFound;
-
-		_LIT(KFormatStringSpecifier, "%S");
-		TInt formatPos = aSubjectFormat.Find(KFormatStringSpecifier);
-		if( formatPos > 0 )
-			{
-			// Look in current subject for the format string - avoid the '%'.
-			formatPosInSubject = aSubject.FindF(aSubjectFormat.Left(formatPos - 1));
-			}
-		
-		// Need to format the string if the format string is not at the start of
-		// the current subject.
-		if( formatPosInSubject != 0 )
-			{
-			// Create a buffer large enough to hold re-formated subject - need
-			// to subtract two from the prefix length (the %S).
-			length += aSubjectFormat.Length() - 2;
-			HBufC* buf = HBufC::NewLC(length);
-			TPtr ptr(buf->Des());
-			
-			// Format the reply subject and set in the email fields.
-			ptr.Format(aSubjectFormat, &aSubject);
-			aEmailFields->SetSubjectL(*buf);
-			
-			CleanupStack::PopAndDestroy(buf);
-			}
-		else
-			{
-			// Subject already contains the format string - use it.
-			aEmailFields->SetSubjectL(aSubject);
-			}
-		}
-	}
-	
-/**
-The email fields object for this message.
-
-@return
-The email fields object for this message.
-*/	
-EXPORT_C const CSmsEmailFields& CSmsHeader::EmailFields() const
-	{
-	return *iEmailFields;
-	}
-
-/** 
-Internalises the object from the specified stream.
-
-@param	aStream
-The stream to be read from.
-*/
-EXPORT_C void CSmsHeader::InternalizeL(RMsvReadStream& aStream)
-	{
-#if (!defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-
-	aStream.ReadInt16L(); //version. Not used yet
-	
-	iRecipients.ResetAndDestroy();
-	TInt count=aStream.ReadInt32L();
-	while(count--)
-		{
-		CSmsNumber* recipient=CSmsNumber::NewL();  
-		CleanupStack::PushL(recipient);
-		recipient->InternalizeL(aStream);
-		iRecipients.AppendL(recipient);
-		CleanupStack::Pop(recipient);
-		}
-
-	iFlags = aStream.ReadUint32L();
-	iBioMsgIdType = (TBioMsgIdType) aStream.ReadInt8L();
-	iMessage->InternalizeWithoutBufferL(aStream);
-#else
-	iMessage->InternalizeWithoutBufferL(aStream);
-#endif
-	}
-
-/**
-Externalises the object to the specified stream.
-
-@param	aStream
-The stream to be writen to.
-*/
-EXPORT_C void CSmsHeader::ExternalizeL(RMsvWriteStream& aStream) const
-	{
-#if (!defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-
-	aStream.WriteInt16L(KMsvSmsHeaderVersion);
-
-	TInt count=iRecipients.Count();
-	aStream.WriteInt32L(count);
-
-	for (TInt i=0; i<count; i++)
-		iRecipients[i]->ExternalizeL(aStream);
-
-	aStream.WriteUint32L(iFlags);
-	aStream.WriteInt8L(iBioMsgIdType);
-	iMessage->ExternalizeWithoutBufferL(aStream); 
-#else
-	iMessage->ExternalizeWithoutBufferL(aStream); 	
-#endif 	
-	}
-
-/**
-Restores the object from the message entry store.
-
-The SMS object is restored from the KUidMsvSMSHeaderStream in the supplied store.
- 
-@param	aStore
-The store from which the object is restored.
- 
-@leave	KErrNotFound
-The stream KUidMsvSMSHeaderStream does not exist in aStore.
-*/
-EXPORT_C void CSmsHeader::RestoreL(CMsvStore& aStore)
-	{
-#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-	ReStoreDBL(aStore);
-	RMsvReadStream in;
-	in.OpenLC(aStore,KUidMsvSMSHeaderStream);
-	InternalizeL(in);
-	CleanupStack::PopAndDestroy(&in);
-#else
-
-	RMsvReadStream in;
-	in.OpenLC(aStore,KUidMsvSMSHeaderStream);
-	InternalizeL(in);
-	CleanupStack::PopAndDestroy(&in);
-	
-	iEmailFields->RestoreL(aStore);
-	
-#endif 
-	}
-
-
-/**
-Stores the object in the message entry store.
-
-The object is written to the KUidMsvSMSHeaderStream stream. Any previous content
-is overwritten.
-
-@param	aStore
-The store to hold the stream into which the object is written.
-*/
-EXPORT_C void CSmsHeader::StoreL(CMsvStore& aStore) const
-	{
-#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-	StoreDbL(aStore);
-	RMsvWriteStream out;
-	out.AssignLC(aStore,KUidMsvSMSHeaderStream);
-	ExternalizeL(out);
-	out.CommitL();
-	CleanupStack::PopAndDestroy(&out);
-
-#else
-	RMsvWriteStream out;
-	out.AssignLC(aStore,KUidMsvSMSHeaderStream);
-	ExternalizeL(out);
-	out.CommitL();
-	CleanupStack::PopAndDestroy(&out);
-	
-	iEmailFields->StoreL(aStore);
-#endif
-	}
-
-
-/**
-Check  whether a CMsvStore contains an SMS header stream.
-
-@param aStore The store.
-@return ETrue if there is a   SMS header
-*/
-EXPORT_C TBool CSmsHeader::ContainsSmsHeaderL(const CMsvStore& aStore)
-    {
-    return aStore.IsPresentL(KUidMsvSMSHeaderStream);
-    }
-
-CSmsHeader::CSmsHeader(CSmsMessage* aSmsMessage)
-:	iRecipients(KSmcmRecipientsGranularity),
-	iMessage(aSmsMessage),
-	iFlags(ESmsHeaderNoFlags),
-	iBioMsgIdType(EBioMsgIdNbs),
-	iCloseFs(ETrue)
-	{
-	}
-
-void CSmsHeader::ConstructL(CSmsPDU::TSmsPDUType aType, CEditableText& aText)
-	{
-	User::LeaveIfError(iFs.Connect());
-	iMessage=CSmsMessage::NewL(iFs, aType, CSmsEditorBuffer::NewL(aText), EFalse);
-	iEmailFields = CSmsEmailFields::NewL();
-	}
-	
-void CSmsHeader::ConstructL(CSmsPDU::TSmsPDUType aType, CEditableText& aText, RFs& aFs)
-	{
-	iFs=aFs;
-	iCloseFs = EFalse;
-	iMessage=CSmsMessage::NewL(iFs, aType, CSmsEditorBuffer::NewL(aText), EFalse);
-	iEmailFields = CSmsEmailFields::NewL();
-	}
-
-void CSmsHeader::ConstructL()
-	{
-	iEmailFields = CSmsEmailFields::NewL();
-
-	// Check the PID of the SMS PDU to see if set for interworking with email.
-	CSmsPDU& pdu = Message().SmsPDU();
-	if( pdu.ProtocolIdentifierPresent() &&
-		pdu.PIDType() == TSmsProtocolIdentifier::ESmsPIDTelematicInterworking &&
-		pdu.TelematicDeviceIndicator() == TSmsProtocolIdentifier::ESmsTelematicDevice &&
-		pdu.TelematicDeviceType() == TSmsProtocolIdentifier::ESmsInternetElectronicMail )
-		{
-		__ASSERT_DEBUG( pdu.Type() == CSmsPDU::ESmsDeliver, User::Invariant() );
-		
-		// Ok, this is an email SMS - parse out the address and the optional 
-		// subject fields.
-		CSmsBufferBase& message = Message().Buffer();
-		TInt length = message.Length();
-		HBufC* buf = HBufC::NewLC(length);
-		TPtr bufPtr(buf->Des());
-		message.Extract(bufPtr, 0, length);
-		
-		TInt end = iEmailFields->ParseL(*buf);
-		
-		if( end > 0 )
-			{
-			TPtrC body((*buf).Mid(end));
-			message.Reset();
-			message.InsertL(0, body);
-			}
-		CleanupStack::PopAndDestroy(buf);
-		}
-	}
-
-void CSmsHeader::SetCanConcatenate(TBool aCanConcatenate)
-	{
-	iFlags = (iFlags & ~ESmsHeaderCanConcatenate) | (aCanConcatenate ? ESmsHeaderCanConcatenate : ESmsHeaderNoFlags);
-	}
-
-TBool CSmsHeader::CanConcatenate() const
-	{
-	return iFlags & ESmsHeaderCanConcatenate;
-	}
-
-/**
-Gets the summary information for the specified acknowledgement.
-
-If the specified acknowledgement is not recognised, then this function returns
-the default value of TMsvSmsEntryAckSummary::ENoAckSummary.
-nothing.
-
-@param
-aAckType	The requested acknowledgement summary.
-
-@return
-The acknowledgement summary information.
-
-@see
-TMsvSmsEntry::TMsvSmsEntryAckSummary
-*/
-EXPORT_C TMsvSmsEntry::TMsvSmsEntryAckSummary TMsvSmsEntry::AckSummary(TSmsAckType aAckType) const
-	{
-	TMsvSmsEntryAckSummary summary = ENoAckSummary;
-	switch( aAckType )
-		{
-	case ESmsAckTypeDelivery:
-		summary = static_cast<TMsvSmsEntryAckSummary>((iMtmData2 & EMsvSmsEntryDeliveryAckSummary) >> EMsvSmsEntryDeliveryAckSummaryShift);
-		break;
-	default:
-		// Use default summary - fail gracefully.
-		break;
-		}
-	return summary;
-	}
-
-/**
-Sets the summary information for the specified acknowlwdgement.
-
-If the specified acknowledgement is not recognised, then this function does
-nothing.
-
-@param
-aAckType	The acknowledgement summary to be set.
-
-@param
-aAckSummary	The summary information.
-
-@see
-TMsvSmsEntry::TMsvSmsEntryAckSummary
-*/
-EXPORT_C void TMsvSmsEntry::SetAckSummary(TSmsAckType aAckType, TMsvSmsEntryAckSummary aAckSummary)
-	{
-	switch( aAckType )
-		{
-	case ESmsAckTypeDelivery:
-		iMtmData2 = (iMtmData2 & ~EMsvSmsEntryDeliveryAckSummary) | ((aAckSummary << EMsvSmsEntryDeliveryAckSummaryShift) & EMsvSmsEntryDeliveryAckSummary);
-		break;
-	default:
-		// Do nothing - fail gracefully.
-		break;
-		}
-	}
-
-/**
-Gets the message log ID and a flag indicating if it is valid.
-
-The returned flag indicates whether the message log ID is valid. If it is valid
-then the message has only a single recipient that is pending a status report. In
-this case the returned message log ID refers to the recipient that is pending.
-
-If it is not valid then the message has more than one recipient that is pending 
-a status report. The message log ID should is not valid and should not be used.
-
-@param
-aMessageId	An output argument for the message log ID.
-
-@return
-A flag indicating whether the message log ID aMessageId is valid or not.
-*/
-EXPORT_C TBool TMsvSmsEntry::MessageId(TInt32& aMessageId) const
-	{
-	aMessageId = iMtmData3;
-	return iMtmData2 & EMsvSmsMessageValid;
-	}
-
-/**
-Sets the message log ID and a flag indicating if it is valid.
-
-If the message has only a single recipient that is pending a status report then
-the message log ID for that recipient can be set in the index. The flag must be
-set to true.
-
-If the message has more than one recipient that is pending a status report then
-the message log ID must not be used. The flag must be set to false.
-
-This functionality cannot be used with bio-messages. This function will panic if
-used with a bio-message.
-
-@param
-aMessageId	The message log ID. Should only be used if aIsValid is true. It has
-			a default value of zero.
-
-@param
-aIsValid	A flag indicating if the message log ID is valid. This should have
-			a value or true if the message has only a single recipient pending
-			a status report.
-			
-@panic	USER	0
-This message is a bio-message and therefore the message ID field cannot be used.
-*/
-EXPORT_C void TMsvSmsEntry::SetMessageId(TInt32 aMessageId, TBool aIsValid)
-	{
-	__ASSERT_ALWAYS( iBioType == 0, User::Invariant() );
-
-	aIsValid ? (iMtmData2 |= EMsvSmsMessageValid) : (iMtmData2 &= ~EMsvSmsMessageValid);
-	iMtmData3 = aMessageId;
-	}
-
-/** 
-Gets the reply to address if it exists, otherwise calls FromAddress().
-
-Only valid for SMS-DELIVER type messages. 
-@return
-The reply to address if it exists, otherwise the originator address as returned by FromAddress().
-*/	
-TPtrC CSmsHeader::ReplyAddressL() const
-	{
-	
-	if(Type()==CSmsPDU::ESmsDeliver)
-		{
-		//Check for a reply address field
-		CSmsReplyAddressOperations& operations = STATIC_CAST(CSmsReplyAddressOperations&,Message().GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
-		if(!operations.ContainsReplyAddressIEL())
-			{
-			//if there is no reply to field call FromAddress()
-			return FromAddress();	
-			}	
-		//return the reply to address
-		HBufC* replyAddressHBuf=operations.GetReplyAddressL();
-		return replyAddressHBuf->Des();			
-		}	
-	else
-		{
-		return FromAddress();		
-		}
-	}
-
-#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
-
-/**
-Stores the object in the message entry store in SQL DB.
-
-The object is written to the KUidMsvSMSHeaderStream stream. Any previous content
-is overwritten.
-
-@param	aStore
-The store to hold the stream into which the object is written.
-*/
-
-void CSmsHeader::StoreDbL(CMsvStore& aStore) const
-	{
-	_LIT(KDetails,"");
-	
-	CHeaderFields* smsHeaderFields = new(ELeave) CHeaderFields();
-	CleanupStack::PushL(smsHeaderFields);
-	smsHeaderFields->iUid = KUidMsvSMSHeaderStream;
-	
-	// 1. Header version field.
-	CFieldPair* smsHeaderVersionfield = new(ELeave) CFieldPair();
-	CleanupStack::PushL(smsHeaderVersionfield);
-	smsHeaderVersionfield->iFieldNumValue = KMsvSmsHeaderVersion;
-	smsHeaderFields->iFieldPairList.AppendL(smsHeaderVersionfield);
-	CleanupStack::Pop(smsHeaderVersionfield);
-	
-	// 2. Recipient count field.
-	CFieldPair* smsRecipientCountField = new(ELeave) CFieldPair();
-	CleanupStack::PushL(smsRecipientCountField);
-	smsRecipientCountField->iFieldNumValue = iRecipients.Count();
-	smsHeaderFields->iFieldPairList.AppendL(smsRecipientCountField);
-	CleanupStack::Pop(smsRecipientCountField);
-	
-	// 3. Recipients field.
-	TInt size = 0;	
-	for (TInt i=0; i < iRecipients.Count(); i++)
-		{
-		size += sizeof(CMsvRecipient::TRecipientStatus);
-		size += 16;		// CMsvRecipient::iError (4), iRetries(4) and iTime (8)
-		size += Align4(iRecipients[i]->Address().Size());	// CSmsNumber::iNumber
-		size += Align4(iRecipients[i]->Name().Size());		// CSmsNumber::iName
-		size += sizeof(TLogId);								// CSmsNumber::iLogId
-		size += sizeof(CSmsNumber::TSmsAckStatus);			// CSmsNumber::iDeliveryStatus
-		size += 10;											// For delimiters
-		}
-
-	RBuf recipients;
-	CleanupClosePushL(recipients);
-	recipients.CreateL(size);
-
-	for (TInt i=0; i<iRecipients.Count(); i++)
-		{		
-		recipients.AppendNum(iRecipients[i]->Status()); //0
-		recipients.Append(KComma);
-		recipients.AppendNum(iRecipients[i]->Error()); //1
-		recipients.Append(KComma);
-		recipients.AppendNum(iRecipients[i]->Retries()); //2
-		recipients.Append(KComma);
-		recipients.AppendNum(iRecipients[i]->Time().Int64()); //3
-		recipients.Append(KComma);
-	
-		recipients.Append(iRecipients[i]->Address()); //4
-		recipients.Append(KComma);
-		recipients.Append(iRecipients[i]->Name()); //5
-		recipients.Append(KComma);
-		recipients.AppendNum(iRecipients[i]->LogId()); //6
-		recipients.Append(KComma);
-		recipients.AppendNum(iRecipients[i]->AckStatus(ESmsAckTypeDelivery)); //7
-		recipients.Append(KDelimiter);
-		}
-		
-	CFieldPair* smsRecipientsField = new(ELeave) CFieldPair();
-	CleanupStack::PushL(smsRecipientsField);
-	smsRecipientsField->iFieldTextValue = recipients.AllocL();
-	smsHeaderFields->iFieldPairList.AppendL(smsRecipientsField);
-				
-	CleanupStack::Pop(smsRecipientsField);	// smsRecipientsField
-	CleanupStack::PopAndDestroy();			// recipients
-
-	// 4. SMS Flag
-	CFieldPair* smsSmsFlags = new(ELeave) CFieldPair();
-	CleanupStack::PushL(smsSmsFlags);
-	smsSmsFlags->iFieldNumValue = iFlags;
-	smsHeaderFields->iFieldPairList.AppendL(smsSmsFlags);
-	CleanupStack::Pop(smsSmsFlags);
-	
-	// 5. BIO Msg Id
-	CFieldPair* smsBioMsgIdType = new(ELeave) CFieldPair();
-	CleanupStack::PushL(smsBioMsgIdType);
-	smsBioMsgIdType->iFieldNumValue = iBioMsgIdType;
-	smsHeaderFields->iFieldPairList.AppendL(smsBioMsgIdType);
-	CleanupStack::Pop(smsBioMsgIdType);
-	
-			
-	CFieldPair* smsdetailField = new (ELeave)CFieldPair();
-	CleanupStack::PushL(smsdetailField);
-	smsdetailField->iFieldName =  KDetails().AllocL();
-	smsdetailField->iFieldType = ETextField;
-	smsdetailField->iFieldTextValue = KNullDesC().AllocL();
-	smsHeaderFields->iFieldPairList.AppendL(smsdetailField);
-	CleanupStack::Pop(smsdetailField);
-
-	TMsvWriteStore storeWriter(aStore);
-	storeWriter.AssignL(smsHeaderFields);
-	storeWriter.CommitL();
-	
-	CleanupStack::Pop(smsHeaderFields);
-	
-	// 6.  SMS-Email UID
-	// 7.  SMS-EMail HeaderVersion
-	// 8.  Subject
-	// 9.  AddressCount
-	// 10. Addresses
-
-	iEmailFields->StoreDBL(aStore);	
-	
-	}
-
-/**
-Restores the object from the message entry store in SQL DB.
-
-The SMS object is restored from the KUidMsvSMSHeaderStream in the supplied store.
- 
-@param	aStore
-The store from which the object is restored.
- 
-@leave	KErrNotFound
-The stream KUidMsvSMSHeaderStream does not exist in aStore.
-*/	
-	
-void CSmsHeader::ReStoreDBL(CMsvStore& aStore)	
-	{
-	
-	CHeaderFields* rcvHeaderRow = NULL;
-	TMsvReadStore storeReader(aStore, KUidMsvSMSHeaderStream);
-	storeReader.LoadL(rcvHeaderRow);
-
-	
-	iRecipients.ResetAndDestroy();
-	
-	TInt i = 0;
-	CFieldPair* rcvHeader = rcvHeaderRow->iFieldPairList[i];
-
-	TInt16 headerversion = rcvHeaderRow->iFieldPairList[i++]->iFieldNumValue; // header version.
-	TInt count = rcvHeaderRow->iFieldPairList[i++]->iFieldNumValue;
-	
-	HBufC* 	receipientList = rcvHeaderRow->iFieldPairList[i++]->iFieldTextValue->Des().AllocL();
-	CleanupStack::PushL(receipientList);
-	
-	TPtrC receipientListPtr = receipientList->Des();
-	GetRecipientL(receipientListPtr);
-
-	iFlags  = rcvHeaderRow->iFieldPairList[i++]->iFieldNumValue;
-	iBioMsgIdType = (TBioMsgIdType)rcvHeaderRow->iFieldPairList[i++]->iFieldNumValue ;
-
-	CleanupStack::PopAndDestroy(receipientList);
-	
-	iEmailFields->ReStoreDBL(aStore);
-	
-	}
-
-/**
-Get the recipient strring and Create the recipient.
-
-@param : aRecipientStr A TPtrC16.
-@return None.
-*/
-void CSmsHeader::GetRecipientL(TDesC16& aRecipientStrList)
-	{
-	TPtrC16 aRecipientStr = aRecipientStrList.Left(aRecipientStrList.Length());
-	
-	if(aRecipientStr.Length()>0)
-		{
-		RArray<TPtrC16> smsNumberData;
-		TInt startPos = 0;
-		TInt firstSemiColonPos = aRecipientStr.Locate(';');
-		TInt lastSemiColonPos = aRecipientStr.LocateReverse(';');
-				
-		do
-			{
-			CSmsNumber* recipientNumber=CSmsNumber::NewL();  
-			TPtrC16 str1 = aRecipientStr.Left(firstSemiColonPos+1); // First recipient
-			startPos = str1.Locate(',') ;
-			
-			while(startPos != KErrNotFound )
-				{
-				TPtrC16 str2 = str1.Left(startPos);
-				smsNumberData.Append(str2);
-				
-				startPos++;
-				str1.Set(str1.Mid(startPos, str1.Length()- startPos));
-			
-				startPos = str1.Locate(',');
-				if(startPos == KErrNotFound)
-					{
-					TPtrC16 str3;
-					str3.Set(str1.Mid(0,str1.Length()-1));
-					smsNumberData.Append(str3);
-					break;
-					}
-					
-				}
-		
-			recipientNumber->SetStatus((CMsvRecipient::TRecipientStatus)ConvertToTInt(smsNumberData[0]));
-			recipientNumber->SetError(ConvertToTInt(smsNumberData[1]));
-			recipientNumber->SetRetries(ConvertToTInt(smsNumberData[2]));
-			TInt64 time = ConvertToTInt(smsNumberData[3]);
-			recipientNumber->SetTimeValue(time);
-			
-			//CSmsNumber	
-			recipientNumber->SetAddressL(smsNumberData[4]);
-			recipientNumber->SetNameL(smsNumberData[5]);
-			
-			TLex logId(smsNumberData[6]);
-			TInt32 logIdNum;
-			logId.Val(logIdNum);
-			recipientNumber->SetLogId(logIdNum);	
-			
-			TLex ackStatus(smsNumberData[7]);
-			TInt32 ackStatusNum;
-			recipientNumber->SetAckStatus( (TSmsAckType) ackStatus.Val(ackStatusNum), CSmsNumber::ENoAckRequested);
-				
-			iRecipients.AppendL(recipientNumber);
-			smsNumberData.Reset();
-			
-			if(firstSemiColonPos != lastSemiColonPos)
-				{
-				aRecipientStr.Set(aRecipientStr.Mid(firstSemiColonPos+1,aRecipientStr.Length()-firstSemiColonPos-1));
-				firstSemiColonPos = aRecipientStr.Locate(';');
-				lastSemiColonPos = aRecipientStr.LocateReverse(';');
-				}
-			else	
-				{
-				break;	
-				}
-								
-			}while(1);
-		
-		smsNumberData.Close();				
-		}		
-	}
-
-
-/**
- * Convert a String to an Integer.
- * @param aStr A string to make Integer.
- * @return TInt A integer value 
- */
- TInt CSmsHeader::ConvertToTInt(TDesC16& aStr)
-	{
-	TLex str(aStr);
-	TInt32 string;
-	str.Val(string);
-	return string;
-	}
-
-#endif