diff -r 000000000000 -r 72b543305e3a email/alwaysonlineemailplugin/src/AlwaysOnlineEmailEMNResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/alwaysonlineemailplugin/src/AlwaysOnlineEmailEMNResolver.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2006 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: Handles OMA Email Notification messages. +* +*/ + + +// INCLUDE FILES +#include + +#include +#include +#include + + +#include "AlwaysOnlineEmailEMNResolver.h" +#include "AlwaysOnlineEmailPluginLogging.h" +#include "AlwaysOnlineEmailLoggingTools.h" + +// Literals used when trying to match a mailbox +// to a received EMN message +_LIT(KMailatPattern, "*mailat:*@*"); +_LIT(KImapUserPattern, "*imap://*@*"); // Same as KImapPattern, but includes also username +_LIT(KPopUserPattern, "*pop://*;*@*"); // Include username and auth +_LIT(KPopUserNoAuthPattern, "*pop://*@*"); // Same as KPopUserPattern, but does not include auth +// Literals used when trying to parse username, server +_LIT(KForwardSlashes, "//"); +_LIT(KAtSign, "@"); +_LIT(KSemicolon, ";"); + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::CAlwaysOnlineEmailEMNResolver() +// ---------------------------------------------------------------------------- +// +CAlwaysOnlineEmailEMNResolver::CAlwaysOnlineEmailEMNResolver() + { + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::~CAlwaysOnlineEmailEMNResolver() +// ---------------------------------------------------------------------------- +// +CAlwaysOnlineEmailEMNResolver::~CAlwaysOnlineEmailEMNResolver() + { + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::ConstructL() +// ---------------------------------------------------------------------------- +// +void CAlwaysOnlineEmailEMNResolver::ConstructL() + { + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::NewL() +// ---------------------------------------------------------------------------- +// +CAlwaysOnlineEmailEMNResolver* CAlwaysOnlineEmailEMNResolver::NewL() + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::NewL" ); + CAlwaysOnlineEmailEMNResolver* self = NewLC(); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::NewLC() +// ---------------------------------------------------------------------------- +// +CAlwaysOnlineEmailEMNResolver* CAlwaysOnlineEmailEMNResolver::NewLC() + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::NewLC" ); + CAlwaysOnlineEmailEMNResolver* self = + new ( ELeave ) CAlwaysOnlineEmailEMNResolver(); + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +//----------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::FindEMNMailbox +//----------------------------------------------------------------------------- +CAlwaysOnlineEmailAgentBase* CAlwaysOnlineEmailEMNResolver::FindEMNMailbox( + TDesC& aMailboxURI, CAOEmailAgentArray& aMailAgentArray ) + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::FindEMNMailbox" ); + CAlwaysOnlineEmailAgentBase* mailAgent = NULL; + TImumDaSettings::TTextEmailAddress emailAddress; + TImumDaSettings::TTextServerAddress incomingServer; + TImumDaSettings::TTextUserName username; + + const TInt count = aMailAgentArray.Count(); + + for ( TInt loop = 0; loop < count && !mailAgent; loop++) + { + TBool isEmn = aMailAgentArray[loop]->IsEmn(); + + // We are only interested of those mailboxes which have EMN on. + if ( isEmn ) + { + // Get needed settings + aMailAgentArray[loop]->EmailAddress( emailAddress ); + aMailAgentArray[loop]->ServerAddress( incomingServer ); + aMailAgentArray[loop]->Username( username ); + TBool isImap = aMailAgentArray[loop]->IsImap4(); + + KAOEMAIL_LOGGER_WRITE_FORMAT("aMailboxURI = %s", aMailboxURI.Ptr() ); + + // + if ( aMailboxURI.Match( KMailatPattern ) == 0 && + aMailboxURI.Find( emailAddress ) > 0 ) + { + mailAgent = aMailAgentArray[loop]; + } + // + else if ( aMailboxURI.Match( KImapUserPattern ) == 0 && isImap ) + { + if ( HandleEmnImapUserURI( aMailboxURI, username, incomingServer ) ) + { + mailAgent = aMailAgentArray[loop]; + } + } + // + else if ( aMailboxURI.Match( KPopUserPattern ) == 0 && !isImap ) + { + if ( HandleEmnPopUserURI( aMailboxURI, username, incomingServer ) ) + { + mailAgent = aMailAgentArray[loop]; + } + } + // + else if ( aMailboxURI.Match( KPopUserNoAuthPattern ) == 0 && !isImap ) + { + if ( HandleEmnPopNoAuthURI( aMailboxURI, username, incomingServer ) ) + { + mailAgent = aMailAgentArray[loop]; + } + } + else + { + KAOEMAIL_LOGGER_WRITE_FORMAT("Mailbox 0x%x is EMN mailbox, but there was no match", aMailAgentArray[loop]->MailboxId() ); + } + } + else + { + KAOEMAIL_LOGGER_WRITE_FORMAT("Mailbox 0x%x is not EMN mailbox", aMailAgentArray[loop]->MailboxId() ); + } + } + + return mailAgent; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement +// ---------------------------------------------------------------------------- +TInt CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement( + const TDesC8& aParameters, + TEMNElement& aElement ) const + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement" ); + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement(): Dispatch mailbox URI and timestamp from parameters"); + AOLOG_WRV( "Dispatch mailbox URI and timestamp from parameters", EAoLogSt3 ); + + // Presume that wrong type of parameter is given + TInt err = KErrNotSupported; + + // Unpack parameters to see to which mailbox EMN is for + TPckgBuf paramPack; + + // Make sure that the parameter length matches TEMNElement length and + // extract mailbox and timestamp values. + if ( aParameters.Size() == sizeof( TEMNElement ) ) + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement(): EMN parameters not corrupted, extracting... " ); + AOLOG_WRV( "EMN parameters not corrupted, extracting...", EAoLogSt3 ); + + paramPack.Copy( aParameters ); + + aElement.mailbox.Zero(); + aElement.mailbox.Append( paramPack().mailbox ); + + aElement.timestamp = paramPack().timestamp; + + err = KErrNone; + } + else + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailEMNResolver::ParameterDispatchTEMNElement(): Corrupted EMN parameters?!?!"); + } + + return err; + } + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::HandleEmnImapUserURI +// ---------------------------------------------------------------------------- +TBool CAlwaysOnlineEmailEMNResolver::HandleEmnImapUserURI( + const TDesC& aURI, + const TDesC8& aUsername, + const TDesC& aServer ) const + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::HandleEmnImapUserURI" ); + // Try to match with following EMN message + // + // + + // endPart = username@mail.somehost.com/folder;UIDVALIDITY=385759045/;UID=20 + TInt pos = aURI.Find( KForwardSlashes ); + // Step over forward slashes + pos += 2; // CSI: 47 # see comment above + // Strip "imap://" away + TPtrC endPart( aURI.Right( aURI.Length() - ( pos ) ) ); + + // Username is from beginning to @ character + pos = endPart.Find( KAtSign ); + TImumDaSettings::TTextUserName user; + user.Copy( endPart.Left( pos ) ); + + // Strip username and '@' character away + endPart.Set( endPart.Right( endPart.Length() - pos - 1 ) ); + TPtrC server( endPart ); + + // Do we have a winner? + return ( aUsername.Compare( user ) == 0 && + server.Find( aServer ) == 0 ); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::HandleEmnPopUserURI +// ---------------------------------------------------------------------------- +TBool CAlwaysOnlineEmailEMNResolver::HandleEmnPopUserURI( + const TDesC& aURI, + const TDesC8& aUsername, + const TDesC& aServer ) const + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::HandleEmnPopUserURI" ); + // Try to match with following EMN message + // + + TInt pos = aURI.Find( KForwardSlashes ); + // Step over forward slashes + pos += 2; // CSI: 47 # see comment above + // Strip "pop://" away + TPtrC endPart( aURI.Right( aURI.Length() - ( pos ) ) ); + + // Username is from beginning to ; character + pos = endPart.Find( KSemicolon ); + TImumDaSettings::TTextUserName user; + user.Copy( endPart.Left( pos ) ); + + // ";auth=3598302" omitted + + // server name + pos = endPart.Find( KAtSign ); + // Step over at sign + pos++; + + // server = mail.somehost.com + TPtrC server( endPart.Right( endPart.Length() - pos ) ); + + // Do we have a winner? + return ( aUsername.Compare( user ) == 0 && + aServer.Compare( server ) == 0 ); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailEMNResolver::HandleEmnPopNoAuthURI +// ---------------------------------------------------------------------------- +TBool CAlwaysOnlineEmailEMNResolver::HandleEmnPopNoAuthURI( + const TDesC& aURI, + const TDesC8& aUsername, + const TDesC& aServer ) const + { + AOLOG_IN( "CAlwaysOnlineEmailEMNResolver::HandleEmnPopNoAuthURI" ); + // Try to match with following EMN message + // + + TInt pos = aURI.Find( KForwardSlashes ); + // Step over forward slashes + pos += 2; // CSI: 47 # see comment above + // Strip "pop://" away + TPtrC endPart( aURI.Right( aURI.Length() - ( pos ) ) ); + + // Username is from beginning to @ character + pos = endPart.Find( KAtSign ); + TImumDaSettings::TTextUserName user; + user.Copy( endPart.Left( pos ) ); + // Step over at sign + pos++; + // server = mail.somehost.com + TPtrC server( endPart.Right( endPart.Length() - pos ) ); + + // Do we have a winner? + return ( aUsername.Compare( user ) == 0 && + aServer.Compare( server ) == 0 ); + + } + +// End of File