| 21 |      1 | /*
 | 
|  |      2 | * Copyright (c) 2002-2007 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:  Cache for strings
 | 
|  |     15 | *
 | 
|  |     16 | */
 | 
|  |     17 | 
 | 
|  |     18 | 
 | 
|  |     19 | // INCLUDES
 | 
|  |     20 | #include <AknUtils.h>
 | 
|  |     21 | #include <StringLoader.h>
 | 
|  |     22 | #include <filemanager.rsg>
 | 
|  |     23 | #include <CFileManagerEngine.h>
 | 
|  |     24 | #include <CFileManagerItemProperties.h>
 | 
|  |     25 | #include <CFileManagerCommonDefinitions.h>
 | 
|  |     26 | #include <CFileManagerFeatureManager.h>
 | 
|  |     27 | #include "CFileManagerStringCache.h"
 | 
|  |     28 | #include "CFileManagerIconArray.h"
 | 
|  |     29 | 
 | 
|  |     30 | // CONSTANTS
 | 
|  |     31 | const TInt KFmgrMaximumSizeOfIconIdString = 3;
 | 
|  |     32 | _LIT( KIconStr, "%d" );
 | 
|  |     33 | const TInt KMaxSizeString = 16;
 | 
|  |     34 | const TInt64 KKileByte = 1024;
 | 
|  |     35 | const TInt64 KMegaByte = 1048576;
 | 
|  |     36 | const TInt64 KGigaByte = 1073741824;
 | 
|  |     37 | const TInt64 KKileByteLowLimit = 100; // 100 bytes
 | 
|  |     38 | const TInt64 KMegaByteLowLimit = 1048576; // 1MB
 | 
|  |     39 | const TInt64 KGigaByteLowLimit = 1073741824; // 1GB
 | 
|  |     40 | const TInt KSizeDecimals = 1;
 | 
|  |     41 | const TInt KSizeTextArrayLen = 2;
 | 
|  |     42 | 
 | 
|  |     43 | _LIT( KDateFormat1, "%1" );
 | 
|  |     44 | _LIT( KDateFormat2, "%2" );
 | 
|  |     45 | _LIT( KDateFormat3, "%3" );
 | 
|  |     46 | const TUint KSecondSeparator = 1;
 | 
|  |     47 | const TUint KThirdSeparator = 2;
 | 
|  |     48 | const TInt KDateStrMax = 20;
 | 
|  |     49 | 
 | 
|  |     50 | 
 | 
|  |     51 | // ============================ LOCAL FUNCTIONS ================================
 | 
|  |     52 | 
 | 
|  |     53 | // -----------------------------------------------------------------------------
 | 
|  |     54 | // GetUnitAndFormatSize
 | 
|  |     55 | // -----------------------------------------------------------------------------
 | 
|  |     56 | //
 | 
|  |     57 | static TInt GetUnitAndFormatSize( TDes& aDes, const TInt64& aSize )
 | 
