email/imum/Utils/Src/ImumInSettingsDataCollectionImpl.cpp
changeset 0 72b543305e3a
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 /*
       
     2 * Copyright (c) 2002 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:  ImumInSettingsDataCollectionImpl.cpp
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <msvstd.h>
       
    21 #include <MuiuMsvUiServiceUtilities.h>
       
    22 #include <SendUiConsts.h>                       // Message type constants
       
    23 
       
    24 #include "ImumInSettingsDataCollectionImpl.h"
       
    25 #include "ImumDaErrorCodes.h"
       
    26 #include "ImumPanic.h"
       
    27 #include "ImumInSettingsDataArray.h"
       
    28 #include "ImumDaSettingsKeys.h"
       
    29 #include "ImumInSettingsKeys.h"
       
    30 #include "EmailUtils.H"
       
    31 #include "ImumInSettingsDataCtrl.h"
       
    32 #include "ImumInSettingsDataValidator.h"
       
    33 #include "ImumUtilsLogging.h"
       
    34 #include "ImumConstants.h"
       
    35 #include "ImumMboxDefaultData.h"
       
    36 
       
    37 // EXTERNAL DATA STRUCTURES
       
    38 // EXTERNAL FUNCTION PROTOTYPES
       
    39 // CONSTANTS
       
    40 // MACROS
       
    41 // LOCAL CONSTANTS AND MACROS
       
    42 // MODULE DATA STRUCTURES
       
    43 // LOCAL FUNCTION PROTOTYPES
       
    44 // FORWARD DECLARATIONS
       
    45 
       
    46 // ============================ MEMBER FUNCTIONS ===============================
       
    47 
       
    48 // ----------------------------------------------------------------------------
       
    49 // CImumInSettingsDataCollectionImpl::CImumInSettingsDataCollectionImpl()
       
    50 // ----------------------------------------------------------------------------
       
    51 //
       
    52 CImumInSettingsDataCollectionImpl::CImumInSettingsDataCollectionImpl(
       
    53     const TUid& aProtocol,
       
    54     const MImumInSettingsDataCollection* aDefaultData,
       
    55     CImumInSettingsDataValidator& aValidator )
       
    56     :
       
    57     iDefaultData( aDefaultData ),
       
    58     iProtocol( aProtocol ),
       
    59     iValidator( aValidator ),
       
    60     iSettings( NULL )
       
    61     {
       
    62     }
       
    63 
       
    64 // ----------------------------------------------------------------------------
       
    65 // CImumInSettingsDataCollectionImpl::~CImumInSettingsDataCollectionImpl()
       
    66 // ----------------------------------------------------------------------------
       
    67 //
       
    68 CImumInSettingsDataCollectionImpl::~CImumInSettingsDataCollectionImpl()
       
    69     {
       
    70     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::~CImumInSettingsDataCollectionImpl, 0, KLogInApi );
       
    71     IMUM_IN();
       
    72 
       
    73     delete iSettings;
       
    74     iSettings = NULL;
       
    75 
       
    76     IMUM_OUT();
       
    77     }
       
    78 
       
    79 // ----------------------------------------------------------------------------
       
    80 // CImumInSettingsDataCollectionImpl::ConstructL()
       
    81 // ----------------------------------------------------------------------------
       
    82 //
       
    83 void CImumInSettingsDataCollectionImpl::ConstructL(
       
    84     const TUid& aProtocol )
       
    85     {
       
    86     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::ConstructL, 0, KLogInApi );
       
    87     IMUM_IN();
       
    88 
       
    89     iSettings = CImumInSettingsDataArray::NewL();
       
    90 
       
    91     if ( aProtocol == KSenduiMtmImap4Uid )
       
    92         {
       
    93         SetAttr(
       
    94             TImumDaSettings::EKeyProtocol,
       
    95             TImumDaSettings::EValueProtocolImap4 );
       
    96         }
       
    97     else if ( aProtocol == KSenduiMtmPop3Uid )
       
    98         {
       
    99         SetAttr(
       
   100             TImumDaSettings::EKeyProtocol,
       
   101             TImumDaSettings::EValueProtocolPop3 );
       
   102         }
       
   103     else if ( aProtocol == KSenduiMtmSmtpUid )
       
   104         {
       
   105         SetAttr(
       
   106             TImumDaSettings::EKeyProtocol,
       
   107             TImumDaSettings::EValueProtocolSmtp );
       
   108         }
       
   109     else if ( !aProtocol.iUid )
       
   110         {
       
   111         SettingsDataCollectionExceptionL(
       
   112             TImumDaErrorCode::EParamUnsupportedProtocol );
       
   113         }
       
   114     else
       
   115         {
       
   116         SettingsDataCollectionExceptionL(
       
   117             TImumDaErrorCode::EParamEmptyProtocol );
       
   118         }
       
   119 
       
   120 
       
   121     // It's possible to reset the settings, if the settings class would
       
   122     // contain the default data. If the default data is not set, it means
       
   123     // that the current object is the default data, so the resetting should
       
   124     // be skipped here and the actual resetting happens in the real default
       
   125     // data class.
       
   126     if ( iDefaultData )
       
   127         {
       
   128         ResetAll();
       
   129         }
       
   130 
       
   131     IMUM_OUT();
       
   132     }
       
   133 
       
   134 // ----------------------------------------------------------------------------
       
   135 // CImumInSettingsDataCollectionImpl::NewL()
       
   136 // ----------------------------------------------------------------------------
       
   137 //
       
   138 CImumInSettingsDataCollectionImpl* CImumInSettingsDataCollectionImpl::NewL(
       
   139     const TUid& aProtocol,
       
   140     const MImumInSettingsDataCollection* aDefaultData,
       
   141     CImumInSettingsDataValidator& aValidator )
       
   142     {
       
   143     IMUM_STATIC_CONTEXT( CImumInSettingsDataCollectionImpl::NewL, 0, utils, KLogInApi );
       
   144     IMUM_IN();
       
   145 
       
   146     CImumInSettingsDataCollectionImpl* self = NewLC(
       
   147         aProtocol, aDefaultData, aValidator );
       
   148     CleanupStack::Pop( self );
       
   149 
       
   150     IMUM_OUT();
       
   151 
       
   152     return self;
       
   153     }
       
   154 
       
   155 // ----------------------------------------------------------------------------
       
   156 // CImumInSettingsDataCollectionImpl::NewLC()
       
   157 // ----------------------------------------------------------------------------
       
   158 //
       
   159 CImumInSettingsDataCollectionImpl* CImumInSettingsDataCollectionImpl::NewLC(
       
   160     const TUid& aProtocol,
       
   161     const MImumInSettingsDataCollection* aDefaultData,
       
   162     CImumInSettingsDataValidator& aValidator )
       
   163     {
       
   164     IMUM_STATIC_CONTEXT( CImumInSettingsDataCollectionImpl::NewLC, 0, utils, KLogInApi );
       
   165     IMUM_IN();
       
   166 
       
   167     CImumInSettingsDataCollectionImpl* self =
       
   168         new ( ELeave ) CImumInSettingsDataCollectionImpl(
       
   169             aProtocol, aDefaultData, aValidator );
       
   170     CleanupStack::PushL( self );
       
   171     self->ConstructL( aProtocol );
       
   172 
       
   173     IMUM_OUT();
       
   174 
       
   175     return self;
       
   176     }
       
   177 
       
   178 // ---------------------------------------------------------------------------
       
   179 // From class MImumDaSettingsDataCollection.
       
   180 // CImumInSettingsDataCollectionImpl::SetAttr()
       
   181 // ---------------------------------------------------------------------------
       
   182 //
       
   183 TInt CImumInSettingsDataCollectionImpl::SetAttr(
       
   184     const TUint aAttributeKey,
       
   185     const TInt aValue )
       
   186     {
       
   187     TInt emptyDefault = 0;
       
   188     return ImumInSettingsDataCtrl::CreateToArray(
       
   189         *iSettings,
       
   190         iDefaultData,
       
   191         aAttributeKey,
       
   192         ECmpTInt32,
       
   193         aValue,
       
   194         emptyDefault );
       
   195     }
       
   196 
       
   197 // ---------------------------------------------------------------------------
       
   198 // From class MImumDaSettingsDataCollection.
       
   199 // CImumInSettingsDataCollectionImpl::SetAttr()
       
   200 // ---------------------------------------------------------------------------
       
   201 //
       
   202 TInt CImumInSettingsDataCollectionImpl::SetAttr(
       
   203     const TUint aAttributeKey,
       
   204     const TInt64 aValue )
       
   205     {
       
   206     TInt64 emptyDefault = 0;
       
   207     return ImumInSettingsDataCtrl::CreateToArray(
       
   208         *iSettings,
       
   209         iDefaultData,
       
   210         aAttributeKey,
       
   211         ECmpTInt64,
       
   212         aValue,
       
   213         emptyDefault );
       
   214     }
       
   215 
       
   216 // ---------------------------------------------------------------------------
       
   217 // From class MImumDaSettingsDataCollection.
       
   218 // CImumInSettingsDataCollectionImpl::SetAttr()
       
   219 // ---------------------------------------------------------------------------
       
   220 //
       
   221 TInt CImumInSettingsDataCollectionImpl::SetAttr(
       
   222     const TUint aAttributeKey,
       
   223     const TMsvId aId )
       
   224     {
       
   225     TMsvId emptyDefault = 0;
       
   226     return ImumInSettingsDataCtrl::CreateToArray(
       
   227         *iSettings,
       
   228         iDefaultData,
       
   229         aAttributeKey,
       
   230         ECmpTUint32,
       
   231         aId,
       
   232         emptyDefault );
       
   233     }
       
   234 
       
   235 // ---------------------------------------------------------------------------
       
   236 // From class MImumDaSettingsDataCollection.
       
   237 // CImumInSettingsDataCollectionImpl::SetAttr()
       
   238 // ---------------------------------------------------------------------------
       
   239 //
       
   240 TInt CImumInSettingsDataCollectionImpl::SetAttr(
       
   241     const TUint aAttributeKey,
       
   242     const TDesC& aText )
       
   243     {
       
   244     RBuf emptyDefault;
       
   245     TInt error = emptyDefault.Create( ImumTextConsts::EMaxTextLen );
       
   246     if ( error == KErrNone )
       
   247         {
       
   248         error = ImumInSettingsDataCtrl::CreateToArray(
       
   249             *iSettings,
       
   250             iDefaultData,
       
   251             aAttributeKey,
       
   252             ECmpNormal,
       
   253             aText,
       
   254             emptyDefault );
       
   255         }
       
   256 
       
   257     emptyDefault.Close();
       
   258 
       
   259     return error;
       
   260     }
       
   261 
       
   262 // ---------------------------------------------------------------------------
       
   263 // From class MImumDaSettingsDataCollection.
       
   264 // CImumInSettingsDataCollectionImpl::SetAttr()
       
   265 // ---------------------------------------------------------------------------
       
   266 //
       
   267 TInt CImumInSettingsDataCollectionImpl::SetAttr(
       
   268     const TUint aAttributeKey,
       
   269     const TDesC8& aText )
       
   270     {
       
   271     RBuf8 emptyDefault;
       
   272     TInt error = emptyDefault.Create( ImumTextConsts::EMaxTextLen );
       
   273     if ( error == KErrNone )
       
   274         {
       
   275         error = ImumInSettingsDataCtrl::CreateToArray(
       
   276             *iSettings,
       
   277             iDefaultData,
       
   278             aAttributeKey,
       
   279             ECmpNormal8,
       
   280             aText,
       
   281             emptyDefault );
       
   282         }
       
   283 
       
   284     emptyDefault.Close();
       
   285 
       
   286     return error;
       
   287     }
       
   288 
       
   289 // ---------------------------------------------------------------------------
       
   290 // From class MImumDaSettingsDataCollection.
       
   291 // CImumInSettingsDataCollectionImpl::GetAttr()
       
   292 // ---------------------------------------------------------------------------
       
   293 //
       
   294 TInt CImumInSettingsDataCollectionImpl::GetAttr(
       
   295     const TUint aAttributeKey,
       
   296     TInt& aValue ) const
       
   297     {
       
   298     return ImumInSettingsDataCtrl::RetrieveFromArray(
       
   299         *iSettings,
       
   300         aAttributeKey,
       
   301         ECmpTInt32,
       
   302         aValue );
       
   303     }
       
   304 
       
   305 // ---------------------------------------------------------------------------
       
   306 // From class MImumDaSettingsDataCollection.
       
   307 // CImumInSettingsDataCollectionImpl::GetAttr()
       
   308 // ---------------------------------------------------------------------------
       
   309 //
       
   310 TInt CImumInSettingsDataCollectionImpl::GetAttr(
       
   311     const TUint aAttributeKey,
       
   312     TInt64& aValue ) const
       
   313     {
       
   314     return ImumInSettingsDataCtrl::RetrieveFromArray(
       
   315         *iSettings,
       
   316         aAttributeKey,
       
   317         ECmpTInt64,
       
   318         aValue );
       
   319     }
       
   320 
       
   321 // ---------------------------------------------------------------------------
       
   322 // From class MImumDaSettingsDataCollection.
       
   323 // CImumInSettingsDataCollectionImpl::GetAttr()
       
   324 // ---------------------------------------------------------------------------
       
   325 //
       
   326 TInt CImumInSettingsDataCollectionImpl::GetAttr(
       
   327     const TUint aAttributeKey,
       
   328     TMsvId& aId ) const
       
   329     {
       
   330     return ImumInSettingsDataCtrl::RetrieveFromArray(
       
   331         *iSettings,
       
   332         aAttributeKey,
       
   333         ECmpTUint32,
       
   334         aId );
       
   335     }
       
   336 
       
   337 // ---------------------------------------------------------------------------
       
   338 // From class MImumDaSettingsDataCollection.
       
   339 // CImumInSettingsDataCollectionImpl::GetAttr()
       
   340 // ---------------------------------------------------------------------------
       
   341 //
       
   342 TInt CImumInSettingsDataCollectionImpl::GetAttr(
       
   343     const TUint aAttributeKey,
       
   344     TDes& aText ) const
       
   345     {
       
   346     return ImumInSettingsDataCtrl::RetrieveFromArray(
       
   347         *iSettings,
       
   348         aAttributeKey,
       
   349         ECmpNormal,
       
   350         aText );
       
   351     }
       
   352 
       
   353 // ---------------------------------------------------------------------------
       
   354 // From class MImumDaSettingsDataCollection.
       
   355 // CImumInSettingsDataCollectionImpl::GetAttr()
       
   356 // ---------------------------------------------------------------------------
       
   357 //
       
   358 TInt CImumInSettingsDataCollectionImpl::GetAttr(
       
   359     const TUint aAttributeKey,
       
   360     TDes8& aText ) const
       
   361     {
       
   362     return ImumInSettingsDataCtrl::RetrieveFromArray(
       
   363         *iSettings,
       
   364         aAttributeKey,
       
   365         ECmpNormal8,
       
   366         aText );
       
   367     }
       
   368 
       
   369 // ---------------------------------------------------------------------------
       
   370 // From class MImumDaSettingsDataCollection.
       
   371 // CImumInSettingsDataCollectionImpl::operator!=()
       
   372 // ---------------------------------------------------------------------------
       
   373 //
       
   374 TBool CImumInSettingsDataCollectionImpl::operator!=(
       
   375     const MImumDaSettingsDataCollection& aSettingsData ) const
       
   376     {
       
   377     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::operator!=, 0, KLogInApi );
       
   378     IMUM_IN();
       
   379     IMUM_OUT();
       
   380 
       
   381     return !( *this == aSettingsData );
       
   382     }
       
   383 
       
   384 // ---------------------------------------------------------------------------
       
   385 // From class MImumInSettingsDataCollection.
       
   386 // CImumInSettingsDataCollectionImpl::operator!=()
       
   387 // ---------------------------------------------------------------------------
       
   388 //
       
   389 TBool CImumInSettingsDataCollectionImpl::operator!=(
       
   390     const MImumInSettingsDataCollection& aSettingsData ) const
       
   391     {
       
   392     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::operator!=, 0, KLogInApi );
       
   393     IMUM_IN();
       
   394     IMUM_OUT();
       
   395 
       
   396     return !( *this == aSettingsData );
       
   397     }
       
   398 
       
   399 // ---------------------------------------------------------------------------
       
   400 // From class MImumDaSettingsDataCollection.
       
   401 // CImumInSettingsDataCollectionImpl::operator==()
       
   402 // ---------------------------------------------------------------------------
       
   403 //
       
   404 TBool CImumInSettingsDataCollectionImpl::operator==(
       
   405     const MImumDaSettingsDataCollection& /* aSettingsData */ ) const
       
   406     {
       
   407     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::operator==, 0, KLogInApi );
       
   408     IMUM_IN();
       
   409 
       
   410     IMUM_OUT();
       
   411 
       
   412     return ETrue;
       
   413     }
       
   414 
       
   415 // ---------------------------------------------------------------------------
       
   416 // From class MImumInSettingsDataCollection.
       
   417 // CImumInSettingsDataCollectionImpl::operator==()
       
   418 // ---------------------------------------------------------------------------
       
   419 //
       
   420 TBool CImumInSettingsDataCollectionImpl::operator==(
       
   421     const MImumInSettingsDataCollection& aSettingsData ) const
       
   422     {
       
   423     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::operator==, 0, KLogInApi );
       
   424     IMUM_IN();
       
   425 
       
   426     IMUM_OUT();
       
   427     return ( *this == *static_cast<const MImumDaSettingsDataCollection*>(
       
   428         &aSettingsData ) );
       
   429     }
       
   430 
       
   431 // ---------------------------------------------------------------------------
       
   432 // From class MImumDaSettingsDataCollection.
       
   433 // CImumInSettingsDataCollectionImpl::Reset()
       
   434 // ---------------------------------------------------------------------------
       
   435 //
       
   436 void CImumInSettingsDataCollectionImpl::Reset( const TUint aAttributeKey )
       
   437     {
       
   438     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::Reset, 0, KLogInApi );
       
   439     IMUM_IN();
       
   440 
       
   441     iSettings->ResetAttr( aAttributeKey );
       
   442 
       
   443     IMUM_OUT();
       
   444     }
       
   445 
       
   446 // ---------------------------------------------------------------------------
       
   447 // From class MImumDaSettingsDataCollection.
       
   448 // CImumInSettingsDataCollectionImpl::Copy()
       
   449 // ---------------------------------------------------------------------------
       
   450 //
       
   451 TInt CImumInSettingsDataCollectionImpl::Copy(
       
   452     const MImumDaSettingsDataCollection& /* aSettingsData */ )
       
   453     {
       
   454     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::Copy, 0, KLogInApi );
       
   455     IMUM_IN();
       
   456 
       
   457     // Currently no support for copy operation. Cloning should be used instead.
       
   458     __ASSERT_DEBUG( EFalse, User::Panic(
       
   459         KImumInSettingsDataCollectionImpl, KErrNotSupported ) );
       
   460 
       
   461     IMUM_OUT();
       
   462 
       
   463     return KErrNotSupported;
       
   464     }
       
   465 
       
   466 // ---------------------------------------------------------------------------
       
   467 // From class MImumDaSettingsDataCollection.
       
   468 // CImumInSettingsDataCollectionImpl::Copy()
       
   469 // ---------------------------------------------------------------------------
       
   470 //
       
   471 TInt CImumInSettingsDataCollectionImpl::Copy(
       
   472     const MImumInSettingsDataCollection& aSettingsData )
       
   473     {
       
   474     return Copy( *static_cast<const MImumDaSettingsDataCollection*>(
       
   475         &aSettingsData ) );
       
   476     }
       
   477 
       
   478 // ---------------------------------------------------------------------------
       
   479 // CImumInSettingsDataCollectionImpl::SettingsDataCollectionExceptionL()
       
   480 // ---------------------------------------------------------------------------
       
   481 //
       
   482 void CImumInSettingsDataCollectionImpl::SettingsDataCollectionExceptionL(
       
   483     const TInt aErrorCode ) const
       
   484     {
       
   485     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::SettingsDataCollectionExceptionL, 0, KLogInApi );
       
   486     IMUM_IN();
       
   487 
       
   488     User::Leave( aErrorCode );
       
   489     __ASSERT_DEBUG( EFalse, User::Panic(
       
   490         KImumInSettingsDataCollectionImpl, aErrorCode ) );
       
   491     }
       
   492 
       
   493 // ---------------------------------------------------------------------------
       
   494 // CImumInSettingsDataCollectionImpl::ValidateL()
       
   495 // ---------------------------------------------------------------------------
       
   496 //
       
   497 void CImumInSettingsDataCollectionImpl::ValidateL()
       
   498     {
       
   499     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::ValidateL, 0, KLogInApi );
       
   500     IMUM_IN();
       
   501 
       
   502     iValidator.ValidateL( *this );
       
   503 
       
   504     IMUM_OUT();
       
   505     }
       
   506 
       
   507 // ---------------------------------------------------------------------------
       
   508 // CImumInSettingsDataCollectionImpl::ResetAll()
       
   509 // ---------------------------------------------------------------------------
       
   510 //
       
   511 void CImumInSettingsDataCollectionImpl::ResetAll()
       
   512     {
       
   513     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::ResetAll, 0, KLogInApi );
       
   514     IMUM_IN();
       
   515 
       
   516     RArray<TUint> excludeList;
       
   517     iSettings->ResetAll( excludeList );
       
   518     excludeList.Close();
       
   519 
       
   520     IMUM_OUT();
       
   521     }
       
   522 
       
   523 // ---------------------------------------------------------------------------
       
   524 // CImumInSettingsDataCollectionImpl::Log()
       
   525 // ---------------------------------------------------------------------------
       
   526 //
       
   527 void CImumInSettingsDataCollectionImpl::Log()
       
   528     {
       
   529     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::Log, 0, KLogInApi );
       
   530     IMUM_IN();
       
   531     IMUM_OUT();
       
   532     }
       
   533 
       
   534 // ---------------------------------------------------------------------------
       
   535 // From class .
       
   536 // CImumInSettingsDataCollectionImpl::CloneL()
       
   537 // ---------------------------------------------------------------------------
       
   538 //
       
   539 MImumInSettingsDataCollection* CImumInSettingsDataCollectionImpl::CloneL() const
       
   540     {
       
   541     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::Log, 0, KLogInApi );
       
   542     IMUM_IN();
       
   543     IMUM_OUT();
       
   544 
       
   545     return DoCloneL();
       
   546     }
       
   547 
       
   548 // ---------------------------------------------------------------------------
       
   549 // CImumInSettingsDataCollectionImpl::DoCloneL()
       
   550 // ---------------------------------------------------------------------------
       
   551 //
       
   552 CImumInSettingsDataCollectionImpl*
       
   553     CImumInSettingsDataCollectionImpl::DoCloneL() const
       
   554     {
       
   555     IMUM_CONTEXT( CImumInSettingsDataCollectionImpl::Log, 0, KLogInApi );
       
   556     IMUM_IN();
       
   557 
       
   558     CImumInSettingsDataCollectionImpl* clone = NewLC(
       
   559         iProtocol, iDefaultData, iValidator );
       
   560 
       
   561     // Before doing anything, the previous array must be deleted to prevent
       
   562     // any extra data to remain in the memory.
       
   563     delete clone->iSettings;
       
   564     clone->iSettings = iSettings->CloneL();
       
   565 
       
   566     CleanupStack::Pop( clone );
       
   567 
       
   568     IMUM_OUT();
       
   569 
       
   570     return clone;
       
   571     }
       
   572 
       
   573 
       
   574 // End of File