gssettingsuis/Gs/GSFramework/src/GSPluginAndViewIdCache.cpp
author hgs
Thu, 04 Nov 2010 13:38:47 +0800
changeset 68 13e71d907dc3
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*           Plugin and view id caching support
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include "GSPluginAndViewIdCache.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// System includes
hgs
parents:
diff changeset
    24
#include <bautils.h>
hgs
parents:
diff changeset
    25
#include <s32file.h>
hgs
parents:
diff changeset
    26
#include <eikappui.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// User includes
hgs
parents:
diff changeset
    29
#include "GSShimmedView.h"
hgs
parents:
diff changeset
    30
#include "GSPlaceholderView.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// Constants
hgs
parents:
diff changeset
    33
_LIT( KGSCacheFileName, "PluginUidToViewIdCache.dat" );
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
// CGSPluginAndViewIdCache::CGSPluginAndViewIdCache
hgs
parents:
diff changeset
    40
// C++ constructor.
hgs
parents:
diff changeset
    41
//
hgs
parents:
diff changeset
    42
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    43
//
hgs
parents:
diff changeset
    44
CGSPluginAndViewIdCache::CGSPluginAndViewIdCache( CEikAppUi& aAppUi )
hgs
parents:
diff changeset
    45
:   iAppUi( aAppUi ), iFsSession(CCoeEnv::Static()->FsSession()),iLookupTable( &HashFunction, &HashIdentityRelation )
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    50
// CGSPluginAndViewIdCache::~CGSPluginAndViewIdCache
hgs
parents:
diff changeset
    51
// C++ destructor.
hgs
parents:
diff changeset
    52
//
hgs
parents:
diff changeset
    53
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    54
//
hgs
parents:
diff changeset
    55
CGSPluginAndViewIdCache::~CGSPluginAndViewIdCache()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    TRAP_IGNORE( StoreL() );
hgs
parents:
diff changeset
    58
    //
hgs
parents:
diff changeset
    59
    delete iPlaceholderView;
hgs
parents:
diff changeset
    60
    DestroyShims();
hgs
parents:
diff changeset
    61
    iLookupTable.Close();
hgs
parents:
diff changeset
    62
    //
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// CGSPluginAndViewIdCache::ConstructL
hgs
parents:
diff changeset
    68
// 
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
void CGSPluginAndViewIdCache::ConstructL()
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
    User::LeaveIfError( iFsSession.CreatePrivatePath( EDriveC ) );
hgs
parents:
diff changeset
    75
    //
hgs
parents:
diff changeset
    76
    iPlaceholderView = CGSPlaceholderView::NewL( iAppUi );
hgs
parents:
diff changeset
    77
    //
hgs
parents:
diff changeset
    78
    TRAP_IGNORE( RestoreL() );
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    83
// CGSPluginAndViewIdCache::NewL
hgs
parents:
diff changeset
    84
// 
hgs
parents:
diff changeset
    85
//
hgs
parents:
diff changeset
    86
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
//
hgs
parents:
diff changeset
    88
CGSPluginAndViewIdCache* CGSPluginAndViewIdCache::NewL( CEikAppUi& aAppUi )
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
    CGSPluginAndViewIdCache* self = new(ELeave) CGSPluginAndViewIdCache( aAppUi );
hgs
parents:
diff changeset
    91
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    92
    self->ConstructL();
hgs
parents:
diff changeset
    93
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    94
    return self;
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    99
// CGSPluginAndViewIdCache::ActivatePlaceholderViewL
hgs
parents:
diff changeset
   100
// 
hgs
parents:
diff changeset
   101
//
hgs
parents:
diff changeset
   102
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
//
hgs
parents:
diff changeset
   104
void CGSPluginAndViewIdCache::ActivatePlaceholderViewL()
hgs
parents:
diff changeset
   105
    {
hgs
parents:
diff changeset
   106
    iPlaceholderView->ActivateL();
hgs
parents:
diff changeset
   107
    }
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   111
// CGSPluginAndViewIdCache::PriorToPlaceholderActiveViewId
hgs
parents:
diff changeset
   112