|  |     58 |     {
 | 
|  |     59 |     TRealFormat sizeFormat( aDes.MaxLength(), KSizeDecimals );
 | 
|  |     60 |     sizeFormat.iType |= KDoNotUseTriads;
 | 
|  |     61 |     TInt ret( R_QTN_FMGR_UNITS_BYTE );
 | 
|  |     62 |     if ( aSize >= KGigaByteLowLimit )
 | 
|  |     63 |         {
 | 
|  |     64 |         // Format in GBs with decimals
 | 
|  |     65 |         TReal size( I64REAL( aSize ) / I64REAL( KGigaByte ) );
 | 
|  |     66 |         aDes.AppendNum( size, sizeFormat );
 | 
|  |     67 |         ret = R_QTN_FMGR_UNITS_GIGABYTE;
 | 
|  |     68 |         }
 | 
|  |     69 |     else if ( aSize >= KMegaByteLowLimit )
 | 
|  |     70 |         {
 | 
|  |     71 |         // Format in MBs with decimals
 | 
|  |     72 |         TReal size( I64REAL( aSize ) / I64REAL( KMegaByte ) );
 | 
|  |     73 |         aDes.AppendNum( size, sizeFormat );
 | 
|  |     74 |         ret = R_QTN_FMGR_UNITS_MEGABYTE;
 | 
|  |     75 |         }
 | 
|  |     76 |     else if ( aSize >= KKileByteLowLimit )
 | 
|  |     77 |         {
 | 
|  |     78 |         // Format in kBs with decimals
 | 
|  |     79 |         TReal size( I64REAL( aSize ) / I64REAL( KKileByte ) );
 | 
|  |     80 |         aDes.AppendNum( size, sizeFormat );
 | 
|  |     81 |         ret = R_QTN_FMGR_UNITS_KILOBYTE;
 | 
|  |     82 |         }
 | 
|  |     83 |     else
 | 
|  |     84 |         {
 | 
|  |     85 |         // Format in bytes
 | 
|  |     86 |         aDes.AppendNum( aSize );
 | 
|  |     87 |         }
 | 
|  |     88 |     AknTextUtils::LanguageSpecificNumberConversion( aDes );
 | 
|  |     89 |     return ret;
 | 
|  |     90 |     }
 | 
|  |     91 | 
 | 
|  |     92 | // -----------------------------------------------------------------------------
 | 
|  |     93 | // GetFreeSpaceStringL
 | 
|  |     94 | // -----------------------------------------------------------------------------
 | 
|  |     95 | //
 | 
|  |     96 | static HBufC* GetFreeSpaceStringL( const TInt64& aSize )
 | 
|  |     97 |     {
 | 
|  |     98 |     CDesCArray* sizeTexts = new ( ELeave ) CDesCArrayFlat( KSizeTextArrayLen );
 | 
|  |     99 |     CleanupStack::PushL( sizeTexts );
 | 
|  |    100 |     TBuf< KMaxSizeString > size;
 | 
|  |    101 |     HBufC* unit = StringLoader::LoadLC( GetUnitAndFormatSize( size, aSize ) );
 | 
|  |    102 |     sizeTexts->AppendL( size );
 | 
|  |    103 |     sizeTexts->AppendL( *unit );
 | 
|  |    104 |     CleanupStack::PopAndDestroy( unit );
 | 
|  |    105 |     HBufC* ret = StringLoader::LoadL( R_QTN_FMGR_FREE_MEMORY_VAR_UNITS,
 | 
|  |    106 |         *sizeTexts );
 | 
|  |    107 |     CleanupStack::PopAndDestroy( sizeTexts );
 | 
|  |    108 |     return ret;
 | 
|  |    109 |     }
 | 
|  |    110 | 
 | 
|  |    111 | // -----------------------------------------------------------------------------
 | 
|  |    112 | // DateStringL
 | 
|  |    113 | // -----------------------------------------------------------------------------
 | 
|  |    114 | //
 | 
|  |    115 | static HBufC* DateStringL( const TTime& aTime )
 | 
|  |    116 |     {
 | 
|  |    117 |     TBuf< KDateStrMax > dateStr;
 | 
|  |    118 |     TBuf< KDateStrMax > dateStrFormat;
 | 
|  |    119 |     TLocale local;
 | 
|  |    120 |     dateStrFormat.Append( KDateFormat1 );
 | 
|  |    121 |     dateStrFormat.Append( local.DateSeparator( KSecondSeparator ) );
 | 
|  |    122 |     dateStrFormat.Append( KDateFormat2 );
 | 
|  |    123 |     dateStrFormat.Append( local.DateSeparator( KThirdSeparator ) );
 | 
|  |    124 |     dateStrFormat.Append( KDateFormat3 );
 | 
|  |    125 |     aTime.FormatL( dateStr, dateStrFormat );
 | 
|  |    126 |     return dateStr.AllocL();
 | 
|  |    127 |     }
 | 
|  |    128 | 
 | 
|  |    129 | // ============================ MEMBER FUNCTIONS ===============================
 | 
|  |    130 | 
 | 
