messagingfw/muiuutils/src/MuiuServiceUtilities.cpp
branchRCL_3
changeset 22 d2c4c66342f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/muiuutils/src/MuiuServiceUtilities.cpp	Tue Aug 31 15:41:11 2010 +0300
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2002 - 2005 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:  
+*     Static class to help mtm service queries.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <bldvariant.hrh>           // For feature flags  
+#include <msvuids.h>                // KUidMsvServiceEntry
+#include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
+#include <msvapi.h>
+#include <msvstd.hrh>
+#include <msvids.h>
+#include <mtclreg.h>                // CClientMtmRegistry
+#include <mtclbase.h>               // CBaseMtm
+#include <centralrepository.h>      // CRepository 
+#include <UiklafInternalCRKeys.h>   // KCRUidUiklaf, KUikOODDiskCriticalThreshold
+
+#include <MuiuServiceUtilities.h>
+
+// CONSTANTS
+const TInt KMuiuCharQuote = '\"';
+const TInt KMuiuCharBackSlash = '\\';
+const TInt KMuiuCharDot = '.';
+const TInt KMuiuCharSpace = ' ';
+const TInt KMuiuCharDel = 127;
+const TInt KMuiuCharAt = '@';
+const TInt KMuiuSpecialCharStrLen = 12;
+_LIT( KRFC822Specials,"()<>@,;:\\\"[]");
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// ---------------------------------------------------------
+// MsvUiServiceUtilitiesr::GetListOfAccountsL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C CMsvEntrySelection* MsvUiServiceUtilities::GetListOfAccountsL( CMsvSession& aSession, 
+                                                                        TBool aAlwaysListHidden )
+    { // static
+    return DoGetListOfAccountsL( aSession, KNullUid, aAlwaysListHidden );
+    }
+
+
+// ---------------------------------------------------------
+// MsvUiServiceUtilitiesr::GetListOfAccountsWithMTML
+//
+// ---------------------------------------------------------
+//
+EXPORT_C CMsvEntrySelection* MsvUiServiceUtilities::GetListOfAccountsWithMTML( 
+                                                    CMsvSession& aSession, 
+                                                    TUid aMtm, TBool aAlwaysListHidden )
+    { // static
+    return DoGetListOfAccountsL( aSession, aMtm, aAlwaysListHidden );
+    }
+
+
+// ---------------------------------------------------------
+// MsvUiServiceUtilitiesr::DoGetListOfAccountsL
+//
+// ---------------------------------------------------------
+//
+CMsvEntrySelection* MsvUiServiceUtilities::DoGetListOfAccountsL( CMsvSession& aSession, 
+                                                                 TUid aMtm, 
+                                                                 TBool aAlwaysListHidden )
+    {
+    CMsvEntrySelection* sel = new( ELeave ) CMsvEntrySelection();
+    CleanupStack::PushL( sel );
+    CMsvEntry* entry = aSession.GetEntryL( KMsvRootIndexEntryIdValue );
+    CleanupStack::PushL( entry );
+    TBool visible = EFalse;
+    TInt err;
+    
+    TInt cnt = entry->Count();
+    if ( cnt != 0 )
+        {
+        entry->SetSortTypeL( TMsvSelectionOrdering( KMsvGroupByType | KMsvGroupByStandardFolders, 
+                                                    EMsvSortByDetailsReverse, ETrue ) );
+        const TMsvEntry* tentry;
+        for (TInt cc = entry->Count(); --cc >= 0; )
+            {
+            tentry=&(*entry)[cc];
+            if ( aMtm == KNullUid || tentry->iMtm == aMtm )
+                {
+                if ( tentry->iType.iUid == KUidMsvServiceEntryValue && 
+                     tentry->Id() != KMsvLocalServiceIndexEntryIdValue )
+                    {
+                    const TBool noRelatedId = tentry->iRelatedId == KMsvNullIndexEntryId || 
+                                tentry->iRelatedId == tentry->Id();
+                    if ( tentry->Visible() || noRelatedId || aAlwaysListHidden )
+                        {
+                        // Add this service if:
+                        // it is visible, or,there is no associated related service, or,
+                        // we have been asked to list all services.
+                        sel->AppendL( tentry->Id() );
+                        }
+                    else
+                        {
+                        // This service is invisible and has a related service.
+                        // If the related service is visible we will add it later.
+                        // If the related service is also invisible, and has not yet been added,
+                        // add this service.
+                        TRAP( err, visible = entry->ChildDataL( tentry->iRelatedId ).Visible() )
+                            if ( err == KErrNone && !visible && 
+                                 sel->Find(tentry->iRelatedId) != KErrNone )
+                                {
+                                sel->AppendL( tentry->Id() );
+                                }
+                        }
+                    }
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( entry );
+    CleanupStack::Pop( sel );
+    return sel;
+    }
+
+// ----------------------------------------------------
+// MsvUiServiceUtilities::IsValidEmailAddressL
+//
+// ----------------------------------------------------
+EXPORT_C TBool MsvUiServiceUtilities::IsValidEmailAddressL( const TDesC& aAddress )
+    {
+    TInt c;
+    TInt length = aAddress.Length ();
+    TBufC<KMuiuSpecialCharStrLen> rfc822Specials ( KRFC822Specials );
+        
+    // first we validate the name portion (name@domain)
+    if ( length && aAddress[0] == KMuiuCharDot )
+        {
+        return EFalse;
+        }
+    for ( c = 0 ; c < length ; c++ )
+        {
+        if ( aAddress[c] == KMuiuCharQuote && ( c == 0 || 
+        aAddress[c-1] == KMuiuCharDot || aAddress[c-1] == KMuiuCharQuote ) )
+            {
+            while ( ++c < length )
+                {
+                if ( aAddress[c] == KMuiuCharQuote )
+                    {
+                    if( (c + 1) == length)
+                        {
+                        return EFalse;
+                        }
+                    break;
+                    }
+                if ( aAddress[c] == KMuiuCharBackSlash && 
+                    ( aAddress[++c] == KMuiuCharSpace) ) 
+                    {
+                    continue;
+                    }  
+                if ( aAddress[c] <= KMuiuCharSpace || 
+                    aAddress[c] >= KMuiuCharDel ) 
+                    {
+                    return EFalse;
+                    }
+                }
+            if ( c++ == length )
+                {
+                return EFalse;
+                }
+            if ( aAddress[c] == KMuiuCharAt )
+                {
+                break;
+                }
+            if ( aAddress[c] != KMuiuCharDot )
+                {
+                return EFalse;
+                }
+            continue;
+            }
+        if ( aAddress[c] == KMuiuCharAt )
+            {
+            break; 
+            }
+        if ( aAddress[c] <= KMuiuCharSpace || aAddress[c] >= KMuiuCharDel )
+            {
+            return EFalse;
+            }    
+        if ( rfc822Specials.Locate ( aAddress[c] ) != KErrNotFound )
+            {
+            return EFalse;
+            }
+        }
+    if ( c == 0 || aAddress[c-1] == KMuiuCharDot )
+        {
+        return EFalse;
+        }
+    // next we validate the domain portion (name@domain)
+    if ( c == length )
+        {
+        return EFalse;
+        }
+    else
+        {
+        c++; 
+        return IsValidDomainL ( aAddress.Mid ( ( c ) , length-c ) );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// MsvUiServiceUtilities::IsValidDomainL
+// -----------------------------------------------------------------------------
+EXPORT_C TBool MsvUiServiceUtilities::IsValidDomainL ( const TDesC& aDomain )
+    {
+    TInt c = 0;  
+    TInt length = aDomain.Length ();
+    TBufC<KMuiuSpecialCharStrLen> rfc822Specials ( KRFC822Specials );
+    
+    if ( length == 0 )
+        {
+        return EFalse;   
+        }
+    
+    do
+        {    
+        if ( aDomain[c] == KMuiuCharDot )
+            {
+            if ( c == 0 || aDomain[c-1] == KMuiuCharDot )
+                {
+                return EFalse;
+                }
+            }
+        if ( aDomain[c] <= KMuiuCharSpace || aDomain[c] >= KMuiuCharDel )
+            {
+            return EFalse;
+            }
+        if ( rfc822Specials.Locate( aDomain[c] ) != KErrNotFound )
+            {
+            return EFalse;
+            }
+        } 
+    while ( ++c < length );
+  
+    return ( aDomain[length-1] != '.' );
+    }
+    
+
+// ---------------------------------------------------------
+// MsvUiServiceUtilitiesr::DiskSpaceBelowCriticalLevelL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C TBool MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( CMsvSession& aSession,
+                                                                    TInt aBytesToWrite )
+    {
+    RFs& fs = aSession.FileSession();
+    TInt err = KErrNone;
+    TVolumeInfo vinfo;
+    TInt currentDrive = TInt( aSession.CurrentDriveL() );
+    err = fs.Volume( vinfo, currentDrive );
+    if ( err != KErrNone )
+        {
+        User::LeaveIfError( err );
+        }
+    
+    TInt64 freespace = vinfo.iFree;
+    TInt64 newFree = freespace - ( TInt64 )aBytesToWrite;
+    TInt criticalLevel;
+    CRepository* repository = CRepository::NewLC( KCRUidUiklaf );
+    repository->Get( KUikOODDiskCriticalThreshold, criticalLevel );
+    CleanupStack::PopAndDestroy( repository ); //repository
+    return ( newFree <= (TInt64)criticalLevel );
+    }
+
+
+
+// ---------------------------------------------------------
+// MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelWithOverheadL
+//
+// ---------------------------------------------------------
+//
+EXPORT_C TBool MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelWithOverheadL( 
+                                                                 CMsvSession& aSession,
+                                                                 TInt aBytesToWrite,
+                                                                 TInt aPhoneMemoryOverheadBytes )
+    {
+    RFs& fs = aSession.FileSession();
+    TInt err = KErrNone;
+    TBool belowCritical = EFalse;
+    TVolumeInfo vinfo;
+    TInt criticalLevel;
+    CRepository* repository = CRepository::NewLC( KCRUidUiklaf );
+    repository->Get( KUikOODDiskCriticalThreshold, criticalLevel );
+    CleanupStack::PopAndDestroy( repository ); //repository
+    
+    TInt currentDrive = TInt( aSession.CurrentDriveL() );
+    // Sending eat always some memory from C drive
+    if( currentDrive != EDriveC )
+        {
+        err = fs.Volume( vinfo, EDriveC );
+        if ( err != KErrNone )
+            {
+            User::LeaveIfError( err );
+            }
+        belowCritical = ( vinfo.iFree < ( (TInt64)aPhoneMemoryOverheadBytes + 
+                                          (TInt64)criticalLevel ) );
+        }
+
+    if ( !belowCritical )
+        {
+        err = fs.Volume( vinfo, currentDrive );
+        if ( err != KErrNone )
+            {
+            User::LeaveIfError( err );
+            }
+        if( currentDrive == EDriveC )
+            {
+            belowCritical = ( vinfo.iFree < ( (TInt64)aBytesToWrite + 
+                                              (TInt64)aPhoneMemoryOverheadBytes + 
+                                              (TInt64)criticalLevel ) );
+            }
+        else
+            {
+            belowCritical = ( vinfo.iFree < ( (TInt64)aBytesToWrite + (TInt64)criticalLevel ) );
+            }
+        }
+        
+    return belowCritical;
+    }
+    
+// End of File