messagingappbase/smsmtm/servermtm/src/TextRecipientSend.cpp
changeset 23 238255e8b033
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/smsmtm/servermtm/src/TextRecipientSend.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,200 @@
+// 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 <e32std.h>
+#include <gsmumsg.h>
+#include <smutset.h>
+#include "SMSRecipientSend.h"
+
+#include <smsuaddr.h>
+#include <smsustrm.h>
+#include <smuthdr.h>
+#include <csmsemailfields.h>
+#include "SmssSimUtils.h"
+#include <msventry.h>
+#include <logwraplimits.h>
+
+#ifndef _MSG_NO_LOGGING
+_LIT(KTextRecipientSendLogFile, "TextSend.txt");
+#endif
+
+CTextRecipientSend* CTextRecipientSend::NewL(TSmsProgress& aProgress, RFs& aFs, CMsvServerEntry& aServerEntry)
+	{
+	CTextRecipientSend* self = new (ELeave) CTextRecipientSend(aProgress, aFs, aServerEntry);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	CleanupStack::Pop();
+	return self;
+	}
+
+TBool CTextRecipientSend::AcceptMessage(const TMsvEntry& aEntry, const CSmsHeader& aHeader) const
+	{
+	TBool retVal = (aHeader.BioMsgIdType() == EBioMsgIdNbs);
+
+	if (retVal && aEntry.iBioType)
+		{
+		TInt err = AcceptBioType(aEntry.iBioType, aHeader.BioMsgIdType());
+		retVal = (err == KErrNone);
+		}
+
+	return retVal;
+	}
+
+TBool CTextRecipientSend::AcceptBioMsgId(const TBioMsgId& aBioMsgId) const
+	{
+	return aBioMsgId.iType == EBioMsgIdNbs && aBioMsgId.iPort <= 0 && aBioMsgId.iText.Length();
+	}
+
+CTextRecipientSend::CTextRecipientSend(TSmsProgress& aProgress, RFs& aFs, CMsvServerEntry& aServerEntry)
+: CSmsRecipientSend(aProgress, aFs, aServerEntry)
+	{
+	}
+
+CTextRecipientSend::~CTextRecipientSend()
+	{
+	Cancel();
+	}
+
+void CTextRecipientSend::StartL()
+	{
+	if (iRecipient->LogId() == KLogNullId)
+		AddLogEvent();
+	else
+		GetLogEvent();
+	}
+
+void CTextRecipientSend::PrependNbsStringL(const TMsvEntry& aEntry, CSmsMessage& arMessage, HBufC*& rOldMessage)
+	{
+	rOldMessage = NULL;
+
+	const CSmsEmailFields& fields = iHeader->EmailFields();
+
+	if (aEntry.iBioType)
+		{
+		if( fields.HasAddress() )
+			{
+			// This is a BIO message that has email fields - not supported.
+			User::Leave(KErrNotSupported);
+			}
+			
+		CSmsBufferBase& buffer = arMessage.Buffer();
+		TInt length = buffer.Length();
+		HBufC* oldMessage = HBufC::NewLC(length);
+		TPtr oldPtr(oldMessage->Des());
+		buffer.Extract(oldPtr, 0, length);
+		
+		TBioMsgId bioMsgId;
+		GetDefaultSendBearerL(aEntry.iBioType, EBioMsgIdNbs, bioMsgId); //will leave with KErrNotFound if a bioIdType is not found
+
+		//Only prepend the nbs string if it doesn't exist already
+		if (oldMessage->FindF(bioMsgId.iText) != 0) //case insensitve
+			{
+			length += bioMsgId.iText.Length();
+			length += 1; //for the line feed
+
+			HBufC* newMessage = HBufC::NewLC(length);
+			TPtr newPtr(newMessage->Des());
+
+			newPtr.Append(bioMsgId.iText);
+			newPtr.Append(_L("\n")); //according to the Smart Messaging Spec
+			newPtr.Append(*oldMessage);
+
+			//Pre-pend the string to the CSmsMessage
+			buffer.Reset();
+			buffer.InsertL(0, newPtr);
+
+			CleanupStack::PopAndDestroy(newMessage);
+			CleanupStack::Pop(oldMessage);
+			rOldMessage = oldMessage;
+			}
+		else
+			{
+			CleanupStack::PopAndDestroy(oldMessage);
+			}
+		}
+	else
+		{
+		// Check if this is an email message - just check the email fields have
+		// a length greater than zero. The PID will have been set for email.
+		if( fields.HasAddress() )
+			{
+			__ASSERT_DEBUG( arMessage.SmsPDU().TelematicDeviceType() == TSmsProtocolIdentifier::ESmsInternetElectronicMail, User::Invariant() );
+
+			// Create the email header.
+			HBufC* buf = fields.ComposeLC();
+					
+			// Need to append the email fields to the start of the message body.
+			CSmsBufferBase& body = arMessage.Buffer();
+			body.InsertL(0, *buf);
+			CleanupStack::PopAndDestroy(buf);
+			}
+		}
+	}
+
+void CTextRecipientSend::RevertBackToOldMessageL(const TDesC& aOldMessage, CSmsMessage& arMessage)
+	{
+	CSmsBufferBase& buffer = arMessage.Buffer();
+	buffer.Reset();
+	buffer.InsertL(0, aOldMessage);
+	}
+
+void CTextRecipientSend::SendMessageL()
+	{
+	SMSSLOG(FLogFormat(_L8("CTextRecipientSend::SendMessageL() for msg %d"), iEntry.Id()));
+	//Store the header to preserve the log ID
+ 	const TMsvId oldId = iServerEntry.Entry().Id();
+ 	User::LeaveIfError(iServerEntry.SetEntry(iEntry.Id()));
+ 	StoreHeaderL(*iHeader);
+ 	iServerEntry.SetEntry(oldId); //ignore error
+
+	CSmsMessage& message = iHeader->Message();
+
+	HBufC* oldMessage = NULL;
+
+	PrependNbsStringL(iEntry, message, oldMessage);
+
+	if (oldMessage)
+		{
+		CleanupStack::PushL(oldMessage);
+		}
+
+	SMSSLOG(FLogMessage(iEntry, message, iHeader->BioMsgIdType(), KTextRecipientSendLogFile));
+
+	CSmsSimUtils::ConnectL(iSession, iSocket, ESmsAddrSendOnly);
+
+	RSmsSocketWriteStream writestream(iSocket);
+	writestream << message;
+
+	if (oldMessage)
+		{
+		RevertBackToOldMessageL(*oldMessage, message);
+		CleanupStack::PopAndDestroy(); //oldMessage
+		}
+	
+	writestream.CommitL();
+
+	iSocket.Ioctl(KIoctlSendSmsMessage, iStatus,&iSendBuffer, KSolSmsProv);
+
+	iState = ESmsRecipientSendSendingMessage;
+	SetActive();
+	}
+
+void CTextRecipientSend::DoCancelSendingMessage()
+	{
+	SMSSLOG(FLogFormat(_L8("CTextRecipientSend::DoCancelSendingMessage() while sending msg %d"), iEntry.Id()));
+	iSocket.CancelIoctl();
+	}