|  |    131 | // -----------------------------------------------------------------------------
 | 
|  |    132 | // CFileManagerStringCache::CFileManagerStringCache
 | 
|  |    133 | // C++ default constructor can NOT contain any code, that
 | 
|  |    134 | // might leave.
 | 
|  |    135 | // -----------------------------------------------------------------------------
 | 
|  |    136 | //
 | 
|  |    137 | CFileManagerStringCache::CFileManagerStringCache(
 | 
|  |    138 |         CFileManagerEngine& aEngine,
 | 
|  |    139 |         CFileManagerIconArray& aIconArray ) :
 | 
|  |    140 |     iEngine( aEngine ),
 | 
|  |    141 |     iIconArray( aIconArray )
 | 
|  |    142 |     {
 | 
|  |    143 |     }
 | 
|  |    144 | 
 | 
|  |    145 | // -----------------------------------------------------------------------------
 | 
|  |    146 | // CFileManagerStringCache::NewL
 | 
|  |    147 | // Two-phased constructor.
 | 
|  |    148 | // -----------------------------------------------------------------------------
 | 
|  |    149 | //
 | 
|  |    150 | CFileManagerStringCache* CFileManagerStringCache::NewL(
 | 
|  |    151 |         CFileManagerEngine& aEngine,
 | 
|  |    152 |         CFileManagerIconArray& aIconArray )
 | 
|  |    153 |     {
 | 
|  |    154 |     CFileManagerStringCache* self = new( ELeave )
 | 
|  |    155 |         CFileManagerStringCache( aEngine, aIconArray );
 | 
|  |    156 |     
 | 
|  |    157 |     CleanupStack::PushL( self );
 | 
|  |    158 |     self->ConstructL();
 | 
|  |    159 |     CleanupStack::Pop( self );
 | 
|  |    160 | 
 | 
|  |    161 |     return self;
 | 
|  |    162 |     }
 | 
|  |    163 | 
 | 
|  |    164 | // -----------------------------------------------------------------------------
 | 
|  |    165 | // CFileManagerStringCache::ConstructL
 | 
|  |    166 | // 
 | 
|  |    167 | // -----------------------------------------------------------------------------
 | 
|  |    168 | // 
 | 
|  |    169 | void CFileManagerStringCache::ConstructL()
 | 
|  |    170 |     {
 | 
|  |    171 |     Clear();
 | 
|  |    172 |     }
 | 
|  |    173 | 
 | 
|  |    174 | // -----------------------------------------------------------------------------
 | 
|  |    175 | // CFileManagerStringCache::~CFileManagerStringCache
 | 
|  |    176 | // Destructor
 | 
|  |    177 | // -----------------------------------------------------------------------------
 | 
|  |    178 | // 
 | 
|  |    179 | CFileManagerStringCache::~CFileManagerStringCache()
 | 
|  |    180 |     {
 | 
|  |    181 |     Clear();
 | 
|  |    182 |     }
 | 
|  |    183 | 
 | 
|  |    184 | // -----------------------------------------------------------------------------
 | 
|  |    185 | // CFileManagerStringCache::MdcaCount
 | 
|  |    186 | // 
 | 
|  |    187 | // -----------------------------------------------------------------------------
 | 
|  |    188 | // 
 | 
|  |    189 | TInt CFileManagerStringCache::MdcaCount() const
 | 
|  |    190 |     {
 | 
|  |    191 |     return iEngine.FileList()->MdcaCount();
 | 
|  |    192 |     }
 | 
|  |    193 |         
 | 
|  |    194 | // -----------------------------------------------------------------------------
 | 
|  |    195 | // CFileManagerStringCache::MdcaPoint
 | 
|  |    196 | // 
 | 
|  |    197 | // -----------------------------------------------------------------------------
 | 
|  |    198 | // 
 | 
|  |    199 | TPtrC CFileManagerStringCache::MdcaPoint( TInt aIndex ) const
 | 
