--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/muiuutils/src/MuiuServiceUtilities.cpp Fri Apr 16 15:27:42 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