perfsrv/memspy/Engine/Source/Helpers/MemSpyEngineHelperFbServ.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 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
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <memspy/engine/memspyenginehelperfbserv.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <s32mem.h>
hgs
parents:
diff changeset
    22
#include <f32file.h>
hgs
parents:
diff changeset
    23
#include <e32rom.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// Driver includes
hgs
parents:
diff changeset
    26
#include <memspy/driver/memspydriverclient.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// User includes
hgs
parents:
diff changeset
    29
#include <memspy/engine/memspyengine.h>
hgs
parents:
diff changeset
    30
#include <memspy/engine/memspyengineutils.h>
hgs
parents:
diff changeset
    31
#include <memspy/engine/memspyengineoutputsink.h>
hgs
parents:
diff changeset
    32
#include <memspy/engine/memspyengineobjectprocess.h>
hgs
parents:
diff changeset
    33
#include <memspy/engine/memspyengineobjectthread.h>
hgs
parents:
diff changeset
    34
#include <memspy/engine/memspyengineobjectcontainer.h>
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// Literal constants
hgs
parents:
diff changeset
    37
_LIT( KMemSpyEngineFBServComma, ", " );
hgs
parents:
diff changeset
    38
_LIT( KMemSpyEngineFBServExportFileName, "Image_%08x_%02d_bpp_(%d x %d).bmp");
hgs
parents:
diff changeset
    39
_LIT( KMemSpyEngineFBSLargeChunkName, "FbsLargeChunk" );
hgs
parents:
diff changeset
    40