//
hgs
parents:
diff changeset
   113
// 
hgs
parents:
diff changeset
   114
// ----------------------------------------------------------------------------
hgs
parents:
diff changeset
   115
//
hgs
parents:
diff changeset
   116
const TVwsViewId& CGSPluginAndViewIdCache::PriorToPlaceholderActiveViewId() const
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
    return iPlaceholderView->PreviouslyActiveViewId();
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
// CGSPluginAndViewIdCache::SetPriorToPlaceholderActiveViewId
hgs
parents:
diff changeset
   124
// 
hgs
parents:
diff changeset
   125
//
hgs
parents:
diff changeset
   126
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   127
//
hgs
parents:
diff changeset
   128
void CGSPluginAndViewIdCache::SetPriorToPlaceholderActiveViewId( const TVwsViewId& aViewId )
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
    iPlaceholderView->SetPreviouslyActiveViewId( aViewId );
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
// CGSPluginAndViewIdCache::RegisterViewAndImplementationAssociationL
hgs
parents:
diff changeset
   136
// 
hgs
parents:
diff changeset
   137
//
hgs
parents:
diff changeset
   138
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   139
//
hgs
parents:
diff changeset
   140
void CGSPluginAndViewIdCache::RegisterViewAndImplementationAssociationL( TUid aViewId, TUid aImplementationUid )
hgs
parents:
diff changeset
   141
    {
hgs
parents:
diff changeset
   142
    RegisterViewAndImplementationAssociationL( aViewId, aImplementationUid, EFalse );
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   147
// CGSPluginAndViewIdCache::PrepareToRegisterPluginInstanceLC
hgs
parents:
diff changeset
   148
// 
hgs
parents:
diff changeset
   149
//
hgs
parents:
diff changeset
   150
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   151
//
hgs
parents:
diff changeset
   152
void CGSPluginAndViewIdCache::PrepareToRegisterPluginInstanceLC( TUid aViewId )
hgs
parents:
diff changeset
   153
    {
hgs
parents:
diff changeset
   154
    TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   155
    if  ( value && value->iShim )
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
        // Store cleanup view uid so that we know which shim to re-register
hgs
parents:
diff changeset
   158
        // if the cleanup item is invoked.
hgs
parents:
diff changeset
   159
        iTransientCleanupViewUid = aViewId;
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
        // Prepare item
hgs
parents:
diff changeset
   162
        TCleanupItem item( ReRegisterShimWithUi, this );
hgs
parents:
diff changeset
   163
        CleanupStack::PushL( item );
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
        // Unregister shim view
hgs
parents:
diff changeset
   166
        value->iShim->DeregisterView();
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
        // If a leave now occurs, the cleanup stack will unwind and will
hgs
parents:
diff changeset
   169
        // invoke our cleanup item. This item will then re-add
hgs
parents:
diff changeset
   170
        // the specified shim to the view framework. See ReRegisterShimWithUiL
hgs
parents:
diff changeset
   171
        // for further details.
hgs
parents:
diff changeset
   172
        }
hgs
parents:
diff changeset
   173
    else
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        // Record not found - just push NULL to ensure cleanup stack
hgs
parents:
diff changeset
   176
        // remains balanced.
hgs
parents:
diff changeset
   177
        CleanupStack::PushL( (CBase*) NULL );
hgs
parents:
diff changeset
   178
        }
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   183
// CGSPluginAndViewIdCache::RegisterPluginInstanceL
hgs
parents:
diff changeset
   184
// 
hgs
parents:
diff changeset
   185
//
hgs
parents:
diff changeset
   186
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   187
//
hgs
parents:
diff changeset
   188
