contextframework/cfw/src/cfserver/CFMessageHandlerScript.cpp
changeset 0 2e3d3ce01487
equal deleted inserted replaced
-1:000000000000 0:2e3d3ce01487
       
     1 /*
       
     2 * Copyright (c) 2006-2006 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:  Message handler context class implementation.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <s32mem.h>
       
    20 
       
    21 #include "CFMessageHandlerScript.h"
       
    22 #include "cfcommon.h"
       
    23 #include "CFScriptInterface.h"
       
    24 #include "CFActionSubscriptionImpl.h"
       
    25 #include "CFActionIndicationImpl.h"
       
    26 #include "CFServSession.h"
       
    27 #include "cftrace.h"
       
    28 
       
    29 CCFMessageHandlerScript* CCFMessageHandlerScript::NewL(
       
    30 	MCFExtendedContextInterface& aCFContext,
       
    31     MCFActionInterface& aCFAction,
       
    32     MCFScriptInterface& aScriptInterface )
       
    33     {
       
    34     FUNC_LOG;
       
    35     
       
    36     CCFMessageHandlerScript* self = CCFMessageHandlerScript::NewLC(
       
    37         aCFContext,
       
    38         aCFAction,
       
    39         aScriptInterface );
       
    40     CleanupStack::Pop( self );
       
    41     
       
    42     return self;
       
    43     }
       
    44 
       
    45 CCFMessageHandlerScript* CCFMessageHandlerScript::NewLC(
       
    46 	MCFExtendedContextInterface& aCFContext,
       
    47     MCFActionInterface& aCFAction,
       
    48     MCFScriptInterface& aScriptInterface )
       
    49     {
       
    50     FUNC_LOG;
       
    51     
       
    52     CCFMessageHandlerScript* self = new( ELeave ) CCFMessageHandlerScript(
       
    53         aCFContext,
       
    54         aCFAction,
       
    55         aScriptInterface );
       
    56     CleanupStack::PushL( self );
       
    57     self->ConstructL();
       
    58     
       
    59     return self;
       
    60     }
       
    61 
       
    62 CCFMessageHandlerScript::~CCFMessageHandlerScript()
       
    63     {
       
    64     FUNC_LOG;
       
    65     
       
    66     iCFScriptInterface.DeregisterScriptOwner( *this );
       
    67     if( !iMessage.IsNull() )
       
    68         {
       
    69         // Complete message
       
    70         iMessage.Complete( KErrCancel );
       
    71         }
       
    72     iScriptIds.Close();
       
    73     }
       
    74 
       
    75 CCFMessageHandlerScript::CCFMessageHandlerScript(
       
    76 	MCFExtendedContextInterface& aCFContext,
       
    77     MCFActionInterface& aCFAction,
       
    78     MCFScriptInterface& aCFScriptInterface ):
       
    79     CCFMessageHandlerBase( aCFContext, aCFAction, aCFScriptInterface )
       
    80     {
       
    81     FUNC_LOG;
       
    82     }
       
    83     
       
    84 void CCFMessageHandlerScript::ConstructL()
       
    85     {
       
    86     FUNC_LOG;
       
    87     }
       
    88 
       
    89 // METHODS
       
    90 
       
    91 //-----------------------------------------------------------------------------
       
    92 // CCFMessageHandlerScript::HandleMessageL
       
    93 //-----------------------------------------------------------------------------
       
    94 //
       
    95 TBool CCFMessageHandlerScript::HandleMessageL( const RMessage2& aMessage )
       
    96     {
       
    97     FUNC_LOG;
       
    98 
       
    99     TBool handled = ETrue;
       
   100     switch( aMessage.Function() )
       
   101         {
       
   102 		// Slot[0] = RFs handle
       
   103 		// Slot[1] = RFile handle
       
   104 		case ERegisterScriptByName:
       
   105 			{
       
   106             RFile scriptFile;
       
   107             User::LeaveIfError( scriptFile.AdoptFromClient( aMessage, 0, 1 ) );
       
   108             CleanupClosePushL( scriptFile );
       
   109             
       
   110             HBufC8* script = LoadScriptFromFile( scriptFile );
       
   111             TPtrC8 scriptPtrC( *script );
       
   112             CleanupStack::PushL( script );
       
   113             
       
   114             RThread client;
       
   115             aMessage.ClientL( client );
       
   116             CleanupClosePushL( client );
       
   117             
       
   118             HBufC* name = HBufC::NewLC( KMaxFileName );
       
   119             TPtr namePtr( name->Des() );
       
   120             User::LeaveIfError( scriptFile.Name( namePtr ) );
       
   121             
       
   122             // Register script
       
   123             TInt scriptId = 0;
       
   124             TInt err = RegisterScript( client, namePtr, scriptPtrC, scriptId );
       
   125 
       
   126             // Clean up
       
   127             CleanupStack::PopAndDestroy( name );
       
   128             CleanupStack::PopAndDestroy( &client );
       
   129             CleanupStack::PopAndDestroy( script );
       
   130             CleanupStack::PopAndDestroy( &scriptFile );
       
   131             
       
   132             if( err == KErrNone )
       
   133                 {
       
   134                 err = scriptId;
       
   135                 }
       
   136             aMessage.Complete( err );
       
   137             break;
       
   138 			}
       
   139 
       
   140         // Slot[0] = TDesC8 - Script
       
   141         // Slot[1] = TDesC  - Script name
       
   142     	case ERegisterScriptByNameAndDesc:
       
   143             {
       
   144             HBufC8* script = HBufC8::NewLC( aMessage.GetDesLengthL( 0 ) );
       
   145             TPtr8 scriptPtr( script->Des() );
       
   146             aMessage.ReadL( 0, scriptPtr );
       
   147             
       
   148             HBufC* name = HBufC::NewLC( aMessage.GetDesLengthL( 1 ) );
       
   149             TPtr namePtr( name->Des() );
       
   150             aMessage.ReadL( 1, namePtr );
       
   151             
       
   152             RThread client;
       
   153             aMessage.ClientL( client );
       
   154             CleanupClosePushL( client );
       
   155 
       
   156             // Register script
       
   157             TInt scriptId = 0;
       
   158             TInt err = RegisterScript( client, namePtr, scriptPtr, scriptId );
       
   159 
       
   160             // Clean up
       
   161             CleanupStack::PopAndDestroy( &client );
       
   162             CleanupStack::PopAndDestroy( name );
       
   163             CleanupStack::PopAndDestroy( script );
       
   164             
       
   165             if( err == KErrNone )
       
   166                 {
       
   167                 err = scriptId;
       
   168                 }
       
   169             aMessage.Complete( err );
       
   170             break;
       
   171             }
       
   172 
       
   173         // Slot[0] = TInt - Script ID
       
   174         case EDeregisterScriptById:
       
   175             {
       
   176 			TInt scriptId = aMessage.Int0();            
       
   177             
       
   178             // Get handle to client process thread
       
   179             RThread client;
       
   180             aMessage.ClientL( client );
       
   181             CleanupClosePushL( client );
       
   182             
       
   183             // Deregister script
       
   184             TInt err = iCFScriptInterface.DeregisterScript( scriptId, client );
       
   185 
       
   186             // Cleanup
       
   187             CleanupStack::PopAndDestroy( &client );
       
   188 
       
   189             // Complete message and return
       
   190             aMessage.Complete( err );
       
   191             break;
       
   192             }
       
   193             
       
   194         // Slot[0] = RFs handle
       
   195         // Slot[1] = RFile handle
       
   196         case ESaveScriptByName:
       
   197             {
       
   198             RFile scriptFile;
       
   199             User::LeaveIfError( scriptFile.AdoptFromClient( aMessage, 0, 1 ) );
       
   200             CleanupClosePushL( scriptFile );
       
   201             
       
   202             HBufC8* script = LoadScriptFromFile( scriptFile );
       
   203             TPtrC8 scriptPtrC( *script );
       
   204             CleanupStack::PushL( script );
       
   205             
       
   206             RThread client;
       
   207             aMessage.ClientL( client );
       
   208             CleanupClosePushL( client );
       
   209             
       
   210             HBufC* name = HBufC::NewLC( KMaxFileName );
       
   211             TPtr namePtr( name->Des() );
       
   212             User::LeaveIfError( scriptFile.Name( namePtr ) );
       
   213             
       
   214             // Register script
       
   215             TInt scriptId = 0;
       
   216             TInt err = RegisterScript( client, namePtr, scriptPtrC, scriptId );
       
   217             if( err == KErrNone )
       
   218                 {
       
   219                 // Script registered - save script
       
   220                 err = iCFScriptInterface.SaveScript(
       
   221                     scriptPtrC, scriptId, client );
       
   222                 if( err != KErrNone )
       
   223                     {
       
   224                     // Script save failed - deregister script
       
   225                     iCFScriptInterface.DeregisterScript( scriptId, client );
       
   226                     }
       
   227                 }
       
   228 
       
   229             // Clean up
       
   230             CleanupStack::PopAndDestroy( name );
       
   231             CleanupStack::PopAndDestroy( &client );
       
   232             CleanupStack::PopAndDestroy( script );
       
   233             CleanupStack::PopAndDestroy( &scriptFile );
       
   234             
       
   235             if( err == KErrNone )
       
   236                 {
       
   237                 err = scriptId;
       
   238                 }
       
   239             aMessage.Complete( err );
       
   240             break;
       
   241             }
       
   242             
       
   243         // Slot[0] = TDesC8 - Script
       
   244         // Slot[1] = TDesC  - Script name
       
   245         case ESaveScriptByNameAndDesc:
       
   246             {
       
   247             HBufC8* script = HBufC8::NewLC( aMessage.GetDesLengthL( 0 ) );
       
   248             TPtr8 scriptPtr( script->Des() );
       
   249             aMessage.ReadL( 0, scriptPtr );
       
   250             
       
   251             HBufC* name = HBufC::NewLC( aMessage.GetDesLengthL( 1 ) );
       
   252             TPtr namePtr( name->Des() );
       
   253             aMessage.ReadL( 1, namePtr );
       
   254             
       
   255             RThread client;
       
   256             aMessage.ClientL( client );
       
   257             CleanupClosePushL( client );
       
   258 
       
   259             // Register script
       
   260             TInt scriptId = 0;
       
   261             TInt err = RegisterScript( client, namePtr, scriptPtr, scriptId );
       
   262             if( err == KErrNone )
       
   263                 {
       
   264                 // Register ok - save script
       
   265                 err = iCFScriptInterface.SaveScript(
       
   266                     scriptPtr, scriptId, client );
       
   267                 if( err != KErrNone )
       
   268                     {
       
   269                     // Script save failed - deregister script
       
   270                     iCFScriptInterface.DeregisterScript( scriptId, client );
       
   271                     }
       
   272                 }
       
   273 
       
   274             // Clean up
       
   275             CleanupStack::PopAndDestroy( &client );
       
   276             CleanupStack::PopAndDestroy( name );
       
   277             CleanupStack::PopAndDestroy( script );
       
   278             
       
   279             if( err == KErrNone )
       
   280                 {
       
   281                 err = scriptId;
       
   282                 }
       
   283             aMessage.Complete( err );
       
   284             break;
       
   285             }
       
   286 
       
   287             // Slot[0] = TDesC - Script name
       
   288         case EDeleteScriptByName:
       
   289             {
       
   290             HBufC* scriptName = HBufC::NewLC( aMessage.GetDesLengthL( 0 ) );
       
   291             TPtr scriptNamePtr( scriptName->Des() );
       
   292             aMessage.ReadL( 0, scriptNamePtr );
       
   293             
       
   294             // Get handle to client process thread
       
   295             RThread client;
       
   296             aMessage.ClientL( client );
       
   297             CleanupClosePushL( client );
       
   298             
       
   299             // Delete script by name
       
   300             TInt err = iCFScriptInterface.DeleteScript( scriptNamePtr, client );
       
   301             if( err == KErrNone )
       
   302                 {
       
   303                 // cleanup script persistent data
       
   304                 iCFScriptInterface.CleanupPersistentDataByName(
       
   305                     scriptNamePtr, client );
       
   306                 
       
   307                 // Delete ok - deregister script
       
   308                 err = iCFScriptInterface.DeregisterScript(
       
   309                     scriptNamePtr, client );
       
   310                 }
       
   311 
       
   312             // Cleanup
       
   313             CleanupStack::PopAndDestroy( &client );
       
   314             CleanupStack::PopAndDestroy( scriptName );
       
   315 
       
   316             // Complete message and return
       
   317             aMessage.Complete( err == KErrDeregisterNotNeeded ? KErrNone : err );
       
   318             break;
       
   319             }
       
   320 
       
   321             // No params
       
   322         case EDeleteScriptByUid:
       
   323             {
       
   324             // Get handle to client process thread
       
   325             RThread client;
       
   326             aMessage.ClientL( client );
       
   327             CleanupClosePushL( client );
       
   328             
       
   329             // Delete scripts from the client
       
   330             TInt err = iCFScriptInterface.DeleteScripts( client );
       
   331             if( err == KErrNone )
       
   332                 {
       
   333                 // cleanup script persistent data
       
   334                 iCFScriptInterface.CleanupPersistentDataByUid( client );
       
   335 
       
   336                 // Delete ok - deregister scripts
       
   337                 err = iCFScriptInterface.DeregisterScripts( client );
       
   338                 }
       
   339 
       
   340             // Cleanup
       
   341             CleanupStack::PopAndDestroy( &client );
       
   342 
       
   343             // Complete message and return
       
   344             aMessage.Complete( err == KErrDeregisterNotNeeded ? KErrNone : err );
       
   345             break;
       
   346             }
       
   347             
       
   348             // Slot[0] = RFs handle
       
   349             // Slot[1] = RFile handle
       
   350         case EUpgradeRomScriptByName:
       
   351             {
       
   352             RFile scriptFile;
       
   353             User::LeaveIfError( scriptFile.AdoptFromClient( aMessage, 0, 1 ) );
       
   354             CleanupClosePushL( scriptFile );
       
   355             
       
   356             HBufC8* script = LoadScriptFromFile( scriptFile );
       
   357             TPtrC8 scriptPtrC( *script );
       
   358             CleanupStack::PushL( script );
       
   359 
       
   360             HBufC* name = HBufC::NewLC( KMaxFileName );
       
   361             TPtr namePtr( name->Des() );
       
   362             User::LeaveIfError( scriptFile.Name( namePtr ) );
       
   363             
       
   364             RThread client;
       
   365             aMessage.ClientL( client );
       
   366             CleanupClosePushL( client );
       
   367             
       
   368             // Check if client is allowed to upgrade
       
   369             TInt err = iCFScriptInterface.IsUpgradeAllowed(
       
   370                 namePtr, *script, client );
       
   371             if( err == KErrNone )
       
   372                 {
       
   373                 // Upgrade script
       
   374                 err = UpgradeScript( namePtr, scriptPtrC );
       
   375                 }
       
   376 
       
   377             // Clean up
       
   378             CleanupStack::PopAndDestroy( &client );
       
   379             CleanupStack::PopAndDestroy( name );
       
   380             CleanupStack::PopAndDestroy( script );
       
   381             CleanupStack::PopAndDestroy( &scriptFile );
       
   382             
       
   383             aMessage.Complete( err );
       
   384             break;
       
   385             }
       
   386             
       
   387             // Slot[0] = TDesC8 - Script
       
   388             // Slot[1] = TDesC  - Script name
       
   389         case EUpgradeRomScriptByNameAndDesc:
       
   390             {
       
   391             HBufC8* script = HBufC8::NewLC( aMessage.GetDesLengthL( 0 ) );
       
   392             TPtr8 scriptPtr( script->Des() );
       
   393             aMessage.ReadL( 0, scriptPtr );
       
   394             
       
   395             HBufC* name = HBufC::NewLC( aMessage.GetDesLengthL( 1 ) );
       
   396             TPtr namePtr( name->Des() );
       
   397             aMessage.ReadL( 1, namePtr );
       
   398             
       
   399             RThread client;
       
   400             aMessage.ClientL( client );
       
   401             CleanupClosePushL( client );
       
   402             
       
   403             // Check if client is allowed to upgrade
       
   404             TInt err = iCFScriptInterface.IsUpgradeAllowed(
       
   405                 namePtr, *script, client );
       
   406             if( err == KErrNone )
       
   407                 {
       
   408                 // Upgrade script
       
   409                 err = UpgradeScript( namePtr, scriptPtr );
       
   410                 }
       
   411 
       
   412             // Clean up
       
   413             CleanupStack::PopAndDestroy( &client );
       
   414             CleanupStack::PopAndDestroy( name );
       
   415             CleanupStack::PopAndDestroy( script );
       
   416             
       
   417             aMessage.Complete( err );
       
   418             break;
       
   419             }
       
   420             
       
   421             // Slot[0] = TDesC - Script name
       
   422         case ERestoreRomScript:
       
   423             {
       
   424             // Read file name
       
   425             HBufC* scriptName = HBufC::NewLC( aMessage.GetDesLengthL( 0 ) );
       
   426             TPtr scriptNamePtr( scriptName->Des() );
       
   427             aMessage.ReadL( 0, scriptNamePtr );
       
   428             
       
   429             RThread mainThread;
       
   430             CleanupClosePushL( mainThread );
       
   431 
       
   432             // Check if the script exists
       
   433             TInt err = KErrNotFound;
       
   434             TInt scriptId = 0;
       
   435             TBool exists = iCFScriptInterface.AlreadyExists(
       
   436                 scriptNamePtr, mainThread, scriptId );
       
   437             if( exists )
       
   438                 {
       
   439                 // Get handle to the client thread
       
   440                 RThread client;
       
   441                 aMessage.ClientL( client );
       
   442                 CleanupClosePushL( client );
       
   443 
       
   444                 // Restore script - check that client is allowed to restore
       
   445                 err = iCFScriptInterface.RestoreRomScript(
       
   446                     scriptId, client );
       
   447                 if( err == KErrNone )
       
   448                     {
       
   449                     // Delete ram script
       
   450                     err = iCFScriptInterface.DeleteScript(
       
   451                         scriptNamePtr, mainThread );
       
   452                     }
       
   453                 CleanupStack::PopAndDestroy( &client );
       
   454                 }
       
   455             
       
   456             // Clean up
       
   457             CleanupStack::PopAndDestroy( &mainThread );
       
   458             CleanupStack::PopAndDestroy( scriptName );
       
   459             
       
   460             // Complete message
       
   461             aMessage.Complete( err );
       
   462             break;
       
   463             }
       
   464             
       
   465             // Slot[0] = TDes
       
   466             // Slot[1] = TInt
       
   467         case EScriptNotificationStart:
       
   468             {
       
   469             // Check if we already have message listening active
       
   470             // Client has messed up
       
   471             if( !iMessage.IsNull() )
       
   472                 {
       
   473                 // Panic client
       
   474                 iMessage.Panic( KPanicCatClient,
       
   475                     EAlreadyReceivingScriptNotification );
       
   476                 }
       
   477             else
       
   478                 {
       
   479                 // Store message and check if there are removed scripts notified
       
   480                 iMessage = aMessage;
       
   481                 NotifyRemovedScriptsL( iMessage );
       
   482                 }            
       
   483             break;
       
   484             }
       
   485             
       
   486             // No args
       
   487         case EScriptNotificationCancel:
       
   488             {
       
   489             if( !iMessage.IsNull() )
       
   490                 {
       
   491                 // Complete message
       
   492                 iMessage.Complete( KErrCancel );
       
   493                 }
       
   494             aMessage.Complete( KErrNone );
       
   495             break;
       
   496             }
       
   497             
       
   498             // Slot[0] = TDes
       
   499         case EGetScriptNotification:
       
   500             {
       
   501             // Message will be completed during the function call
       
   502             NotifyRemovedScriptsL( aMessage );
       
   503             break;
       
   504             }
       
   505             
       
   506         default:
       
   507             {
       
   508             // Message not handled
       
   509             handled = EFalse;
       
   510             break;
       
   511             }
       
   512         }
       
   513     
       
   514     return handled;
       
   515     }
       
   516 
       
   517 //------------------------------------------------------------------------------
       
   518 // CCFMessageHandlerScript::HandleScriptsRemoved
       
   519 //------------------------------------------------------------------------------
       
   520 //
       
   521 void CCFMessageHandlerScript::HandleScriptsRemoved(
       
   522     const RArray<TInt>& aScriptIds )
       
   523     {
       
   524     FUNC_LOG;
       
   525     
       
   526     // Add ids in to list
       
   527     for( TInt i = 0; i < aScriptIds.Count(); i++ )
       
   528         {
       
   529         // Ignore errors since this can occur only due to OOM
       
   530         iScriptIds.Append( aScriptIds[i] );
       
   531         }
       
   532 
       
   533     // Check if there is a message pending
       
   534     TRAP_IGNORE( NotifyRemovedScriptsL( iMessage ) );
       
   535     }
       
   536 
       
   537 // -----------------------------------------------------------------------------
       
   538 // CCFMessageHandlerScript::LoadScriptFromFile
       
   539 // -----------------------------------------------------------------------------
       
   540 //
       
   541 HBufC8* CCFMessageHandlerScript::LoadScriptFromFile( RFile& aFile )
       
   542     {
       
   543     FUNC_LOG;
       
   544     
       
   545     HBufC8* script = NULL;
       
   546     TInt size = 0;
       
   547     TInt err = aFile.Size( size );
       
   548     if( err == KErrNone )
       
   549         {
       
   550         script = HBufC8::New( size );
       
   551         if( script )
       
   552             {
       
   553             TPtr8 scriptPtr = script->Des();
       
   554             err = aFile.Read( scriptPtr );
       
   555             if( err == KErrNone )
       
   556                 {
       
   557                 // Strip all unnecassary data from script
       
   558                 TInt pos = scriptPtr.FindF( KScriptStartTag );
       
   559                 if( pos != KErrNotFound )
       
   560                     {
       
   561                     scriptPtr.Copy( scriptPtr.MidTPtr( pos ) );
       
   562                     }
       
   563                 else
       
   564                     {
       
   565                     // Incorrect script
       
   566                     delete script;
       
   567                     script = NULL;
       
   568                     }
       
   569                 }
       
   570             else
       
   571                 {
       
   572                 delete script;
       
   573                 script = NULL;
       
   574                 }
       
   575             }
       
   576         }
       
   577     
       
   578     ERROR( err, "Failed loading script" );
       
   579     
       
   580     return script;
       
   581     }
       
   582 
       
   583 // -----------------------------------------------------------------------------
       
   584 // CCFMessageHandlerScript::RegisterScript
       
   585 // -----------------------------------------------------------------------------
       
   586 //
       
   587 TInt CCFMessageHandlerScript::RegisterScript( const RThread& aClient,
       
   588     const TDesC& aName,
       
   589     const TDesC8& aScript,
       
   590     TInt& aScriptId )
       
   591     {
       
   592     FUNC_LOG;
       
   593 
       
   594     TInt err = KErrNone;
       
   595 
       
   596     // Check if the client already has a script with the same name
       
   597     TBool exists = iCFScriptInterface.AlreadyExists(
       
   598         aName, aClient, aScriptId );
       
   599     if( exists )
       
   600         {
       
   601         // Update the script
       
   602         err = iCFScriptInterface.UpdateScript(
       
   603             aScriptId, aClient, aScript, *this );
       
   604         }
       
   605     else
       
   606         {
       
   607         // Register a new script
       
   608         err = iCFScriptInterface.RegisterScript(
       
   609             aName, aScript, aScriptId, aClient, *this );    
       
   610         }
       
   611     
       
   612     return err;
       
   613     }
       
   614 
       
   615 // -----------------------------------------------------------------------------
       
   616 // CCFMessageHandlerScript::UpgradeScript
       
   617 // -----------------------------------------------------------------------------
       
   618 //
       
   619 TInt CCFMessageHandlerScript::UpgradeScript( const TDesC& aName,
       
   620     const TDesC8& aScript )
       
   621     {
       
   622     FUNC_LOG;
       
   623 
       
   624     RThread mainThread;
       
   625     TInt err = KErrNotFound;
       
   626     TInt scriptId = 0;
       
   627     TBool found = iCFScriptInterface.AlreadyExists(
       
   628         aName, mainThread, scriptId );
       
   629     if( found )
       
   630         {
       
   631         // Update script
       
   632         err = iCFScriptInterface.UpdateScript( scriptId, mainThread, aScript, *this );
       
   633         if( err == KErrNone )
       
   634             {
       
   635             // Script updated - save script
       
   636             err = iCFScriptInterface.SaveScript(
       
   637                 aScript, scriptId, mainThread );
       
   638             }
       
   639         }
       
   640     
       
   641     // Clean up
       
   642     mainThread.Close();
       
   643     
       
   644     return err;
       
   645     }
       
   646 
       
   647 //------------------------------------------------------------------------------
       
   648 // CCFMessageHandlerScript::NotifyRemovedScriptsL
       
   649 //------------------------------------------------------------------------------
       
   650 //
       
   651 void CCFMessageHandlerScript::NotifyRemovedScriptsL(
       
   652     const RMessage2& aMessage )
       
   653     {
       
   654     FUNC_LOG;
       
   655     
       
   656     // Double check that the message is not already completed and there are
       
   657     // script ids which have not yet been notified
       
   658     if( !aMessage.IsNull() && iScriptIds.Count() )
       
   659         {
       
   660         TInt err = KErrNone;
       
   661         
       
   662         // Check if the client side buffer is large enough
       
   663         TInt size = 0;
       
   664         
       
   665         // Count
       
   666         size += sizeof( TInt );
       
   667         // Ids
       
   668         for( TInt i = 0; i < iScriptIds.Count(); i++ )
       
   669             {
       
   670             size += sizeof( TInt );
       
   671             }
       
   672         // Client buffer length
       
   673         TInt clientBufLen = aMessage.GetDesMaxLengthL( 0 );
       
   674         if( clientBufLen >= size )
       
   675             {
       
   676             // Buffer large enough
       
   677             HBufC8* buf = HBufC8::NewLC( size );
       
   678             TPtr8 bufPtr( buf->Des() );
       
   679             RDesWriteStream write( bufPtr );
       
   680             write.PushL();
       
   681             
       
   682             // Write content in to the stream and then to client side buffer
       
   683             write.WriteInt16L( iScriptIds.Count() );
       
   684             for( TInt i = 0; i < iScriptIds.Count(); i++ )
       
   685                 {
       
   686                 write.WriteInt16L( iScriptIds[i] );
       
   687                 }
       
   688             write.CommitL();
       
   689             aMessage.WriteL( 0, bufPtr );
       
   690             
       
   691             // Clean up
       
   692             CleanupStack::PopAndDestroy( &write );
       
   693             CleanupStack::PopAndDestroy( buf );
       
   694             
       
   695             // Reset script ids
       
   696             iScriptIds.Reset();
       
   697             }
       
   698         else
       
   699             {
       
   700             // Buffer too small
       
   701             err = KErrTooBig;
       
   702             TPckg<TInt> bufferSize( size );
       
   703             aMessage.WriteL( 1, bufferSize );
       
   704             }
       
   705         
       
   706         // Complete message
       
   707         aMessage.Complete( err );
       
   708         }
       
   709     }
       
   710 
       
   711 // End of file