_LIT( KMemSpyEngineFBSSharedChunkName, "FbsSharedChunk" );
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
CMemSpyEngineHelperFbServ::CMemSpyEngineHelperFbServ( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
    44
:   iEngine( aEngine )
hgs
parents:
diff changeset
    45
    {
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
CMemSpyEngineHelperFbServ::~CMemSpyEngineHelperFbServ()
hgs
parents:
diff changeset
    50
    {
hgs
parents:
diff changeset
    51
    iEngine.Driver().WalkHeapClose();
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
void CMemSpyEngineHelperFbServ::ConstructL()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
CMemSpyEngineHelperFbServ* CMemSpyEngineHelperFbServ::NewL( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
    CMemSpyEngineHelperFbServ* self = new(ELeave) CMemSpyEngineHelperFbServ( aEngine );
hgs
parents:
diff changeset
    63
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    64
    self->ConstructL();
hgs
parents:
diff changeset
    65
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    66
    return self;
hgs
parents:
diff changeset
    67
    }
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
TBool CMemSpyEngineHelperFbServ::IsLargeBitmapChunk( const TMemSpyDriverChunkInfo& aChunkInfo )
hgs
parents:
diff changeset
    71
    {
hgs
parents:
diff changeset
    72
    TBool ret = EFalse;
hgs
parents:
diff changeset
    73
    //
hgs
parents:
diff changeset
    74
    if  ( aChunkInfo.iType == EMemSpyDriverChunkTypeGlobal )
hgs
parents:
diff changeset
    75
        {
hgs
parents:
diff changeset
    76
        ret = ( aChunkInfo.iName.FindF( KMemSpyEngineFBSLargeChunkName ) >= 0 );
hgs
parents:
diff changeset
    77
        }
hgs
parents:
diff changeset
    78
    //
hgs
parents:
diff changeset
    79
    return ret;
hgs
parents:
diff changeset
    80
    }
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
TBool CMemSpyEngineHelperFbServ::IsSharedBitmapChunk( const TMemSpyDriverChunkInfo& aChunkInfo )
hgs
parents:
diff changeset
    84
    {
hgs
parents:
diff changeset
    85
    TBool ret = EFalse;
hgs
parents:
diff changeset
    86
    //
hgs
parents:
diff changeset
    87
    if  ( aChunkInfo.iType == EMemSpyDriverChunkTypeGlobal )
hgs
parents:
diff changeset
    88
        {
hgs
parents:
diff changeset
    89
        ret = ( aChunkInfo.iName.FindF( KMemSpyEngineFBSSharedChunkName ) >= 0 );
hgs
parents:
diff changeset
    90
        }
hgs
parents:
diff changeset
    91
    //
hgs
parents:
diff changeset
    92
    return ret;
hgs
parents:
diff changeset
    93
    }
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
EXPORT_C void CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL( RArray<TInt>& aHandles )
hgs
parents:
diff changeset
    97
    {
hgs
parents:
diff changeset
    98
    TInt fontConCount = 0;
hgs
parents:
diff changeset
    99
    TInt bitmapConCount =0;
hgs
parents:
diff changeset
   100
    //RArray<TInt> dirtyHandles;
hgs
parents:
diff changeset
   101
    //CleanupClosePushL( dirtyHandles );
hgs
parents:
diff changeset
   102
    GetArrayOfBitmapHandlesL( aHandles, bitmapConCount, fontConCount );
hgs
parents:
diff changeset
   103
    //CleanupStack::PopAndDestroy( &dirtyHandles );
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
void CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL( RArray<TInt>& aHandles, TInt& aBitmapConCount, TInt& aFontConCount )
hgs
parents:
diff changeset
   108
    {
hgs
parents:
diff changeset
   109
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - START") );
hgs
parents:
diff changeset
   110
    CMemSpyThread& fbServThread = IdentifyFbServThreadL();
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    // Suspend the process
hgs
parents:
diff changeset
   113
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - got FBServ thread, suspending it..."));
hgs
parents:
diff changeset
   114
    iEngine.ProcessSuspendLC( fbServThread.Process().Id() );
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
    // Get the heap cell data for the correct object (CFbTop)
hgs
parents:
diff changeset
   117
    TAny* cellAddress = NULL;
hgs
parents:
diff changeset
   118
    HBufC8* cellData = LocateCFbTopHeapCellDataLC( fbServThread, cellAddress );
hgs
parents:
diff changeset
   119
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - got CFbTop cell data: %d bytes", cellData->Length()));
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
    // Work out the offset to the bitmap address handles array
hgs
parents:
diff changeset
   122
    const TUint offsetBitmapCon = OffsetToCObjectConBitmapCon();
hgs
parents:
diff changeset
   123
    const TUint offsetFontCon = OffsetToCObjectConFontCon();
hgs
parents:
diff changeset
   124
    const TUint offsetHandleArray = OffsetToBitmapHandleArray();
hgs
parents:
diff changeset
   125
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - offsetBitmapCon:   %d", offsetBitmapCon ));
hgs
parents:
diff changeset
   126
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - offsetFontCon:     %d", offsetFontCon ));
hgs
parents:
diff changeset
   127
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - offsetHandleArray: %d", offsetHandleArray ));
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    // Create stream for reading heap data (makes life a bit easier).
hgs
parents:
diff changeset
   130
    RDesReadStream stream( *cellData );
hgs
parents:
diff changeset
   131
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   132
    
hgs
parents:
diff changeset
   133
    // We need to skip over the preamble to the start of the actual data.
hgs
parents:
diff changeset
   134
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - skipping %d bytes [to start of bitmap con]...", offsetBitmapCon ));
hgs
parents:
diff changeset
   135
    (void) stream.ReadL( offsetBitmapCon ); // skip this much
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    // Read CFbTop::iBitmapCon cell address
hgs
parents:
diff changeset
   138
    TAny* cellAddresBitmapCon = reinterpret_cast<TAny*>( stream.ReadUint32L() );
hgs
parents:
diff changeset
   139
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - cellAddresBitmapCon: 0x%08x", cellAddresBitmapCon ));
hgs
parents:
diff changeset
   140
    TInt bitmapConAllocated = 0;
hgs
parents:
diff changeset
   141
    RArray<TAny*> bitmapConAddresses;
hgs
parents:
diff changeset
   142
    CleanupClosePushL( bitmapConAddresses );
hgs
parents:
diff changeset
   143
    ReadCObjectConInfoL( cellAddresBitmapCon, bitmapConAddresses, aBitmapConCount, bitmapConAllocated );
hgs
parents:
diff changeset
   144
    CleanupStack::PopAndDestroy( &bitmapConAddresses );
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    // Read CFbTop::iFontCon cell address
hgs
parents:
diff changeset
   147
    TAny* cellAddresFontCon = reinterpret_cast<TAny*>( stream.ReadUint32L() );
hgs
parents:
diff changeset
   148
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - cellAddresFontCon: 0x%08x", cellAddresFontCon ));
hgs
parents:
diff changeset
   149
    TInt fontConAllocated = 0;
hgs
parents:
diff changeset
   150
    RArray<TAny*> fontConAddresses;
hgs
parents:
diff changeset
   151
    CleanupClosePushL( fontConAddresses );
hgs
parents:
diff changeset
   152
    ReadCObjectConInfoL( cellAddresFontCon, fontConAddresses, aFontConCount, fontConAllocated );
hgs
parents:
diff changeset
   153
    CleanupStack::PopAndDestroy( &fontConAddresses );
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
    // Skip forwards to the bitmap handle array info
hgs
parents:
diff changeset
   156
    const TUint skipRemaining = ( offsetHandleArray - offsetFontCon );
hgs
parents:
diff changeset
   157
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - skipRemaining: %d", skipRemaining ));
hgs
parents:
diff changeset
   158
    (void) stream.ReadL( skipRemaining ); // skip this much
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    // The layout of RPointerArrayBase is as follows:
hgs
parents:
diff changeset
   161
    //
hgs
parents:
diff changeset
   162
    //  TInt iCount;
hgs
parents:
diff changeset
   163
	//  TAny** iEntries;
hgs
parents:
diff changeset
   164
	//  TInt iAllocated;
hgs
parents:
diff changeset
   165
	//  TInt iGranularity;
hgs
parents:
diff changeset
   166
	//  TInt iSpare1;
hgs
parents:
diff changeset
   167
	//  TInt iSpare2;
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
    // Now read the next 4 bytes. This is the number of allocated array entries.
hgs
parents:
diff changeset
   170
    const TInt arrayEntryCount = stream.ReadInt32L();
hgs
parents:
diff changeset
   171
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - arrayEntryCount: %d", arrayEntryCount ));
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    // The next four bytes are the address of the cell we are interested in.
hgs
parents:
diff changeset
   174
    cellAddress = reinterpret_cast<TAny*>( stream.ReadUint32L() );
hgs
parents:
diff changeset
   175
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - cellAddress: 0x%08x", cellAddress ));
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    // The next four bytes are the allocated count
hgs
parents:
diff changeset
   178
    const TInt arrayAlloctedCount = stream.ReadInt32L();
hgs
parents:
diff changeset
   179
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - arrayAlloctedCount: %d", arrayAlloctedCount ));
hgs
parents:
diff changeset
   180
    
hgs
parents:
diff changeset
   181
    // Validate
hgs
parents:
diff changeset
   182
    if  ( arrayEntryCount > arrayAlloctedCount || arrayEntryCount < 0 || arrayAlloctedCount < 0 )
hgs
parents:
diff changeset
   183
        {
hgs
parents:
diff changeset
   184
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - invalid array details => Leave with KErrCorrupt"));
hgs
parents:
diff changeset
   185
        User::Leave( KErrCorrupt );
hgs
parents:
diff changeset
   186
        }
hgs
parents:
diff changeset
   187
    
hgs
parents:
diff changeset
   188
    // Clean up - don't need this data anymore. Real data is in another cell
hgs
parents:
diff changeset
   189
    CleanupStack::PopAndDestroy( 2, cellData );  // stream & cellData
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
    // Now obtain the heap cell data for the actual array itself.
hgs
parents:
diff changeset
   192
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - trying to find bitmap array data..."));
hgs
parents:
diff changeset
   193
    cellData = LocateBitmapArrayHeapCellDataLC( cellAddress, arrayAlloctedCount );
hgs
parents:
diff changeset
   194
    
hgs
parents:
diff changeset
   195
    // Parse the cell data in order to obtain the bitmap handles.
hgs
parents:
diff changeset
   196
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - trying to extract bitmap handles..."));
hgs
parents:
diff changeset
   197
    ParseCellDataAndExtractHandlesL( *cellData, aHandles, arrayEntryCount );
hgs
parents:
diff changeset
   198
    
hgs
parents:
diff changeset
   199
    // Tidy up
hgs
parents:
diff changeset
   200
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - resuming process..."));
hgs
parents:
diff changeset
   201
    CleanupStack::PopAndDestroy( cellData );
hgs
parents:
diff changeset
   202
 
hgs
parents:
diff changeset
   203
    // Close heap walker & resume process
hgs
parents:
diff changeset
   204
    iEngine.Driver().WalkHeapClose();
hgs
parents:
diff changeset
   205
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   206
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetArrayOfBitmapHandlesL() - END"));
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
void CMemSpyEngineHelperFbServ::GetBitmapInfoL( TInt aHandle, TMemSpyEngineFBServBitmapInfo& aInfo )
hgs
parents:
diff changeset
   211
    {
hgs
parents:
diff changeset
   212
    CFbsBitmap* bitmap = GetBitmapInfoLC( aHandle, aInfo );
hgs
parents:
diff changeset
   213
    CleanupStack::PopAndDestroy( bitmap );
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
 
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
CFbsBitmap* CMemSpyEngineHelperFbServ::GetBitmapInfoLC( TInt aHandle, TMemSpyEngineFBServBitmapInfo& aInfo )
hgs
parents:
diff changeset
   218
    {
hgs
parents:
diff changeset
   219
    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap();
hgs
parents:
diff changeset
   220
    CleanupStack::PushL( bitmap );
hgs
parents:
diff changeset
   221
    const TInt error = bitmap->Duplicate( aHandle );
hgs
parents:
diff changeset
   222
    User::LeaveIfError( error );
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
    // Basic info from bitmap itself
hgs
parents:
diff changeset
   225
    aInfo.iHandle = aHandle;
hgs
parents:
diff changeset
   226
    aInfo.iDisplayMode = bitmap->DisplayMode();
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
    // Extended info comes from header
hgs
parents:
diff changeset
   229
    const SEpocBitmapHeader header( bitmap->Header() );
hgs
parents:
diff changeset
   230
    
hgs
parents:
diff changeset
   231
    aInfo.iSizeInPixels = header.iSizeInPixels;
hgs
parents:
diff changeset
   232
    aInfo.iCompressionType = header.iCompression;
hgs
parents:
diff changeset
   233
    aInfo.iColor = header.iColor;
hgs
parents:
diff changeset
   234
    aInfo.iBitsPerPixel = header.iBitsPerPixel;
hgs
parents:
diff changeset
   235
    aInfo.iSizeInBytes = header.iBitmapSize;
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
    // Flags
hgs
parents:
diff changeset
   238
    aInfo.iFlags = TMemSpyEngineFBServBitmapInfo::EFlagsNone;
hgs
parents:
diff changeset
   239
    if  ( bitmap->IsRomBitmap() )
hgs
parents:
diff changeset
   240
        {
hgs
parents:
diff changeset
   241
        aInfo.iFlags |= TMemSpyEngineFBServBitmapInfo::EFlagsIsRomBitmap;
hgs
parents:
diff changeset
   242
        }
hgs
parents:
diff changeset
   243
     if  ( bitmap->IsLargeBitmap() )
hgs
parents:
diff changeset
   244
        {
hgs
parents:
diff changeset
   245
        aInfo.iFlags |= TMemSpyEngineFBServBitmapInfo::EFlagsIsLarge;
hgs
parents:
diff changeset
   246
        }
hgs
parents:
diff changeset
   247
    if  ( bitmap->IsCompressedInRAM() )
hgs
parents:
diff changeset
   248
        {
hgs
parents:
diff changeset
   249
        aInfo.iFlags |= TMemSpyEngineFBServBitmapInfo::EFlagsIsCompressedInRam;
hgs
parents:
diff changeset
   250
        }
hgs
parents:
diff changeset
   251
    else
hgs
parents:
diff changeset
   252
        {
hgs
parents:
diff changeset
   253
        // Can only do this if not compressed
hgs
parents:
diff changeset
   254
        if  ( bitmap->IsMonochrome() )
hgs
parents:
diff changeset
   255
             {
hgs
parents:
diff changeset
   256
             aInfo.iFlags |= TMemSpyEngineFBServBitmapInfo::EFlagsIsMonochrome;
hgs
parents:
diff changeset
   257
             }
hgs
parents:
diff changeset
   258
        }
hgs
parents:
diff changeset
   259
 
hgs
parents:
diff changeset
   260
    return bitmap;
hgs
parents:
diff changeset
   261
    }
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
CMemSpyThread& CMemSpyEngineHelperFbServ::IdentifyFbServThreadL()
hgs
parents:
diff changeset
   265
    {
hgs
parents:
diff changeset
   266
    _LIT(KFbServThreadName, "FbServ::!Fontbitmapserver");
hgs
parents:
diff changeset
   267
    //
hgs
parents:
diff changeset
   268
    CMemSpyThread* thread = NULL;
hgs
parents:
diff changeset
   269
    CMemSpyProcess* process = NULL;
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
    // Get the fbserv thread object
hgs
parents:
diff changeset
   272
    CMemSpyEngineObjectContainer& container = iEngine.Container();
hgs
parents:
diff changeset
   273
    User::LeaveIfError( container.ProcessAndThreadByFullName( KFbServThreadName, process, thread ) );
hgs
parents:
diff changeset
   274
    //
hgs
parents:
diff changeset
   275
    return *thread;
hgs
parents:
diff changeset
   276
    }
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
HBufC8* CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC( CMemSpyThread& aFbServThread, TAny*& aCellAddress )
hgs
parents:
diff changeset
   280
    {
hgs
parents:
diff changeset
   281
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - START"));
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
    // We'll start looking for the CFbTop object at cell index 0, then we'll
hgs
parents:
diff changeset
   284
    // continue to a maximum of cell index 10. These are not actual allocation
hgs
parents:
diff changeset
   285
    // numbers, they are just cell indicies within FBServ's heap.
hgs
parents:
diff changeset
   286
    // Realistically, the cell should be the 7th.
hgs
parents:
diff changeset
   287
    const TInt KFbServWillingToStartAtCellIndex = 0;
hgs
parents:
diff changeset
   288
    const TInt KFbServWillingToSearchUntilCellIndex = 10;
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
    // We know the size of the cell is pretty big, since it contains a large 
hgs
parents:
diff changeset
   291
    // hash-map object (4096 elements by default, 4 bytes big => 16k). We'll
hgs
parents:
diff changeset
   292
    // not try to retrieve more than 18k of data.
hgs
parents:
diff changeset
   293
    const TInt KFbServExpectedMinimumCellSize = 14*1024;
hgs
parents:
diff changeset
   294
    const TInt KFbServExpectedMaximumCellSize = 18*1024;
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
    // This is what we'll return, if we find it...
hgs
parents:
diff changeset
   297
    aCellAddress = NULL;
hgs
parents:
diff changeset
   298
    HBufC8* heapCellData = NULL;
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
    // Get the heap info - we need this for verification purposes
hgs
parents:
diff changeset
   301
    TMemSpyHeapInfo info;
hgs
parents:
diff changeset
   302
    TInt err = iEngine.Driver().GetHeapInfoUser( info, aFbServThread.Id() );
hgs
parents:
diff changeset
   303
    if ( err == KErrNone && info.Type() == TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
   304
        {
hgs
parents:
diff changeset
   305
        err = KErrNotSupported;
hgs
parents:
diff changeset
   306
        }
hgs
parents:
diff changeset
   307
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
    // Now walk the heap!
hgs
parents:
diff changeset
   310
    err = iEngine.Driver().WalkHeapInit( aFbServThread.Id() );
hgs
parents:
diff changeset
   311
    if  ( err == KErrNone )
hgs
parents:
diff changeset
   312
        {
hgs
parents:
diff changeset
   313
        TMemSpyDriverCellType cellType;
hgs
parents:
diff changeset
   314
        TAny* cellAddress;
hgs
parents:
diff changeset
   315
        TInt cellLength;
hgs
parents:
diff changeset
   316
        TInt cellNestingLevel;
hgs
parents:
diff changeset
   317
        TInt cellAllocationNumber;
hgs
parents:
diff changeset
   318
        TInt cellHeaderSize;
hgs
parents:
diff changeset
   319
        TAny* cellPayloadAddress;
hgs
parents:
diff changeset
   320
        //
hgs
parents:
diff changeset
   321
        for( TInt cellIndex = KFbServWillingToStartAtCellIndex; err == KErrNone && cellIndex < KFbServWillingToSearchUntilCellIndex; cellIndex++ )
hgs
parents:
diff changeset
   322
            {
hgs
parents:
diff changeset
   323
            err = iEngine.Driver().WalkHeapNextCell( aFbServThread.Id(), cellType, cellAddress, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   324
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - cellIndex[%d] err: %d, cellLength: %d, cellAllocationNumber: %d, cellType: %d", cellIndex, err, cellLength, cellAllocationNumber, cellType));
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
            if  ( err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
hgs
parents:
diff changeset
   327
                {
hgs
parents:
diff changeset
   328
                // We know we are looking for a relatively large *allocated* cell.
hgs
parents:
diff changeset
   329
                if  ( cellLength >= KFbServExpectedMinimumCellSize && cellLength <= KFbServExpectedMaximumCellSize )
hgs
parents:
diff changeset
   330
                    {
hgs
parents:
diff changeset
   331
                    const TInt payloadLength = cellLength;
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
                    // This is *probably* the right cell. Let's get the data and check.
hgs
parents:
diff changeset
   334
                    HBufC8* data = HBufC8::NewLC( payloadLength );
hgs
parents:
diff changeset
   335
                    TPtr8 pData( data->Des() );
hgs
parents:
diff changeset
   336
                    //
hgs
parents:
diff changeset
   337
                    err = iEngine.Driver().WalkHeapReadCellData( cellAddress, pData, payloadLength );
hgs
parents:
diff changeset
   338
                    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - data fetch returned error: %d", err));
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
                    if  ( err == KErrNone )
hgs
parents:
diff changeset
   341
                        {
hgs
parents:
diff changeset
   342
                        //_LIT(KHeapDumpDataFormat, "%S");
hgs
parents:
diff changeset
   343
                        //iEngine.Sink().OutputBinaryDataL( KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) cellAddress, pData.Length() );
hgs
parents:
diff changeset
   344
                    
hgs
parents:
diff changeset
   345
                        // Check the data
hgs
parents:
diff changeset
   346
                        const TUint heapMaxSize = info.AsRHeap().MetaData().iMaxHeapSize;
hgs
parents:
diff changeset
   347
                        const TUint heapBaseAddress = (TUint) info.AsRHeap().MetaData().ChunkBaseAddress();
hgs
parents:
diff changeset
   348
                        const TBool correctHeapCellLocated = VerifyCorrectHeapCellL( *data, cellAddress, cellPayloadAddress, heapBaseAddress, heapMaxSize );
hgs
parents:
diff changeset
   349
                        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - verified: %d", correctHeapCellLocated));
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
                        if  ( correctHeapCellLocated )
hgs
parents:
diff changeset
   352
                            {
hgs
parents:
diff changeset
   353
                            aCellAddress = cellAddress;
hgs
parents:
diff changeset
   354
                            heapCellData = data;
hgs
parents:
diff changeset
   355
                            CleanupStack::Pop( data );
hgs
parents:
diff changeset
   356
                            break;
hgs
parents:
diff changeset
   357
                            }
hgs
parents:
diff changeset
   358
                        else
hgs
parents:
diff changeset
   359
                            {
hgs
parents:
diff changeset
   360
                            // Not the right cell. Keep going...
hgs
parents:
diff changeset
   361
                            CleanupStack::PopAndDestroy( data );
hgs
parents:
diff changeset
   362
                            }
hgs
parents:
diff changeset
   363
                        }
hgs
parents:
diff changeset
   364
                    }
hgs
parents:
diff changeset
   365
                }
hgs
parents:
diff changeset
   366
            }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
        // NB: don't do this here - 
hgs
parents:
diff changeset
   369
        // iEngine.Driver().WalkHeapClose();
hgs
parents:
diff changeset
   370
        // It gets done after all reading is complete
hgs
parents:
diff changeset
   371
        }
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
    if  ( heapCellData == NULL )
hgs
parents:
diff changeset
   374
        {
hgs
parents:
diff changeset
   375
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - END - didn't find the right cell => KErrNotFound"));
hgs
parents:
diff changeset
   376
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   377
        }
hgs
parents:
diff changeset
   378
    //
hgs
parents:
diff changeset
   379
    CleanupStack::PushL( heapCellData );
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - END - everything okay, cell is: 0x%08x", aCellAddress));
hgs
parents:
diff changeset
   382
    return heapCellData;
hgs
parents:
diff changeset
   383
    }
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
void CMemSpyEngineHelperFbServ::ReadCObjectConInfoL( TAny* aCellAddress, RArray<TAny*>& aContainerObjects, TInt& aCount, TInt& aAllocated )
hgs
parents:
diff changeset
   387
    {
hgs
parents:
diff changeset
   388
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - START - trying cell: 0x%08x", aCellAddress ));
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
    // What we will return
hgs
parents:
diff changeset
   391
    HBufC8* cellData = NULL;
hgs
parents:
diff changeset
   392
    
hgs
parents:
diff changeset
   393
    // Try to get info about real cell
hgs
parents:
diff changeset
   394
    TMemSpyDriverCellType cellType;
hgs
parents:
diff changeset
   395
    TInt cellLength;
hgs
parents:
diff changeset
   396
    TInt cellNestingLevel;
hgs
parents:
diff changeset
   397
    TInt cellAllocationNumber;
hgs
parents:
diff changeset
   398
    TInt cellHeaderSize;
hgs
parents:
diff changeset
   399
    TAny* cellPayloadAddress;
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
    // NOTE: this call may change the value of 'cellAddress'
hgs
parents:
diff changeset
   402
    TInt err = iEngine.Driver().WalkHeapGetCellInfo( aCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   403
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aCellAddress, cellLength, cellAllocationNumber, cellType));
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
	if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
hgs
parents:
diff changeset
   406
        {
hgs
parents:
diff changeset
   407
        // Check that the cell size meets our expectations - it should be a CObjectCon cell.
hgs
parents:
diff changeset
   408
        const TInt expectedCellSize = sizeof(CObjectCon*) + cellHeaderSize;
hgs
parents:
diff changeset
   409
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - expectedCellSize: %d, actual: %d, address: 0x%08x", expectedCellSize, cellLength, aCellAddress));
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
        if  ( expectedCellSize <= cellLength )
hgs
parents:
diff changeset
   412
            {
hgs
parents:
diff changeset
   413
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - cell lengths are good, trying to get cell data..."));
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
            // Try to get real cell data        
hgs
parents:
diff changeset
   416
            cellData = HBufC8::NewLC( cellLength );
hgs
parents:
diff changeset
   417
            TPtr8 pData( cellData->Des() );
hgs
parents:
diff changeset
   418
            //
hgs
parents:
diff changeset
   419
            err = iEngine.Driver().WalkHeapReadCellData( aCellAddress, pData, cellLength );
hgs
parents:
diff changeset
   420
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - reading cell data returned error: %d", err));
hgs
parents:
diff changeset
   421
            }
hgs
parents:
diff changeset
   422
        else
hgs
parents:
diff changeset
   423
            {
hgs
parents:
diff changeset
   424
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - not enough data -> KErrCorrupt"));
hgs
parents:
diff changeset
   425
            err = KErrCorrupt;
hgs
parents:
diff changeset
   426
            }
hgs
parents:
diff changeset
   427
        }
hgs
parents:
diff changeset
   428
    else
hgs
parents:
diff changeset
   429
        {
hgs
parents:
diff changeset
   430
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - END - didn't find cell data => KErrNotFound"));
hgs
parents:
diff changeset
   431
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   432
        }
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
    CObjectCon* con = CObjectCon::NewL();
hgs
parents:
diff changeset
   435
    const TUint32 KExpectedObjectConVTable = *((TUint32*) con);
hgs
parents:
diff changeset
   436
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - KExpectedObjectConVTable: 0x%08x", KExpectedObjectConVTable ));
hgs
parents:
diff changeset
   437
    delete con;
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
    // We should have the valid CObjectCon data now.
62
hgs
parents: 51
diff changeset
   440
    if( cellData )
hgs
parents: 51
diff changeset
   441
    	{
hgs
parents: 51
diff changeset
   442
		RDesReadStream stream( *cellData );
hgs
parents: 51
diff changeset
   443
		CleanupClosePushL( stream );
51
hgs
parents:
diff changeset
   444
    
62
hgs
parents: 51
diff changeset
   445
		// Read vtable
hgs
parents: 51
diff changeset
   446
		const TUint32 vTable = stream.ReadUint32L();
hgs
parents: 51
diff changeset
   447
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - actual vTable: 0x%08x", vTable ));
hgs
parents: 51
diff changeset
   448
		if  ( vTable != KExpectedObjectConVTable )
hgs
parents: 51
diff changeset
   449
			{
hgs
parents: 51
diff changeset
   450
			User::Leave( KErrNotFound );
hgs
parents: 51
diff changeset
   451
			}
51
hgs
parents:
diff changeset
   452
62
hgs
parents: 51
diff changeset
   453
		const TInt uniqueId = stream.ReadInt32L();
hgs
parents: 51
diff changeset
   454
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - uniqueId: %d", uniqueId ));
51
hgs
parents:
diff changeset
   455
62
hgs
parents: 51
diff changeset
   456
		aCount = stream.ReadInt32L();
hgs
parents: 51
diff changeset
   457
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - aCount: %d", aCount ));
51
hgs
parents:
diff changeset
   458
62
hgs
parents: 51
diff changeset
   459
		aAllocated = stream.ReadInt32L();
hgs
parents: 51
diff changeset
   460
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - aAllocated: %d", aAllocated ));
51
hgs
parents:
diff changeset
   461
62
hgs
parents: 51
diff changeset
   462
		// This is actually CObject's iObject, i.e. CObject** iObjects.
hgs
parents: 51
diff changeset
   463
		TAny* pObjects = reinterpret_cast< TAny*>( stream.ReadUint32L() );
hgs
parents: 51
diff changeset
   464
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - pObjects: 0x%08x", pObjects ));
51
hgs
parents:
diff changeset
   465
62
hgs
parents: 51
diff changeset
   466
    	CleanupStack::PopAndDestroy( 2, cellData ); // cellData & stream
hgs
parents: 51
diff changeset
   467
    
hgs
parents: 51
diff changeset
   468
		// Now fetch the cell containing the CObject pointers...
hgs
parents: 51
diff changeset
   469
		err = iEngine.Driver().WalkHeapGetCellInfo( pObjects, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents: 51
diff changeset
   470
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - array of CObject* cell fetch err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aCellAddress, cellLength, cellAllocationNumber, cellType));
hgs
parents: 51
diff changeset
   471
		User::LeaveIfError( err );
51
hgs
parents:
diff changeset
   472
62
hgs
parents: 51
diff changeset
   473
		const TInt expectedSize = ( aAllocated * sizeof(CObject*) ) + cellHeaderSize;
hgs
parents: 51
diff changeset
   474
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - expectedSize: %d, actual size: %d", expectedSize, cellLength ));
hgs
parents: 51
diff changeset
   475
		if  ( cellLength < expectedSize )
hgs
parents: 51
diff changeset
   476
			{
hgs
parents: 51
diff changeset
   477
			User::Leave( KErrUnderflow );
hgs
parents: 51
diff changeset
   478
			}
51
hgs
parents:
diff changeset
   479
    
62
hgs
parents: 51
diff changeset
   480
		// Get the data
hgs
parents: 51
diff changeset
   481
		cellData = HBufC8::NewLC( cellLength );
hgs
parents: 51
diff changeset
   482
		TPtr8 pData( cellData->Des() );
hgs
parents: 51
diff changeset
   483
		err = iEngine.Driver().WalkHeapReadCellData( pObjects, pData, cellLength );
hgs
parents: 51
diff changeset
   484
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - reading cell data returned error: %d", err));
hgs
parents: 51
diff changeset
   485
		User::LeaveIfError( err );
51
hgs
parents:
diff changeset
   486
62
hgs
parents: 51
diff changeset
   487
		// Open stream
hgs
parents: 51
diff changeset
   488
		stream.Open( *cellData );
hgs
parents: 51
diff changeset
   489
		CleanupClosePushL( stream );
51
hgs
parents:
diff changeset
   490
62
hgs
parents: 51
diff changeset
   491
		// Extract array of pointers
hgs
parents: 51
diff changeset
   492
		for( TInt i=0; i<aCount; i++ )
hgs
parents: 51
diff changeset
   493
			{
hgs
parents: 51
diff changeset
   494
			TAny* objectAddress = reinterpret_cast< TAny*>( stream.ReadUint32L() );
hgs
parents: 51
diff changeset
   495
			TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - object[%04d]: 0x%08x", i, objectAddress ));
hgs
parents: 51
diff changeset
   496
			aContainerObjects.AppendL( objectAddress );
hgs
parents: 51
diff changeset
   497
			}		
hgs
parents: 51
diff changeset
   498
	    CleanupStack::PopAndDestroy( 2, cellData ); // cellData & stream
hgs
parents: 51
diff changeset
   499
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ReadCObjectConInfoL() - END" ));		
hgs
parents: 51
diff changeset
   500
    	}
51
hgs
parents:
diff changeset
   501
    }
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
HBufC8* CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC( TAny*& aArrayCellAddress, TInt aArrayAllocCount )
hgs
parents:
diff changeset
   505
    {
hgs
parents:
diff changeset
   506
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - START - trying cell: 0x%08x, aArrayAllocCount: %d", aArrayCellAddress, aArrayAllocCount));
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
    // What we will return
hgs
parents:
diff changeset
   509
    HBufC8* cellData = NULL;
hgs
parents:
diff changeset
   510
    
hgs
parents:
diff changeset
   511
    // Try to get info about real cell
hgs
parents:
diff changeset
   512
    TMemSpyDriverCellType cellType;
hgs
parents:
diff changeset
   513
    TInt cellLength;
hgs
parents:
diff changeset
   514
    TInt cellNestingLevel;
hgs
parents:
diff changeset
   515
    TInt cellAllocationNumber;
hgs
parents:
diff changeset
   516
    TInt cellHeaderSize;
hgs
parents:
diff changeset
   517
    TAny* cellPayloadAddress;
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
    // NOTE: this call may change the value of 'cellAddress'
hgs
parents:
diff changeset
   520
    TInt err = iEngine.Driver().WalkHeapGetCellInfo( aArrayCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   521
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateCFbTopHeapCellDataLC() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aArrayCellAddress, cellLength, cellAllocationNumber, cellType));
hgs
parents:
diff changeset
   522
hgs
parents:
diff changeset
   523
    if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
hgs
parents:
diff changeset
   524
        {
hgs
parents:
diff changeset
   525
        // Check that the cell size meets our expectations. 
hgs
parents:
diff changeset
   526
        // The cell should be a very specific length
hgs
parents:
diff changeset
   527
        const TInt expectedCellSize = (sizeof(CBase*) * aArrayAllocCount) + cellHeaderSize;
hgs
parents:
diff changeset
   528
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - expectedCellSize: %d, actual: %d, address: 0x%08x", expectedCellSize, cellLength, aArrayCellAddress));
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
        if  ( expectedCellSize <= cellLength )
hgs
parents:
diff changeset
   531
            {
hgs
parents:
diff changeset
   532
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - cell lengths are good, trying to get cell data..."));
hgs
parents:
diff changeset
   533
hgs
parents:
diff changeset
   534
            // Try to get real cell data        
hgs
parents:
diff changeset
   535
            cellData = HBufC8::NewLC( cellLength );
hgs
parents:
diff changeset
   536
            TPtr8 pData( cellData->Des() );
hgs
parents:
diff changeset
   537
            //
hgs
parents:
diff changeset
   538
            err = iEngine.Driver().WalkHeapReadCellData( aArrayCellAddress, pData, cellLength );
hgs
parents:
diff changeset
   539
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - reading cell data returned error: %d", err));
hgs
parents:
diff changeset
   540
            }
hgs
parents:
diff changeset
   541
        else
hgs
parents:
diff changeset
   542
            {
hgs
parents:
diff changeset
   543
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - not enough data -> KErrCorrupt"));
hgs
parents:
diff changeset
   544
            err = KErrCorrupt;
hgs
parents:
diff changeset
   545
            }
hgs
parents:
diff changeset
   546
        }
hgs
parents:
diff changeset
   547
    //
hgs
parents:
diff changeset
   548
    if  ( cellData == NULL )
hgs
parents:
diff changeset
   549
        {
hgs
parents:
diff changeset
   550
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - END - didn't find cell data => KErrNotFound"));
hgs
parents:
diff changeset
   551
        err = KErrNotFound;
hgs
parents:
diff changeset
   552
        }
hgs
parents:
diff changeset
   553
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   554
    //
hgs
parents:
diff changeset
   555
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::LocateBitmapArrayHeapCellDataLC() - END - ok! - got %d bytes", cellData->Length() ) );
hgs
parents:
diff changeset
   556
    return cellData;
hgs
parents:
diff changeset
   557
    }
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
void CMemSpyEngineHelperFbServ::ParseCellDataAndExtractHandlesL( const TDesC8& aData, RArray<TInt>& aHandles, TInt aArrayEntryCount )
hgs
parents:
diff changeset
   561
    {
hgs
parents:
diff changeset
   562
    aHandles.Reset();
hgs
parents:
diff changeset
   563
    
hgs
parents:
diff changeset
   564
    // Create read stream
hgs
parents:
diff changeset
   565
    RDesReadStream stream( aData );
hgs
parents:
diff changeset
   566
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   567
    
hgs
parents:
diff changeset
   568
    for( TInt i=0; i<aArrayEntryCount; i++ )
hgs
parents:
diff changeset
   569
        {
hgs
parents:
diff changeset
   570
        const TInt handle = stream.ReadInt32L();
hgs
parents:
diff changeset
   571
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::ParseCellDataAndExtractHandlesL() - handle[%4d] = 0x%08x", i, handle));
hgs
parents:
diff changeset
   572
        aHandles.AppendL( handle );
hgs
parents:
diff changeset
   573
        }
hgs
parents:
diff changeset
   574
    
hgs
parents:
diff changeset
   575
    // Tidy up
hgs
parents:
diff changeset
   576
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   577
    }
hgs
parents:
diff changeset
   578
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
TBool CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL( const TDesC8& aData, TAny* aCellAddress, TAny* aPayloadAddress, TUint aHeapStartingAddress, TUint aHeapMaxSize )
hgs
parents:
diff changeset
   581
    {
hgs
parents:
diff changeset
   582
    (void) aPayloadAddress;
hgs
parents:
diff changeset
   583
    (void) aCellAddress;
hgs
parents:
diff changeset
   584
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - START - aDataLen: %d, aCellAddress: 0x%08x, aPayloadAddress: 0x%08x, aHeapStartingAddress: 0x%08x, aHeapSize: %d", aData.Length(), aCellAddress, aPayloadAddress, aHeapStartingAddress, aHeapMaxSize ));
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
    const TUint KFbServHeapCeilingAddress = aHeapStartingAddress + aHeapMaxSize;
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
    // Whether we can use this cell's data...
hgs
parents:
diff changeset
   589
    TBool correctCell = EFalse;
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
    // We can use certain knowledge of the layout of the cell to work out
hgs
parents:
diff changeset
   592
    // if we've found the right one. 
hgs
parents:
diff changeset
   593
    // 
hgs
parents:
diff changeset
   594
    // This is fragile because of the font and bitmap server heap layout changes 
hgs
parents:
diff changeset
   595
    // significantly, then this can break.
hgs
parents:
diff changeset
   596
    RDesReadStream reader( aData );
hgs
parents:
diff changeset
   597
    CleanupClosePushL( reader );
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
    // Get vtable address
hgs
parents:
diff changeset
   600
    TUint address = reader.ReadUint32L();
hgs
parents:
diff changeset
   601
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - suspected vtable: 0x%08x", address));
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
#ifdef __EPOC32__
hgs
parents:
diff changeset
   604
    TBool isROMAddress = EFalse;
hgs
parents:
diff changeset
   605
    TInt err = User::IsRomAddress( isROMAddress, (TAny*) address );
hgs
parents:
diff changeset
   606
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - vtable (0x%08x) is in ROM: %d (error: %d)", address, isROMAddress, err));
hgs
parents:
diff changeset
   607
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   608
hgs
parents:
diff changeset
   609
    if  ( !isROMAddress )
hgs
parents:
diff changeset
   610
        {
hgs
parents:
diff changeset
   611
        // Close stream
hgs
parents:
diff changeset
   612
        CleanupStack::PopAndDestroy( &reader );
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
        // VTable value should be in the ROM range.
hgs
parents:
diff changeset
   615
        correctCell = EFalse;
hgs
parents:
diff changeset
   616
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - END - suspected CFbTop vTable isn't in ROM address range! - correctCell: %d", correctCell));
hgs
parents:
diff changeset
   617
        return correctCell;
hgs
parents:
diff changeset
   618
        }
hgs
parents:
diff changeset
   619
#else
hgs
parents:
diff changeset
   620
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - skipping vtable: 0x%08x", address));
hgs
parents:
diff changeset
   621
#endif
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
    // First real item is an RFs object instance. We can't check this
hgs
parents:
diff changeset
   624
    // very easily because its an embedded object-> We must skip it
hgs
parents:
diff changeset
   625
    __ASSERT_ALWAYS( sizeof(RFs) == 4, User::Invariant() );
hgs
parents:
diff changeset
   626
    address = reader.ReadUint32L();
hgs
parents:
diff changeset
   627
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - skipping RFs: 0x%08x", address));
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
    // Next object is an address (CFontStore* iFontStore). We can validate this against
hgs
parents:
diff changeset
   630
    // the method arguments.
hgs
parents:
diff changeset
   631
    address = reader.ReadUint32L();
hgs
parents:
diff changeset
   632
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - iFontStore: 0x%08x", address));
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
    if  ( address > aHeapStartingAddress && address < KFbServHeapCeilingAddress )
hgs
parents:
diff changeset
   635
        {
hgs
parents:
diff changeset
   636
        // Next comes another pointer (CObjectCon* iBitmapCon)
hgs
parents:
diff changeset
   637
        address = reader.ReadUint32L();
hgs
parents:
diff changeset
   638
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - iBitmapCon: 0x%08x", address));
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
        if  ( address > aHeapStartingAddress && address < KFbServHeapCeilingAddress )
hgs
parents:
diff changeset
   641
            {
hgs
parents:
diff changeset
   642
            // Next another pointer (CObjectCon* iFontCon)
hgs
parents:
diff changeset
   643
            address = reader.ReadUint32L();
hgs
parents:
diff changeset
   644
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - iFontCon: 0x%08x", address));
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
            if  ( address > aHeapStartingAddress && address < KFbServHeapCeilingAddress )
hgs
parents:
diff changeset
   647
                {
hgs
parents:
diff changeset
   648
                // And finally, yet another pointer (RHeap* iHeap)
hgs
parents:
diff changeset
   649
                address = reader.ReadUint32L();
hgs
parents:
diff changeset
   650
                TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - iHeap: 0x%08x", address));
hgs
parents:
diff changeset
   651
hgs
parents:
diff changeset
   652
                if  ( address > aHeapStartingAddress && address < KFbServHeapCeilingAddress )
hgs
parents:
diff changeset
   653
                    {
hgs
parents:
diff changeset
   654
                    // That'll do.
hgs
parents:
diff changeset
   655
                    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - data seems okay!"));
hgs
parents:
diff changeset
   656
                    correctCell = ETrue;
hgs
parents:
diff changeset
   657
                    }
hgs
parents:
diff changeset
   658
                }
hgs
parents:
diff changeset
   659
            }
hgs
parents:
diff changeset
   660
        }
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
    CleanupStack::PopAndDestroy( &reader );
hgs
parents:
diff changeset
   663
    //
hgs
parents:
diff changeset
   664
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::VerifyCorrectHeapCellL() - END - correctCell: %d", correctCell));
hgs
parents:
diff changeset
   665
    return correctCell;
hgs
parents:
diff changeset
   666
    }
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
TUint CMemSpyEngineHelperFbServ::OffsetToCObjectConBitmapCon()
hgs
parents:
diff changeset
   670
    {
hgs
parents:
diff changeset
   671
    TUint ret = 0;
hgs
parents:
diff changeset
   672
hgs
parents:
diff changeset
   673
    // VTable
hgs
parents:
diff changeset
   674
    ret += 4;
hgs
parents:
diff changeset
   675
hgs
parents:
diff changeset
   676
    // RFs
hgs
parents:
diff changeset
   677
    ret += sizeof(RFs);
hgs
parents:
diff changeset
   678
hgs
parents:
diff changeset
   679
	// CFontStore* iFontStore;
hgs
parents:
diff changeset
   680
    ret += sizeof(CBase*); // best effort
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
    return ret;
hgs
parents:
diff changeset
   683
    }
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
hgs
parents:
diff changeset
   686
TUint CMemSpyEngineHelperFbServ::OffsetToCObjectConFontCon()
hgs
parents:
diff changeset
   687
    {
hgs
parents:
diff changeset
   688
    TUint ret = OffsetToCObjectConBitmapCon();
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
	// CObjectCon* iBitmapCon;
hgs
parents:
diff changeset
   691
    ret += sizeof(CObjectCon*);
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
    return ret;
hgs
parents:
diff changeset
   694
    }
hgs
parents:
diff changeset
   695
hgs
parents:
diff changeset
   696
hgs
parents:
diff changeset
   697
TUint CMemSpyEngineHelperFbServ::OffsetToBitmapHandleArray()
hgs
parents:
diff changeset
   698
    {
hgs
parents:
diff changeset
   699
    TUint ret = OffsetToCObjectConFontCon();
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
	// CObjectConIx* iConIx;
hgs
parents:
diff changeset
   702
    ret += sizeof(CObjectConIx*);
hgs
parents:
diff changeset
   703
hgs
parents:
diff changeset
   704
	// RHeap* iHeap;
hgs
parents:
diff changeset
   705
    ret += sizeof(RHeap*);
hgs
parents:
diff changeset
   706
hgs
parents:
diff changeset
   707
	// RChunk iChunk
hgs
parents:
diff changeset
   708
    ret += sizeof(RChunk);
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
	// RChunk iLargeBitmapChunk
hgs
parents:
diff changeset
   711
    ret += sizeof(RChunk);
hgs
parents:
diff changeset
   712
hgs
parents:
diff changeset
   713
	// RMutex iLargeBitmapAccess
hgs
parents:
diff changeset
   714
    ret += sizeof(RMutex);
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
	// CChunkPile* iPile;
hgs
parents:
diff changeset
   717
    ret += sizeof(CBase*); // best effort
hgs
parents:
diff changeset
   718
hgs
parents:
diff changeset
   719
	// RPointerArray<HBufC> iFontNameAlias;
hgs
parents:
diff changeset
   720
    ret += sizeof(RPointerArray<HBufC>);
hgs
parents:
diff changeset
   721
	
hgs
parents:
diff changeset
   722
    return ret;
hgs
parents:
diff changeset
   723
    }
hgs
parents:
diff changeset
   724
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
CMemSpyEngineHelperFbServ::CBitmapObject* CMemSpyEngineHelperFbServ::GetBitmapObjectLC( TAny* aCellAddress )
hgs
parents:
diff changeset
   727
    {
hgs
parents:
diff changeset
   728
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - START - aCellAddress: 0x%08x", aCellAddress ));
hgs
parents:
diff changeset
   729
hgs
parents:
diff changeset
   730
    // What we will return
hgs
parents:
diff changeset
   731
    CBitmapObject* object = new(ELeave) CBitmapObject();
hgs
parents:
diff changeset
   732
    CleanupStack::PushL( object );
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
    // The data we will read
hgs
parents:
diff changeset
   735
    HBufC8* cellData = NULL;
hgs
parents:
diff changeset
   736
    
hgs
parents:
diff changeset
   737
    // Try to get info about real cell
hgs
parents:
diff changeset
   738
    TMemSpyDriverCellType cellType;
hgs
parents:
diff changeset
   739
    TInt cellLength;
hgs
parents:
diff changeset
   740
    TInt cellNestingLevel;
hgs
parents:
diff changeset
   741
    TInt cellAllocationNumber;
hgs
parents:
diff changeset
   742
    TInt cellHeaderSize;
hgs
parents:
diff changeset
   743
    TAny* cellPayloadAddress;
hgs
parents:
diff changeset
   744
hgs
parents:
diff changeset
   745
    // NOTE: this call may change the value of 'cellAddress'
hgs
parents:
diff changeset
   746
    TInt err = iEngine.Driver().WalkHeapGetCellInfo( aCellAddress, cellType, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   747
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - err: %d, cellAddress: 0x%08x, cellLength: %d, cellAllocationNumber: %d, cellType: %d", err, aCellAddress, cellLength, cellAllocationNumber, cellType));
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
    if (err == KErrNone && (cellType & EMemSpyDriverAllocatedCellMask))
hgs
parents:
diff changeset
   750
        {
hgs
parents:
diff changeset
   751
        // Check that the cell size meets our expectations - it should be a CBitmapObject, but without the additional "this" pointer
hgs
parents:
diff changeset
   752
        // which we have tacked onto the object.
hgs
parents:
diff changeset
   753
        const TInt expectedCellSize = sizeof( CBitmapObject ) + cellHeaderSize - sizeof( CBitmapObject* );
hgs
parents:
diff changeset
   754
        TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - expectedCellSize: %d, actual: %d, address: 0x%08x", expectedCellSize, cellLength, aCellAddress));
hgs
parents:
diff changeset
   755
hgs
parents:
diff changeset
   756
        if  ( expectedCellSize <= cellLength )
hgs
parents:
diff changeset
   757
            {
hgs
parents:
diff changeset
   758
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - cell lengths are good, trying to get cell data..."));
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
            // Try to get real cell data        
hgs
parents:
diff changeset
   761
            cellData = HBufC8::NewLC( cellLength );
hgs
parents:
diff changeset
   762
            TPtr8 pData( cellData->Des() );
hgs
parents:
diff changeset
   763
            //
hgs
parents:
diff changeset
   764
            err = iEngine.Driver().WalkHeapReadCellData( aCellAddress, pData, cellLength );
hgs
parents:
diff changeset
   765
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - reading cell data returned error: %d", err));
hgs
parents:
diff changeset
   766
            }
hgs
parents:
diff changeset
   767
        else
hgs
parents:
diff changeset
   768
            {
hgs
parents:
diff changeset
   769
            TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - not enough data -> KErrCorrupt"));
hgs
parents:
diff changeset
   770
            err = KErrCorrupt;
hgs
parents:
diff changeset
   771
            }
hgs
parents:
diff changeset
   772
        }
hgs
parents:
diff changeset
   773
    else
hgs
parents:
diff changeset
   774
        {
hgs
parents:
diff changeset
   775
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   776
        }
hgs
parents:
diff changeset
   777
62
hgs
parents: 51
diff changeset
   778
    if( cellData )
hgs
parents: 51
diff changeset
   779
    	{
hgs
parents: 51
diff changeset
   780
		RDesReadStream stream( *cellData );
hgs
parents: 51
diff changeset
   781
		CleanupClosePushL( stream );
hgs
parents: 51
diff changeset
   782
    	    
hgs
parents: 51
diff changeset
   783
		// Read vtable
hgs
parents: 51
diff changeset
   784
		const TUint32 vTable = stream.ReadUint32L();
hgs
parents: 51
diff changeset
   785
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - actual vTable: 0x%08x", vTable ));
hgs
parents: 51
diff changeset
   786
		TBool isROMAddress = EFalse;
hgs
parents: 51
diff changeset
   787
		err = User::IsRomAddress( isROMAddress, (TAny*) vTable );
hgs
parents: 51
diff changeset
   788
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - vtable (0x%08x) is in ROM: %d (error: %d)", vTable, isROMAddress, err));
hgs
parents: 51
diff changeset
   789
		User::LeaveIfError( err );
51
hgs
parents:
diff changeset
   790
62
hgs
parents: 51
diff changeset
   791
		// Skip CObject members
hgs
parents: 51
diff changeset
   792
		(void) stream.ReadL( sizeof( CObject ) ); // skip this much
hgs
parents: 51
diff changeset
   793
		object->iThisPointer = reinterpret_cast< CBitmapObject* >( cellPayloadAddress );;
hgs
parents: 51
diff changeset
   794
		object->iTop = reinterpret_cast< CBase* >( stream.ReadUint32L() );
hgs
parents: 51
diff changeset
   795
		object->iAddressPointer = reinterpret_cast< CBitwiseBitmap* >( stream.ReadUint32L() );
hgs
parents: 51
diff changeset
   796
		object->iHandle = stream.ReadInt32L();
hgs
parents: 51
diff changeset
   797
		object->iCleanBitmap = reinterpret_cast< CBitmapObject* >( stream.ReadUint32L() );
51
hgs
parents:
diff changeset
   798
62
hgs
parents: 51
diff changeset
   799
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - object->iThisPointer:    0x%08x", object->iThisPointer ));
hgs
parents: 51
diff changeset
   800
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - object->iTop:            0x%08x", object->iTop ));
hgs
parents: 51
diff changeset
   801
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - object->iAddressPointer: 0x%08x", object->iAddressPointer ));
hgs
parents: 51
diff changeset
   802
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - object->iHandle:         0x%08x", object->iHandle ));
hgs
parents: 51
diff changeset
   803
		TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - object->iCleanBitmap:    0x%08x", object->iCleanBitmap ));
51
hgs
parents:
diff changeset
   804
    
62
hgs
parents: 51
diff changeset
   805
		// Clean up - don't need this data anymore. Real data is in another cell
hgs
parents: 51
diff changeset
   806
    	CleanupStack::PopAndDestroy( 2, cellData );  // stream & cellData
hgs
parents: 51
diff changeset
   807
    	}
51
hgs
parents:
diff changeset
   808
hgs
parents:
diff changeset
   809
    TRACE( RDebug::Printf("CMemSpyEngineHelperFbServ::GetBitmapObjectLC() - END - aCellAddress: 0x%08x", aCellAddress ));
hgs
parents:
diff changeset
   810
    return object;
hgs
parents:
diff changeset
   811
    }
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
hgs
parents:
diff changeset
   815
hgs
parents:
diff changeset
   816
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
hgs
parents:
diff changeset
   825
hgs
parents:
diff changeset
   826
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
hgs
parents:
diff changeset
   833
hgs
parents:
diff changeset
   834
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
hgs
parents:
diff changeset
   837
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
CMemSpyEngineFbServBitmapArray::CMemSpyEngineFbServBitmapArray( const RArray<TInt>& aBitmapHandles )
hgs
parents:
diff changeset
   840
:   CActive( CActive::EPriorityIdle ), iBitmapHandles( aBitmapHandles ), iGranularity( 0 )
hgs
parents:
diff changeset
   841
    {
hgs
parents:
diff changeset
   842
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
   843
    }
hgs
parents:
diff changeset
   844
hgs
parents:
diff changeset
   845
hgs
parents:
diff changeset
   846
CMemSpyEngineFbServBitmapArray::CMemSpyEngineFbServBitmapArray( TInt aPriority, const RArray<TInt>& aBitmapHandles, MMemSpyEngineFbSerbBitmapArrayObserver& aObserver, TInt aGranularity )
hgs
parents:
diff changeset
   847
:   CActive( aPriority ), iBitmapHandles( aBitmapHandles ), iObserver( &aObserver ), iGranularity( aGranularity )
hgs
parents:
diff changeset
   848
    {
hgs
parents:
diff changeset
   849
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
   850
    CompleteSelf();
hgs
parents:
diff changeset
   851
    }
hgs
parents:
diff changeset
   852
hgs
parents:
diff changeset
   853
hgs
parents:
diff changeset
   854
EXPORT_C CMemSpyEngineFbServBitmapArray::~CMemSpyEngineFbServBitmapArray()
hgs
parents:
diff changeset
   855
    {
hgs
parents:
diff changeset
   856
    Cancel();
hgs
parents:
diff changeset
   857
    //
hgs
parents:
diff changeset
   858
    iBitmaps.ResetAndDestroy();
hgs
parents:
diff changeset
   859
    iBitmaps.Close();
hgs
parents:
diff changeset
   860
    }
hgs
parents:
diff changeset
   861
hgs
parents:
diff changeset
   862
hgs
parents:
diff changeset
   863
void CMemSpyEngineFbServBitmapArray::ConstructL()
hgs
parents:
diff changeset
   864
    {
hgs
parents:
diff changeset
   865
    if  ( !IsActive() )
hgs
parents:
diff changeset
   866
        {
hgs
parents:
diff changeset
   867
        // Sync construction...
hgs
parents:
diff changeset
   868
        const TInt count = iBitmapHandles.Count();
hgs
parents:
diff changeset
   869
        for(TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
   870
            {
hgs
parents:
diff changeset
   871
            const TInt handle = iBitmapHandles[ i ];
hgs
parents:
diff changeset
   872
            //
hgs
parents:
diff changeset
   873
            TRAP_IGNORE( CreateBitmapL( handle ) );
hgs
parents:
diff changeset
   874
            }
hgs
parents:
diff changeset
   875
    
hgs
parents:
diff changeset
   876
        SortBySizeL();
hgs
parents:
diff changeset
   877
        }
hgs
parents:
diff changeset
   878
    }
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
EXPORT_C CMemSpyEngineFbServBitmapArray* CMemSpyEngineFbServBitmapArray::NewL( const RArray<TInt>& aBitmapHandles )
hgs
parents:
diff changeset
   882
    {
hgs
parents:
diff changeset
   883
    CMemSpyEngineFbServBitmapArray* self = new(ELeave) CMemSpyEngineFbServBitmapArray( aBitmapHandles );
hgs
parents:
diff changeset
   884
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   885
    self->ConstructL();
hgs
parents:
diff changeset
   886
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   887
    return self;
hgs
parents:
diff changeset
   888
    }
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
hgs
parents:
diff changeset
   891
EXPORT_C CMemSpyEngineFbServBitmapArray* CMemSpyEngineFbServBitmapArray::NewL( TInt aPriority, const RArray<TInt>& aBitmapHandles, MMemSpyEngineFbSerbBitmapArrayObserver& aObserver, TInt aGranularity )
hgs
parents:
diff changeset
   892
    {
hgs
parents:
diff changeset
   893
    CMemSpyEngineFbServBitmapArray* self = new(ELeave) CMemSpyEngineFbServBitmapArray( aPriority, aBitmapHandles, aObserver, aGranularity );
hgs
parents:
diff changeset
   894
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   895
    self->ConstructL();
hgs
parents:
diff changeset
   896
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   897
    return self;
hgs
parents:
diff changeset
   898
    }
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
hgs
parents:
diff changeset
   901
EXPORT_C TInt CMemSpyEngineFbServBitmapArray::Count() const
hgs
parents:
diff changeset
   902
    {
hgs
parents:
diff changeset
   903
    return iBitmaps.Count();
hgs
parents:
diff changeset
   904
    }
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
hgs
parents:
diff changeset
   907
EXPORT_C CMemSpyEngineFbServBitmap& CMemSpyEngineFbServBitmapArray::At( TInt aIndex )
hgs
parents:
diff changeset
   908
    {
hgs
parents:
diff changeset
   909
    return *iBitmaps[ aIndex ];
hgs
parents:
diff changeset
   910
    }
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
hgs
parents:
diff changeset
   913
EXPORT_C const CMemSpyEngineFbServBitmap& CMemSpyEngineFbServBitmapArray::At( TInt aIndex ) const
hgs
parents:
diff changeset
   914
    {
hgs
parents:
diff changeset
   915
    return *iBitmaps[ aIndex ];
hgs
parents:
diff changeset
   916
    }
hgs
parents:
diff changeset
   917
hgs
parents:
diff changeset
   918
hgs
parents:
diff changeset
   919
EXPORT_C CMemSpyEngineFbServBitmap& CMemSpyEngineFbServBitmapArray::BitmapByHandleL( TInt aHandle )
hgs
parents:
diff changeset
   920
    {
hgs
parents:
diff changeset
   921
    const TInt index = BitmapIndexByHandle( aHandle );
hgs
parents:
diff changeset
   922
    User::LeaveIfError( index );
hgs
parents:
diff changeset
   923
    CMemSpyEngineFbServBitmap& ret = At( index );
hgs
parents:
diff changeset
   924
    return ret;
hgs
parents:
diff changeset
   925
    }
hgs
parents:
diff changeset
   926
hgs
parents:
diff changeset
   927
hgs
parents:
diff changeset
   928
EXPORT_C TInt CMemSpyEngineFbServBitmapArray::BitmapIndexByHandle( TInt aHandle ) const
hgs
parents:
diff changeset
   929
    {
hgs
parents:
diff changeset
   930
    TInt ret = KErrNotFound;
hgs
parents:
diff changeset
   931
    //
hgs
parents:
diff changeset
   932
    const TInt count = Count();
hgs
parents:
diff changeset
   933
    for( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
   934
        {
hgs
parents:
diff changeset
   935
        const CMemSpyEngineFbServBitmap& bitmap = At( i );
hgs
parents:
diff changeset
   936
        //
hgs
parents:
diff changeset
   937
        if  ( bitmap.Handle() == aHandle )
hgs
parents:
diff changeset
   938
            {
hgs
parents:
diff changeset
   939
            ret = i;
hgs
parents:
diff changeset
   940
            break;
hgs
parents:
diff changeset
   941
            }
hgs
parents:
diff changeset
   942
        }
hgs
parents:
diff changeset
   943
    //
hgs
parents:
diff changeset
   944
    return ret;
hgs
parents:
diff changeset
   945
    }
hgs
parents:
diff changeset
   946
hgs
parents:
diff changeset
   947
hgs
parents:
diff changeset
   948
EXPORT_C TInt CMemSpyEngineFbServBitmapArray::MdcaCount() const
hgs
parents:
diff changeset
   949
    {
hgs
parents:
diff changeset
   950
    return Count();
hgs
parents:
diff changeset
   951
    }
hgs
parents:
diff changeset
   952
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
EXPORT_C TPtrC CMemSpyEngineFbServBitmapArray::MdcaPoint( TInt aIndex ) const
hgs
parents:
diff changeset
   955
    {
hgs
parents:
diff changeset
   956
    const CMemSpyEngineFbServBitmap& bitmap = At( aIndex );
hgs
parents:
diff changeset
   957
    return TPtrC( bitmap.Caption() );
hgs
parents:
diff changeset
   958
    }
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
hgs
parents:
diff changeset
   961
void CMemSpyEngineFbServBitmapArray::RunL()
hgs
parents:
diff changeset
   962
    {
hgs
parents:
diff changeset
   963
    const TInt bitmapHandleCount = iBitmapHandles.Count();
hgs
parents:
diff changeset
   964
    const TInt endIndex = Min( iIndex + iGranularity, bitmapHandleCount );
hgs
parents:
diff changeset
   965
    //
hgs
parents:
diff changeset
   966
    for( ; iIndex < endIndex; iIndex++ )
hgs
parents:
diff changeset
   967
        {
hgs
parents:
diff changeset
   968
        const TInt handle = iBitmapHandles[ iIndex ];
hgs
parents:
diff changeset
   969
        //
hgs
parents:
diff changeset
   970
        TRAP_IGNORE( CreateBitmapL( handle ) );
hgs
parents:
diff changeset
   971
        }
hgs
parents:
diff changeset
   972
    
hgs
parents:
diff changeset
   973
    // Report progress & queue for next iteration
hgs
parents:
diff changeset
   974
    MMemSpyEngineFbSerbBitmapArrayObserver::TEvent event = MMemSpyEngineFbSerbBitmapArrayObserver::EBitmapArrayConstructionComplete;
hgs
parents:
diff changeset
   975
    if  ( endIndex < bitmapHandleCount )
hgs
parents:
diff changeset
   976
        {
hgs
parents:
diff changeset
   977
        CompleteSelf();
hgs
parents:
diff changeset
   978
        event = MMemSpyEngineFbSerbBitmapArrayObserver::EBitmapItemsCreated;
hgs
parents:
diff changeset
   979
        }
hgs
parents:
diff changeset
   980
    else
hgs
parents:
diff changeset
   981
        {
hgs
parents:
diff changeset
   982
        SortBySizeL();
hgs
parents:
diff changeset
   983
        }
hgs
parents:
diff changeset
   984
hgs
parents:
diff changeset
   985
    if  ( iObserver )
hgs
parents:
diff changeset
   986
        {
hgs
parents:
diff changeset
   987
        iObserver->HandleFbServBitmapArrayEventL( event );
hgs
parents:
diff changeset
   988
        }
hgs
parents:
diff changeset
   989
    }
hgs
parents:
diff changeset
   990
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
void CMemSpyEngineFbServBitmapArray::DoCancel()
hgs
parents:
diff changeset
   993
    {
hgs
parents:
diff changeset
   994
    // Nothing to do
hgs
parents:
diff changeset
   995
    }
hgs
parents:
diff changeset
   996
hgs
parents:
diff changeset
   997
hgs
parents:
diff changeset
   998
TInt CMemSpyEngineFbServBitmapArray::RunError( TInt /*aError*/ )
hgs
parents:
diff changeset
   999
    {
hgs
parents:
diff changeset
  1000
    return KErrNone;
hgs
parents:
diff changeset
  1001
    }
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
hgs
parents:
diff changeset
  1004
void CMemSpyEngineFbServBitmapArray::CompleteSelf()
hgs
parents:
diff changeset
  1005
    {
hgs
parents:
diff changeset
  1006
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
  1007
    User::RequestComplete( status, KErrNone );
hgs
parents:
diff changeset
  1008
    SetActive();
hgs
parents:
diff changeset
  1009
    }
hgs
parents:
diff changeset
  1010
hgs
parents:
diff changeset
  1011
hgs
parents:
diff changeset
  1012
void CMemSpyEngineFbServBitmapArray::CreateBitmapL( TInt aHandle )
hgs
parents:
diff changeset
  1013
    {
hgs
parents:
diff changeset
  1014
    CMemSpyEngineFbServBitmap* bitmap = CMemSpyEngineFbServBitmap::NewLC( aHandle );
hgs
parents:
diff changeset
  1015
    iBitmaps.AppendL( bitmap );
hgs
parents:
diff changeset
  1016
    CleanupStack::Pop( bitmap );
hgs
parents:
diff changeset
  1017
    }
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
void CMemSpyEngineFbServBitmapArray::SortBySizeL()
hgs
parents:
diff changeset
  1021
    {
hgs
parents:
diff changeset
  1022
    TLinearOrder< CMemSpyEngineFbServBitmap > comparer( CompareBySize );
hgs
parents:
diff changeset
  1023
    iBitmaps.Sort( comparer );
hgs
parents:
diff changeset
  1024
    }
hgs
parents:
diff changeset
  1025
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
TInt CMemSpyEngineFbServBitmapArray::CompareBySize( const CMemSpyEngineFbServBitmap& aLeft, const CMemSpyEngineFbServBitmap& aRight )
hgs
parents:
diff changeset
  1028
    {
hgs
parents:
diff changeset
  1029
    TInt ret = 1;
hgs
parents:
diff changeset
  1030
    //
hgs
parents:
diff changeset
  1031
    if  ( aLeft.BitmapSizeInBytes() > aRight.BitmapSizeInBytes() )
hgs
parents:
diff changeset
  1032
        {
hgs
parents:
diff changeset
  1033
        ret = -1;
hgs
parents:
diff changeset
  1034
        }
hgs
parents:
diff changeset
  1035
    else if ( aLeft.BitmapSizeInBytes() == aRight.BitmapSizeInBytes() )
hgs
parents:
diff changeset
  1036
        {
hgs
parents:
diff changeset
  1037
        ret = 0;
hgs
parents:
diff changeset
  1038
        }
hgs
parents:
diff changeset
  1039
    //
hgs
parents:
diff changeset
  1040
    return ret;
hgs
parents:
diff changeset
  1041
    }
hgs
parents:
diff changeset
  1042
hgs
parents:
diff changeset
  1043
hgs
parents:
diff changeset
  1044
hgs
parents:
diff changeset
  1045
hgs
parents:
diff changeset
  1046
hgs
parents:
diff changeset
  1047
hgs
parents:
diff changeset
  1048
hgs
parents:
diff changeset
  1049
hgs
parents:
diff changeset
  1050
hgs
parents:
diff changeset
  1051
hgs
parents:
diff changeset
  1052
hgs
parents:
diff changeset
  1053
hgs
parents:
diff changeset
  1054
hgs
parents:
diff changeset
  1055
hgs
parents:
diff changeset
  1056
hgs
parents:
diff changeset
  1057
hgs
parents:
diff changeset
  1058
hgs
parents:
diff changeset
  1059
hgs
parents:
diff changeset
  1060
hgs
parents:
diff changeset
  1061
hgs
parents:
diff changeset
  1062
hgs
parents:
diff changeset
  1063
hgs
parents:
diff changeset
  1064
CMemSpyEngineFbServBitmap::CMemSpyEngineFbServBitmap()
hgs
parents:
diff changeset
  1065
:   CDesCArrayFlat( 5 )
hgs
parents:
diff changeset
  1066
    {
hgs
parents:
diff changeset
  1067
    }
hgs
parents:
diff changeset
  1068
hgs
parents:
diff changeset
  1069
hgs
parents:
diff changeset
  1070
EXPORT_C CMemSpyEngineFbServBitmap::~CMemSpyEngineFbServBitmap()
hgs
parents:
diff changeset
  1071
    {
hgs
parents:
diff changeset
  1072
    delete iBitmap;
hgs
parents:
diff changeset
  1073
    delete iCaption;
hgs
parents:
diff changeset
  1074
    }
hgs
parents:
diff changeset
  1075
hgs
parents:
diff changeset
  1076
hgs
parents:
diff changeset
  1077
void CMemSpyEngineFbServBitmap::ConstructL( TInt aHandle )
hgs
parents:
diff changeset
  1078
    {
hgs
parents:
diff changeset
  1079
    iBitmap = new(ELeave) CFbsBitmap();
hgs
parents:
diff changeset
  1080
    const TInt error = iBitmap->Duplicate( aHandle );
hgs
parents:
diff changeset
  1081
    User::LeaveIfError( error );
hgs
parents:
diff changeset
  1082
    const SEpocBitmapHeader header( iBitmap->Header() );
hgs
parents:
diff changeset
  1083
hgs
parents:
diff changeset
  1084
    // Prepare caption
hgs
parents:
diff changeset
  1085
    _LIT( KCaptionFormat, "\t%2d bpp, %S\t\t%4d x %4d pixels" );
hgs
parents:
diff changeset
  1086
    iCaption = HBufC::NewL( 128 );
hgs
parents:
diff changeset
  1087
    TPtr pCaption( iCaption->Des() );
hgs
parents:
diff changeset
  1088
    
hgs
parents:
diff changeset
  1089
    // Create size string
hgs
parents:
diff changeset
  1090
    const TMemSpySizeText size( MemSpyEngineUtils::FormatSizeText( header.iBitmapSize ) );
hgs
parents:
diff changeset
  1091
    pCaption.AppendFormat( KCaptionFormat, header.iBitsPerPixel, &size, header.iSizeInPixels.iWidth, header.iSizeInPixels.iHeight );
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
    // Prepare items
hgs
parents:
diff changeset
  1094
    PrepareItemsL();
hgs
parents:
diff changeset
  1095
    }
hgs
parents:
diff changeset
  1096
hgs
parents:
diff changeset
  1097
hgs
parents:
diff changeset
  1098
EXPORT_C CMemSpyEngineFbServBitmap* CMemSpyEngineFbServBitmap::NewLC( TInt aHandle )
hgs
parents:
diff changeset
  1099
    {
hgs
parents:
diff changeset
  1100
    CMemSpyEngineFbServBitmap* self = new(ELeave) CMemSpyEngineFbServBitmap();
hgs
parents:
diff changeset
  1101
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
  1102
    self->ConstructL( aHandle );
hgs
parents:
diff changeset
  1103
    return self;
hgs
parents:
diff changeset
  1104
    }
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
hgs
parents:
diff changeset
  1107
TInt CMemSpyEngineFbServBitmap::BitmapSizeInBytes() const
hgs
parents:
diff changeset
  1108
    {
hgs
parents:
diff changeset
  1109
    const SEpocBitmapHeader header( iBitmap->Header() );
hgs
parents:
diff changeset
  1110
    return header.iBitmapSize;
hgs
parents:
diff changeset
  1111
    }
hgs
parents:
diff changeset
  1112
hgs
parents:
diff changeset
  1113
hgs
parents:
diff changeset
  1114
EXPORT_C const TDesC& CMemSpyEngineFbServBitmap::Caption() const
hgs
parents:
diff changeset
  1115
    {
hgs
parents:
diff changeset
  1116
    return *iCaption;
hgs
parents:
diff changeset
  1117
    }
hgs
parents:
diff changeset
  1118
hgs
parents:
diff changeset
  1119
hgs
parents:
diff changeset
  1120
EXPORT_C CFbsBitmap& CMemSpyEngineFbServBitmap::Bitmap()
hgs
parents:
diff changeset
  1121
    {
hgs
parents:
diff changeset
  1122
    return *iBitmap;
hgs
parents:
diff changeset
  1123
    }
hgs
parents:
diff changeset
  1124
hgs
parents:
diff changeset
  1125
hgs
parents:
diff changeset
  1126
EXPORT_C const CFbsBitmap& CMemSpyEngineFbServBitmap::Bitmap() const
hgs
parents:
diff changeset
  1127
    {
hgs
parents:
diff changeset
  1128
    return *iBitmap;
hgs
parents:
diff changeset
  1129
    }
hgs
parents:
diff changeset
  1130
hgs
parents:
diff changeset
  1131
hgs
parents:
diff changeset
  1132
EXPORT_C TInt CMemSpyEngineFbServBitmap::Handle() const
hgs
parents:
diff changeset
  1133
    {
hgs
parents:
diff changeset
  1134
    return iBitmap->Handle();
hgs
parents:
diff changeset
  1135
    }
hgs
parents:
diff changeset
  1136
hgs
parents:
diff changeset
  1137
hgs
parents:
diff changeset
  1138
EXPORT_C void CMemSpyEngineFbServBitmap::OutputDataL( CMemSpyEngine& aEngine ) const
hgs
parents:
diff changeset
  1139
    {
hgs
parents:
diff changeset
  1140
    const SEpocBitmapHeader header( iBitmap->Header() );
hgs
parents:
diff changeset
  1141
    //
hgs
parents:
diff changeset
  1142
    _LIT(KMemSpyFBServHex, "0x%08x");
hgs
parents:
diff changeset
  1143
    _LIT(KMemSpyFBServDecimal, "%d");
hgs
parents:
diff changeset
  1144
    //
hgs
parents:
diff changeset
  1145
    HBufC* columns = HBufC::NewLC( 1024 );
hgs
parents:
diff changeset
  1146
    TPtr pColumns( columns->Des() );
hgs
parents:
diff changeset
  1147
    //
hgs
parents:
diff changeset
  1148
    pColumns.AppendFormat( KMemSpyFBServHex, Handle() );
hgs
parents:
diff changeset
  1149
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1150
    //
hgs
parents:
diff changeset
  1151
    pColumns.AppendFormat( KMemSpyFBServDecimal, header.iBitmapSize );
hgs
parents:
diff changeset
  1152
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1153
    //
hgs
parents:
diff changeset
  1154
    pColumns.AppendFormat( KMemSpyFBServDecimal, header.iSizeInPixels.iWidth );
hgs
parents:
diff changeset
  1155
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1156
    //
hgs
parents:
diff changeset
  1157
    pColumns.AppendFormat( KMemSpyFBServDecimal, header.iSizeInPixels.iHeight );
hgs
parents:
diff changeset
  1158
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1159
    //
hgs
parents:
diff changeset
  1160
    pColumns.AppendFormat( KMemSpyFBServDecimal, header.iBitsPerPixel );
hgs
parents:
diff changeset
  1161
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1162
    //
hgs
parents:
diff changeset
  1163
    pColumns.AppendFormat( KMemSpyFBServDecimal, header.iColor );
hgs
parents:
diff changeset
  1164
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1165
    //
hgs
parents:
diff changeset
  1166
    TBuf<24> fileCompressionType;
hgs
parents:
diff changeset
  1167
    GetFileCompressionTypeAsString( header.iCompression, fileCompressionType );
hgs
parents:
diff changeset
  1168
    pColumns.Append( fileCompressionType );
hgs
parents:
diff changeset
  1169
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1170
    //
hgs
parents:
diff changeset
  1171
    GetExportableFileNameL( pColumns );
hgs
parents:
diff changeset
  1172
    //
hgs
parents:
diff changeset
  1173
    aEngine.Sink().OutputLineL( pColumns );
hgs
parents:
diff changeset
  1174
    CleanupStack::PopAndDestroy( columns );
hgs
parents:
diff changeset
  1175
    }
hgs
parents:
diff changeset
  1176
hgs
parents:
diff changeset
  1177
hgs
parents:
diff changeset
  1178
EXPORT_C void CMemSpyEngineFbServBitmap::OutputDataColumnsL( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
  1179
    {
hgs
parents:
diff changeset
  1180
    HBufC* columns = HBufC::NewLC( 1024 );
hgs
parents:
diff changeset
  1181
    TPtr pColumns( columns->Des() );
hgs
parents:
diff changeset
  1182
    //
hgs
parents:
diff changeset
  1183
    _LIT(KCol1, "Handle");
hgs
parents:
diff changeset
  1184
    pColumns.Append( KCol1 );
hgs
parents:
diff changeset
  1185
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1186
    //
hgs
parents:
diff changeset
  1187
    _LIT(KCol2, "Uncompressed Size (Bytes)");
hgs
parents:
diff changeset
  1188
    pColumns.Append( KCol2 );
hgs
parents:
diff changeset
  1189
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1190
    //
hgs
parents:
diff changeset
  1191
    _LIT(KCol3, "Width");
hgs
parents:
diff changeset
  1192
    pColumns.Append( KCol3 );
hgs
parents:
diff changeset
  1193
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1194
    //
hgs
parents:
diff changeset
  1195
    _LIT(KCol4, "Height");
hgs
parents:
diff changeset
  1196
    pColumns.Append( KCol4 );
hgs
parents:
diff changeset
  1197
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1198
    //
hgs
parents:
diff changeset
  1199
    _LIT(KCol5, "BPP");
hgs
parents:
diff changeset
  1200
    pColumns.Append( KCol5 );
hgs
parents:
diff changeset
  1201
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1202
    //
hgs
parents:
diff changeset
  1203
    _LIT(KCol6, "Color");
hgs
parents:
diff changeset
  1204
    pColumns.Append( KCol6 );
hgs
parents:
diff changeset
  1205
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1206
    //
hgs
parents:
diff changeset
  1207
    _LIT(KCol7, "Compression");
hgs
parents:
diff changeset
  1208
    pColumns.Append( KCol7 );
hgs
parents:
diff changeset
  1209
    pColumns.Append( KMemSpyEngineFBServComma );
hgs
parents:
diff changeset
  1210
    //
hgs
parents:
diff changeset
  1211
    _LIT(KCol8, "File Name");
hgs
parents:
diff changeset
  1212
    pColumns.Append( KCol8 );
hgs
parents:
diff changeset
  1213
    //
hgs
parents:
diff changeset
  1214
    aEngine.Sink().OutputLineL( pColumns );
hgs
parents:
diff changeset
  1215
    CleanupStack::PopAndDestroy( columns );
hgs
parents:
diff changeset
  1216
    }
hgs
parents:
diff changeset
  1217
hgs
parents:
diff changeset
  1218
hgs
parents:
diff changeset
  1219
EXPORT_C void CMemSpyEngineFbServBitmap::GetExportableFileNameL( TDes& aAppendName ) const
hgs
parents:
diff changeset
  1220
    {
hgs
parents:
diff changeset
  1221
    const SEpocBitmapHeader header( iBitmap->Header() );
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
    // Create a filename
hgs
parents:
diff changeset
  1224
    aAppendName.AppendFormat( KMemSpyEngineFBServExportFileName, Handle(), header.iBitsPerPixel, header.iSizeInPixels.iWidth, header.iSizeInPixels.iHeight );
hgs
parents:
diff changeset
  1225
    }
hgs
parents:
diff changeset
  1226
hgs
parents:
diff changeset
  1227
hgs
parents:
diff changeset
  1228
void CMemSpyEngineFbServBitmap::GetExportableFileNameL( const TMemSpyEngineFBServBitmapInfo& aInfo, TDes& aAppendName )
hgs
parents:
diff changeset
  1229
    {
hgs
parents:
diff changeset
  1230
    aAppendName.AppendFormat( KMemSpyEngineFBServExportFileName, aInfo.iHandle, aInfo.iBitsPerPixel, aInfo.iSizeInPixels.iWidth, aInfo.iSizeInPixels.iHeight );
hgs
parents:
diff changeset
  1231
    }
hgs
parents:
diff changeset
  1232
hgs
parents:
diff changeset
  1233
hgs
parents:
diff changeset
  1234
void CMemSpyEngineFbServBitmap::PrepareItemsL()
hgs
parents:
diff changeset
  1235
    {
hgs
parents:
diff changeset
  1236
    const SEpocBitmapHeader header( iBitmap->Header() );
hgs
parents:
diff changeset
  1237
    TBuf<256> item;
hgs
parents:
diff changeset
  1238
hgs
parents:
diff changeset
  1239
    // View bitmap (ugly, but needed by UI)
hgs
parents:
diff changeset
  1240
    _LIT(KCaptionMinus2, "\tView Bitmap\t\t");
hgs
parents:
diff changeset
  1241
    AppendL( KCaptionMinus2 );
hgs
parents:
diff changeset
  1242
hgs
parents:
diff changeset
  1243
    // Dimensions
hgs
parents:
diff changeset
  1244
    _LIT(KCaptionMinus1, "\tDimensions\t\t%5d x %5d");
hgs
parents:
diff changeset
  1245
    item.Format( KCaptionMinus1, header.iSizeInPixels.iWidth, header.iSizeInPixels.iHeight );
hgs
parents:
diff changeset
  1246
    AppendL( item );
hgs
parents:
diff changeset
  1247
hgs
parents:
diff changeset
  1248
    // Handle
hgs
parents:
diff changeset
  1249
    _LIT(KCaption0, "\tHandle\t\t0x%08x");
hgs
parents:
diff changeset
  1250
    item.Format( KCaption0, iBitmap->Handle() );
hgs
parents:
diff changeset
  1251
    AppendL( item );
hgs
parents:
diff changeset
  1252
hgs
parents:
diff changeset
  1253
    // In Rom?
hgs
parents:
diff changeset
  1254
    _LIT(KCaption1, "\tIn ROM?\t\t%S");
hgs
parents:
diff changeset
  1255
    _LIT(KIsRomBitmap, "Yes");
hgs
parents:
diff changeset
  1256
    _LIT(KNotRomBitmap, "No");
hgs
parents:
diff changeset
  1257
    if  ( iBitmap->IsRomBitmap() )
hgs
parents:
diff changeset
  1258
        {
hgs
parents:
diff changeset
  1259
        item.Format( KCaption1, &KIsRomBitmap );
hgs
parents:
diff changeset
  1260
        }
hgs
parents:
diff changeset
  1261
    else
hgs
parents:
diff changeset
  1262
        {
hgs
parents:
diff changeset
  1263
        item.Format( KCaption1, &KNotRomBitmap );
hgs
parents:
diff changeset
  1264
        }
hgs
parents:
diff changeset
  1265
    AppendL( item );
hgs
parents:
diff changeset
  1266
hgs
parents:
diff changeset
  1267
    // Bits per pixel
hgs
parents:
diff changeset
  1268
    _LIT(KCaption2, "\tBits Per Pixel\t\t%2d");
hgs
parents:
diff changeset
  1269
    item.Format( KCaption2, header.iBitsPerPixel );
hgs
parents:
diff changeset
  1270
    AppendL( item );
hgs
parents:
diff changeset
  1271
hgs
parents:
diff changeset
  1272
    // Size of uncompressed bitmap data
hgs
parents:
diff changeset
  1273
    _LIT(KCaption3, "\tUncompressed data size\t\t%S");
hgs
parents:
diff changeset
  1274
    const TMemSpySizeText sizeStringUncompressed( MemSpyEngineUtils::FormatSizeText( header.iBitmapSize ) );
hgs
parents:
diff changeset
  1275
    item.Format( KCaption3, &sizeStringUncompressed );
hgs
parents:
diff changeset
  1276
    AppendL( item );
hgs
parents:
diff changeset
  1277
hgs
parents:
diff changeset
  1278
    // Palette entry count
hgs
parents:
diff changeset
  1279
    _LIT(KCaption4, "\tNumber of palette entries\t\t%d");
hgs
parents:
diff changeset
  1280
    item.Format( KCaption4, header.iPaletteEntries );
hgs
parents:
diff changeset
  1281
    AppendL( item );
hgs
parents:
diff changeset
  1282
hgs
parents:
diff changeset
  1283
    // Colour
hgs
parents:
diff changeset
  1284
    _LIT(KCaption5, "\tColour\t\t%d");
hgs
parents:
diff changeset
  1285
    item.Format( KCaption5, header.iColor);
hgs
parents:
diff changeset
  1286
    AppendL( item );
hgs
parents:
diff changeset
  1287
hgs
parents:
diff changeset
  1288
    // Palette entry count
hgs
parents:
diff changeset
  1289
    _LIT(KCaption6, "\tFile compression type\t\t%S");
hgs
parents:
diff changeset
  1290
    TBuf<24> fileCompressionType;
hgs
parents:
diff changeset
  1291
    GetFileCompressionTypeAsString( header.iCompression, fileCompressionType );
hgs
parents:
diff changeset
  1292
    item.Format( KCaption6, &fileCompressionType );
hgs
parents:
diff changeset
  1293
    AppendL( item );
hgs
parents:
diff changeset
  1294
    }
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
hgs
parents:
diff changeset
  1297
void CMemSpyEngineFbServBitmap::GetFileCompressionTypeAsString( TBitmapfileCompression aType, TDes& aString )
hgs
parents:
diff changeset
  1298
    {
hgs
parents:
diff changeset
  1299
    _LIT(KUnknown, "Unknown");
hgs
parents:
diff changeset
  1300
    _LIT(KNoCompression, "None");
hgs
parents:
diff changeset
  1301
    _LIT(KRLE, "RLE");
hgs
parents:
diff changeset
  1302
    _LIT(KTwelveBitRLE, "12-bit RLE");
hgs
parents:
diff changeset
  1303
    _LIT(KSixteenBitRLE, "16-bit RLE");
hgs
parents:
diff changeset
  1304
    _LIT(KTwentyFourBitRLE, "24-bit RLE");
hgs
parents:
diff changeset
  1305
    _LIT(KThirtyTwoBitRLE, "32-bit RLE");
hgs
parents:
diff changeset
  1306
    //
hgs
parents:
diff changeset
  1307
    switch( aType )
hgs
parents:
diff changeset
  1308
        {
hgs
parents:
diff changeset
  1309
    case ENoBitmapCompression:
hgs
parents:
diff changeset
  1310
        aString = KNoCompression;
hgs
parents:
diff changeset
  1311
        break;
hgs
parents:
diff changeset
  1312
    case EByteRLECompression:
hgs
parents:
diff changeset
  1313
        aString = KRLE;
hgs
parents:
diff changeset
  1314
        break;
hgs
parents:
diff changeset
  1315
    case ETwelveBitRLECompression:
hgs
parents:
diff changeset
  1316
        aString = KTwelveBitRLE;
hgs
parents:
diff changeset
  1317
        break;
hgs
parents:
diff changeset
  1318
    case ESixteenBitRLECompression:
hgs
parents:
diff changeset
  1319
        aString = KSixteenBitRLE;
hgs
parents:
diff changeset
  1320
        break;
hgs
parents:
diff changeset
  1321
    case ETwentyFourBitRLECompression:
hgs
parents:
diff changeset
  1322
        aString = KTwentyFourBitRLE;
hgs
parents:
diff changeset
  1323
        break;
hgs
parents:
diff changeset
  1324
    case EThirtyTwoUBitRLECompression:
hgs
parents:
diff changeset
  1325
        aString = KThirtyTwoBitRLE;
hgs
parents:
diff changeset
  1326
        break;
hgs
parents:
diff changeset
  1327
    default:
hgs
parents:
diff changeset
  1328
    case ERLECompressionLast:
hgs
parents:
diff changeset
  1329
        aString = KUnknown;
hgs
parents:
diff changeset
  1330
        break;
hgs
parents:
diff changeset
  1331
        }
hgs
parents:
diff changeset
  1332
    }
hgs
parents:
diff changeset
  1333
hgs
parents:
diff changeset
  1334
hgs
parents:
diff changeset
  1335
hgs
parents:
diff changeset
  1336
hgs
parents:
diff changeset
  1337
hgs
parents:
diff changeset
  1338
hgs
parents:
diff changeset
  1339
hgs
parents:
diff changeset
  1340