memspy/Engine/Source/Helpers/MemSpyEngineHelperECom.cpp
changeset 51 98307c651589
parent 42 0ff24a8f6ca2
child 52 c2f44e33b468
equal deleted inserted replaced
42:0ff24a8f6ca2 51:98307c651589
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 
       
    18 #include <memspy/engine/memspyenginehelperecom.h>
       
    19 
       
    20 // System includes
       
    21 #include <charconv.h>
       
    22 
       
    23 // User includes
       
    24 #include <memspy/engine/memspyengine.h>
       
    25 #include <memspy/engine/memspyengineutils.h>
       
    26 #include <memspy/engine/memspyenginehelperfilesystem.h>
       
    27 
       
    28 // Literal constants
       
    29 _LIT8( KMemSpyEComXmlFileMimeType, "text/xml" );
       
    30 _LIT8( KMemSpyXmlSpec_MasterSection, "memspy_ecom_sections" );
       
    31 _LIT8( KMemSpyXmlSpec_ChildSectionCategory, "category" );
       
    32 _LIT8( KMemSpyXmlSpec_ChildSectionCategory_Attribute_Name, "name" );
       
    33 _LIT8( KMemSpyXmlSpec_ChildSectionInterface, "interface" );
       
    34 _LIT8( KMemSpyXmlSpec_ChildSectionInterface_Name, "name" );
       
    35 _LIT8( KMemSpyXmlSpec_ChildSectionInterface_Uid, "uid" );
       
    36 _LIT8( KMemSpyXmlSpec_HexPrefix, "0x" );
       
    37 
       
    38 
       
    39 
       
    40 
       
    41 
       
    42 CMemSpyEngineHelperECom::CMemSpyEngineHelperECom( CMemSpyEngine& aEngine )
       
    43 :   iEngine( aEngine )
       
    44     {
       
    45     }
       
    46 
       
    47     
       
    48 CMemSpyEngineHelperECom::~CMemSpyEngineHelperECom()
       
    49     {
       
    50     iCategories.ResetAndDestroy();
       
    51     iCategories.Close();
       
    52     //
       
    53     delete iParser;
       
    54     delete iConverter;
       
    55     //
       
    56     iEComSession.Close();
       
    57     REComSession::FinalClose();
       
    58     }
       
    59 
       
    60 
       
    61 void CMemSpyEngineHelperECom::ConstructL()
       
    62     {
       
    63     TRAPD( err, ConstructInternalL() );
       
    64     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructL() - error: %d", err );
       
    65     err = err;
       
    66     }
       
    67 
       
    68 
       
    69 void CMemSpyEngineHelperECom::ConstructInternalL()
       
    70     {
       
    71     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructInternalL() - START" );
       
    72     iEComSession = REComSession::OpenL();
       
    73 
       
    74     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructInternalL() - creating parser..." );
       
    75 	iParser = CParser::NewL( KMemSpyEComXmlFileMimeType, *this );
       
    76 
       
    77     // We only convert from UTF-8 to UTF-16
       
    78     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructInternalL() - creating charconv object..." );
       
    79     iConverter = CCnvCharacterSetConverter::NewL();
       
    80     if  ( iConverter->PrepareToConvertToOrFromL( KCharacterSetIdentifierUtf8, iEngine.FsSession() ) == CCnvCharacterSetConverter::ENotAvailable )
       
    81 	    {
       
    82 		User::Leave(KErrNotFound);
       
    83 		}
       
    84 
       
    85     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructInternalL() - reading xml..." );
       
    86     ConstructFromFileL();
       
    87     
       
    88     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructInternalL() - END" );
       
    89     }
       
    90 
       
    91 
       
    92 void CMemSpyEngineHelperECom::ConstructFromFileL()
       
    93     {
       
    94     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructFromFileL() - START" );
       
    95 
       
    96     // Locate the source file
       
    97     TRAPD( err, 
       
    98         HBufC* fileName = FindEComXmlFileNameLC();
       
    99         ParseL( *fileName );
       
   100         CleanupStack::PopAndDestroy( fileName );
       
   101         );
       
   102     err = err;
       
   103 
       
   104     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructFromFileL() - parse error: %d", err );
       
   105 
       
   106     delete iConverter;
       
   107     iConverter = NULL;
       
   108 
       
   109     // Build captions
       
   110     const TInt categoryCount = iCategories.Count();
       
   111     for( TInt i=0; i<categoryCount; i++ )
       
   112         {
       
   113         //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructFromFileL() - building caption: %d", i );
       
   114 
       
   115         CMemSpyEngineEComCategory* cat = iCategories[ i ];
       
   116         cat->BuildCaptionL();
       
   117         }
       
   118 
       
   119     //RDebug::Printf( "CMemSpyEngineHelperECom::ConstructFromFileL() - END" );
       
   120     }
       
   121 
       
   122 
       
   123 CMemSpyEngineHelperECom* CMemSpyEngineHelperECom::NewL( CMemSpyEngine& aEngine )
       
   124     {
       
   125     CMemSpyEngineHelperECom* self = new(ELeave) CMemSpyEngineHelperECom( aEngine );
       
   126     CleanupStack::PushL( self );
       
   127     self->ConstructL();
       
   128     CleanupStack::Pop( self );
       
   129     return self;
       
   130     }
       
   131 
       
   132 
       
   133 REComSession& CMemSpyEngineHelperECom::EComSession()
       
   134     {
       
   135     return iEComSession;
       
   136     }
       
   137 
       
   138 
       
   139 EXPORT_C CMemSpyEngineEComCategory& CMemSpyEngineHelperECom::At( TInt aIndex )
       
   140     {
       
   141     return *iCategories[ aIndex ];
       
   142     }
       
   143 
       
   144 
       
   145 EXPORT_C TInt CMemSpyEngineHelperECom::IndexOf( const CMemSpyEngineEComCategory& aEntry )
       
   146     {
       
   147     const TInt index = iCategories.Find( &aEntry );
       
   148     return index;
       
   149     }
       
   150 
       
   151 
       
   152 EXPORT_C TInt CMemSpyEngineHelperECom::MdcaCount() const
       
   153     {
       
   154     return iCategories.Count();
       
   155     }
       
   156 
       
   157 
       
   158 EXPORT_C TPtrC CMemSpyEngineHelperECom::MdcaPoint( TInt aIndex ) const
       
   159     {
       
   160     CMemSpyEngineEComCategory* category = iCategories[ aIndex ];
       
   161     return category->Caption();
       
   162     }
       
   163 
       
   164 
       
   165 HBufC* CMemSpyEngineHelperECom::FindEComXmlFileNameLC()
       
   166     {
       
   167     RFs& fsSession = iEngine.FsSession();
       
   168     //
       
   169     TFileName* fileName = new(ELeave) TFileName();
       
   170     CleanupStack::PushL( fileName );
       
   171     //
       
   172     fsSession.PrivatePath( *fileName );
       
   173     //
       
   174     TFindFile findFile( fsSession );
       
   175     User::LeaveIfError( findFile.FindByPath( KMemSpyEComInterfaceIdFileName, fileName ) );
       
   176     //
       
   177     HBufC* ret = findFile.File().AllocL();
       
   178     CleanupStack::PopAndDestroy( fileName );
       
   179     CleanupStack::PushL( ret );
       
   180     return ret;
       
   181     }
       
   182 
       
   183 
       
   184 void CMemSpyEngineHelperECom::ConvertL( const TDesC8& aInput, TDes16& aOutput )
       
   185     {
       
   186     const TInt error = iConverter->ConvertToUnicode( aOutput, aInput, iCharconvConverterState );
       
   187     User::LeaveIfError( error );
       
   188     }
       
   189 
       
   190 
       
   191 void CMemSpyEngineHelperECom::ParseL( const TDesC& aFileName )
       
   192     {
       
   193 	Xml::ParseL( *iParser, iEngine.FsSession(), aFileName );
       
   194     //
       
   195     const TInt error = iParserErrorCode;
       
   196     //RDebug::Printf( "CMemSpyEngineHelperECom::ParseL() - iParserErrorCode: %d", iParserErrorCode );
       
   197     iParserErrorCode = KErrNone;
       
   198     //
       
   199 	User::LeaveIfError( error );
       
   200     }
       
   201 
       
   202 
       
   203 void CMemSpyEngineHelperECom::OnChildSectionCategoryL( const RAttributeArray& aAttributes )
       
   204     {
       
   205     TBuf<128> name;
       
   206     TBool gotName = EFalse;
       
   207     //
       
   208     const TInt count = aAttributes.Count();
       
   209 	for( TInt i=0; i<count; i++ )
       
   210 		{
       
   211 		const TPtrC8 attrib( aAttributes[ i ].Attribute().LocalName().DesC() );
       
   212 		const TPtrC8 value( aAttributes[ i ].Value().DesC() );
       
   213         //
       
   214 		if  ( attrib.CompareF( KMemSpyXmlSpec_ChildSectionCategory_Attribute_Name ) == 0 )
       
   215 			{
       
   216             if  ( gotName )
       
   217                 {
       
   218                 User::LeaveIfError( KErrCorrupt );
       
   219                 }
       
   220             else
       
   221                 {
       
   222                 ConvertL( value, name );
       
   223                 gotName = ETrue;
       
   224                 }
       
   225 			}
       
   226         }
       
   227     //
       
   228     if  ( gotName )
       
   229         {
       
   230         // Make a new category
       
   231         //RDebug::Print( _L("CMemSpyEngineHelperECom::OnChildSectionCategoryL() - creating category: %S"), &name );
       
   232 
       
   233         CMemSpyEngineEComCategory* category = CMemSpyEngineEComCategory::NewLC( *this, name );
       
   234         iCategories.AppendL( category );
       
   235         CleanupStack::Pop( category );
       
   236 
       
   237         //RDebug::Print( _L("CMemSpyEngineHelperECom::OnChildSectionCategoryL() - created category: %S"), &name );
       
   238         }
       
   239     else
       
   240         {
       
   241         User::Leave( KErrCorrupt );
       
   242         }
       
   243     }
       
   244 
       
   245 
       
   246 void CMemSpyEngineHelperECom::OnChildSectionInterfaceL( const RAttributeArray& aAttributes )
       
   247     {
       
   248     TUid uid = KNullUid;
       
   249     TBuf<128> name;
       
   250     TBool gotName = EFalse;
       
   251     TBool gotUid = EFalse;
       
   252     //
       
   253     const TInt count = aAttributes.Count();
       
   254 	for( TInt i=0; i<count; i++ )
       
   255 		{
       
   256 		const TPtrC8 attrib( aAttributes[ i ].Attribute().LocalName().DesC() );
       
   257 		const TPtrC8 value( aAttributes[ i ].Value().DesC() );
       
   258         //
       
   259 		if  ( attrib.CompareF( KMemSpyXmlSpec_ChildSectionInterface_Name ) == 0 )
       
   260 			{
       
   261             if  ( gotName )
       
   262                 {
       
   263                 User::LeaveIfError( KErrCorrupt );
       
   264                 }
       
   265             else
       
   266                 {
       
   267                 ConvertL( value, name );
       
   268                 gotName = ETrue;
       
   269                 }
       
   270 			}
       
   271 		else if ( attrib.CompareF( KMemSpyXmlSpec_ChildSectionInterface_Uid ) == 0 )
       
   272 			{
       
   273             if  ( gotUid )
       
   274                 {
       
   275                 User::LeaveIfError( KErrCorrupt );
       
   276                 }
       
   277             else
       
   278                 {
       
   279                 if  ( value.Length() >= 8 )
       
   280                     {
       
   281                     TRadix radix = EDecimal;
       
   282                     TPtrC8 pValue( value );
       
   283                     //
       
   284                     if  ( value.Length() == 10 && value.Left( 2 ) == KMemSpyXmlSpec_HexPrefix )
       
   285                         {
       
   286                         pValue.Set( value.Mid( 2 ) );
       
   287                         radix = EHex;
       
   288                         }
       
   289                     //
       
   290                     TUint32 uidVal = 0;
       
   291                     TLex8 lexer( pValue );
       
   292                     const TInt err = lexer.Val( uidVal, radix );
       
   293                     User::LeaveIfError( err );
       
   294                     uid.iUid = uidVal;
       
   295                     gotUid = ETrue;
       
   296                     }
       
   297                 }
       
   298 			}
       
   299         }
       
   300     //
       
   301     const TInt catCount = iCategories.Count();
       
   302     if  ( gotName && gotUid && catCount > 0 )
       
   303         {
       
   304         //RDebug::Print( _L("CMemSpyEngineHelperECom::OnChildSectionInterfaceL() - creating interface for %S [0x%08x]"), &name, uid.iUid );
       
   305 
       
   306         CMemSpyEngineEComCategory* category = iCategories[ catCount - 1 ];
       
   307         TRAPD( err, category->CreateInterfaceL( name, uid ) );
       
   308         err = err;
       
   309         //RDebug::Print( _L("CMemSpyEngineHelperECom::OnChildSectionInterfaceL() - error: %d, for %S [0x%08x]"), err, &name, uid.iUid );
       
   310         }
       
   311     else
       
   312         {
       
   313         User::Leave( KErrCorrupt );
       
   314         }
       
   315     }
       
   316 
       
   317 
       
   318 void CMemSpyEngineHelperECom::OnStartDocumentL( const RDocumentParameters& /*aDocParam*/, TInt aErrorCode )
       
   319     {
       
   320     User::LeaveIfError( aErrorCode );
       
   321     }
       
   322 
       
   323 
       
   324 void CMemSpyEngineHelperECom::OnEndDocumentL( TInt aErrorCode )
       
   325     {
       
   326     User::LeaveIfError( aErrorCode );
       
   327     }
       
   328 
       
   329 
       
   330 void CMemSpyEngineHelperECom::OnStartElementL( const RTagInfo& aElement, const RAttributeArray& aAttributes, TInt aErrorCode )
       
   331     {
       
   332     User::LeaveIfError( aErrorCode );
       
   333     //
       
   334 	TInt err = KErrNone;
       
   335 	const TPtrC8 name( aElement.LocalName().DesC() );
       
   336     //
       
   337     if  ( name.CompareF( KMemSpyXmlSpec_MasterSection ) == 0 )
       
   338 		{
       
   339 		iSeenMasterSection = ETrue;
       
   340 		}
       
   341     else if ( iSeenMasterSection )
       
   342         {
       
   343         if  ( name.CompareF( KMemSpyXmlSpec_ChildSectionCategory ) == 0 )
       
   344             {
       
   345             OnChildSectionCategoryL( aAttributes );
       
   346             }
       
   347         else if ( name.CompareF( KMemSpyXmlSpec_ChildSectionInterface ) == 0 )
       
   348             {
       
   349             OnChildSectionInterfaceL( aAttributes );
       
   350             }
       
   351         }
       
   352     //
       
   353     User::LeaveIfError( err );
       
   354     }
       
   355 
       
   356 
       
   357 void CMemSpyEngineHelperECom::OnEndElementL( const RTagInfo& /*aElement*/, TInt aErrorCode )
       
   358     {
       
   359     User::LeaveIfError( aErrorCode );
       
   360     }
       
   361 
       
   362 
       
   363 void CMemSpyEngineHelperECom::OnContentL( const TDesC8& /*aBytes*/, TInt aErrorCode )
       
   364     {
       
   365     User::LeaveIfError( aErrorCode );
       
   366     }
       
   367 
       
   368 
       
   369 void CMemSpyEngineHelperECom::OnStartPrefixMappingL( const RString& /*aPrefix*/, const RString& /*aUri*/, TInt aErrorCode )
       
   370     {
       
   371     User::LeaveIfError( aErrorCode );
       
   372     }
       
   373 
       
   374 
       
   375 void CMemSpyEngineHelperECom::OnEndPrefixMappingL( const RString& /*aPrefix*/, TInt aErrorCode )
       
   376     {
       
   377     User::LeaveIfError( aErrorCode );
       
   378     }
       
   379 
       
   380 
       
   381 void CMemSpyEngineHelperECom::OnIgnorableWhiteSpaceL( const TDesC8& /*aBytes*/, TInt aErrorCode )
       
   382     {
       
   383     User::LeaveIfError( aErrorCode );
       
   384     }
       
   385 
       
   386 
       
   387 void CMemSpyEngineHelperECom::OnSkippedEntityL( const RString& /*aName*/, TInt aErrorCode )
       
   388     {
       
   389     User::LeaveIfError( aErrorCode );
       
   390     }
       
   391 
       
   392 
       
   393 void CMemSpyEngineHelperECom::OnProcessingInstructionL( const TDesC8& /*aTarget*/, const TDesC8& /*aData*/, TInt aErrorCode )
       
   394     {
       
   395     User::LeaveIfError( aErrorCode );
       
   396     }
       
   397 
       
   398 
       
   399 void CMemSpyEngineHelperECom::OnError( TInt aErrorCode )
       
   400     {
       
   401     iParserErrorCode = aErrorCode;
       
   402     }
       
   403 
       
   404 
       
   405 TAny* CMemSpyEngineHelperECom::GetExtendedInterface( const TInt32 /*aUid*/ )
       
   406     {
       
   407     return NULL;
       
   408     }
       
   409 
       
   410 
       
   411 
       
   412 
       
   413 
       
   414 
       
   415 
       
   416 
       
   417 
       
   418 
       
   419 
       
   420 
       
   421 
       
   422 
       
   423 
       
   424 
       
   425 
       
   426 
       
   427 
       
   428 
       
   429 
       
   430 
       
   431 
       
   432 
       
   433 
       
   434 
       
   435 
       
   436 
       
   437 
       
   438 
       
   439 
       
   440 
       
   441 
       
   442 
       
   443 
       
   444 
       
   445 
       
   446 CMemSpyEngineEComCategory::CMemSpyEngineEComCategory( CMemSpyEngineHelperECom& aHelper )
       
   447 :   iHelper( aHelper )
       
   448     {
       
   449     }
       
   450 
       
   451     
       
   452 CMemSpyEngineEComCategory::~CMemSpyEngineEComCategory()
       
   453     {
       
   454     delete iCaption;
       
   455     delete iName;
       
   456     iInterfaces.ResetAndDestroy();
       
   457     iInterfaces.Close();
       
   458     }
       
   459 
       
   460 
       
   461 void CMemSpyEngineEComCategory::ConstructL( const TDesC& aName )
       
   462     {
       
   463     iName = aName.AllocL();
       
   464     iCaption = aName.AllocL(); // Replace later on
       
   465     }
       
   466 
       
   467 
       
   468 CMemSpyEngineEComCategory* CMemSpyEngineEComCategory::NewLC( CMemSpyEngineHelperECom& aHelper, const TDesC& aName )
       
   469     {
       
   470     CMemSpyEngineEComCategory* self = new(ELeave) CMemSpyEngineEComCategory( aHelper );
       
   471     CleanupStack::PushL( self );
       
   472     self->ConstructL( aName );
       
   473     return self;
       
   474     }
       
   475 
       
   476 
       
   477 EXPORT_C CMemSpyEngineEComInterface& CMemSpyEngineEComCategory::At( TInt aIndex )
       
   478     {
       
   479     return *iInterfaces[ aIndex ];
       
   480     }
       
   481 
       
   482 
       
   483 EXPORT_C TInt CMemSpyEngineEComCategory::IndexOf( const CMemSpyEngineEComInterface& aEntry )
       
   484     {
       
   485     const TInt index = iInterfaces.Find( &aEntry );
       
   486     return index;
       
   487     }
       
   488 
       
   489 
       
   490 EXPORT_C TInt CMemSpyEngineEComCategory::MdcaCount() const
       
   491     {
       
   492     return iInterfaces.Count();
       
   493     }
       
   494 
       
   495 
       
   496 EXPORT_C TPtrC CMemSpyEngineEComCategory::MdcaPoint( TInt aIndex ) const
       
   497     {
       
   498     CMemSpyEngineEComInterface* iface = iInterfaces[ aIndex ];
       
   499     return iface->Caption();
       
   500     }
       
   501 
       
   502 
       
   503 void CMemSpyEngineEComCategory::CreateInterfaceL( const TDesC& aName, TUid aUid )
       
   504     {
       
   505     CMemSpyEngineEComInterface* iface = CMemSpyEngineEComInterface::NewLC( *this, aName, aUid );
       
   506     iInterfaces.AppendL( iface );
       
   507     CleanupStack::Pop( iface );
       
   508     }
       
   509 
       
   510 
       
   511 void CMemSpyEngineEComCategory::BuildCaptionL()
       
   512     {
       
   513     delete iCaption; 
       
   514     iCaption = NULL;
       
   515 
       
   516     _LIT( KCaptionFormat, "\t%S\t\t%d interface" );
       
   517     iCaption = HBufC::NewL( 256 );
       
   518     TPtr pCaption( iCaption->Des() );
       
   519     pCaption.Format( KCaptionFormat, iName, iInterfaces.Count() );
       
   520     if  ( iInterfaces.Count() > 1 )
       
   521         {
       
   522         pCaption.Append( 's' );
       
   523         }
       
   524     }
       
   525 
       
   526 
       
   527 
       
   528 
       
   529 
       
   530 
       
   531 
       
   532 
       
   533 
       
   534 
       
   535 
       
   536 
       
   537 CMemSpyEngineEComInterface::CMemSpyEngineEComInterface( CMemSpyEngineEComCategory& aCategory, TUid aUid )
       
   538 :   iUid( aUid ), iCategory( aCategory )
       
   539     {
       
   540     }
       
   541 
       
   542     
       
   543 CMemSpyEngineEComInterface::~CMemSpyEngineEComInterface()
       
   544     {
       
   545     delete iCaption;
       
   546     delete iName;
       
   547     iImplementations.ResetAndDestroy();
       
   548     iImplementations.Close();
       
   549     }
       
   550 
       
   551 
       
   552 void CMemSpyEngineEComInterface::ConstructL( const TDesC& aName )
       
   553     {
       
   554     iName = aName.AllocL();
       
   555 
       
   556     // Get implementation information for this interface...
       
   557     RImplInfoPtrArray infoArray;
       
   558     CleanupResetAndDestroyPushL( infoArray );
       
   559     REComSession::ListImplementationsL( iUid, infoArray );
       
   560 
       
   561     // Make implementation objects for each impl that exists.
       
   562     const TInt count = infoArray.Count();
       
   563     for( TInt i=count-1; i>=0; i-- )
       
   564         {
       
   565         CImplementationInformation* info = infoArray[ i ];
       
   566 
       
   567         // Get info
       
   568         CMemSpyEngineEComImplementation* impl = CMemSpyEngineEComImplementation::NewLC( *this, info );
       
   569 
       
   570         // Now owned by impl
       
   571         infoArray.Remove( i );
       
   572 
       
   573         // Add to container
       
   574         iImplementations.AppendL( impl );
       
   575         CleanupStack::Pop( impl );
       
   576         }
       
   577 
       
   578     // Tidy up
       
   579     CleanupStack::PopAndDestroy( &infoArray );
       
   580 
       
   581     // Build caption
       
   582     _LIT( KCaptionFormat, "\t%S\t\t[0x%08x] [%d impl]" );
       
   583     iCaption = HBufC::NewL( 256 );
       
   584     TPtr pCaption( iCaption->Des() );
       
   585     pCaption.Format( KCaptionFormat, iName, iUid.iUid, count );
       
   586     }
       
   587 
       
   588 
       
   589 CMemSpyEngineEComInterface* CMemSpyEngineEComInterface::NewLC( CMemSpyEngineEComCategory& aCategory, const TDesC& aName, TUid aUid )
       
   590     {
       
   591     CMemSpyEngineEComInterface* self = new(ELeave) CMemSpyEngineEComInterface( aCategory, aUid );
       
   592     CleanupStack::PushL( self );
       
   593     self->ConstructL( aName );
       
   594     return self;
       
   595     }
       
   596 
       
   597 
       
   598 EXPORT_C CMemSpyEngineEComImplementation& CMemSpyEngineEComInterface::At( TInt aIndex )
       
   599     {
       
   600     return *iImplementations[ aIndex ];
       
   601     }
       
   602 
       
   603 
       
   604 EXPORT_C TInt CMemSpyEngineEComInterface::IndexOf( const CMemSpyEngineEComImplementation& aEntry )
       
   605     {
       
   606     const TInt index = iImplementations.Find( &aEntry );
       
   607     return index;
       
   608     }
       
   609 
       
   610 
       
   611 EXPORT_C TInt CMemSpyEngineEComInterface::MdcaCount() const
       
   612     {
       
   613     return iImplementations.Count();
       
   614     }
       
   615 
       
   616 
       
   617 EXPORT_C TPtrC CMemSpyEngineEComInterface::MdcaPoint( TInt aIndex ) const
       
   618     {
       
   619     CMemSpyEngineEComImplementation* impl = iImplementations[ aIndex ];
       
   620     return impl->Caption();
       
   621     }
       
   622 
       
   623 
       
   624 
       
   625 
       
   626 
       
   627 
       
   628 
       
   629 
       
   630 
       
   631 
       
   632 
       
   633 
       
   634 
       
   635 
       
   636 
       
   637 
       
   638 
       
   639 
       
   640 
       
   641 
       
   642 
       
   643 CMemSpyEngineEComImplementation::CMemSpyEngineEComImplementation( CMemSpyEngineEComInterface& aInterface )
       
   644 :   iInterface( aInterface )
       
   645     {
       
   646     }
       
   647 
       
   648     
       
   649 CMemSpyEngineEComImplementation::~CMemSpyEngineEComImplementation()
       
   650     {
       
   651     delete iCaption;
       
   652     delete iName;
       
   653     delete iInfoText;
       
   654     delete iInfo;
       
   655     }
       
   656 
       
   657 
       
   658 void CMemSpyEngineEComImplementation::ConstructL( CImplementationInformation* aInfo )
       
   659     {
       
   660     iInfoText = new(ELeave) CDesCArrayFlat( 10 );
       
   661     TBuf< 256 > temp;
       
   662 
       
   663     // Make items.
       
   664     if  ( aInfo->DisplayName().Length() )
       
   665         {
       
   666         _LIT( KNameFormat, "0x%08x - %S" );
       
   667         temp.Format( KNameFormat, aInfo->ImplementationUid().iUid, &aInfo->DisplayName() );
       
   668         }
       
   669     else
       
   670         {
       
   671         _LIT( KNameFormat, "0x%08x" );
       
   672         temp.Format( KNameFormat, aInfo->ImplementationUid().iUid );
       
   673         }
       
   674     iName = temp.AllocL();
       
   675 
       
   676     _LIT( KItem1, "\tImpl. Uid\t\t0x%08x" );
       
   677     temp.Format( KItem1, aInfo->ImplementationUid().iUid );
       
   678     iInfoText->AppendL( temp );
       
   679 
       
   680     if  ( aInfo->DisplayName().Length() )
       
   681         {
       
   682         _LIT( KItem2, "\tDisplay Name\t\t%S" );
       
   683         temp.Format( KItem2, &aInfo->DisplayName() );
       
   684         }
       
   685     else
       
   686         {
       
   687         _LIT( KItem2, "\tDisplay Name\t\t[Undefined]" );
       
   688         temp.Copy( KItem2 );
       
   689         }
       
   690     iInfoText->AppendL( temp );
       
   691 
       
   692     _LIT( KItem3, "\tVersion\t\t%d" );
       
   693     temp.Format( KItem3, aInfo->Version() );
       
   694     iInfoText->AppendL( temp );
       
   695 
       
   696     HBufC* opaqueData = CopyAndCropLC( aInfo->OpaqueData() );
       
   697     if  ( opaqueData->Length() )
       
   698         {
       
   699         _LIT( KItem4, "\tOpaque Data\t\t%S" );
       
   700         temp.Format( KItem4, opaqueData );
       
   701         }
       
   702     else
       
   703         {
       
   704         _LIT( KItem4, "\tOpaque Data\t\t[Undefined]" );
       
   705         temp.Copy( KItem4 );
       
   706         }
       
   707     iInfoText->AppendL( temp );
       
   708     CleanupStack::PopAndDestroy( opaqueData );
       
   709 
       
   710     HBufC* dataType = CopyAndCropLC( aInfo->DataType() );
       
   711     if  ( opaqueData->Length() )
       
   712         {
       
   713         _LIT( KItem5, "\tData Type\t\t%S" );
       
   714         temp.Format( KItem5, dataType );
       
   715         }
       
   716     else
       
   717         {
       
   718         _LIT( KItem5, "\tData Type\t\t[Undefined]" );
       
   719         temp.Copy( KItem5 );
       
   720         }
       
   721     iInfoText->AppendL( temp );
       
   722     CleanupStack::PopAndDestroy( dataType );
       
   723 
       
   724     _LIT( KItem6, "\tDrive\t\t%S" );
       
   725     TBuf< 10 > drive;
       
   726     const TDriveNumber driveNumber = static_cast< TDriveNumber >( static_cast< TInt >( aInfo->Drive() ) );
       
   727     CMemSpyEngineHelperFileSystem::GetDriveNumberText( driveNumber, drive );
       
   728     temp.Format( KItem6, &drive );
       
   729     iInfoText->AppendL( temp );
       
   730 
       
   731     if  ( aInfo->Disabled() )
       
   732         {
       
   733         iInfoText->AppendL( _L("\tIs Disabled\t\tYes") );
       
   734         }
       
   735     else
       
   736         {
       
   737         iInfoText->AppendL( _L("\tIs Disabled\t\tNo") );
       
   738         }
       
   739 
       
   740     if  ( aInfo->RomOnly() )
       
   741         {
       
   742         iInfoText->AppendL( _L("\tROM-Only\t\tYes") );
       
   743         }
       
   744     else
       
   745         {
       
   746         iInfoText->AppendL( _L("\tROM-Only\t\tNo") );
       
   747         }
       
   748     
       
   749     if  ( aInfo->RomBased() )
       
   750         {
       
   751         iInfoText->AppendL( _L("\tROM-Based\t\tYes") );
       
   752         }
       
   753     else
       
   754         {
       
   755         iInfoText->AppendL( _L("\tROM-Based\t\tNo") );
       
   756         }
       
   757     
       
   758     // Make caption
       
   759     if  ( aInfo->DisplayName().Length() )
       
   760         {
       
   761         _LIT( KCaptionFormat, "\t0x%08x\t\t%S" );
       
   762         temp.Format( KCaptionFormat, aInfo->ImplementationUid().iUid, &aInfo->DisplayName() );
       
   763         }
       
   764     else
       
   765         {
       
   766         _LIT( KCaptionFormat, "\t0x%08x\t\t[Name Undefined]" );
       
   767         temp.Format( KCaptionFormat, aInfo->ImplementationUid().iUid );
       
   768         }
       
   769     iCaption = temp.AllocL();
       
   770 
       
   771     // Must do this last
       
   772     iInfo = aInfo;
       
   773     }
       
   774 
       
   775 
       
   776 CMemSpyEngineEComImplementation* CMemSpyEngineEComImplementation::NewLC( CMemSpyEngineEComInterface& aInterface, CImplementationInformation* aInfo )
       
   777     {
       
   778     CMemSpyEngineEComImplementation* self = new(ELeave) CMemSpyEngineEComImplementation( aInterface );
       
   779     CleanupStack::PushL( self );
       
   780     self->ConstructL( aInfo );
       
   781     return self;
       
   782     }
       
   783 
       
   784 
       
   785 HBufC* CMemSpyEngineEComImplementation::CopyAndCropLC( const TDesC8& aText )
       
   786     {
       
   787     const TInt KMaxEComDataLength = 200; // Any longer and we'll crop it...
       
   788     //
       
   789     HBufC* data = HBufC::NewLC( aText.Length() );
       
   790     data->Des().Copy( aText );
       
   791     //
       
   792     if  ( data->Length() > KMaxEComDataLength )
       
   793         {
       
   794         data->Des().SetLength( KMaxEComDataLength );
       
   795         }
       
   796     //
       
   797     return data;
       
   798     }
       
   799 
       
   800 
       
   801 EXPORT_C TInt CMemSpyEngineEComImplementation::MdcaCount() const
       
   802     {
       
   803     return iInfoText->MdcaCount();
       
   804     }
       
   805 
       
   806 
       
   807 EXPORT_C TPtrC CMemSpyEngineEComImplementation::MdcaPoint( TInt aIndex ) const
       
   808     {
       
   809     return iInfoText->MdcaPoint( aIndex );
       
   810     }
       
   811 
       
   812 
       
   813