|  |    200 |     {
 | 
|  |    201 |     TInt err( KErrNone );
 | 
|  |    202 |     TInt index( FormattedStringFound( aIndex ) );
 | 
|  |    203 | 
 | 
|  |    204 |     if ( index >= 0 )
 | 
|  |    205 |         {
 | 
|  |    206 |         return FormattedString( index );
 | 
|  |    207 |         }
 | 
|  |    208 | 
 | 
|  |    209 |     iFormatString.Zero();
 | 
|  |    210 | 
 | 
|  |    211 |     // Get icon
 | 
|  |    212 |     TInt iconId( EFileManagerOtherFileIcon );
 | 
|  |    213 |     TRAP( err, iconId = iEngine.IconIdL( aIndex ) );
 | 
|  |    214 |     if ( err != KErrNone )
 | 
|  |    215 |         {
 | 
|  |    216 |         iconId = EFileManagerOtherFileIcon;
 | 
|  |    217 |         SetError( err );
 | 
|  |    218 |         }
 | 
|  |    219 |     // Get name
 | 
|  |    220 |     CFileManagerItemProperties* prop = NULL;
 | 
|  |    221 |     TRAP( err, prop = iEngine.GetItemInfoL( aIndex ) );
 | 
|  |    222 |     if ( err == KErrNone )
 | 
|  |    223 |         {
 | 
|  |    224 |         TPtrC ptr( prop->LocalizedName() );
 | 
|  |    225 |         if ( iconId != EFileManagerFolderIcon &&
 | 
|  |    226 |              iconId != EFileManagerFolderSubIcon &&
 | 
|  |    227 |              iconId != EFileManagerFolderEmptyIcon )
 | 
|  |    228 |             {
 | 
|  |    229 |             // Append file name with conversion
 | 
|  |    230 |             HBufC* buffer = NULL;
 | 
|  |    231 |             TRAP( err,  buffer = AknTextUtils::ConvertFileNameL( ptr ) );
 | 
|  |    232 |             if ( err == KErrNone )
 | 
|  |    233 |                 {
 | 
|  |    234 |                 iFormatString.Append( *buffer );
 | 
|  |    235 |                 }
 | 
|  |    236 |             else
 | 
|  |    237 |                 {
 | 
|  |    238 |                 // Put file name without any convertion, its better than nothing
 | 
|  |    239 |                 iFormatString.Append( ptr );
 | 
|  |    240 |                 SetError( err );
 | 
|  |    241 |                 }
 | 
|  |    242 |             delete buffer;
 | 
|  |    243 |             }
 | 
|  |    244 |         else
 | 
|  |    245 |             {
 | 
|  |    246 |             // Append folder name
 | 
|  |    247 |             iFormatString.Append( ptr );
 | 
|  |    248 |             }
 | 
|  |    249 |         }
 | 
|  |    250 |     else
 | 
|  |    251 |         {
 | 
|  |    252 |         SetError( err );
 | 
|  |    253 |         }
 | 
|  |    254 |     // Remove all other possible tabs in string than the icon separator,
 | 
|  |    255 |     // so that listbox won't get broken
 | 
|  |    256 |     AknTextUtils::StripCharacters( iFormatString, KFmgrTab );
 | 
|  |    257 | 
 | 
|  |    258 |     AknTextUtils::ReplaceCharacters( iFormatString, KFmgrLineFeed, KFmgrSpace()[0] );
 | 
|  |    259 |     AknTextUtils::ReplaceCharacters( iFormatString, KFmgrParagraphSeparator, KFmgrSpace()[0] );
 | 
|  |    260 | 
 | 
|  |    261 |     TInt iconIndex( iIconArray.FindIcon( iconId ) );
 | 
|  |    262 |     if ( iconIndex >= 0 )
 | 
|  |    263 |         {
 | 
|  |    264 |         iFormatString.Insert( 0, KFmgrTab );
 | 
|  |    265 |         TBuf<KFmgrMaximumSizeOfIconIdString> numBuf;
 | 
|  |    266 |         numBuf.Copy( KIconStr );
 | 
|  |    267 |         numBuf.Format( KIconStr, iconIndex );
 | 
|  |    268 |         iFormatString.Insert( 0, numBuf );
 | 
|  |    269 |         }
 | 
|  |    270 |     else
 | 
|  |    271 |         {
 | 
|  |    272 |         SetError( iconIndex );
 | 
|  |    273 |         }
 | 
|  |    274 | 
 | 
|  |    275 |     if ( err == KErrNone && prop && prop->IsDrive() )
 | 
|  |    276 |         {
 | 
|  |    277 |         TFileManagerDriveInfo drvInfo;
 | 
|  |    278 |         TRAP( err, iEngine.GetDriveInfoL( prop->DriveId(), drvInfo ) );
 | 
|  |    279 |         if ( err == KErrNone )
 | 
|  |    280 |             {
 | 
|  |    281 |             // Show free space for accessible local drives
 | 
|  |    282 |             if ( ( drvInfo.iState & TFileManagerDriveInfo::EDrivePresent ) &&
 | 
|  |    283 |                  !( drvInfo.iState & ( TFileManagerDriveInfo::EDriveRemote |
 | 
|  |    284 |                                        TFileManagerDriveInfo::EDriveCorrupted |
 | 
|  |    285 |                                        TFileManagerDriveInfo::EDriveLocked |
 | 
|  |    286 |                                        TFileManagerDriveInfo::EDriveInUse ) ) )
 | 
|  |    287 |                 {
 | 
|  |    288 |                 HBufC* freeSpace = NULL;
 | 
|  |    289 |                 TRAP( err, freeSpace = GetFreeSpaceStringL( drvInfo.iSpaceFree ) );
 | 
|  |    290 |                 if ( err == KErrNone )
 | 
|  |    291 |                     {
 | 
|  |    292 |                     iFormatString.Append( KFmgrTab );
 | 
|  |    293 |                     iFormatString.Append( *freeSpace );
 | 
|  |    294 |                     }
 | 
|  |    295 |                 else
 | 
|  |    296 |                     {
 | 
|  |    297 |                     SetError( err );
 | 
|  |    298 |                     }
 | 
|  |    299 |                 delete freeSpace;
 | 
|  |    300 |                 }
 | 
|  |    301 |             // Show connection icon for connected remote drives
 | 
|  |    302 |             else if ( ( drvInfo.iState & TFileManagerDriveInfo::EDriveRemote ) &&
 | 
|  |    303 |                       ( drvInfo.iState & TFileManagerDriveInfo::EDriveConnected ) )
 | 
|  |    304 |                 {
 | 
|  |    305 |                 iconIndex = iIconArray.FindIcon(
 | 
|  |    306 |                     EFileManagerRemoteDriveConnectedIcon );
 | 
|  |    307 |                 if ( iconIndex >= 0 )
 | 
|  |    308 |                     {
 | 
|  |    309 |                     iFormatString.Append( KFmgrTab );
 | 
|  |    310 |                     iFormatString.Append( KFmgrTab );
 | 
|  |    311 |                     iFormatString.AppendNum( iconIndex );
 | 
|  |    312 |                     }
 | 
|  |    313 |                 else if ( iconIndex != KErrNotFound )
 | 
|  |    314 |                     {
 | 
|  |    315 |                     SetError( iconIndex );
 | 
|  |    316 |                     }
 | 
|  |    317 |                 }
 | 
|  |    318 |             }
 | 
|  |    319 |         }
 | 
|  |    320 |     else if ( err == KErrNone && prop && !prop->FullPath().Length() )
 | 
|  |    321 |         {
 | 
|  |    322 |         // Show the latest backup date
 | 
|  |    323 |         TTime time( 0 );
 | 
|  |    324 |         if( prop->ModifiedLocalDate( time ) == KErrNone )
 | 
|  |    325 |             {
 | 
|  |    326 |             HBufC* date = NULL;
 | 
|  |    327 |             if ( !(time.DateTime().Year()) )
 | 
|  |    328 |             	{
 | 
|  |    329 |             	iFormatString.Append( KFmgrTab );
 | 
|  |    330 |             	iFormatString.Append( KNullDesC );
 | 
|  |    331 |             	}
 | 
|  |    332 |             else
 | 
|  |    333 |             	{
 | 
|  |    334 | 	            
 | 
|  |    335 | 	            TRAPD( err2, date = DateStringL( time ) );
 | 
|  |    336 | 	            if ( err2 == KErrNone )
 | 
|  |    337 | 	                {
 | 
|  |    338 | 	                iFormatString.Append( KFmgrTab );
 | 
|  |    339 | 	                iFormatString.Append( *date );
 | 
|  |    340 | 	                delete date;
 | 
|  |    341 | 	                }
 | 
|  |    342 |             	}
 | 
|  |    343 |             }
 | 
|  |    344 |         }
 | 
|  |    345 | 
 | 
|  |    346 |     delete prop;
 | 
|  |    347 | 
 | 
|  |    348 |     TRAP( err, StoreFormattedStringL( aIndex ) );
 | 
|  |    349 |     if( err != KErrNone )
 | 
|  |    350 |         {
 | 
|  |    351 |         Clear();
 | 
|  |    352 |         SetError( err );
 | 
|  |    353 |         }
 | 
|  |    354 | 
 | 
|  |    355 |     return iFormatString;
 | 
|  |    356 |     }
 | 
