mmappcomponents/harvester/server/src/mpxharvestersession.cpp
changeset 0 a2952bb97e68
equal deleted inserted replaced
-1:000000000000 0:a2952bb97e68
       
     1 /*
       
     2 * Copyright (c) 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:  harvester server session
       
    15 *
       
    16 */
       
    17 
       
    18 #include <e32std.h>
       
    19 #include <e32svr.h>
       
    20 #include <bamdesca.h>
       
    21 #include <mpxlog.h>
       
    22 #include <mpxuser.h>
       
    23 #include <mpxcmn.h>
       
    24 #include <mpxmedia.h>
       
    25 #include "mpxharvestercommon.h"
       
    26 #include "mpxharvestersession.h"
       
    27 #include "mpxharvesterserver.h"
       
    28 #include "mpxharvesterengine.h"
       
    29 
       
    30 // ============================ LOCAL FUNCTIONS ==============================
       
    31 
       
    32 // ----------------------------------------------------------------------------
       
    33 // Panic client
       
    34 // ----------------------------------------------------------------------------
       
    35 //
       
    36 LOCAL_C void PanicClient(const RMessage2 &aMessage,TInt aPanic)
       
    37     {
       
    38     _LIT(KTxtServer,"Harvester Server Session");
       
    39     aMessage.Panic(KTxtServer,aPanic);
       
    40     }
       
    41 
       
    42 // ----------------------------------------------------------------------------
       
    43 // Two-phased constructor.
       
    44 // ----------------------------------------------------------------------------
       
    45 //
       
    46 CMPXHarvesterSession* CMPXHarvesterSession::NewL(
       
    47     CMPXHarvesterServer& aServer,
       
    48     CMPXHarvesterEngine& aEngine)
       
    49     {
       
    50     CMPXHarvesterSession* s = new(ELeave)CMPXHarvesterSession(aServer, aEngine);
       
    51     CleanupStack::PushL(s);
       
    52     s->ConstructL();
       
    53     CleanupStack::Pop(s);
       
    54     return s;
       
    55     }
       
    56 
       
    57 // ----------------------------------------------------------------------------
       
    58 // C++ constructor can NOT contain any code that might leave.
       
    59 // ----------------------------------------------------------------------------
       
    60 //
       
    61 CMPXHarvesterSession::CMPXHarvesterSession(CMPXHarvesterServer& aServer,
       
    62                                            CMPXHarvesterEngine& aEngine)
       
    63     : iServer(aServer), iEngine(aEngine)
       
    64     {
       
    65     iServer.AddClient();
       
    66     }
       
    67 
       
    68 // ----------------------------------------------------------------------------
       
    69 // Symbian 2nd phase constructor can leave.
       
    70 // ----------------------------------------------------------------------------
       
    71 //
       
    72 void CMPXHarvesterSession::ConstructL()
       
    73     {
       
    74     }
       
    75 
       
    76 // ----------------------------------------------------------------------------
       
    77 // Destructor
       
    78 // ----------------------------------------------------------------------------
       
    79 //
       
    80 CMPXHarvesterSession::~CMPXHarvesterSession()
       
    81     {
       
    82     iServer.RemoveClient();
       
    83     delete iDes;
       
    84     delete iDes8;
       
    85     delete iBuffer;
       
    86     delete iMedia;
       
    87 
       
    88     iMessages.ResetAndDestroy();
       
    89     iMessages.Close();
       
    90     }
       
    91 
       
    92 // ----------------------------------------------------------------------------
       
    93 // Service request
       
    94 // ----------------------------------------------------------------------------
       
    95 //
       
    96 void CMPXHarvesterSession::ServiceL(const RMessage2& aMessage)
       
    97     {
       
    98     // Default ServiceErrorL() will complete the message if ServiceL() leaves
       
    99     DispatchMessageL(aMessage);
       
   100     }
       
   101 
       
   102 // ----------------------------------------------------------------------------
       
   103 // Handle Import Complete
       
   104 // ----------------------------------------------------------------------------
       
   105 //
       
   106 void CMPXHarvesterSession::HandleImportCompleteL( CMPXMedia* aMedia,
       
   107                                                   TInt aErr,
       
   108                                                   RHvsMsg* aMsg )
       
   109     {
       
   110     TInt r(0);
       
   111     if( aErr == KErrNone )
       
   112         {
       
   113         // Keep media alive
       
   114         delete iMedia;
       
   115         iMedia = NULL;
       
   116         iMedia = CMPXMedia::NewL( *aMedia );
       
   117 
       
   118         // Serialize the media property to iBuffer
       
   119         ::CreateBufferL<CMPXMedia>( *aMedia, iBuffer );
       
   120         r = iBuffer->Size();
       
   121         }
       
   122     CompleteMessage( aMsg, aErr < 0 ? aErr : r );
       
   123     }
       
   124 
       
   125 // ----------------------------------------------------------------------------
       
   126 // Handle Export Complete
       
   127 // ----------------------------------------------------------------------------
       
   128 //
       
   129 void CMPXHarvesterSession::HandleExportCompleteL( CMPXMedia* aMedia,
       
   130                                                   TInt aErr,
       
   131                                                   RHvsMsg* aMsg )
       
   132     {
       
   133     TInt r(0);
       
   134     if( aErr == KErrNone )
       
   135         {
       
   136          // Keep media alive
       
   137         delete iMedia;
       
   138         iMedia = NULL;
       
   139 
       
   140         iMedia = CMPXMedia::NewL( *aMedia );
       
   141 
       
   142         // Serialize the media property to iBuffer
       
   143         ::CreateBufferL<CMPXMedia>( *aMedia, iBuffer );
       
   144         r = iBuffer->Size();
       
   145         }
       
   146     CompleteMessage( aMsg, aErr < 0 ? aErr : r );
       
   147     }
       
   148 
       
   149 // ----------------------------------------------------------------------------
       
   150 // Handles task completion with error
       
   151 // ----------------------------------------------------------------------------
       
   152 //
       
   153 void CMPXHarvesterSession::CompleteTask( RHvsMsg* aMsg, TInt aErr )
       
   154     {
       
   155     CompleteMessage( aMsg, aErr );
       
   156     }
       
   157 
       
   158 // ----------------------------------------------------------------------------
       
   159 // Message dispatcher
       
   160 // ----------------------------------------------------------------------------
       
   161 //
       
   162 void CMPXHarvesterSession::DispatchMessageL(const RMessage2& aMessage)
       
   163     {
       
   164     MPX_DEBUG1(_L("CMPXHarvesterSession::DispatchMessageL <---"));
       
   165 
       
   166     TInt op(aMessage.Function());
       
   167 
       
   168     switch(op)
       
   169         {
       
   170         case EHvsServerGetBuffer:
       
   171             {
       
   172             ASSERT( iBuffer );
       
   173             aMessage.WriteL(0,iBuffer->Ptr(0));
       
   174             delete iBuffer;
       
   175             iBuffer = NULL;
       
   176             aMessage.Complete( KErrNone );
       
   177             break;
       
   178             }
       
   179         case EHvsServerScan:
       
   180             {
       
   181             DoScanL();
       
   182             aMessage.Complete( KErrNone );
       
   183             break;
       
   184             }
       
   185         case EHvsServerCancelScan:
       
   186             {
       
   187             aMessage.Complete( KErrNone );
       
   188             DoCancelScan();
       
   189             break;
       
   190             }
       
   191         case EHvsServerShutdown:
       
   192             {
       
   193             DoShutdown();
       
   194             aMessage.Complete( KErrNone );
       
   195             break;
       
   196             }
       
   197         case EHvsServerAddFile:
       
   198             {
       
   199             ReadDesL( aMessage, 0 ); // file path
       
   200             RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op );
       
   201             DoAddFileL( msg );
       
   202             break;
       
   203             }
       
   204         case EHvsServerAddFileMedia:
       
   205             {
       
   206             TInt r = DoAddMediaPropL( aMessage );
       
   207             aMessage.Complete( r );
       
   208             break;
       
   209             }
       
   210         case EHvsServerGetMedia:
       
   211             {
       
   212             ReadDesL( aMessage, 0 ); // file path
       
   213             RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op );
       
   214             DoGetMediaL( msg );
       
   215             break;
       
   216             }
       
   217         case EHvsServerGetColUid:
       
   218             {
       
   219             TInt r = DoGetColUidL( aMessage );
       
   220             aMessage.Complete( r );
       
   221             break;
       
   222             }
       
   223         case EHvsServerRemoveFile:
       
   224             {
       
   225             ReadDesL( aMessage, 0 ); // file path
       
   226             TPckgBuf<TInt> del;
       
   227             aMessage.Read( 1, del);
       
   228 
       
   229             TInt r = iEngine.RemoveFileL( *iDes, del() );
       
   230             aMessage.Complete( r );
       
   231             break;
       
   232             }
       
   233         case EHvsServerRemoveFiles:
       
   234             {
       
   235             DoRemoveMultipleFilesL( aMessage );
       
   236             aMessage.Complete( KErrNone );
       
   237             break;
       
   238             }
       
   239 
       
   240         case EHvsServerRemoveAllFiles:
       
   241             {
       
   242             iEngine.RemoveAllFilesL();
       
   243             aMessage.Complete( KErrNone );
       
   244             break;
       
   245             }
       
   246         case EHvsServerUpdateFile:
       
   247             {
       
   248             DoUpdateFileL( aMessage );
       
   249             aMessage.Complete( KErrNone );
       
   250             break;
       
   251             }
       
   252         case EHvsServerRenameFile:
       
   253             {
       
   254             DoRenameFileL( aMessage );
       
   255             aMessage.Complete( KErrNone );
       
   256             break;
       
   257             }
       
   258         case EHvsServerExportPlaylist:
       
   259             {
       
   260             // Async, complete later
       
   261             RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op );
       
   262             TRAPD( err,  iEngine.ExportPlaylistL( msg, this ) );
       
   263             if( err != KErrNone )
       
   264                 {
       
   265                 CompleteMessage( msg, err );
       
   266                 }
       
   267             break;
       
   268             }
       
   269         case EHvsServerImportPlaylist:
       
   270             {
       
   271             RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op );
       
   272             TRAPD( err, iEngine.ImportPlaylistL( msg, this ) );
       
   273             if( err != KErrNone )
       
   274                 {
       
   275                 CompleteMessage( msg, err );
       
   276                 }
       
   277             break;
       
   278             }
       
   279         case EHvsServerFindColID:
       
   280             {
       
   281             ReadDesL( aMessage, 0 ); // file path
       
   282             TInt r=iEngine.FindCollectionIdL( *iDes );
       
   283             aMessage.Complete( r );
       
   284             break;
       
   285             }
       
   286         case EHvsServerReqAttr:
       
   287             {
       
   288             TPckgBuf<TInt> playlistType;
       
   289             aMessage.Read(0, playlistType );
       
   290             TArray<TMPXAttribute> requiredAttributes=iEngine.RequiredAttributesL( playlistType() );
       
   291             ::CreateBufferL<TMPXAttribute>( requiredAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64
       
   292             aMessage.Complete( iBuffer->Size() );
       
   293             break;
       
   294             }
       
   295         case EHvsServerOptAttr:
       
   296             {
       
   297             TPckgBuf<TInt> playlistType;
       
   298             aMessage.Read(0, playlistType );
       
   299             TArray<TMPXAttribute> optionalAttributes=iEngine.OptionalAttributesL( playlistType() );
       
   300             ::CreateBufferL<TMPXAttribute>( optionalAttributes, iBuffer ); //lint !e1024 !e1703 !e1514 !e64
       
   301             aMessage.Complete( iBuffer->Size() );
       
   302             break;
       
   303             }
       
   304         case EHvsServerPlaylistFileExt:
       
   305             {
       
   306             TPckgBuf<TInt> playlistType;
       
   307             aMessage.Read(0, playlistType );
       
   308             const TDesC& fileExtension=iEngine.PlaylistFileExtensionL( playlistType() );
       
   309             aMessage.WriteL(1,fileExtension);
       
   310             aMessage.Complete( KErrNone );
       
   311             break;
       
   312             }
       
   313         case EHvsServerIsPlaylist:
       
   314             {
       
   315             ReadDesL( aMessage, 0 ); // file path
       
   316             TBool r=iEngine.IsPlaylistL( *iDes );
       
   317             aMessage.Complete( r );
       
   318             break;
       
   319             }
       
   320         case EHvsServerImportFile:
       
   321             {
       
   322             RHvsMsg* msg = SetAsyncL( aMessage, (TMPXHarvesterServerOp) op );
       
   323             TRAPD( err, iEngine.ImportFileL( msg, this ) );
       
   324             if( err != KErrNone )
       
   325                 {
       
   326                 CompleteMessage( msg, err );
       
   327                 }
       
   328             break;
       
   329             }
       
   330         case  EHvsServerReCreateDB:
       
   331             {
       
   332             iEngine.RecreateDatabases();
       
   333             aMessage.Complete( KErrNone );
       
   334             break;
       
   335             }
       
   336         case EHvsServerCheckSystemEvent:
       
   337             {
       
   338             iEngine.CheckForSystemEvents();
       
   339             aMessage.Complete( KErrNone );
       
   340             break;
       
   341             }
       
   342         case EHvsServerCloseTransaction:
       
   343             {
       
   344             TRAPD( err, iEngine.CloseTransactionL() );
       
   345             aMessage.Complete( err );
       
   346             break;
       
   347             }
       
   348         default:
       
   349             PanicClient(aMessage, KErrNotFound);
       
   350             break;
       
   351         }
       
   352 
       
   353     MPX_DEBUG1(_L("CMPXHarvesterSession::DispatchMessageL --->"));
       
   354     }
       
   355 
       
   356 // ----------------------------------------------------------------------------
       
   357 // Start scanning for new files
       
   358 // ----------------------------------------------------------------------------
       
   359 //
       
   360 void CMPXHarvesterSession::DoScanL()
       
   361     {
       
   362     MPX_DEBUG1(_L("CMPXHarvesterSession::DoScanL <---"));
       
   363     iEngine.ScanL();
       
   364     MPX_DEBUG1(_L("CMPXHarvesterSession::DoScanL --->"));
       
   365     }
       
   366 
       
   367 // ----------------------------------------------------------------------------
       
   368 // Cancel a scanning operation
       
   369 // ----------------------------------------------------------------------------
       
   370 //
       
   371 void CMPXHarvesterSession::DoCancelScan()
       
   372     {
       
   373     MPX_DEBUG1(_L("CMPXHarvesterSession::DoCancelScanL <---"));
       
   374     iEngine.CancelScan();
       
   375     MPX_DEBUG1(_L("CMPXHarvesterSession::DoCancelScanL --->"));
       
   376     }
       
   377 
       
   378 // ----------------------------------------------------------------------------
       
   379 // Shutdown the server, only used for memory leak testing
       
   380 // ----------------------------------------------------------------------------
       
   381 //
       
   382 void CMPXHarvesterSession::DoShutdown()
       
   383     {
       
   384     MPX_DEBUG1(_L("CMPXHarvesterSession::DoShutdown <---"));
       
   385     CActiveScheduler::Stop();
       
   386     MPX_DEBUG1(_L("CMPXHarvesterSession::DoShutdown --->"));
       
   387     }
       
   388 
       
   389 // ----------------------------------------------------------------------------
       
   390 // Handles adding a file
       
   391 // ----------------------------------------------------------------------------
       
   392 //
       
   393 void CMPXHarvesterSession::DoAddFileL( RHvsMsg* aMsg )
       
   394     {
       
   395     MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddFileL <---"));
       
   396     iEngine.AddFileL( aMsg ,*iDes, this );
       
   397     MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddFileL <---"));
       
   398     }
       
   399 
       
   400 // ----------------------------------------------------------------------------
       
   401 // Handle adding a media property
       
   402 // ----------------------------------------------------------------------------
       
   403 //
       
   404 TInt CMPXHarvesterSession::DoAddMediaPropL( const RMessage2& aMessage )
       
   405     {
       
   406     MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddMediaPropL <---"));
       
   407     CMPXMedia* prop( NULL );
       
   408     ::NewFromMessageL<CMPXMedia>( aMessage, 0, prop );
       
   409 
       
   410     CleanupStack::PushL( prop );
       
   411     TInt r = iEngine.AddFileL( prop );
       
   412     CleanupStack::PopAndDestroy( prop );
       
   413 
       
   414     MPX_DEBUG1(_L("CMPXHarvesterSession::DoAddMediaPropL --->"));
       
   415     return r;
       
   416     }
       
   417 
       
   418 // ----------------------------------------------------------------------------
       
   419 // Handles media creation for a file
       
   420 // ----------------------------------------------------------------------------
       
   421 //
       
   422 void CMPXHarvesterSession::DoGetMediaL( RHvsMsg* aMsg )
       
   423     {
       
   424     MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetMediaL <---"));
       
   425     iEngine.GetMediaL( aMsg ,*iDes, this );
       
   426     MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetMediaL --->"));
       
   427     }
       
   428 
       
   429 // ----------------------------------------------------------------------------
       
   430 // Handle getting collection id
       
   431 // ----------------------------------------------------------------------------
       
   432 //
       
   433 TInt CMPXHarvesterSession::DoGetColUidL( const RMessage2& aMessage )
       
   434     {
       
   435     MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetColUidL <---"));
       
   436 
       
   437     HBufC* buf = HBufC::NewLC(aMessage.GetDesLengthL(0));
       
   438     TPtr ptr = buf->Des();
       
   439     aMessage.Read(0,ptr);
       
   440 
       
   441     TInt r = iEngine.GetColUidL( *buf );
       
   442     CleanupStack::PopAndDestroy( buf );
       
   443 
       
   444     MPX_DEBUG1(_L("CMPXHarvesterSession::DoGetColUidL --->"));
       
   445     return r;
       
   446     }
       
   447 
       
   448 // ----------------------------------------------------------------------------
       
   449 // Remove multiple songs from the harvester db
       
   450 // ----------------------------------------------------------------------------
       
   451 //
       
   452 void CMPXHarvesterSession::DoRemoveMultipleFilesL( const RMessage2& aMessage )
       
   453     {
       
   454     MPX_DEBUG1(_L("CMPXHarvesterSession::DoRemoveMultipleSongsL <---"));
       
   455 
       
   456     // Buffer with the array
       
   457     //
       
   458     CDesCArray* array( NULL );
       
   459     CBufBase* buffer( NULL );
       
   460     MPXUser::RecreateBufferL(aMessage.GetDesLengthL(0), buffer);
       
   461     CleanupStack::PushL( buffer );
       
   462     TPtr8 ptr = buffer->Ptr(0);
       
   463     User::LeaveIfError( aMessage.Read( 0, ptr ) );
       
   464     MPXUser::CreateFromBufferL( *buffer, array );
       
   465     CleanupStack::PopAndDestroy( buffer );
       
   466 
       
   467     if( array )
       
   468         {
       
   469         CleanupStack::PushL( array );
       
   470 
       
   471         // Check if we want to delete the files
       
   472         //
       
   473         TPckgBuf<TInt> del;
       
   474         aMessage.Read( 1, del );
       
   475         TPckgBuf<TInt> endTransaction;
       
   476         TInt error = aMessage.Read( 2, endTransaction );
       
   477         TInt endDbTransaction(1); // If endTranscation is not sent, assume True to commit the db.
       
   478         if ( !error )
       
   479             {
       
   480             endDbTransaction = endTransaction();
       
   481             }
       
   482         // Engine to do the work
       
   483         //
       
   484         iEngine.RemoveMultipleFilesL(*array, del(), endDbTransaction );
       
   485 
       
   486         CleanupStack::PopAndDestroy( array );
       
   487         }
       
   488     else
       
   489         {
       
   490         // Array was NULL;
       
   491         User::Leave( KErrArgument );
       
   492         }
       
   493 
       
   494     MPX_DEBUG1(_L("CMPXHarvesterSession::DoRemoveMultipleSongsL --->"));
       
   495     }
       
   496 
       
   497 // ----------------------------------------------------------------------------
       
   498 // Unpacks an RMessage2 and calls update functions in the engine
       
   499 // ----------------------------------------------------------------------------
       
   500 //
       
   501 void CMPXHarvesterSession::DoUpdateFileL( const RMessage2& aMessage )
       
   502     {
       
   503      // Path of the object
       
   504     HBufC* buf = HBufC::NewLC(aMessage.GetDesLengthL(0));
       
   505     TPtr ptr = buf->Des();
       
   506     aMessage.Read(0,ptr);
       
   507 
       
   508     // New collection ID
       
   509     TPckgBuf<TInt> collection;
       
   510     aMessage.Read(1, collection );
       
   511 
       
   512     iEngine.UpdateFileL( *buf, collection() );
       
   513     CleanupStack::PopAndDestroy( buf );
       
   514     }
       
   515 
       
   516 // ----------------------------------------------------------------------------
       
   517 // Unpacks an RMessage2 and calls rename function in the engine
       
   518 // ----------------------------------------------------------------------------
       
   519 //
       
   520 void CMPXHarvesterSession::DoRenameFileL( const RMessage2& aMessage )
       
   521     {
       
   522     // Path of the object
       
   523     HBufC* oldPath = HBufC::NewLC(aMessage.GetDesLengthL(0));
       
   524     TPtr oldPathPtr = oldPath->Des();
       
   525     aMessage.Read(0,oldPathPtr);
       
   526 
       
   527     // Path of the object
       
   528     HBufC* newPath = HBufC::NewLC(aMessage.GetDesLengthL(1));
       
   529     TPtr newPathPtr = newPath->Des();
       
   530     aMessage.Read(1,newPathPtr);
       
   531 
       
   532     // collection Id of the object
       
   533     TPckgBuf<TInt> collection;
       
   534     aMessage.Read(2, collection );
       
   535 
       
   536     iEngine.RenameFileL( *oldPath, *newPath, collection() );
       
   537     CleanupStack::PopAndDestroy( 2, oldPath ); // newPath, oldPath
       
   538     }
       
   539 
       
   540 // ----------------------------------------------------------------------------
       
   541 // Sets this message as asynchronous and adds it to internal list
       
   542 // ----------------------------------------------------------------------------
       
   543 //
       
   544 RHvsMsg* CMPXHarvesterSession::SetAsyncL( const RMessage2& aMessage,
       
   545                                           TMPXHarvesterServerOp aOp )
       
   546     {
       
   547     RHvsMsg* msg = new(ELeave) RHvsMsg( aMessage, aOp );
       
   548     iMessages.Append( msg );
       
   549     return msg;
       
   550     }
       
   551 
       
   552 // ----------------------------------------------------------------------------
       
   553 // Complete an async message
       
   554 // ----------------------------------------------------------------------------
       
   555 //
       
   556 void CMPXHarvesterSession::CompleteMessage( RHvsMsg*& aMessage,
       
   557                                             TInt aErr )
       
   558     {
       
   559     TInt count = iMessages.Count();
       
   560     for( TInt i=0; i<count; ++i )
       
   561         {
       
   562         if( aMessage == iMessages[i] )
       
   563             {
       
   564             // Ensures we complete the correct message!
       
   565             iMessages[i]->Message().Complete( aErr );
       
   566             delete iMessages[i];
       
   567             iMessages.Remove(i);
       
   568             break;
       
   569             }
       
   570         }
       
   571     }
       
   572 
       
   573 // ----------------------------------------------------------------------------
       
   574 // Reads a descriptor from the message, allocated into iDes
       
   575 // ----------------------------------------------------------------------------
       
   576 //
       
   577 const TDesC& CMPXHarvesterSession::ReadDesL(const RMessage2& aMessage,
       
   578                                              TInt aMsgSlot)
       
   579     {
       
   580     TInt s=aMessage.GetDesLengthL(aMsgSlot);
       
   581     delete iDes;
       
   582     iDes=NULL;
       
   583     iDes=HBufC::NewL(s);
       
   584     TPtr p=iDes->Des();
       
   585     aMessage.ReadL(aMsgSlot,p);
       
   586     return *iDes;
       
   587     }
       
   588 
       
   589 // END OF FILE
       
   590