void CGSPluginAndViewIdCache::RegisterPluginInstanceL( TUid aViewId, CGSPluginInterface& aPluginInstance )
hgs
parents:
diff changeset
   189
    {
hgs
parents:
diff changeset
   190
    TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   191
    ASSERT( value != NULL );
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    // Can now associate the plugin instance with the cache entry.
hgs
parents:
diff changeset
   194
    value->iLoadedPluginImplementation = &aPluginInstance;
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   199
// CGSPluginAndViewIdCache::PluginImplementationUidForView
hgs
parents:
diff changeset
   200
// 
hgs
parents:
diff changeset
   201
//
hgs
parents:
diff changeset
   202
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   203
//
hgs
parents:
diff changeset
   204
TBool CGSPluginAndViewIdCache::IsPluginLoaded( TUid aViewId ) const
hgs
parents:
diff changeset
   205
    {
hgs
parents:
diff changeset
   206
    CGSPluginInterface* instance = PluginInstance( aViewId );
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
    TBool loaded = EFalse;
hgs
parents:
diff changeset
   209
    if ( instance )
hgs
parents:
diff changeset
   210
        {
hgs
parents:
diff changeset
   211
        loaded = ETrue;
hgs
parents:
diff changeset
   212
        }
hgs
parents:
diff changeset
   213
    
hgs
parents:
diff changeset
   214
    return loaded;
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   219
// CGSPluginAndViewIdCache::PluginInstance
hgs
parents:
diff changeset
   220
// 
hgs
parents:
diff changeset
   221
//
hgs
parents:
diff changeset
   222
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   223
//
hgs
parents:
diff changeset
   224
CGSPluginInterface* CGSPluginAndViewIdCache::PluginInstance( TUid aViewId ) const
hgs
parents:
diff changeset
   225
    {
hgs
parents:
diff changeset
   226
    CGSPluginInterface* ret = NULL;
hgs
parents:
diff changeset
   227
    //
hgs
parents:
diff changeset
   228
    const TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   229
    if  ( value )
hgs
parents:
diff changeset
   230
        {
hgs
parents:
diff changeset
   231
        ret = value->iLoadedPluginImplementation;
hgs
parents:
diff changeset
   232
        }
hgs
parents:
diff changeset
   233
    //
hgs
parents:
diff changeset
   234
    return ret;
hgs
parents:
diff changeset
   235
    }
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   239
// CGSPluginAndViewIdCache::PluginImplementationUidForView
hgs
parents:
diff changeset
   240
// 
hgs
parents:
diff changeset
   241
//
hgs
parents:
diff changeset
   242
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   243
//
hgs
parents:
diff changeset
   244
TUid CGSPluginAndViewIdCache::PluginImplementationUidForView( TUid aViewId ) const
hgs
parents:
diff changeset
   245
    {
hgs
parents:
diff changeset
   246
    TUid pluginUid = KNullUid;
hgs
parents:
diff changeset
   247
    //
hgs
parents:
diff changeset
   248
    const TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   249
    if  ( value )
hgs
parents:
diff changeset
   250
        {
hgs
parents:
diff changeset
   251
        pluginUid = value->iImplementationUid;
hgs
parents:
diff changeset
   252
        }
hgs
parents:
diff changeset
   253
    //
hgs
parents:
diff changeset
   254
    return pluginUid;
hgs
parents:
diff changeset
   255
    }
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   259
// CGSPluginAndViewIdCache::DestroyShims
hgs
parents:
diff changeset
   260
// 
hgs
parents:
diff changeset
   261
//
hgs
parents:
diff changeset
   262
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   263
//
hgs
parents:
diff changeset
   264
void CGSPluginAndViewIdCache::DestroyShims()
hgs
parents:
diff changeset
   265
    {
hgs
parents:
diff changeset
   266
	RHashMap< TUid, TCacheEntry >::TIter iterator( iLookupTable );
hgs
parents:
diff changeset
   267
    FOREVER
hgs
parents:
diff changeset
   268
		{
hgs
parents:
diff changeset
   269
		const TUid* key = iterator.NextKey();
hgs
parents:
diff changeset
   270
		if  ( key )
hgs
parents:
diff changeset
   271
            {
hgs
parents:
diff changeset
   272
            TCacheEntry* value = iterator.CurrentValue();
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
            // Destroy shim instance
hgs
parents:
diff changeset
   275
            delete value->iShim;
hgs
parents:
diff changeset
   276
            value->iShim = NULL;
hgs
parents:
diff changeset
   277
            }
hgs
parents:
diff changeset
   278
        else
hgs
parents:
diff changeset
   279
            {
hgs
parents:
diff changeset
   280
			break;
hgs
parents:
diff changeset
   281
            }
hgs
parents:
diff changeset
   282
		}
hgs
parents:
diff changeset
   283
    }
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
// CGSPluginAndViewIdCache::RestoreL
hgs
parents:
diff changeset
   288
// 
hgs
parents:
diff changeset
   289
//
hgs
parents:
diff changeset
   290
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   291
//
hgs
parents:
diff changeset
   292
void CGSPluginAndViewIdCache::RestoreL()
hgs
parents:
diff changeset
   293
    {
hgs
parents:
diff changeset
   294
    TFileName* cacheFile = new(ELeave) TFileName();
hgs
parents:
diff changeset
   295
    CleanupStack::PushL( cacheFile );
hgs
parents:
diff changeset
   296
    GetCacheFileNameL( *cacheFile );
hgs
parents:
diff changeset
   297
    //
hgs
parents:
diff changeset
   298
    if  ( BaflUtils::FileExists( iFsSession, *cacheFile ) )
hgs
parents:
diff changeset
   299
        {
hgs
parents:
diff changeset
   300
        RFileReadStream cacheStream;
hgs
parents:
diff changeset
   301
        TInt error = cacheStream.Open( iFsSession, *cacheFile, EFileRead );
hgs
parents:
diff changeset
   302
        User::LeaveIfError( error );
hgs
parents:
diff changeset
   303
        CleanupClosePushL( cacheStream );
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
        // Now read in cache hash table
hgs
parents:
diff changeset
   306
        TUid key = KNullUid;
hgs
parents:
diff changeset
   307
        TUid value = KNullUid;
hgs
parents:
diff changeset
   308
        
hgs
parents:
diff changeset
   309
        const TInt entryCount = cacheStream.ReadInt32L();
hgs
parents:
diff changeset
   310
        for( TInt i=0; i<entryCount; i++ )
hgs
parents:
diff changeset
   311
            {
hgs
parents:
diff changeset
   312
            key.iUid = cacheStream.ReadUint32L();
hgs
parents:
diff changeset
   313
            value.iUid = cacheStream.ReadUint32L();
hgs
parents:
diff changeset
   314
            //
hgs
parents:
diff changeset
   315
            RegisterViewAndImplementationAssociationL( key, value, ETrue );
hgs
parents:
diff changeset
   316
            }
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
        CleanupStack::PopAndDestroy( &cacheStream );
hgs
parents:
diff changeset
   319
        }
hgs
parents:
diff changeset
   320
    //
hgs
parents:
diff changeset
   321
    CleanupStack::PopAndDestroy( cacheFile );
hgs
parents:
diff changeset
   322
    }
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   326
// CGSPluginAndViewIdCache::StoreL
hgs
parents:
diff changeset
   327
// 
hgs
parents:
diff changeset
   328
//
hgs
parents:
diff changeset
   329
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   330
//
hgs
parents:
diff changeset
   331
void CGSPluginAndViewIdCache::StoreL()
hgs
parents:
diff changeset
   332
    {
hgs
parents:
diff changeset
   333
    TFileName* intermediateFileName = new(ELeave) TFileName();
hgs
parents:
diff changeset
   334
    CleanupStack::PushL( intermediateFileName );
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
    TFileName* cachePath = new(ELeave) TFileName();
hgs
parents:
diff changeset
   337
    CleanupStack::PushL( cachePath );
hgs
parents:
diff changeset
   338
    GetCachePathL( *cachePath );
hgs
parents:
diff changeset
   339
    
hgs
parents:
diff changeset
   340
    // Create a temporary file in the GS private data cage to contain
hgs
parents:
diff changeset
   341
    // the cache data. We'll rename this to the real cache file name
hgs
parents:
diff changeset
   342
    // once the operation has been completed successfully.
hgs
parents:
diff changeset
   343
    RFile intermediateCacheFile;
hgs
parents:
diff changeset
   344
    TInt error = intermediateCacheFile.Temp( iFsSession, *cachePath, *intermediateFileName, EFileWrite );
hgs
parents:
diff changeset
   345
    User::LeaveIfError( error );
hgs
parents:
diff changeset
   346
  
hgs
parents:
diff changeset
   347
    // Create a stream from the file. Stream takes ownership of file
hgs
parents:
diff changeset
   348
    RFileWriteStream stream( intermediateCacheFile );
hgs
parents:
diff changeset
   349
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
    // Write each entry to the stream
hgs
parents:
diff changeset
   352
    stream.WriteUint32L( iLookupTable.Count() );
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
	RHashMap< TUid, TCacheEntry >::TIter iterator( iLookupTable );
hgs
parents:
diff changeset
   355
    FOREVER
hgs
parents:
diff changeset
   356
		{
hgs
parents:
diff changeset
   357
		const TUid* key = iterator.NextKey();
hgs
parents:
diff changeset
   358
		if  ( key )
hgs
parents:
diff changeset
   359
            {
hgs
parents:
diff changeset
   360
            const TCacheEntry* value = iterator.CurrentValue();
hgs
parents:
diff changeset
   361
            stream.WriteUint32L( key->iUid );
hgs
parents:
diff changeset
   362
            stream.WriteUint32L( value->iImplementationUid.iUid );
hgs
parents:
diff changeset
   363
            }
hgs
parents:
diff changeset
   364
        else
hgs
parents:
diff changeset
   365
            {
hgs
parents:
diff changeset
   366
			break;
hgs
parents:
diff changeset
   367
            }
hgs
parents:
diff changeset
   368
		}
hgs
parents:
diff changeset
   369
	
hgs
parents:
diff changeset
   370
    // Finalise the stream
hgs
parents:
diff changeset
   371
    stream.CommitL();
hgs
parents:
diff changeset
   372
    stream.Close(); // Also closes the file
hgs
parents:
diff changeset
   373
    CleanupStack::PopAndDestroy( &stream ); 
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
    // If we got this far it means we created the cache file successfully.
hgs
parents:
diff changeset
   376
    // Now its okay to replace any pre-existing cache file with the
hgs
parents:
diff changeset
   377
    // file we just created. We're re-use the cachePath variable for the
hgs
parents:
diff changeset
   378
    // ultimate filename since it saves allocating another 1/2kb on the heap.
hgs
parents:
diff changeset
   379
    GetCacheFileNameL( *cachePath );
hgs
parents:
diff changeset
   380
    if  ( BaflUtils::FileExists( iFsSession, *cachePath ) )
hgs
parents:
diff changeset
   381
        {
hgs
parents:
diff changeset
   382
        error = iFsSession.Delete( *cachePath );
hgs
parents:
diff changeset
   383
        User::LeaveIfError( error );
hgs
parents:
diff changeset
   384
        }
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
    // Now rename intermediate file name to ultimate cache file name.
hgs
parents:
diff changeset
   387
    error = iFsSession.Rename( *intermediateFileName, *cachePath );
hgs
parents:
diff changeset
   388
    User::LeaveIfError( error );
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
    CleanupStack::PopAndDestroy( 2, intermediateFileName );
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   395
// CGSPluginAndViewIdCache::GetCacheFileNameL
hgs
parents:
diff changeset
   396
// 
hgs
parents:
diff changeset
   397
//
hgs
parents:
diff changeset
   398
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   399
//
hgs
parents:
diff changeset
   400
void CGSPluginAndViewIdCache::GetCacheFileNameL( TDes& aFileName )
hgs
parents:
diff changeset
   401
    {
hgs
parents:
diff changeset
   402
    GetCachePathL( aFileName );
hgs
parents:
diff changeset
   403
    aFileName.Append( KGSCacheFileName );
hgs
parents:
diff changeset
   404
    }
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
hgs
parents:
diff changeset
   407
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   408
// CGSPluginAndViewIdCache::GetCachePathL
hgs
parents:
diff changeset
   409
// 
hgs
parents:
diff changeset
   410
//
hgs
parents:
diff changeset
   411
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   412
//
hgs
parents:
diff changeset
   413
void CGSPluginAndViewIdCache::GetCachePathL( TDes& aPath )
hgs
parents:
diff changeset
   414
    {
hgs
parents:
diff changeset
   415
    aPath.Zero();
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
    // Get private data cage path
hgs
parents:
diff changeset
   418
    TInt err = iFsSession.PrivatePath( aPath );
hgs
parents:
diff changeset
   419
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
    // Combine with C: drive
hgs
parents:
diff changeset
   422
    const TDriveUnit cDrive( EDriveC );
hgs
parents:
diff changeset
   423
    const TDriveName cDriveName( cDrive.Name() );
hgs
parents:
diff changeset
   424
    aPath.Insert( 0, cDriveName );
hgs
parents:
diff changeset
   425
    }
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   429
// CGSPluginAndViewIdCache::RegisterViewAndImplementationAssociationL
hgs
parents:
diff changeset
   430
// 
hgs
parents:
diff changeset
   431
//
hgs
parents:
diff changeset
   432
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   433
//
hgs
parents:
diff changeset
   434
void CGSPluginAndViewIdCache::RegisterViewAndImplementationAssociationL( TUid aViewId, TUid aImplementationUid, TBool aCreateShim )
hgs
parents:
diff changeset
   435
    {
hgs
parents:
diff changeset
   436
    // Check if aViewId is a key within the look up table, so as to avoid
hgs
parents:
diff changeset
   437
    // adding duplicate entries...
hgs
parents:
diff changeset
   438
    const TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   439
    if  ( !value )
hgs
parents:
diff changeset
   440
        {
hgs
parents:
diff changeset
   441
        // No registration for this view yet, so create a new entry
hgs
parents:
diff changeset
   442
        TCacheEntry cacheEntry;
hgs
parents:
diff changeset
   443
        cacheEntry.iImplementationUid = aImplementationUid;
hgs
parents:
diff changeset
   444
        cacheEntry.iLoadedPluginImplementation = NULL;
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
        if  ( aCreateShim )
hgs
parents:
diff changeset
   447
            {
hgs
parents:
diff changeset
   448
            // Create a new shim
hgs
parents:
diff changeset
   449
            cacheEntry.iShim = CGSShimmedView::NewLC( aViewId, *this, iAppUi );
hgs
parents:
diff changeset
   450
            }
hgs
parents:
diff changeset
   451
        else
hgs
parents:
diff changeset
   452
            {
hgs
parents:
diff changeset
   453
            cacheEntry.iShim = NULL;
hgs
parents:
diff changeset
   454
            }
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
        // Add entry to table - the shim ownership is also transferred 
hgs
parents:
diff changeset
   457
        // at this point, since the destructor of this class will
hgs
parents:
diff changeset
   458
        // destroy all shims.
hgs
parents:
diff changeset
   459
        iLookupTable.InsertL( aViewId, cacheEntry );
hgs
parents:
diff changeset
   460
        
hgs
parents:
diff changeset
   461
        if  ( aCreateShim )
hgs
parents:
diff changeset
   462
            {
hgs
parents:
diff changeset
   463
            CleanupStack::Pop( cacheEntry.iShim );
hgs
parents:
diff changeset
   464
            }
hgs
parents:
diff changeset
   465
        }
hgs
parents:
diff changeset
   466
    }
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   470
// CGSPluginAndViewIdCache::PrepareForUIDestruction
hgs
parents:
diff changeset
   471
// 
hgs
parents:
diff changeset
   472
//
hgs
parents:
diff changeset
   473
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   474
//
hgs
parents:
diff changeset
   475
void CGSPluginAndViewIdCache::PrepareForUIDestruction()
hgs
parents:
diff changeset
   476
    {
hgs
parents:
diff changeset
   477
    // Have to remove all UI furniture before the AppUi rug is pulled out
hgs
parents:
diff changeset
   478
    // from underneath us...
hgs
parents:
diff changeset
   479
    DestroyShims();
hgs
parents:
diff changeset
   480
    //
hgs
parents:
diff changeset
   481
    delete iPlaceholderView;
hgs
parents:
diff changeset
   482
    iPlaceholderView = NULL;
hgs
parents:
diff changeset
   483
    }
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   487
// CGSPluginAndViewIdCache::HandleShimDestruction
hgs
parents:
diff changeset
   488
// 
hgs
parents:
diff changeset
   489
//
hgs
parents:
diff changeset
   490
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
//
hgs
parents:
diff changeset
   492
void CGSPluginAndViewIdCache::HandleShimDestruction( TUid aViewId )
hgs
parents:
diff changeset
   493
    {
hgs
parents:
diff changeset
   494
    TCacheEntry* value = iLookupTable.Find( aViewId );
hgs
parents:
diff changeset
   495
    if  ( value && value->iShim )
hgs
parents:
diff changeset
   496
        {
hgs
parents:
diff changeset
   497
        // The shim has been destroyed.
hgs
parents:
diff changeset
   498
        value->iShim = NULL;
hgs
parents:
diff changeset
   499
        }
hgs
parents:
diff changeset
   500
    }
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   504
// CGSPluginAndViewIdCache::ReRegisterShimWithUi
hgs
parents:
diff changeset
   505
// 
hgs
parents:
diff changeset
   506
//
hgs
parents:
diff changeset
   507
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   508
//
hgs
parents:
diff changeset
   509
void CGSPluginAndViewIdCache::ReRegisterShimWithUi( TAny* aSelf )
hgs
parents:
diff changeset
   510
    {
hgs
parents:
diff changeset
   511
    CGSPluginAndViewIdCache* self = reinterpret_cast< CGSPluginAndViewIdCache* >( aSelf );
hgs
parents:
diff changeset
   512
    //
hgs
parents:
diff changeset
   513
    if  ( self->iTransientCleanupViewUid != KNullUid )
hgs
parents:
diff changeset
   514
        {
hgs
parents:
diff changeset
   515
        TCacheEntry* value = self->iLookupTable.Find( self->iTransientCleanupViewUid );
hgs
parents:
diff changeset
   516
        if  ( value && value->iShim )
hgs
parents:
diff changeset
   517
            {
hgs
parents:
diff changeset
   518
            TRAP_IGNORE( value->iShim->RegisterViewL() );
hgs
parents:
diff changeset
   519
            }
hgs
parents:
diff changeset
   520
        }
hgs
parents:
diff changeset
   521
    //
hgs
parents:
diff changeset
   522
    self->iTransientCleanupViewUid = KNullUid;
hgs
parents:
diff changeset
   523
    }
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   527
// CGSPluginAndViewIdCache::HashFunction
hgs
parents:
diff changeset
   528
// 
hgs
parents:
diff changeset
   529
//
hgs
parents:
diff changeset
   530
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
//
hgs
parents:
diff changeset
   532
TUint32 CGSPluginAndViewIdCache::HashFunction( const TUid& aViewId )
hgs
parents:
diff changeset
   533
    {
hgs
parents:
diff changeset
   534
    const TUint32 hash = DefaultHash::Integer( aViewId.iUid );
hgs
parents:
diff changeset
   535
    return hash;
hgs
parents:
diff changeset
   536
    }
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
hgs
parents:
diff changeset
   539
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   540
// CGSPluginAndViewIdCache::HashIdentityRelation
hgs
parents:
diff changeset
   541
// 
hgs
parents:
diff changeset
   542
//
hgs
parents:
diff changeset
   543
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   544
//
hgs
parents:
diff changeset
   545
TBool CGSPluginAndViewIdCache::HashIdentityRelation( const TUid& aLeft, const TUid& aRight )
hgs
parents:
diff changeset
   546
    {
hgs
parents:
diff changeset
   547
    const TBool equal = ( aLeft.iUid == aRight.iUid );
hgs
parents:
diff changeset
   548
    return equal;
hgs
parents:
diff changeset
   549
    }
hgs
parents:
diff changeset
   550