|  |    357 | 
 | 
|  |    358 | // -----------------------------------------------------------------------------
 | 
|  |    359 | // CFileManagerStringCache::Clear
 | 
|  |    360 | // 
 | 
|  |    361 | // -----------------------------------------------------------------------------
 | 
|  |    362 | // 
 | 
|  |    363 | void CFileManagerStringCache::Clear() const
 | 
|  |    364 |     {
 | 
|  |    365 |     for ( TInt i( 0 ); i < KNumStringCacheItems; i++ )
 | 
|  |    366 |         {
 | 
|  |    367 |         Clear( i );
 | 
|  |    368 |         }
 | 
|  |    369 |     iError = KErrNone;
 | 
|  |    370 |     }
 | 
|  |    371 | 
 | 
|  |    372 | // -----------------------------------------------------------------------------
 | 
|  |    373 | // CFileManagerStringCache::FormattedStringFound
 | 
|  |    374 | // 
 | 
|  |    375 | // -----------------------------------------------------------------------------
 | 
|  |    376 | // 
 | 
|  |    377 | TInt CFileManagerStringCache::FormattedStringFound( TInt aIndex ) const
 | 
|  |    378 |     {
 | 
|  |    379 |     for ( TInt i( 0 ); i < KNumStringCacheItems; i++ )
 | 
|  |    380 |         {
 | 
|  |    381 |         if ( iFormattedItems[ i ].iIndex == aIndex )
 | 
|  |    382 |             {
 | 
|  |    383 |             return i;
 | 
|  |    384 |             }
 | 
|  |    385 |         }
 | 
|  |    386 |     return KErrNotFound;
 | 
|  |    387 |     }
 | 
