diff -r 000000000000 -r 8e480a14352b messagingfw/msgurlhandler/urlhandler/src/MTSCHEME.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgurlhandler/urlhandler/src/MTSCHEME.CPP Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,202 @@ +// 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 MtScheme.h +// +// + +/** + @file + @see MtScheme.h +*/ + +// System includes +// +#include <txtrich.h> +#include <inetprottextutils.h> +#include <escapeutils.h> +#include <sendas2.h> + +// Local includes +// +#include "MTSCHEME.H" +#include "msgurlparser.h" + +// Mailto field name +// +_LIT(KTo, "to"); +_LIT(KCc, "cc"); +_LIT(KBcc, "bcc"); +_LIT(KSubject, "subject"); +_LIT(KBody, "body"); + +// Constants +// +const TUid KMailMtm = {0x10001028}; +const TInt KEqualChar = '='; + + +CMailtoSchemeHandler::CMailtoSchemeHandler() + { + } + +CMailtoSchemeHandler* CMailtoSchemeHandler::NewLC() + { + CMailtoSchemeHandler* self=new (ELeave) CMailtoSchemeHandler(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CMailtoSchemeHandler* CMailtoSchemeHandler::NewL() + { + CMailtoSchemeHandler* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +void CMailtoSchemeHandler::ConstructL() + { + CMsgSchemeHandlerBase::ConstructL(); + } + +CMailtoSchemeHandler::~CMailtoSchemeHandler() + { + iTo.Close(); + delete iMailtoPart; + } + +void CMailtoSchemeHandler::ParseUrlL(const TDesC& aUrl) + { + // Get the scheme specific part + TPtrC mailtoPart; + GetSchemeSpecificPartL(aUrl, mailtoPart); + + // Convert %xx chars in the URL to ascii characters + HBufC* temp = EscapeUtils::EscapeDecodeL(mailtoPart); + delete iMailtoPart; + iMailtoPart = temp; + + // Parse the scheme specific part + TMailtoUrlParser parser; + parser.Parse(*iMailtoPart); + TPtrC segment; + + // Parse the address segment separated by ',' + TDelimitedAddressParser address = parser.ExtractAddresses(); + while (address.GetNext(segment) != KErrNotFound) + { + SetFieldL(ETo, segment); + } + + // Parse the body segment separated by '&' + TDelimitedBodyParser body = parser.ExtractBody(); + while (body.GetNext(segment) != KErrNotFound) + { + TPtrC value; + TField field = GetFieldAndValue(segment, value); + SetFieldL(field, value); + } + } + +void CMailtoSchemeHandler::SetFieldL(TField aField, const TDesC& aFieldValue) + { + + TPtrC value(aFieldValue); + InetProtTextUtils::RemoveWhiteSpace(value, InetProtTextUtils::ERemoveBoth); + + // Set the field values + switch (aField) + { + case ETo: + case ECc: + case EBcc: + User::LeaveIfError(iTo.Append(value)); + break; + + case ESubject: + __ASSERT_DEBUG(!iSubject.Ptr(), User::Leave(KErrAlreadyExists)); + iSubject.Set(value); + break; + + case EBody: + __ASSERT_DEBUG(!iBody.Ptr(), User::Leave(KErrAlreadyExists)); + iBody.Set(value); + break; + + case EUnknown: + default: + break; + } + } + +CMailtoSchemeHandler::TField CMailtoSchemeHandler::GetFieldAndValue(const TDesC& aComponent, TPtrC& aFieldValue) const + { + // Initialise + TField field = EUnknown; + + // Look for the field separator + TInt pos = aComponent.Locate(KEqualChar); + + if (pos != KErrNotFound) + { + // Set the field name + TPtrC fieldName = aComponent.Left(pos); + InetProtTextUtils::RemoveWhiteSpace(fieldName, InetProtTextUtils::ERemoveBoth); + + // Set the field value i.e everything after the equal. + aFieldValue.Set(aComponent.Mid(pos+1)); + + // Check the field name is valid and set the field. + if (fieldName.CompareF(KTo) == 0) + field = ETo; + else if (fieldName.CompareF(KCc) == 0) + field = ECc; + else if (fieldName.CompareF(KBcc) == 0) + field = EBcc; + else if (fieldName.CompareF(KSubject) == 0) + field = ESubject; + else if (fieldName.CompareF(KBody) == 0) + field = EBody; + } + else + aFieldValue.Set(KNullDesC); + + return field; + } + + +void CMailtoSchemeHandler::SendL() + { + RSendAs sendAs; + CleanupClosePushL(sendAs); + User::LeaveIfError(sendAs.Connect()); // Connect to the SendAs2 server. + + RSendAsMessage mailMessage; + CleanupClosePushL(mailMessage); + + mailMessage.CreateL(sendAs, KMailMtm); + // Set recipient list + const TInt count = iTo.Count(); + for (TInt i=0; i<count; ++i) + { + mailMessage.AddRecipientL(iTo[i], RSendAsMessage::ESendAsRecipientTo); + } + mailMessage.SetSubjectL(iSubject); + mailMessage.SetBodyTextL(iBody); + mailMessage.LaunchEditorAndCloseL(); + CleanupStack::Pop(&mailMessage); // Closed by LaunchEditorAndCloseL + + CleanupStack::PopAndDestroy(&sendAs); + + }