email/imum/Utils/Src/ImumInSettingsDataValidator.cpp
changeset 0 72b543305e3a
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  ImumInSettingsDataValidator.cpp
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32base.h>
       
    21 #include <commdb.h>
       
    22 #include <MuiuMsvUiServiceUtilities.h>
       
    23 
       
    24 #include "ImumDaSettingsKeys.h"
       
    25 #include "ImumInternalApiImpl.h"
       
    26 #include "ImumInSettingsDataValidator.h"
       
    27 #include "ImumDaErrorCodes.h"
       
    28 #include "ImumInSettingsDataImpl.h"
       
    29 #include "ImumInSettingsDataCollectionImpl.h"
       
    30 #include "ImumDaSettingsKeys.h"
       
    31 #include "ImumInSettingsKeys.h"
       
    32 #include "EmailUtils.H"
       
    33 #include "EmailFeatureUtils.h"
       
    34 #include "ComDbUtl.h"                      // CMsvCommDbUtilities
       
    35 #include "ImumUtilsLogging.h"
       
    36 
       
    37 
       
    38 // EXTERNAL DATA STRUCTURES
       
    39 // EXTERNAL FUNCTION PROTOTYPES
       
    40 // CONSTANTS
       
    41 const TInt KImumInValidatorMaxPortValue = 65536;
       
    42 
       
    43 // MACROS
       
    44 // LOCAL CONSTANTS AND MACROS
       
    45 // MODULE DATA STRUCTURES
       
    46 // LOCAL FUNCTION PROTOTYPES
       
    47 // FORWARD DECLARATIONS
       
    48 
       
    49 // ============================ MEMBER FUNCTIONS ===============================
       
    50 
       
    51 // ----------------------------------------------------------------------------
       
    52 // CImumInSettingsDataValidator::CImumInSettingsDataValidator()
       
    53 // ----------------------------------------------------------------------------
       
    54 //
       
    55 CImumInSettingsDataValidator::CImumInSettingsDataValidator(
       
    56     CImumInternalApiImpl& aInternalApi )
       
    57     :
       
    58     iInternalApi( aInternalApi ),
       
    59     iCommDbUtils( NULL )
       
    60     {
       
    61     }
       
    62 
       
    63 // ----------------------------------------------------------------------------
       
    64 // CImumInSettingsDataValidator::~CImumInSettingsDataValidator()
       
    65 // ----------------------------------------------------------------------------
       
    66 //
       
    67 CImumInSettingsDataValidator::~CImumInSettingsDataValidator()
       
    68     {
       
    69     IMUM_CONTEXT( CImumInSettingsDataValidator::~CImumInSettingsDataValidator, 0, KLogInApi );
       
    70     IMUM_IN();
       
    71 
       
    72     delete iCommDbUtils;
       
    73     iCommDbUtils = NULL;
       
    74 
       
    75     IMUM_OUT();
       
    76     }
       
    77 
       
    78 // ----------------------------------------------------------------------------
       
    79 // CImumInSettingsDataValidator::ConstructL()
       
    80 // ----------------------------------------------------------------------------
       
    81 //
       
    82 void CImumInSettingsDataValidator::ConstructL()
       
    83     {
       
    84     IMUM_CONTEXT( CImumInSettingsDataValidator::ConstructL, 0, KLogInApi );
       
    85     IMUM_IN();
       
    86 
       
    87     iCommDbUtils = CMsvCommDbUtilities::NewL();
       
    88 
       
    89 	// Make sure that the filters are set in commdbutils
       
    90     iCommDbUtils->InitializeSelectionL();
       
    91     IMUM_OUT();
       
    92     }
       
    93 
       
    94 // ----------------------------------------------------------------------------
       
    95 // CImumInSettingsDataValidator::NewL()
       
    96 // ----------------------------------------------------------------------------
       
    97 //
       
    98 CImumInSettingsDataValidator* CImumInSettingsDataValidator::NewL(
       
    99     CImumInternalApiImpl& aInternalApi )
       
   100     {
       
   101     IMUM_STATIC_CONTEXT( CImumInSettingsDataValidator::NewL, 0, utils, KLogInApi );
       
   102     IMUM_IN();
       
   103 
       
   104     CImumInSettingsDataValidator* self = NewLC( aInternalApi );
       
   105     CleanupStack::Pop( self );
       
   106 
       
   107     IMUM_OUT();
       
   108 
       
   109     return self;
       
   110     }
       
   111 
       
   112 // ----------------------------------------------------------------------------
       
   113 // CImumInSettingsDataValidator::NewLC()
       
   114 // ----------------------------------------------------------------------------
       
   115 //
       
   116 CImumInSettingsDataValidator* CImumInSettingsDataValidator::NewLC(
       
   117     CImumInternalApiImpl& aInternalApi )
       
   118     {
       
   119     IMUM_STATIC_CONTEXT( CImumInSettingsDataValidator::NewLC, 0, utils, KLogInApi );
       
   120     IMUM_IN();
       
   121 
       
   122     CImumInSettingsDataValidator* self =
       
   123         new ( ELeave ) CImumInSettingsDataValidator( aInternalApi );
       
   124     CleanupStack::PushL( self );
       
   125     self->ConstructL();
       
   126 
       
   127     IMUM_OUT();
       
   128 
       
   129     return self;
       
   130     }
       
   131 
       
   132 // ---------------------------------------------------------------------------
       
   133 // CImumInSettingsDataValidator::Validate()
       
   134 // ---------------------------------------------------------------------------
       
   135 //
       
   136 TInt CImumInSettingsDataValidator::Validate(
       
   137     CImumInSettingsDataImpl& aSettings )
       
   138     {
       
   139     IMUM_CONTEXT( CImumInSettingsDataValidator::Validate, 0, KLogInApi );
       
   140     IMUM_IN();
       
   141 
       
   142     TRAPD( error, ValidateL( aSettings ) );
       
   143 
       
   144     IMUM_OUT();
       
   145 
       
   146     return error;
       
   147     }
       
   148 
       
   149 // ---------------------------------------------------------------------------
       
   150 // CImumInSettingsDataValidator::ValidateL()
       
   151 // ---------------------------------------------------------------------------
       
   152 //
       
   153 void CImumInSettingsDataValidator::ValidateL(
       
   154     CImumInSettingsDataImpl& aSettings )
       
   155     {
       
   156     IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateL, 0, KLogInApi );
       
   157     IMUM_IN();
       
   158 
       
   159     // Settings must have 1 or more connection settings to be valid
       
   160     if ( aSettings.ConnectionSettingsCount() < 1 )
       
   161         {
       
   162         User::Leave( TImumDaErrorCode::NoConnectionSettings );
       
   163         }
       
   164 
       
   165     // Check that the protocols are valid
       
   166     CheckProtocolsL( aSettings );
       
   167 
       
   168     // Check all the connection settings
       
   169     for ( TInt sending = aSettings.ConnectionSettingsCount();
       
   170           --sending >= 0; )
       
   171         {
       
   172         ValidateL( aSettings.GetInSetL( sending ) );
       
   173         }
       
   174 
       
   175     // Check the email address
       
   176     CheckEmailAddressL( aSettings );
       
   177 
       
   178     // Check the mailbox name
       
   179     CheckMailboxNameL( aSettings );
       
   180 
       
   181     IMUM_OUT();
       
   182     }
       
   183 
       
   184 // ---------------------------------------------------------------------------
       
   185 // CImumInSettingsDataValidator::CheckProtocolsL()
       
   186 // ---------------------------------------------------------------------------
       
   187 //
       
   188 void CImumInSettingsDataValidator::CheckProtocolsL(
       
   189     CImumInSettingsDataImpl& aSettings )
       
   190     {
       
   191     IMUM_CONTEXT( CImumInSettingsDataValidator::CheckProtocolsL, 0, KLogInApi );
       
   192     IMUM_IN();
       
   193 
       
   194     // Retrieve the first protocol
       
   195     TInt protocol = VerifyKeyL<TInt>(
       
   196         aSettings[0],
       
   197         TImumDaSettings::EKeyProtocol,
       
   198         TImumDaSettings::EValueProtocolImap4,
       
   199         TImumDaSettings::EValueProtocolSmtp,
       
   200         TImumDaErrorCode::EValueProtocolReceivingNotSet );
       
   201 
       
   202     // First setting must be receiving protocol
       
   203     if ( protocol == TImumDaSettings::EValueProtocolSmtp )
       
   204         {
       
   205         User::Leave( TImumDaErrorCode::EValueProtocolFirstNotReceiving );
       
   206         }
       
   207 
       
   208     // Check all the sending settings
       
   209     for ( TInt sending = aSettings.ConnectionSettingsCount();
       
   210           --sending > 0; )
       
   211         {
       
   212         protocol = VerifyKeyL<TInt>(
       
   213             aSettings[sending],
       
   214             TImumDaSettings::EKeyProtocol,
       
   215             TImumDaSettings::EValueProtocolImap4,
       
   216             TImumDaSettings::EValueProtocolSmtp,
       
   217             TImumDaErrorCode::EValueProtocolSendingNotSet );
       
   218 
       
   219         // Only smtp is supported sending protocol
       
   220         if ( protocol != TImumDaSettings::EValueProtocolSmtp )
       
   221             {
       
   222             User::Leave( TImumDaErrorCode::EValueProtocolTooManyReceiving );
       
   223             }
       
   224         }
       
   225 
       
   226     IMUM_OUT();
       
   227     }
       
   228 
       
   229 // ---------------------------------------------------------------------------
       
   230 // CImumInSettingsDataValidator::Validate()
       
   231 // ---------------------------------------------------------------------------
       
   232 //
       
   233 TInt CImumInSettingsDataValidator::Validate(
       
   234     MImumInSettingsDataCollection& aConnectionSettings )
       
   235     {
       
   236     IMUM_CONTEXT( CImumInSettingsDataValidator::Validate, 0, KLogInApi );
       
   237     IMUM_IN();
       
   238 
       
   239     TRAPD( error, ValidateL( aConnectionSettings ) );
       
   240 
       
   241     IMUM_OUT();
       
   242     return error;
       
   243     }
       
   244 
       
   245 // ---------------------------------------------------------------------------
       
   246 // CImumInSettingsDataValidator::ValidateL()
       
   247 // ---------------------------------------------------------------------------
       
   248 //
       
   249 void CImumInSettingsDataValidator::ValidateL(
       
   250     MImumInSettingsDataCollection& aConnectionSettings )
       
   251     {
       
   252     IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateL, 0, KLogInApi );
       
   253     IMUM_IN();
       
   254 
       
   255     // Get and check protocol
       
   256     TInt protocol = VerifyKeyL<TInt>(
       
   257         aConnectionSettings,
       
   258         TImumDaSettings::EKeyProtocol,
       
   259         TImumDaSettings::EValueProtocolImap4,
       
   260         TImumDaSettings::EValueProtocolSmtp,
       
   261         TImumDaErrorCode::EValueProtocolInvalid );
       
   262 
       
   263     // Check server address
       
   264     CheckServerAddressL( aConnectionSettings );
       
   265 
       
   266     // Check access point
       
   267     ValidateAccessPointL( aConnectionSettings );
       
   268 
       
   269     // Validate security settings
       
   270     ValidateSecurityL( aConnectionSettings );
       
   271 
       
   272     IMUM_OUT();
       
   273     }
       
   274 
       
   275 // ---------------------------------------------------------------------------
       
   276 // CImumInSettingsDataValidator::ValidateAccessPointL()
       
   277 // ---------------------------------------------------------------------------
       
   278 //
       
   279 void CImumInSettingsDataValidator::ValidateAccessPointL(
       
   280     MImumInSettingsDataCollection& aConnectionSettings )
       
   281     {
       
   282     IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateAccessPointL, 0, KLogInApi );
       
   283     IMUM_IN();
       
   284 
       
   285     // Access Point contains the id of the access point or always ask setting
       
   286     TInt apId = ValidateKey<TInt>(
       
   287         aConnectionSettings,
       
   288         TImumDaSettings::EKeyAccessPoint,
       
   289         TImumDaSettings::EValueApAlwaysAsk,
       
   290         KMaxTInt32 );
       
   291 
       
   292     TInt type = ValidateKey<TInt>(
       
   293         aConnectionSettings,
       
   294         TImumInSettings::EKeyAccessPointType,
       
   295         TImumInSettings::EValueApIsIapId,
       
   296         TImumInSettings::EValueApIsIapId );
       
   297 
       
   298     IMUM_OUT();
       
   299     }
       
   300 
       
   301 // ---------------------------------------------------------------------------
       
   302 // CImumInSettingsDataValidator::CheckEmailAddressL()
       
   303 // ---------------------------------------------------------------------------
       
   304 //
       
   305 void CImumInSettingsDataValidator::CheckEmailAddressL(
       
   306     const CImumInSettingsDataImpl& aSettings )
       
   307     {
       
   308     IMUM_CONTEXT( CImumInSettingsDataValidator::CheckEmailAddressL, 0, KLogInApi );
       
   309     IMUM_IN();
       
   310 
       
   311     // Get the info if the email address can be empty
       
   312     TInt allowEmpty = EFalse;
       
   313     aSettings.GetAttr(
       
   314         TImumInSettings::EKeyAllowEmptyEmailAddress, allowEmpty );
       
   315 
       
   316     // Fetch the address
       
   317     TImumDaSettings::TTextEmailAddress address;
       
   318     if ( aSettings.GetAttr(
       
   319         TImumDaSettings::EKeyEmailAddress, address ) )
       
   320         {
       
   321         User::Leave( TImumDaErrorCode::EEmailAddressNotSet );
       
   322         }
       
   323 
       
   324     // If the empty mail address is not allowed and the length is zero, leave
       
   325     if ( !allowEmpty && !address.Length() )
       
   326         {
       
   327         User::Leave( TImumDaErrorCode::EEmailAddressEmpty );
       
   328         }
       
   329 
       
   330     if ( address.Length() > 0 )
       
   331     	{
       
   332     	// Validate email address if it has any characters
       
   333     	if ( !MsvUiServiceUtilities::IsValidEmailAddressL( address ) )
       
   334     		{
       
   335     		User::Leave( TImumDaErrorCode::EEmailAddressInvalid );
       
   336     		}
       
   337     	}
       
   338 
       
   339     IMUM_OUT();
       
   340     }
       
   341 
       
   342 // ---------------------------------------------------------------------------
       
   343 // CImumInSettingsDataValidator::CheckServerAddressL()
       
   344 // ---------------------------------------------------------------------------
       
   345 //
       
   346 void CImumInSettingsDataValidator::CheckServerAddressL(
       
   347     const MImumInSettingsDataCollection& aConnectionSettings )
       
   348     {
       
   349     IMUM_CONTEXT( CImumInSettingsDataValidator::CheckServerAddressL, 0, KLogInApi );
       
   350     IMUM_IN();
       
   351 
       
   352     // Fetch the address
       
   353     TImumDaSettings::TTextServerAddress address;
       
   354     if ( aConnectionSettings.GetAttr(
       
   355         TImumDaSettings::EKeyServer, address ) )
       
   356         {
       
   357         User::Leave( TImumDaErrorCode::EServerAddressNotSet );
       
   358         }
       
   359 
       
   360     // If the empty mail address is not allowed and the length is zero, leave
       
   361     if ( !address.Length() )
       
   362         {
       
   363         User::Leave( TImumDaErrorCode::EServerAddressEmpty );
       
   364         }
       
   365 
       
   366     // Validate server address
       
   367     if ( !MsvUiServiceUtilities::IsValidDomainL( address ) )
       
   368         {
       
   369         User::Leave( TImumDaErrorCode::EServerAddressInvalid );
       
   370         }
       
   371 
       
   372     IMUM_OUT();
       
   373     }
       
   374 
       
   375 // ---------------------------------------------------------------------------
       
   376 // CImumInSettingsDataValidator::CheckMailboxNameL()
       
   377 // ---------------------------------------------------------------------------
       
   378 //
       
   379 void CImumInSettingsDataValidator::CheckMailboxNameL(
       
   380     const CImumInSettingsDataImpl& aSettings )
       
   381     {
       
   382     IMUM_CONTEXT( CImumInSettingsDataValidator::CheckMailboxNameL, 0, KLogInApi );
       
   383     IMUM_IN();
       
   384 
       
   385     // Check if the name exists for the mailbox
       
   386     TImumDaSettings::TTextMailboxName name;
       
   387     if ( aSettings.GetAttr(
       
   388             TImumDaSettings::EKeyMailboxName, name ) )
       
   389         {
       
   390         User::Leave( TImumDaErrorCode::EMailboxNameNotSet );
       
   391         }
       
   392     else
       
   393         {
       
   394         TInt generate = 0;
       
   395         aSettings.GetAttr(
       
   396             TImumInSettings::EKeyGenerateMailboxName, generate );
       
   397         TMsvId mailboxId = 0;
       
   398         aSettings[0].GetAttr(
       
   399             TImumDaSettings::EKeyMailboxId, mailboxId );
       
   400 
       
   401         // Do the account check
       
   402         TRAPD( error, MsvEmailMtmUiUtils::CheckAccountNameL(
       
   403             iInternalApi, name, mailboxId, generate ) );
       
   404         if ( error == KErrAlreadyExists )
       
   405             {
       
   406             User::Leave( TImumDaErrorCode::EMailboxNameAlreadyExist );
       
   407             }
       
   408         else if ( error )
       
   409             {
       
   410             User::Leave( TImumDaErrorCode::EMailboxNameUnknownError );
       
   411             }
       
   412         else
       
   413             {
       
   414             // No errors
       
   415             }
       
   416         }
       
   417 
       
   418     IMUM_OUT();
       
   419     }
       
   420 
       
   421 // ----------------------------------------------------------------------------
       
   422 // CImumInSettingsDataValidator::GetDefaultSecurityPortL()
       
   423 // ----------------------------------------------------------------------------
       
   424 //
       
   425 TInt CImumInSettingsDataValidator::GetDefaultSecurityPortL(
       
   426     const TInt aSecurity,
       
   427     const TInt aProtocol )
       
   428     {
       
   429     IMUM_CONTEXT( CImumInSettingsDataValidator::GetDefaultSecurityPortL, 0, KLogInApi );
       
   430     IMUM_IN();
       
   431 
       
   432     TInt port( 0 );
       
   433 
       
   434     switch( aSecurity )
       
   435         {
       
   436         case TImumDaSettings::EValueSecurityTls:
       
   437         case TImumDaSettings::EValueSecurityOff:
       
   438             {
       
   439             switch ( aProtocol )
       
   440                 {
       
   441                 case TImumDaSettings::EValueProtocolImap4:
       
   442                     port = TImumDaSettings::EDefaultPortImap4;
       
   443                     break;
       
   444 
       
   445                 case TImumDaSettings::EValueProtocolPop3:
       
   446                     port = TImumDaSettings::EDefaultPortPop3;
       
   447                     break;
       
   448 
       
   449                 case TImumDaSettings::EValueProtocolSmtp:
       
   450                     port = TImumDaSettings::EDefaultPortSmtp;
       
   451                     break;
       
   452 
       
   453                 default:
       
   454                     User::Leave( TImumDaErrorCode::ESecurityProtocolIllegal );
       
   455                 }
       
   456             break;
       
   457             }
       
   458         case TImumDaSettings::EValueSecuritySsl:
       
   459             {
       
   460             switch ( aProtocol )
       
   461                 {
       
   462                 case TImumDaSettings::EValueProtocolImap4:
       
   463                     port = TImumDaSettings::EDefaultSecurityPortImap4;
       
   464                     break;
       
   465 
       
   466                 case TImumDaSettings::EValueProtocolPop3:
       
   467                     port = TImumDaSettings::EDefaultSecurityPortPop3;
       
   468                     break;
       
   469 
       
   470                 case TImumDaSettings::EValueProtocolSmtp:
       
   471                     port = TImumDaSettings::EDefaultSecurityPortSmtp;
       
   472                     break;
       
   473 
       
   474                 default:
       
   475                     User::Leave( TImumDaErrorCode::ESecurityProtocolIllegal );
       
   476                 }
       
   477             }
       
   478             break;
       
   479         }
       
   480 
       
   481     IMUM_OUT();
       
   482 
       
   483     return port;
       
   484     }
       
   485 
       
   486 // ---------------------------------------------------------------------------
       
   487 // CImumInSettingsDataValidator::ValidateSecurityL()
       
   488 // ---------------------------------------------------------------------------
       
   489 //
       
   490 void CImumInSettingsDataValidator::ValidateSecurityL(
       
   491     MImumInSettingsDataCollection& aConnectionSettings )
       
   492     {
       
   493     IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateSecurityL, 0, KLogInApi );
       
   494     IMUM_IN();
       
   495 
       
   496     // Validate security settings
       
   497     TInt security = ValidateKey<TInt>(
       
   498         aConnectionSettings,
       
   499         TImumDaSettings::EKeySecurity,
       
   500         TImumDaSettings::EValueSecurityOff,
       
   501         TImumDaSettings::EValueSecuritySsl );
       
   502 
       
   503     // Validate port settings
       
   504     TInt port = ValidateKey<TInt>(
       
   505         aConnectionSettings,
       
   506         TImumDaSettings::EKeyPort,
       
   507         TImumDaSettings::EValuePortDefault,
       
   508         KImumInValidatorMaxPortValue );
       
   509 
       
   510     // Set correct default port
       
   511     if ( port == TImumDaSettings::EValuePortDefault )
       
   512         {
       
   513         TInt protocol = 0;
       
   514         aConnectionSettings.GetAttr(
       
   515             TImumDaSettings::EKeyProtocol,
       
   516             protocol );
       
   517         port = GetDefaultSecurityPortL( security, protocol );
       
   518         aConnectionSettings.SetAttr(
       
   519             TImumDaSettings::EKeyPort, port );
       
   520         }
       
   521 
       
   522     IMUM_OUT();
       
   523     }
       
   524 
       
   525 // End of File