|  |    388 | 
 | 
|  |    389 | // -----------------------------------------------------------------------------
 | 
|  |    390 | // CFileManagerStringCache::FormattedString
 | 
|  |    391 | // 
 | 
|  |    392 | // -----------------------------------------------------------------------------
 | 
|  |    393 | // 
 | 
|  |    394 | TPtrC CFileManagerStringCache::FormattedString( TInt aIndex ) const 
 | 
|  |    395 |     {
 | 
|  |    396 |     TCacheItem& item = iFormattedItems[ aIndex ];
 | 
|  |    397 |     if ( item.iString )
 | 
|  |    398 |         {
 | 
|  |    399 |         return item.iString->Des();
 | 
|  |    400 |         }
 | 
|  |    401 |     return TPtrC( KNullDesC );
 | 
|  |    402 |     }
 | 
|  |    403 |  
 | 
|  |    404 | // -----------------------------------------------------------------------------
 | 
|  |    405 | // CFileManagerStringCache::StoreFormattedString
 | 
|  |    406 | // 
 | 
|  |    407 | // -----------------------------------------------------------------------------
 | 
|  |    408 | // 
 | 
|  |    409 | void CFileManagerStringCache::StoreFormattedStringL( TInt aIndex ) const
 | 
|  |    410 |     {
 | 
|  |    411 |     TInt count( MdcaCount() );
 | 
|  |    412 |     TInt replace( 0 );
 | 
|  |    413 |     TInt maxDist( 0 );
 | 
|  |    414 | 
 | 
|  |    415 |     // Find index to be replaced for cyclic list scroll
 | 
|  |    416 |     for ( TInt i( 0 ); i < KNumStringCacheItems; i++ )
 | 
|  |    417 |         {
 | 
|  |    418 |         TCacheItem& item = iFormattedItems[ i ];
 | 
|  |    419 |         if ( item.iIndex != KErrNotFound )
 | 
|  |    420 |             {
 | 
|  |    421 |             TInt dist( Min( Abs( item.iIndex - aIndex ),
 | 
|  |    422 |                 ( count - aIndex ) + item.iIndex ) );
 | 
|  |    423 |             if ( dist > maxDist )
 | 
|  |    424 |                 {
 | 
|  |    425 |                 maxDist = dist;
 | 
|  |    426 |                 replace = i;
 | 
|  |    427 |                 }
 | 
|  |    428 |             }
 | 
|  |    429 |         else
 | 
|  |    430 |             {
 | 
|  |    431 |             replace = i;
 | 
|  |    432 |             break;
 | 
|  |    433 |             }
 | 
|  |    434 |         }
 | 
|  |    435 |     // Setup new cached item
 | 
|  |    436 |     Clear( replace );
 | 
|  |    437 |     TCacheItem& item = iFormattedItems[ replace ];
 | 
|  |    438 |     item.iString = iFormatString.AllocL();
 | 
|  |    439 |     item.iIndex = aIndex;
 | 
|  |    440 |     }
 | 
