featuremgmt/featuremgr/src/serverexe/featmgrsession.cpp
changeset 0 08ec8eefde2f
child 6 5ffdb8f2067f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include "featmgrsession.h"
       
    21 #include "featmgrfeatureentry.h"
       
    22 #include "featmgrdebug.h"
       
    23 
       
    24 // CONSTANTS
       
    25 const TInt CFeatMgrPendingRequest::iOffset = _FOFF( CFeatMgrPendingRequest,iLink );
       
    26 
       
    27 // LOCAL CONSTANTS AND MACROS
       
    28 _LIT( KPanicCategory, "FeatMgrSession" );
       
    29 
       
    30 // ============================= LOCAL FUNCTIONS ===============================
       
    31 
       
    32 // ============================ MEMBER FUNCTIONS ===============================
       
    33 
       
    34 // -----------------------------------------------------------------------------
       
    35 // CFeatMgrSession::CFeatMgrSession
       
    36 // C++ constructor
       
    37 // -----------------------------------------------------------------------------
       
    38 //
       
    39 CFeatMgrSession::CFeatMgrSession( CFeatMgrServer& aServer, CFeatMgrFeatureRegistry& aRegistry )
       
    40     : iFeatMgrServer( aServer ),
       
    41     iRegistry( aRegistry ),
       
    42     iList( CFeatMgrPendingRequest::iOffset )
       
    43     {
       
    44     }
       
    45 
       
    46 // -----------------------------------------------------------------------------
       
    47 // CFeatMgrSession::NewL
       
    48 // Two-phased constructor.
       
    49 // -----------------------------------------------------------------------------
       
    50 //
       
    51 CFeatMgrSession* CFeatMgrSession::NewL( CFeatMgrServer& aServer, 
       
    52     CFeatMgrFeatureRegistry& aRegistry )
       
    53     {
       
    54     FUNC_LOG
       
    55 
       
    56     CFeatMgrSession* self = new( ELeave ) CFeatMgrSession( aServer, aRegistry );
       
    57     
       
    58     return self;
       
    59     }
       
    60 
       
    61 #ifdef EXTENDED_FEATURE_MANAGER_TEST
       
    62 void CFeatMgrSession::CreateL()
       
    63     {
       
    64     iFeatMgrServer.AddSession();
       
    65     }
       
    66 #endif
       
    67 
       
    68 // ---------------------------------------------------------
       
    69 // Destructor
       
    70 // ---------------------------------------------------------
       
    71 //
       
    72 CFeatMgrSession::~CFeatMgrSession()
       
    73     {
       
    74     FUNC_LOG
       
    75 
       
    76     iNotifyFeatures.Close();
       
    77 
       
    78     while ( !iList.IsEmpty() )
       
    79         {
       
    80         CFeatMgrPendingRequest* pendingReq = iList.First();  
       
    81         iList.Remove( *pendingReq );
       
    82         delete pendingReq;
       
    83         }
       
    84     
       
    85     iList.Reset();
       
    86 #ifdef EXTENDED_FEATURE_MANAGER_TEST
       
    87     iFeatMgrServer.DropSession();
       
    88 #endif
       
    89     }
       
    90 
       
    91 // -----------------------------------------------------------------------------
       
    92 // CFeatMgrSession::PanicClient
       
    93 // RMessage2::Panic() also completes the message. This is:
       
    94 // (a) important for efficient cleanup within the kernel
       
    95 // (b) a problem if the message is completed a second time
       
    96 // -----------------------------------------------------------------------------
       
    97 //
       
    98 void CFeatMgrSession::PanicClient( const RMessage2& aMessage, TFeatMgrPanic aPanic )
       
    99     {
       
   100     INFO_LOG1( "CFeatMgrSession::PanicClient(aPanic 0x%x)", aPanic);
       
   101 
       
   102 	aMessage.Panic( KPanicCategory, aPanic );
       
   103     }
       
   104 
       
   105 // -----------------------------------------------------------------------------
       
   106 // CFeatMgrSession::ServiceL
       
   107 // Calls request handling functions. Also traps any leaves and signals client if
       
   108 // error occurs.
       
   109 // -----------------------------------------------------------------------------
       
   110 //
       
   111 void CFeatMgrSession::ServiceL( const RMessage2& aMessage )
       
   112     {
       
   113     FUNC_LOG
       
   114     
       
   115     if ( !iFeatMgrServer.PluginsReady() )
       
   116         {
       
   117         INFO_LOG( "CFeatMgrSession::ServiceL() - plugins not ready" );
       
   118         iList.AddLast( *CFeatMgrPendingRequest::NewL( aMessage ) );        
       
   119         }
       
   120     else
       
   121         {
       
   122         #if defined(FEATMGR_INFO_LOG_ENABLED)
       
   123             // check memory usage
       
   124             TInt biggestBlock;
       
   125             INFO_LOG1( "CFeatMgrSession::ServiceL() - #### Memory Available in Heap: %6d ####", 
       
   126                                     User::Heap().Available(biggestBlock) );
       
   127             INFO_LOG1( "CFeatMgrSession::ServiceL() - #### Biggest block:            %6d ####", 
       
   128                                     biggestBlock );
       
   129         #endif
       
   130 
       
   131         TRAPD( error, DispatchMessageL( aMessage ) );
       
   132 
       
   133         LOG_IF_ERROR1( error, "CFeatMgrSession::ServiceL(): Error in DispatchMessageL: %d", 
       
   134                                      error );
       
   135 
       
   136         if( aMessage.Function() != EFeatMgrReqNotify )
       
   137             {
       
   138             aMessage.Complete( error );
       
   139             }
       
   140         }
       
   141     }
       
   142     
       
   143 // -----------------------------------------------------------------------------
       
   144 // CFeatMgrSession::ServicePendingRequestsL
       
   145 // Calls request handling functions. Also traps any leaves and signals client if
       
   146 // error occurs.
       
   147 // -----------------------------------------------------------------------------
       
   148 //
       
   149 void CFeatMgrSession::ServicePendingRequestsL()
       
   150     {       
       
   151     FUNC_LOG
       
   152     
       
   153     while ( !iList.IsEmpty() )
       
   154         {
       
   155         CFeatMgrPendingRequest* pendingReq = iList.First();  
       
   156         
       
   157         TRAPD( error, DispatchMessageL( pendingReq->iMessage ) );
       
   158 
       
   159         LOG_IF_ERROR1( error, "CFeatMgrSession::ServicePendingRequestsL(): Error in DispatchMessageL: %d", 
       
   160             error );
       
   161 
       
   162         if( pendingReq->iMessage.Function() != EFeatMgrReqNotify )
       
   163             {
       
   164             pendingReq->iMessage.Complete( error );
       
   165             }
       
   166         
       
   167         iList.Remove( *pendingReq );
       
   168         delete pendingReq;
       
   169         }
       
   170     
       
   171     iList.Reset();
       
   172     }
       
   173 
       
   174 // -----------------------------------------------------------------------------
       
   175 // CFeatMgrSession::DispatchMessageL
       
   176 // Calls matching function of CFeatMgrServer for handling the request.
       
   177 // -----------------------------------------------------------------------------
       
   178 //
       
   179 void CFeatMgrSession::DispatchMessageL( const RMessage2& aMessage )
       
   180     {
       
   181     FUNC_LOG
       
   182     
       
   183     INFO_LOG1( "CFeatMgrSession::DispatchMessageL(0x%x)", aMessage.Function() );
       
   184 
       
   185     TInt msgCmd = aMessage.Function();
       
   186     
       
   187     // Getting the ID of the process making the calls on feature manager. This ID is used
       
   188     // for the addition, deletion, setting, enabling, and disabling functions.
       
   189     TUint processId = 0;	// default value for a process id
       
   190     TInt getIdErr = KErrGeneral;
       
   191     if( msgCmd >= EFeatMgrEnableFeature && msgCmd <= EFeatMgrSWIEnd )
       
   192     	{
       
   193 	    RThread thread;
       
   194 	    getIdErr = aMessage.Client(thread, EOwnerProcess);
       
   195 	    if( getIdErr == KErrNone)
       
   196 	    	{
       
   197 		    RProcess process;
       
   198 		    getIdErr = thread.Process(process);
       
   199 		    if( getIdErr == KErrNone)
       
   200 		    	{
       
   201 		    	TProcessId prcId = process.Id();
       
   202 		    	processId = TUint(prcId.Id());
       
   203 		    	}
       
   204 	    	}
       
   205     	}
       
   206 	    	
       
   207     // Check command code and call appropriate function
       
   208     switch ( msgCmd )
       
   209         {
       
   210     	case EFeatMgrFeatureSupported:
       
   211     	    {
       
   212     	    TFeatureEntry feature;
       
   213     	    TPckg<TFeatureEntry> pckg( feature );
       
   214     	    aMessage.ReadL( 0, pckg );
       
   215     	    TFeatureServerEntry feat( feature );
       
   216     	    TInt supported = iRegistry.IsFeatureSupported( feat );
       
   217     	    // Construct entry for passing back to client.
       
   218     	    TFeatureEntry featBack( feat.FeatureUid(), feat.FeatureFlags(), feat.FeatureData() );
       
   219     	    TPckgC<TFeatureEntry> pckgBack( featBack );
       
   220             TPckgC<TInt> resPckg( supported );
       
   221             aMessage.WriteL( 0, pckgBack );
       
   222             aMessage.WriteL( 1, resPckg );
       
   223     	    
       
   224     	    break;
       
   225     	    }
       
   226     	    
       
   227         case EFeatMgrFeaturesSupported:
       
   228     	    {
       
   229         	TInt count( aMessage.Int0() );
       
   230         	TInt responseCount( 0 );
       
   231         	RFeatureArray temp;
       
   232         	CleanupClosePushL( temp );
       
   233         	temp.ReserveL( count );
       
   234         	
       
   235             for ( TInt i = 0; i < count; i++ )
       
   236                 {
       
   237                 TFeatureEntry feature;
       
   238                 TPckg<TFeatureEntry> pckg( feature );
       
   239                 TInt offset = i * sizeof(TFeatureEntry);
       
   240                 // Read feature entry and fetch entry status/data
       
   241                 aMessage.ReadL( 1, pckg, offset );
       
   242                 TFeatureServerEntry feat( feature );
       
   243                 TInt supported = iRegistry.IsFeatureSupported( feat );
       
   244                 
       
   245                 // Non-existing and uninitialised feature entries are not returned.
       
   246                 if( supported != KErrNotFound && supported != KErrNotReady )
       
   247                     {
       
   248                     responseCount++;
       
   249                     TFeatureEntry featBack( feat.FeatureUid(), feat.FeatureFlags(), 
       
   250                         feat.FeatureData() );
       
   251                     // Can't write to same slot before reading entries first
       
   252                     temp.AppendL( featBack );
       
   253                     }
       
   254                 }
       
   255                 
       
   256             // Write found entries back to client
       
   257             for ( TInt i = 0; i < responseCount; i++ )
       
   258                 {
       
   259                 TInt offset = i * sizeof(TFeatureEntry);
       
   260                 TPckgC<TFeatureEntry> pckgBack( temp[i] );
       
   261                 aMessage.WriteL( 1, pckgBack, offset );
       
   262                 }
       
   263             CleanupStack::PopAndDestroy( &temp );
       
   264 
       
   265             // Write number of found entries back to client
       
   266             TPckgC<TInt> resPckg( responseCount );
       
   267             aMessage.WriteL( 2, resPckg );
       
   268     	    
       
   269     	    break;
       
   270     	    }
       
   271         
       
   272         case EFeatMgrNumberOfSupportedFeatures:
       
   273     	    {
       
   274     	    TInt count = iRegistry.NumberOfSupportedFeatures();
       
   275             TPckgC<TInt> resPckg( count );
       
   276             aMessage.WriteL( 0, resPckg );
       
   277     	    
       
   278     	    break;
       
   279     	    }
       
   280     	    
       
   281     	case EFeatMgrListSupportedFeatures:
       
   282     	    {   
       
   283             RFeatureUidArray supportedFeatures;
       
   284             CleanupClosePushL( supportedFeatures );
       
   285             
       
   286             iRegistry.SupportedFeaturesL( supportedFeatures );
       
   287             TInt count( supportedFeatures.Count() );
       
   288            
       
   289             if ( aMessage.Int0() == count )
       
   290                 {
       
   291                 for ( TInt i = 0; i < count; i++ )
       
   292                     {
       
   293                     TPckg<TUid> pckg( supportedFeatures[i] );
       
   294                     TInt offset = i * sizeof(TUid);
       
   295                     aMessage.WriteL( 1, pckg, offset );
       
   296                     }
       
   297                 
       
   298                 CleanupStack::PopAndDestroy( &supportedFeatures );
       
   299                 }
       
   300             else
       
   301                 {
       
   302                 CleanupStack::PopAndDestroy( &supportedFeatures );
       
   303                 User::Leave( KErrServerBusy );
       
   304                 }
       
   305          	break;
       
   306     	    }
       
   307 
       
   308     	case EFeatMgrEnableFeature:
       
   309     	    {
       
   310     	    if( getIdErr == KErrNone )
       
   311     	    	{
       
   312 	    	    TUid feature = TUid::Uid(aMessage.Int0());
       
   313 	    	    getIdErr = iRegistry.SetFeature( feature, EFeatureSupportEnable, NULL, processId );
       
   314     	    	}
       
   315     	    TPckgC<TInt> resPckg( getIdErr );
       
   316 	        aMessage.WriteL( 1, resPckg );
       
   317 
       
   318 	        break;
       
   319     	    }
       
   320   		
       
   321   		case EFeatMgrDisableFeature:
       
   322     	    {
       
   323     	    if( getIdErr == KErrNone )
       
   324     	    	{
       
   325 	    	    TUid feature = TUid::Uid(aMessage.Int0());
       
   326 	    	    getIdErr = iRegistry.SetFeature( feature, EFeatureSupportDisable, NULL, processId );
       
   327     	    	}    	    
       
   328             TPckgC<TInt> resPckg( getIdErr );
       
   329             aMessage.WriteL( 1, resPckg );
       
   330     	    
       
   331     	    break;
       
   332     	    }
       
   333 
       
   334         case EFeatMgrAddFeature:
       
   335     	    {
       
   336     	    if( getIdErr == KErrNone)
       
   337     	    	{
       
   338     	    	TFeatureEntry feature;
       
   339         	    TPckg<TFeatureEntry> pckg( feature );
       
   340         	    aMessage.ReadL( 0, pckg );
       
   341         	    TFeatureServerEntry feat( feature );
       
   342         	    getIdErr = iRegistry.AddFeature( feat, processId );
       
   343     	    	}    	    
       
   344             TPckgC<TInt> resPckg( getIdErr );
       
   345             aMessage.WriteL( 1, resPckg );
       
   346     	    
       
   347     	    break;
       
   348     	    }
       
   349         
       
   350         case EFeatMgrDeleteFeature:
       
   351     	    {
       
   352     	    if( getIdErr == KErrNone)
       
   353     	    	{
       
   354     	    	TUid feature = TUid::Uid(aMessage.Int0());
       
   355     	    	getIdErr = iRegistry.DeleteFeature( feature, processId );
       
   356     	    	}
       
   357     	    TPckgC<TInt> resPckg( getIdErr );
       
   358             aMessage.WriteL( 1, resPckg );
       
   359     	    
       
   360     	    break;
       
   361     	    }
       
   362         
       
   363         case EFeatMgrSetFeatureAndData:
       
   364     	    {
       
   365     	    if( getIdErr == KErrNone)
       
   366     	    	{
       
   367     	    	TUid feature = TUid::Uid(aMessage.Int0());
       
   368 	    	    TBool enable = aMessage.Int1();
       
   369 	    	    TUint32 data = aMessage.Int2();
       
   370 	    	    getIdErr = iRegistry.SetFeature( feature, enable, &data, processId );
       
   371     	    	}
       
   372     	    TPckgC<TInt> resPckg( getIdErr );
       
   373             aMessage.WriteL( 3, resPckg );
       
   374     	    
       
   375     	    break;
       
   376     	    }
       
   377         
       
   378         case EFeatMgrSetFeatureData:
       
   379     	    {
       
   380     	    if( getIdErr == KErrNone)
       
   381     	    	{
       
   382     	    	TUid feature = TUid::Uid(aMessage.Int0());
       
   383 	    	    TUint32 data = aMessage.Int1();
       
   384 	    	    getIdErr = iRegistry.SetFeature( feature, EFeatureSupportUntouch, &data, processId );
       
   385     	    	}
       
   386     	    TPckgC<TInt> resPckg( getIdErr );
       
   387             aMessage.WriteL( 2, resPckg );
       
   388     	    
       
   389     	    break;
       
   390     	    }
       
   391         
       
   392         case EFeatMgrReqNotify:
       
   393     	    {
       
   394     	    // When client requests notification for feature, it could be checked
       
   395     	    // whether feature exists at all and even whether feature modifiable,
       
   396     	    // i.e. could request ever cause notification. If this will be done, 
       
   397     	    // remember document error codes in API documentation.
       
   398     	    
       
   399     	    // Message is needed for later signaling of client upon feature change.
       
   400     	    if( iNotifyMessage.IsNull() ) 
       
   401     	        {
       
   402     	        iNotifyMessage = aMessage;
       
   403     	        }
       
   404     	    else
       
   405     	        {
       
   406     	        PanicClient( aMessage, EPanicNotifyRequest );
       
   407     	        }
       
   408     	        
       
   409     	    break;
       
   410     	    }
       
   411         
       
   412         case EFeatMgrReqNotifyUids:
       
   413     	    {
       
   414     	    // When client requests notification for features, it could be checked
       
   415     	    // whether features exists at all and even whether features modifiable,
       
   416     	    // i.e. could request ever cause notification. If this will be done, 
       
   417     	    // remember document error codes in API documentation.
       
   418     	    
       
   419     	    TInt err( KErrNone );
       
   420     	    
       
   421         	// Fetch transfer buffer from client
       
   422         	TInt count( aMessage.Int0() );
       
   423         	err = iNotifyFeatures.Reserve( count );
       
   424         	
       
   425         	if( err == KErrNone )
       
   426         	    {
       
   427                 for ( TInt i = 0; i < count; i++ )
       
   428                     {
       
   429                     TUid feature;
       
   430                     TPckg<TUid> pckg( feature );
       
   431                     TInt offset = i * sizeof(TUid);
       
   432                     aMessage.ReadL( 1, pckg, offset );
       
   433                     err = iNotifyFeatures.Append( feature );
       
   434                     if( err != KErrNone )
       
   435                         {
       
   436                         break;
       
   437                         }
       
   438                     }
       
   439         	    }
       
   440     	    
       
   441             TPckgC<TInt> resPckg( err );
       
   442             aMessage.WriteL( 2, resPckg );
       
   443     	    
       
   444     	    break;
       
   445     	    }
       
   446         
       
   447         case EFeatMgrReqNotifyCancel:
       
   448     	    {
       
   449     	    TUid feature = TUid::Uid(aMessage.Int0());
       
   450     	    TInt index( iNotifyFeatures.Find( feature ) );
       
   451     	    TInt err( KErrNotFound );
       
   452     	    
       
   453     	    if( index != KErrNotFound )
       
   454     	        {
       
   455     	        err = KErrNone;
       
   456     	        iNotifyFeatures.Remove( index );
       
   457     	        }
       
   458     	    
       
   459     	    // If no more features to be notified, complete request.
       
   460     	    if( !iNotifyFeatures.Count() 
       
   461     	        && iNotifyMessage.IsNull() == EFalse)
       
   462     	        {
       
   463     	        iNotifyMessage.Complete( KErrCancel );
       
   464     	        }
       
   465     	    
       
   466             TPckgC<TInt> resPckg( err );
       
   467             aMessage.WriteL( 1, resPckg );
       
   468     	    
       
   469     	    break;
       
   470     	    }
       
   471         
       
   472         case EFeatMgrReqNotifyCancelAll:
       
   473     	    {
       
   474     	    iNotifyFeatures.Reset();
       
   475     	    if( iNotifyMessage.IsNull() == EFalse )
       
   476     	        {
       
   477     	        iNotifyMessage.Complete( KErrCancel );
       
   478     	        }
       
   479             TPckgC<TInt> resPckg( KErrNone );
       
   480             aMessage.WriteL( 0, resPckg );
       
   481     	    
       
   482     	    break;
       
   483     	    }
       
   484     	    
       
   485         case EFeatMgrSWIStart:
       
   486     	    {
       
   487     	    if( getIdErr == KErrNone)  
       
   488     	    	{
       
   489     	    	getIdErr = iRegistry.SWIStart(processId);
       
   490 	    	    }
       
   491     	    TPckgC<TInt> resPckg( getIdErr );
       
   492             aMessage.WriteL( 0, resPckg );
       
   493             
       
   494     	    break;
       
   495     	    }
       
   496     	    
       
   497         case EFeatMgrSWIEnd:
       
   498     	    {
       
   499     	    if( getIdErr == KErrNone)
       
   500     	    	{
       
   501     	    	getIdErr = iRegistry.SWIEnd(processId);
       
   502     	    	}
       
   503     	    TPckgC<TInt> resPckg( getIdErr );
       
   504             aMessage.WriteL( 0, resPckg );
       
   505             
       
   506     		break;
       
   507     	    }
       
   508     	    
       
   509 #ifdef EXTENDED_FEATURE_MANAGER_TEST
       
   510     	    // debug only API 
       
   511     	    // returns the size of the iNotifyFeatures array
       
   512         case EFeatMgrNumberOfNotifyFeatures:
       
   513     	    {
       
   514     	    TInt count = iNotifyFeatures.Count();
       
   515             TPckgC<TInt> resPckg( count );
       
   516             aMessage.WriteL( 0, resPckg );
       
   517     	    
       
   518     	    break;
       
   519     	    }
       
   520 
       
   521     	    // returns the number of allocated heap cells
       
   522         case EFeatMgrCountAllocCells:
       
   523     	    {
       
   524     	    TInt count = User::CountAllocCells();
       
   525             TPckgC<TInt> resPckg( count );
       
   526             aMessage.WriteL( 0, resPckg );
       
   527     	    
       
   528     	    break;
       
   529     	    }    
       
   530 #endif
       
   531 
       
   532         // Cannot identify the message.
       
   533         default:
       
   534             {
       
   535             PanicClient( aMessage, EPanicIllegalArgument );
       
   536             break;
       
   537            }
       
   538         }
       
   539     }
       
   540 
       
   541 // -----------------------------------------------------------------------------
       
   542 // CFeatMgrSession::ServiceNotifications
       
   543 // -----------------------------------------------------------------------------
       
   544 //
       
   545 void CFeatMgrSession::ServiceNotifications( TFeatureServerEntry& aFeature, 
       
   546     TFeatureChangeType aType )
       
   547     {       
       
   548     FUNC_LOG
       
   549     
       
   550     if( !iNotifyMessage.IsNull() ) 
       
   551         {
       
   552         TInt index( iNotifyFeatures.Find( aFeature.FeatureUid() ) );
       
   553         
       
   554         if( index != KErrNotFound )
       
   555             {
       
   556             if( aType == EFeatureFeatureDeleted )
       
   557             	{
       
   558             	// The feature was deleted - won't have any more notifications
       
   559             	iNotifyFeatures.Remove(index);
       
   560             	}
       
   561 
       
   562             // Write changed feature back to client and complete request
       
   563             TPckgC<TInt> feature( aFeature.FeatureUid().iUid );
       
   564             TInt err( iNotifyMessage.Write( 0, feature ) );
       
   565             if( err == KErrNone )
       
   566                 {
       
   567                 iNotifyMessage.Complete( aType );
       
   568                 }
       
   569             }
       
   570         }
       
   571     }
       
   572 
       
   573 
       
   574 // ============================= LOCAL FUNCTIONS ===============================
       
   575 
       
   576 // ============================ MEMBER FUNCTIONS ===============================
       
   577 
       
   578 // -----------------------------------------------------------------------------
       
   579 // CFeatMgrPendingRequest::CFeatMgrPendingRequest
       
   580 // C++ constructor
       
   581 // -----------------------------------------------------------------------------
       
   582 //
       
   583 CFeatMgrPendingRequest::CFeatMgrPendingRequest()
       
   584     {
       
   585     }
       
   586 
       
   587 // -----------------------------------------------------------------------------
       
   588 // CFeatMgrPendingRequest::NewL
       
   589 // Two-phased constructor.
       
   590 // -----------------------------------------------------------------------------
       
   591 //
       
   592 CFeatMgrPendingRequest* CFeatMgrPendingRequest::NewL(const RMessage2& aMessage)
       
   593     {
       
   594     FUNC_LOG
       
   595     CFeatMgrPendingRequest* self = new (ELeave) CFeatMgrPendingRequest;
       
   596     
       
   597     CleanupStack::PushL( self );
       
   598     self->ConstructL( aMessage );
       
   599     CleanupStack::Pop( self );
       
   600 
       
   601     return self;
       
   602     }
       
   603 
       
   604 // ---------------------------------------------------------
       
   605 // CFeatMgrPendingRequest::ConstructL
       
   606 // ---------------------------------------------------------
       
   607 //
       
   608 void CFeatMgrPendingRequest::ConstructL(const RMessage2& aMessage)
       
   609     {
       
   610     iMessage = aMessage;
       
   611     }
       
   612 
       
   613 // ---------------------------------------------------------
       
   614 // Destructor
       
   615 // ---------------------------------------------------------
       
   616 //
       
   617 CFeatMgrPendingRequest::~CFeatMgrPendingRequest()
       
   618     {
       
   619     FUNC_LOG
       
   620     }
       
   621 
       
   622 
       
   623 //  End of File