messagingfw/msgurlhandler/urlhandler/src/SMSSCH.CPP
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgurlhandler/urlhandler/src/SMSSCH.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,203 @@
+// Copyright (c) 2001-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:
+// This file contains the implementation for the class defined in SmsSch.h
+// 
+//
+
+/**
+ @file
+ @see	SmsSch.h
+*/
+
+// System includes
+//
+#include <inetprottextutils.h>
+#include <sendas2.h>
+
+// Local includes
+//
+#include "SMSSCH.H"
+#include "msgurlparser.h"
+
+// Allowed characters
+_LIT(KAllowedChars,"0123456789-.");
+
+// Field name
+_LIT(KVia,"via");
+
+// Constants
+//
+const TUid KSmsMtm = {0x1000102c};
+const TInt KPlusChar = '+';
+const TInt KSemiColonChar = ';';
+const TInt KEqualChar = '=';
+
+CSmsSchemeHandler::CSmsSchemeHandler()
+	{
+	}
+
+CSmsSchemeHandler* CSmsSchemeHandler::NewLC()
+	{
+	CSmsSchemeHandler* self=new (ELeave) CSmsSchemeHandler();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CSmsSchemeHandler* CSmsSchemeHandler::NewL()
+	{
+	CSmsSchemeHandler* self = NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CSmsSchemeHandler::ConstructL()
+	{
+	CMsgSchemeHandlerBase::ConstructL();
+	}
+
+CSmsSchemeHandler::~CSmsSchemeHandler()
+	{
+	iNumbers.Close();
+	}
+
+void CSmsSchemeHandler::ParseUrlL(const TDesC& aUrl)
+	{
+	// Get the scheme specific part
+	TPtrC smsPart; 
+	GetSchemeSpecificPartL(aUrl, smsPart);
+
+	// Format of sms url:	sms:<segment>,<segment>,....
+	// Format of segment is: <sms-number>;via=<service center number>
+	TPtrC segment;
+
+	// The sms-number
+	TPtrC numData;
+
+	// The service center segment i.e	via=<service center number>
+	TPtrC serviceData;
+
+	// Parse the scheme specific part
+	TDelimitedSmsParser parser;
+	parser.Parse(smsPart);
+
+	SSmsNumber num;
+	while (parser.GetNext(segment) != KErrNotFound)
+		{
+		// Look for field separator
+		TInt pos = segment.Locate(KSemiColonChar);
+		if (pos != KErrNotFound)
+			{
+			numData.Set(segment.Left(pos));
+
+			// Set everything after the semicolon.
+			serviceData.Set(segment.Mid(pos+1));
+			}
+		else 
+			{
+			numData.Set(segment);
+			serviceData.Set(KNullDesC);
+			}
+
+		// Parse the sms-number
+		InetProtTextUtils::RemoveWhiteSpace(numData, InetProtTextUtils::ERemoveBoth);
+		ParseSmsNumber(numData, num.iNumber);
+
+		// Parse the service center segment
+		TPtrC serviceCenter;
+		GetServiceCenter(serviceData, serviceCenter);
+		ParseSmsNumber(serviceCenter, num.iServiceCentre);
+
+		// This contains sms-number and service center number
+		User::LeaveIfError(iNumbers.Append(num));	
+		}	
+	}
+
+TInt CSmsSchemeHandler::ParseSmsNumber(const TPtrC& aNumber, TPtrC& aParsedNumber)
+	{
+	if (aNumber.Length() == 0)
+		{
+		aParsedNumber.Set(KNullDesC);
+		return KErrNotFound;
+		}
+
+	// Look for '+' at start of data. 	
+	if (aNumber[0] != KPlusChar)
+		// Local number 
+		{
+		// Parse and set the sms-number. Sets the leftmost part of the descriptor up 
+		// to the first non-allowable character.
+		ParseUtil::Subset(aNumber, KAllowedChars, aParsedNumber);
+		}
+	else
+		// International number
+		{
+		// Parse the number without the '+'. Sets the leftmost part of the descriptor up 
+		// to the first non-allowable character.
+		TPtrC number;
+		ParseUtil::Subset(aNumber.Mid(1), KAllowedChars, number); 
+
+		// Number length including the '+'
+		TInt numberLength = 1 + number.Length();
+		
+		// Set the parsed number
+		aParsedNumber.Set(aNumber.Left(numberLength));
+		}
+
+	return KErrNone;
+	}
+
+void CSmsSchemeHandler::GetServiceCenter(const TPtrC& aComponent, TPtrC& aServiceCenter)
+	{
+	// Look for field separator
+	TInt pos = aComponent.Locate(KEqualChar);
+	if (pos != KErrNotFound)
+		{
+		// Set field name
+		TPtrC fieldName = aComponent.Left(pos);
+		InetProtTextUtils::RemoveWhiteSpace(fieldName, InetProtTextUtils::ERemoveBoth);
+
+		// Check field name is valid 
+		if (fieldName.CompareF(KVia) == 0)
+			{
+			// Set service center number - excludes '='
+			aServiceCenter.Set(aComponent.Mid(pos+1));
+			InetProtTextUtils::RemoveWhiteSpace(aServiceCenter, InetProtTextUtils::ERemoveBoth);
+			}
+		}
+	else 
+		aServiceCenter.Set(KNullDesC);
+	} 
+
+void CSmsSchemeHandler::SendL()
+	{
+	RSendAs sendAs;
+	CleanupClosePushL(sendAs);
+	User::LeaveIfError(sendAs.Connect());
+
+	RSendAsMessage smsMessage;
+	CleanupClosePushL(smsMessage);
+	smsMessage.CreateL(sendAs, KSmsMtm);
+
+	const TInt count = iNumbers.Count();
+	for (TInt i = 0; i < count; ++i)
+		{
+		smsMessage.AddRecipientL(iNumbers[i].iNumber, RSendAsMessage::ESendAsRecipientTo);
+		}
+	smsMessage.LaunchEditorAndCloseL();
+	CleanupStack::Pop(&smsMessage); // Closed by LaunchEditorAndCloseL
+	CleanupStack::PopAndDestroy(&sendAs);
+
+	}
+