browserutilities/schemehandler/SchemeDispatcher/src/MailToHandler.cpp
changeset 0 dd21522fd290
child 36 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/schemehandler/SchemeDispatcher/src/MailToHandler.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,493 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*      Implementation of Scheme handler interface implementation for mailto:// scheme
+*      
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "MailToHandler.h"
+#include "SchemeDispLogger.h"
+#include <ECom.h>		// For REComSession
+#include <eikenv.h>
+#include <DocumentHandler.h>
+#include <apgcli.h>
+#include <apparc.h>
+#include <eikdoc.h>
+#include <eikproc.h>
+#include <f32file.h>
+
+
+// ================= CONSTANTS =======================
+
+_LIT( KMailto,"mailto:");
+_LIT( KSubject, "subject=" );
+_LIT( KBody, "body=" );
+_LIT( KCc, "cc=" );
+_LIT( KTo, "to=" );
+_LIT( KBcc, "bcc=" );
+_LIT( KComma, "," );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CMailToHandler::NewL()
+// ---------------------------------------------------------
+//
+CMailToHandler* CMailToHandler::NewL( const TDesC& aUrl )
+	{
+	CLOG_ENTERFN( "CMailToHandler::NewL()" );
+
+	CMailToHandler* self=new(ELeave) CMailToHandler();
+	CleanupStack::PushL(self);
+	self->ConstructL( aUrl );
+	CleanupStack::Pop(self);
+
+	CLOG_LEAVEFN( "CMailToHandler::NewL()" );
+
+	return self;
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::~CMailToHandler()
+// ---------------------------------------------------------
+//
+CMailToHandler::~CMailToHandler()
+	{
+	CLOG_ENTERFN( "CMailToHandler::~CMailToHandler()" );
+
+    if( iTelService != NULL )
+        {
+	    iTelService->RemoveObserver(this);
+	    delete iTelService;
+        iTelService = NULL;
+        }
+
+	CLOG_LEAVEFN( "CMailToHandler::~CMailToHandler()" );
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::CMailToHandler()
+// ---------------------------------------------------------
+//
+CMailToHandler::CMailToHandler() : CBaseHandler()
+	{
+	// Deliberately do nothing here : See ConstructL() for initialisation completion.
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::ConstructL()
+// ---------------------------------------------------------
+//
+void CMailToHandler::ConstructL( const TDesC& aUrl )
+	{
+	CLOG_ENTERFN( "CMailToHandler::ConstructL()" );
+
+	BaseConstructL( aUrl );
+
+	CLOG_LEAVEFN( "CMailToHandler::ConstructL()" );
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::HandleUrlEmbeddedL()
+// ---------------------------------------------------------
+//
+void CMailToHandler::HandleUrlEmbeddedL()
+	{
+	CLOG_ENTERFN( "CMailToHandler::HandleUrlEmbeddedL()" );
+
+    //TPtrC path = iParsedUrl->Des();
+
+	iTelService = CBrowserTelService::NewL();
+	iTelService->AddObserver( this );
+
+	TPtrC recipient = GetField( KMailto );
+	TPtrC subject = GetField( KSubject );
+	TPtrC msgBody = GetField( KBody );
+	TPtrC cC = GetField( KCc );
+    TPtrC tO = GetField( KTo );
+    TPtrC bCC = GetField( KBcc );
+
+    HBufC* rec = ChangeSeparationLC( recipient );
+    HBufC* ccrec = ChangeSeparationLC( cC );
+    HBufC* torec = ChangeSeparationLC( tO );
+    HBufC* bccrec = ChangeSeparationLC( bCC );
+
+    HBufC* allrec = HBufC::NewLC( ccrec->Length() +
+                                  torec->Length() +
+                                  bccrec->Length() + 3*KComma().Length() );
+    if( ccrec->Length() != 0 )
+        {
+        if( allrec->Length() != 0 )
+            {
+            allrec->Des().Append( KComma() );
+            }
+        allrec->Des().Append( ccrec->Des() );
+        }
+    if( torec->Length() != 0 )
+        {
+        if( allrec->Length() != 0 )
+            {
+            allrec->Des().Append( KComma() );
+            }
+        allrec->Des().Append( torec->Des() );
+        }
+    if( bccrec->Length() != 0 )
+        {
+        if( allrec->Length() != 0 )
+            {
+            allrec->Des().Append( KComma() );
+            }
+        allrec->Des().Append( bccrec->Des() );
+        }
+
+    if( rec->Length() > 0 )
+        {
+        TChar ch1('?');
+        TChar ch2('&');
+        TChar recchar((*rec)[ rec->Length() - 1]);
+        if( recchar == ch1 )
+            {
+            rec->Des().SetLength(rec->Length() - 1);
+            }
+        TChar recchar2((*rec)[ rec->Length() - 1]);
+        if( recchar2 == ch2 )
+            {
+            rec->Des().SetLength(rec->Length() - 1);
+            }
+        }
+
+    if( allrec->Length() > 0 )
+        {
+        TChar ch1('?');
+        TChar ch2('&');
+        TChar allrecchar1( (*allrec)[ allrec->Length() - 1] );
+        if( allrecchar1 == ch1 )
+            {
+            allrec->Des().SetLength(allrec->Length() - 1);
+            }
+        TChar allrecchar2( (*allrec)[ allrec->Length() - 1] );
+        if( allrecchar2 == ch2 )
+            {
+            allrec->Des().SetLength(allrec->Length() - 1);
+            }
+        }
+
+ 	TRAPD( err, iTelService->SendEmailMessageL( rec->Des(), allrec->Des(), subject, msgBody, ETrue) );
+
+    CleanupStack::PopAndDestroy( 5 ); // rec, ccrec, torec, bccrec, allrec
+
+    NotifyClient();
+
+    ErrorHandlerL( err );
+
+	CLOG_LEAVEFN( "CMailToHandler::HandleUrlEmbeddedL()" );
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::HandleUrlStandaloneL()
+// ---------------------------------------------------------
+//
+void CMailToHandler::HandleUrlStandaloneL()
+	{
+	CLOG_ENTERFN( "CMailToHandler::HandleUrlStandaloneL()" );
+
+    LaunchSchemeAppWithCommandLineL();
+
+	CLOG_LEAVEFN( "CMailToHandler::HandleUrlStandaloneL()" );
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::GetField()
+// ---------------------------------------------------------
+//
+TPtrC CMailToHandler::GetField(const TDesC& aHeader)
+	{
+	CLOG_ENTERFN( "CMailToHandler::GetField()" );
+
+	TPtrC path = iParsedUrl->Des();
+
+	TInt start = 0;
+	TInt end = 0;
+
+	CMailToHandler::TSchemeMailToFields posHeader = GetHeaderPos( aHeader );
+	// field start from; and end at 
+	switch( posHeader )
+		{
+		case ESchemeMailTo: // MailTo
+			{
+			start = FieldStart( KMailto );
+			end = FieldEnd( KMailto );
+			break;
+			}
+		case ESchemeSubject: // Subject
+			{
+			start = FieldStart( KSubject );
+			end = FieldEnd( KSubject );
+			break;
+			}
+		case ESchemeMsgBody: // Msg Body
+			{
+			start = FieldStart( KBody );
+			end = FieldEnd( KBody );
+			break;
+			}
+		case ESchemeCc: // Cc
+			{
+			start = FieldStart( KCc );
+			end = FieldEnd( KCc );
+			break;
+			}
+		case ESchemeTo: // To
+			{
+			start = FieldStart( KTo );
+			end = FieldEnd( KTo );
+			break;
+			}
+		case ESchemeBcc: // Bcc
+			{
+			start = FieldStart( KBcc );
+			end = FieldEnd( KBcc );
+			break;
+			}
+		case ESchemeNoMore:
+			break;
+		}
+
+    // check that everything is OK
+    if( start > end )
+        {
+        end = path.Length();
+        }
+	CLOG_LEAVEFN( "CMailToHandler::GetField()" );
+
+	return path.Mid( start, end-start );
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::IsHeader()
+// ---------------------------------------------------------
+//
+TBool CMailToHandler::IsHeader(const TDesC& aHeader)
+	{
+	CLOG_ENTERFN( "CMailToHandler::IsHeader()" );
+
+	TBool retVal = EFalse;
+
+	TPtrC path = iParsedUrl->Des();
+
+	/* is the field in the mailto sheme */
+	if( KErrNotFound != path.FindF( aHeader ) )
+		{
+		retVal = ETrue;
+		}
+
+	CLOG_LEAVEFN( "CMailToHandler::IsHeader()" );
+
+	return retVal;
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::FieldStart()
+// ---------------------------------------------------------
+//
+TInt CMailToHandler::FieldStart(const TDesC& aHeader)
+	{
+	CLOG_ENTERFN( "CMailToHandler::FieldStart()" );
+
+	TPtrC path = iParsedUrl->Des();
+	TInt retVal = path.Length();
+
+	/* find the starting position of the specific filed */
+	if( IsHeader( aHeader ) )
+		{
+		retVal = path.FindF( aHeader ) + aHeader.Length();
+		}
+
+	CLOG_LEAVEFN( "CMailToHandler::FieldStart()" );
+
+	return retVal;
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::FieldEnd()
+// ---------------------------------------------------------
+//
+TInt CMailToHandler::FieldEnd(const TDesC& aHeader)
+	{
+	CLOG_ENTERFN( "CMailToHandler::FieldEnd()" );
+
+	TPtrC path = iParsedUrl->Des();
+	TInt length = path.Length(); // length of the scheme
+    TInt retVal = length;
+
+    TInt startPos = FieldStart( aHeader );
+
+	if( IsHeader( aHeader ) )
+		{
+        TInt temp = GetNextField( startPos );
+        /* we need to subtract 1 if the result is 
+           not equal to length because of the & or ? */
+        retVal = ( temp == length ) ? length : ( temp - 1);
+		}
+
+	CLOG_LEAVEFN( "CMailToHandler::FieldEnd()" );
+
+	return retVal;
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::GetHeaderPos()
+// ---------------------------------------------------------
+//
+CMailToHandler::TSchemeMailToFields CMailToHandler::GetHeaderPos(const TDesC& aHeader)
+	{
+	CLOG_ENTERFN( "CMailToHandler::GetHeaderPos()" );
+
+	TSchemeMailToFields retVal = ESchemeMailTo;
+
+	if( 0 == aHeader.Compare( KMailto ) )
+		{
+		retVal = ESchemeMailTo;
+		}
+	else if ( 0 == aHeader.Compare( KSubject ) )
+		{
+		retVal = ESchemeSubject;
+		}
+	else if ( 0 == aHeader.Compare( KBody ) )
+		{
+		retVal = ESchemeMsgBody;
+		}
+	else if ( 0 == aHeader.Compare( KCc ) )
+		{
+		retVal = ESchemeCc;
+		}
+	else if ( 0 == aHeader.Compare( KTo ) )
+		{
+		retVal = ESchemeTo;
+		}
+	else if ( 0 == aHeader.Compare( KBcc ) )
+		{
+		retVal = ESchemeBcc;
+		}
+
+	CLOG_LEAVEFN( "CMailToHandler::GetHeaderPos()" );
+
+	return retVal;
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::GetNextField()
+// ---------------------------------------------------------
+//
+TInt CMailToHandler::GetNextField( TInt aStart )
+    {
+	TPtrC path = iParsedUrl->Des();
+	TInt retVal = path.Length();
+    TPtrC scheme;
+
+    //KSubject KBody KCc
+    if( aStart < retVal )
+        {
+        scheme.Set( path.Right( retVal - aStart ) );
+        }
+    else
+        {
+        return retVal;
+        }
+
+    TInt subjPos = scheme.FindF( KSubject );
+    subjPos = ( subjPos == KErrNotFound ) ? retVal : subjPos;
+
+    TInt bodyPos = scheme.FindF( KBody );
+    bodyPos = ( bodyPos == KErrNotFound ) ? retVal : bodyPos;
+
+    TInt toPos = scheme.FindF( KTo );
+    toPos = ( toPos == KErrNotFound ) ? retVal : toPos;
+
+    TInt ccPos = scheme.FindF( KCc );
+    ccPos = ( ccPos == KErrNotFound ) ? retVal : ccPos;
+
+    TInt bccPos = scheme.FindF( KBcc );
+    bccPos = ( bccPos == KErrNotFound ) ? retVal : bccPos;
+
+    TInt temp = Minimum( subjPos, bodyPos, toPos, ccPos, bccPos );
+    retVal = ( temp < retVal) ? temp + aStart : retVal;
+
+    return retVal;
+    }
+
+
+// ---------------------------------------------------------
+// CMailToHandler::Minimum()
+// ---------------------------------------------------------
+//
+TInt CMailToHandler::Minimum( TInt aPos1, TInt aPos2, TInt aPos3, TInt aPos4, TInt aPos5 )
+    {
+    TInt min = Min( aPos1, aPos2 );
+    min = Min( min, aPos3 );
+    min = Min( min, aPos4 );
+    min = Min( min, aPos5 );
+
+    return min;
+    }
+
+// ---------------------------------------------------------
+// CMailToHandler::BrowserTelServiceEvent()
+// ---------------------------------------------------------
+//
+void CMailToHandler::BrowserTelServiceEvent( TBrowserTelServiceState /*aEvent*/)
+	{
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::BrowserTelServiceError()
+// ---------------------------------------------------------
+//
+void CMailToHandler::BrowserTelServiceError( TBrowserTelServiceError /*aError*/)
+	{
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::NotifyClient()
+// ---------------------------------------------------------
+//
+void CMailToHandler::NotifyClient()
+	{
+	if( NULL !=iSchemeDoc )
+		{
+        iSchemeDoc->HandleServerAppExit( KErrNone );
+		}
+	}
+
+// ---------------------------------------------------------
+// CMailToHandler::ChangeSeparationLC()
+// ---------------------------------------------------------
+//
+HBufC* CMailToHandler::ChangeSeparationLC( const TDesC& aRecipients )
+    {
+    HBufC* newBuffer = aRecipients.AllocLC();
+
+    TInt pos;
+    while( KErrNotFound != ( pos = newBuffer->FindF( KTo ) ) )
+        {
+        TPtr16 ptr = newBuffer->Des();
+        ptr.Replace( pos, KTo().Length(), KComma );
+        }
+
+    return newBuffer;
+    }