|  |    441 | 
 | 
|  |    442 | // -----------------------------------------------------------------------------
 | 
|  |    443 | // CFileManagerStringCache::Clear
 | 
|  |    444 | // 
 | 
|  |    445 | // -----------------------------------------------------------------------------
 | 
|  |    446 | // 
 | 
|  |    447 | void CFileManagerStringCache::Clear( TInt aIndex ) const
 | 
|  |    448 |     {
 | 
|  |    449 |     TCacheItem& item = iFormattedItems[ aIndex ];
 | 
|  |    450 |     delete item.iString;
 | 
|  |    451 |     item.iString = NULL;
 | 
|  |    452 |     item.iIndex = KErrNotFound;
 | 
|  |    453 |     }
 | 
|  |    454 | 
 | 
|  |    455 | // -----------------------------------------------------------------------------
 | 
|  |    456 | // CFileManagerStringCache::LastError
 | 
|  |    457 | // 
 | 
|  |    458 | // -----------------------------------------------------------------------------
 | 
|  |    459 | // 
 | 
|  |    460 | TInt CFileManagerStringCache::LastError() const
 | 
|  |    461 |     {
 | 
|  |    462 |     return iError;
 | 
|  |    463 |     }
 | 
|  |    464 | 
 | 
|  |    465 | // -----------------------------------------------------------------------------
 | 
|  |    466 | // CFileManagerStringCache::SetError
 | 
|  |    467 | // 
 | 
|  |    468 | // -----------------------------------------------------------------------------
 | 
|  |    469 | // 
 | 
|  |    470 | void CFileManagerStringCache::SetError( TInt aError ) const
 | 
|  |    471 |     {
 | 
|  |    472 |     if ( aError == KErrNoMemory ||
 | 
|  |    473 |         ( aError != KErrNone && iError == KErrNone ) )
 | 
|  |    474 |         {
 | 
|  |    475 |         iError = aError;
 | 
|  |    476 |         }
 | 
|  |    477 |     }
 | 
|  |    478 | 
 | 
|  |    479 | // End of File
 |