presencecache/presencecachesymbian/presencecacheclient2/src/presencecacheclient.cpp
branchRCL_3
changeset 19 5b6f26637ad3
equal deleted inserted replaced
18:d4f567ce2e7c 19:5b6f26637ad3
       
     1 /*
       
     2 * Copyright (c) 2008 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:  Implementation for presence cache client.
       
    15 *
       
    16 */
       
    17 
       
    18 #include <e32std.h>
       
    19 #include <s32buf.h>
       
    20 
       
    21 #include <mpresencebuddyinfo2.h>
       
    22 #include <presencecachewritehandler2.h>
       
    23 #include <presencecachereadhandler2.h>
       
    24 
       
    25 #include "presenceobjecthelpers.h"
       
    26 #include "presencecachedefs2.h"
       
    27 #include "cacheobjecthelpers.h"
       
    28 #include "presencecacheclientnotification.h"
       
    29 #include "presencecacheclient.h"
       
    30 
       
    31 //Include Cache server namespace
       
    32 using namespace NCacheSrv2;
       
    33 
       
    34 
       
    35 // ============================ MEMBER FUNCTIONS =============================
       
    36 
       
    37 
       
    38 // ---------------------------------------------------------------------------
       
    39 // CPresenceCacheClient::NewL()
       
    40 // ---------------------------------------------------------------------------
       
    41 //
       
    42 EXPORT_C CPresenceCacheClient* CPresenceCacheClient::NewL()
       
    43     {
       
    44     CPresenceCacheClient* self = new( ELeave ) CPresenceCacheClient();
       
    45     CleanupStack::PushL( self );
       
    46     self->ConstructL();
       
    47     CleanupStack::Pop();
       
    48     return self;    
       
    49     }
       
    50 
       
    51 // ---------------------------------------------------------------------------
       
    52 // CPresenceCacheClient::CreateReaderL()
       
    53 // ---------------------------------------------------------------------------
       
    54 //
       
    55 EXPORT_C MPresenceCacheReader2* MPresenceCacheReader2::CreateReaderL()
       
    56     {
       
    57     return CPresenceCacheClient::NewL();
       
    58     }
       
    59     
       
    60 // ---------------------------------------------------------------------------
       
    61 // CPresenceCacheClient::CreateWriterL()
       
    62 // ---------------------------------------------------------------------------
       
    63 //
       
    64 EXPORT_C MPresenceCacheWriter2* MPresenceCacheWriter2::CreateWriterL()
       
    65     {
       
    66     return CPresenceCacheClient::NewL();
       
    67     }
       
    68     
       
    69 // ---------------------------------------------------------------------------
       
    70 // CPresenceCacheClient::~CPresenceCacheClient()
       
    71 // ---------------------------------------------------------------------------
       
    72 //
       
    73 CPresenceCacheClient::~CPresenceCacheClient()
       
    74     {
       
    75     delete iPresInfoPack;
       
    76     delete iPresInfoPack16;    
       
    77     delete iNotifyHandler;    
       
    78     Cancel();
       
    79     RSessionBase::Close();
       
    80     }
       
    81     
       
    82 // ---------------------------------------------------------------------------
       
    83 // CPresenceCacheClient::CPresenceCacheClient()
       
    84 // ---------------------------------------------------------------------------
       
    85 //
       
    86 CPresenceCacheClient::CPresenceCacheClient(): CActive( EPriorityStandard ), 
       
    87     iWriteHandler(NULL),
       
    88     iReadHandler(NULL),
       
    89     iAsyncReq(NRequest::ENoRequestMade)
       
    90     {
       
    91         
       
    92     }
       
    93 
       
    94 // ---------------------------------------------------------------------------
       
    95 // CPresenceCacheClient::ConstructL()
       
    96 // ---------------------------------------------------------------------------
       
    97 //
       
    98 void CPresenceCacheClient::ConstructL()
       
    99     {
       
   100     User::LeaveIfError( Connect() );
       
   101     CActiveScheduler::Add( this );  
       
   102     }
       
   103     
       
   104 // -----------------------------------------------------------------------------
       
   105 // CPresenceCacheClient::Connect()
       
   106 // Connects to the server and create a session.
       
   107 // -----------------------------------------------------------------------------
       
   108 //
       
   109 TInt CPresenceCacheClient::Connect()
       
   110     {
       
   111     TInt error = StartServer();
       
   112 
       
   113     if ( KErrNone == error )
       
   114         {
       
   115         error = CreateSession( NName::KSymbianServer,
       
   116                                Version(),
       
   117                                NRequest::KMsgSlotCount );
       
   118         }
       
   119     return error;
       
   120     }
       
   121           
       
   122 // ----------------------------------------------------
       
   123 // CPresenceCacheClient::StartServer
       
   124 //
       
   125 // ----------------------------------------------------
       
   126 //
       
   127 TInt CPresenceCacheClient::StartServer()
       
   128     {
       
   129     TInt result;
       
   130     TRequestStatus status = KRequestPending; 
       
   131 
       
   132     TFindServer findCacheServer( NName::KSymbianServer );
       
   133     TFullName name;
       
   134 
       
   135     result = findCacheServer.Next( name );
       
   136     if ( result == KErrNone )
       
   137         {
       
   138         // Server already running
       
   139         return KErrNone;
       
   140         }
       
   141 
       
   142     RProcess server;
       
   143     result = server.Create( NName::KExecutable, KNullDesC );       
       
   144     if( result != KErrNone )
       
   145         return result;     
       
   146     server.Rendezvous( status );    	
       
   147     status != KRequestPending ? server.Kill( 0 ) : server.Resume();
       
   148     //Wait for start or death 
       
   149     User::WaitForRequest( status );	
       
   150     result = server.ExitType() == EExitPanic ? KErrGeneral : status.Int();
       
   151     server.Close();
       
   152     
       
   153     return result;	    
       
   154     }
       
   155     
       
   156 // -----------------------------------------------------------------------------
       
   157 // CPresenceCacheClient::Version()
       
   158 // Gets the version number.
       
   159 // -----------------------------------------------------------------------------
       
   160 //
       
   161 TVersion CPresenceCacheClient::Version() const
       
   162     {
       
   163     return( TVersion( NVersion::KMajor,
       
   164                       NVersion::KMinor,
       
   165                       NVersion::KBuild ) );
       
   166     }
       
   167  
       
   168 // ---------------------------------------------------------------------------
       
   169 // CPresenceCacheClient::PresenceInfoLC()
       
   170 // ---------------------------------------------------------------------------
       
   171 //    
       
   172 MPresenceBuddyInfo2* CPresenceCacheClient::PresenceInfoLC(const TDesC& aIdentity)
       
   173     {
       
   174     MPresenceBuddyInfo2*  presInfo(NULL);  
       
   175     
       
   176     if ( !ValidateXspId( aIdentity ) )    
       
   177         return presInfo;
       
   178     
       
   179     TInt sizeOfPresInfo(0);
       
   180     TPckgBuf<TInt> sizePckg;
       
   181                 
       
   182     // Package message arguments before sending to the server
       
   183     TIpcArgs args;
       
   184     args.Set(1, &aIdentity);    
       
   185     args.Set(2, &sizePckg);    
       
   186         
       
   187     // We will get either size(+ve) or error code(+ve) after this call
       
   188     TInt err = SendReceive( NRequest::EPrepReadPresenceInfoSync, args );
       
   189     
       
   190     if ( err != KErrNone && err != KErrNotFound )
       
   191         {
       
   192         User::Leave( err );
       
   193         }
       
   194     sizeOfPresInfo = sizePckg();
       
   195         
       
   196     if ( sizeOfPresInfo && (err==KErrNone) ) // If found
       
   197         {
       
   198         presInfo = MPresenceBuddyInfo2::NewLC();    
       
   199         HBufC8* presInfoDes = HBufC8::NewLC(sizeOfPresInfo);                        
       
   200         TPtr8 ptrBuf( presInfoDes->Des() );                        
       
   201                                
       
   202         SendReceive( NRequest::EGetLastPreparedPacket, TIpcArgs(&ptrBuf) );
       
   203         
       
   204         TCacheObjectPacker< MPresenceBuddyInfo2 >::UnPackL( *presInfo, *presInfoDes );
       
   205         CleanupStack::PopAndDestroy(presInfoDes);
       
   206         }
       
   207             
       
   208     return presInfo;
       
   209     }
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // CPresenceCacheClient::BuddyCountInAllServices()
       
   213 // ---------------------------------------------------------------------------
       
   214 //    
       
   215 TInt CPresenceCacheClient::BuddyCountInAllServices()
       
   216     {
       
   217     TInt buddyCount(0);
       
   218     TPckgBuf<TInt> buddyCountPckg;
       
   219                       
       
   220     // Package message arguments before sending to the server
       
   221     TIpcArgs args(&buddyCountPckg);
       
   222         
       
   223     // This call waits for the server to complete the request before
       
   224     // proceeding.
       
   225     TInt err = SendReceive( NRequest::EBuddyCountInAllServices, args );
       
   226     buddyCount = buddyCountPckg();
       
   227     
       
   228     return (err<0) ? err  : buddyCount;
       
   229     }
       
   230     
       
   231 // ---------------------------------------------------------------------------
       
   232 // CPresenceCacheClient::BuddyCountInService()
       
   233 // ---------------------------------------------------------------------------
       
   234 //
       
   235 TInt CPresenceCacheClient::BuddyCountInService(const TDesC& aServiceName)
       
   236     {
       
   237     TInt buddyCount(0);
       
   238     TPckgBuf<TInt> buddyCountPckg;
       
   239     
       
   240     // Package message arguments before sending to the server
       
   241     TIpcArgs args(&buddyCountPckg);
       
   242     args.Set(1, &aServiceName);
       
   243         
       
   244     // This call waits for the server to complete the request before
       
   245     // proceeding.
       
   246     TInt err = SendReceive( NRequest::EBuddyCountInService, args );
       
   247     buddyCount = buddyCountPckg();
       
   248     
       
   249     return (err<0) ? err  : buddyCount;
       
   250     }
       
   251 
       
   252 // ---------------------------------------------------------------------------
       
   253 // CPresenceCacheClient::ServicesCount()
       
   254 // ---------------------------------------------------------------------------
       
   255 //
       
   256 TInt CPresenceCacheClient::ServicesCount()
       
   257     {
       
   258     TInt serviceCount(0);
       
   259     TPckgBuf<TInt> serviceCountPckg;
       
   260     
       
   261     // Package message arguments before sending to the server
       
   262     TIpcArgs args(&serviceCountPckg);
       
   263         
       
   264     // This call waits for the server to complete the request before
       
   265     // proceeding.
       
   266     TInt err = SendReceive( NRequest::EGetServiceCount, args );
       
   267     serviceCount = serviceCountPckg();
       
   268     
       
   269     return (err<0) ? err  : serviceCount;
       
   270     }
       
   271 
       
   272 // ---------------------------------------------------------------------------
       
   273 // CPresenceCacheClient::AllBuddiesPresenceInService()
       
   274 // ---------------------------------------------------------------------------
       
   275 //
       
   276 TInt CPresenceCacheClient::AllBuddiesPresenceInService(
       
   277     const TDesC& aServiceName, 
       
   278     MPresenceCacheReadHandler2* aHandler)
       
   279     {
       
   280     if (IsActive())
       
   281         return KErrNotReady;
       
   282     
       
   283     if (!aHandler || (aServiceName.Length()==NULL) )
       
   284         return KErrArgument;
       
   285     else
       
   286         iReadHandler = aHandler;
       
   287     
       
   288     delete iPresInfoPack16;
       
   289     iPresInfoPack16 = NULL;   
       
   290     TRAPD( err, iPresInfoPack16 = aServiceName.AllocL());
       
   291     if ( err )
       
   292         {
       
   293         return err;
       
   294         }
       
   295     
       
   296     // Package message arguments before sending to the server
       
   297     TIpcArgs args(iPresInfoPack16);    
       
   298         
       
   299     // This call is async
       
   300     SendReceive( NRequest::EPrepReadAllBuddiesPresenceInService, args, iStatus );
       
   301     
       
   302     iAsyncReq = NRequest::EPrepReadAllBuddiesPresenceInService;
       
   303     
       
   304     SetActive(); 
       
   305     
       
   306     return KErrNone;        
       
   307     }
       
   308     
       
   309 // ---------------------------------------------------------------------------
       
   310 // CPresenceCacheClient::SubscribePresenceBuddyChangeL
       
   311 // ---------------------------------------------------------------------------
       
   312 //
       
   313 TInt CPresenceCacheClient::SubscribePresenceBuddyChangeL(
       
   314     const TDesC& aIdentity)
       
   315     {
       
   316     if ( !ValidateXspId(aIdentity ))
       
   317         return KErrArgument;
       
   318 
       
   319     if ( !iNotifyClient )
       
   320     	{
       
   321     	return KErrNotReady;
       
   322     	}
       
   323     
       
   324     if ( !iNotifyHandler )
       
   325     	{
       
   326     	iNotifyHandler = CPresenceCacheClientNotification::NewL( *this );  	    	
       
   327     	}
       
   328     
       
   329     TInt ret = iNotifyHandler->SubscribePresenceBuddyChangeL( aIdentity );
       
   330     return ret; 
       
   331     }  
       
   332     
       
   333 // ---------------------------------------------------------------------------
       
   334 // CPresenceCacheClient::UnSubscribePresenceBuddyChangeL
       
   335 // ---------------------------------------------------------------------------
       
   336 //
       
   337 void CPresenceCacheClient::UnSubscribePresenceBuddyChangeL(
       
   338                         const TDesC& aIdentity)
       
   339     {
       
   340     if (!ValidateXspId( aIdentity ))
       
   341         return;
       
   342     
       
   343     if ( iNotifyHandler )
       
   344     	{
       
   345     	iNotifyHandler->UnsubscribePresenceBuddyChangeL( aIdentity);  	    	
       
   346     	} 
       
   347     }      
       
   348                                            
       
   349 // ---------------------------------------------------------------------------
       
   350 // CPresenceCacheClient::SetObserverForSubscribedNotifications
       
   351 // ---------------------------------------------------------------------------
       
   352 //
       
   353 TInt CPresenceCacheClient::SetObserverForSubscribedNotifications(
       
   354     MPresenceCacheReadHandler2* aHandler)
       
   355     {
       
   356     if ( !aHandler )
       
   357     	{
       
   358     	return KErrArgument;
       
   359     	}
       
   360     iNotifyClient = aHandler;
       
   361     return KErrNone;               
       
   362     }                                          
       
   363                                              
       
   364     
       
   365 // ---------------------------------------------------------------------------
       
   366 // CPresenceCacheClient::HandlePreparedAllBuddiesPresenceL()
       
   367 // ---------------------------------------------------------------------------
       
   368 //
       
   369 void CPresenceCacheClient::HandlePreparedAllBuddiesPresenceL(TInt aError)
       
   370     {
       
   371     TInt status = aError; // size comes in status
       
   372     
       
   373     if (!iReadHandler)
       
   374         {
       
   375         // this is possible in cancel situation        
       
   376         return;
       
   377         }
       
   378         
       
   379     RPointerArray<MPresenceBuddyInfo2> tempArray;
       
   380     CleanupClosePushL( tempArray );
       
   381     
       
   382     if (status>0) // if anything found
       
   383         {   
       
   384         HBufC8* buddyInfosDes = HBufC8::NewLC(status);                        
       
   385         TPtr8 ptrBuf( buddyInfosDes->Des() );                        
       
   386                                
       
   387         status = SendReceive( NRequest::EGetLastAsyncPreparedPacket, TIpcArgs(&ptrBuf) );
       
   388         
       
   389         TRAPD( err, TPresenceArrayPacker::UnPackArrayL( tempArray, ptrBuf ));
       
   390         if ( err )
       
   391             {
       
   392             tempArray.ResetAndDestroy();
       
   393             }
       
   394         CleanupStack::PopAndDestroy(buddyInfosDes);
       
   395         }
       
   396     
       
   397     // Thos takes ownership of the elements in the array
       
   398     iReadHandler->HandlePresenceReadL(status, tempArray);
       
   399     CleanupStack::PopAndDestroy( &tempArray  ); // Close the array       
       
   400     }
       
   401 
       
   402 // ---------------------------------------------------------------------------
       
   403 // CPresenceCacheClient::WritePresenceL()
       
   404 // ---------------------------------------------------------------------------
       
   405 //
       
   406 TInt CPresenceCacheClient::WritePresenceL(
       
   407     const MPresenceBuddyInfo2* aPresenceBuddyInfo)
       
   408     {
       
   409     if (!aPresenceBuddyInfo)
       
   410         return KErrArgument;
       
   411     
       
   412     if (!ValidateXspId( aPresenceBuddyInfo->BuddyId() ))
       
   413         return KErrArgument;
       
   414         
       
   415     HBufC8* presInfoPack = PackBuddyPresenceInfoLC( aPresenceBuddyInfo );
       
   416     
       
   417     // Package message arguments before sending to the server
       
   418     TIpcArgs args(presInfoPack);
       
   419                                                             
       
   420        
       
   421     // This call waits for the server to complete the request before
       
   422     // proceeding.
       
   423     TInt err = SendReceive( NRequest::EWritePresenceInfoSync, args );
       
   424     
       
   425     CleanupStack::PopAndDestroy(presInfoPack);        
       
   426     
       
   427     return err;
       
   428     
       
   429     }
       
   430 
       
   431 // ---------------------------------------------------------------------------
       
   432 // CPresenceCacheClient::DeletePresenceL()
       
   433 // ---------------------------------------------------------------------------
       
   434 //
       
   435 TInt CPresenceCacheClient::DeletePresenceL( const TDesC& aIdentity)
       
   436     {   
       
   437     // Package message arguments before sending to the server
       
   438     TIpcArgs args( &aIdentity );
       
   439        
       
   440     // This call waits for the server to complete the request before
       
   441     // proceeding.
       
   442     TInt err = SendReceive( NRequest::EDeletePresence, args ); 
       
   443     
       
   444     return err;
       
   445     }
       
   446     
       
   447 
       
   448 // ---------------------------------------------------------------------------
       
   449 // CPresenceCacheClient::CancelWrite()
       
   450 // ---------------------------------------------------------------------------
       
   451 //
       
   452 TInt CPresenceCacheClient::CancelWrite()
       
   453     {
       
   454     TInt ret(KErrNotFound);
       
   455     if(IsActive())
       
   456         {
       
   457         Cancel();
       
   458         ret = KErrNone;
       
   459         }
       
   460     return ret;
       
   461     }
       
   462 
       
   463 // ---------------------------------------------------------------------------
       
   464 // CPresenceCacheClient::CancelRead()
       
   465 // ---------------------------------------------------------------------------
       
   466 //
       
   467 TInt CPresenceCacheClient::CancelRead()
       
   468     {
       
   469     TInt ret(KErrNotFound);
       
   470     if(IsActive())
       
   471         {
       
   472         Cancel();
       
   473         ret = KErrNone;
       
   474         }
       
   475     return ret;
       
   476     }
       
   477 
       
   478 // ---------------------------------------------------------------------------
       
   479 // CPresenceCacheClient::DeleteService()
       
   480 // ---------------------------------------------------------------------------
       
   481 //
       
   482 TInt CPresenceCacheClient::DeleteService(const TDesC& aServiceName)
       
   483     {
       
   484     return SendReceive( NRequest::EDeleteService, TIpcArgs(&aServiceName) );
       
   485     }
       
   486     
       
   487 
       
   488 
       
   489 // ---------------------------------------------------------------------------
       
   490 // CPresenceCacheClient::NewBuddyPresenceInfoLC()
       
   491 // ---------------------------------------------------------------------------
       
   492 //  
       
   493 
       
   494 MPresenceBuddyInfo2* CPresenceCacheClient::NewBuddyPresenceInfoLC()
       
   495     {
       
   496     return MPresenceBuddyInfo2::NewLC();
       
   497     }    
       
   498 
       
   499                                                 
       
   500 // ---------------------------------------------------------------------------
       
   501 // CPresenceCacheClient::WritePresenceL()
       
   502 // ---------------------------------------------------------------------------
       
   503 //
       
   504 TInt CPresenceCacheClient::WriteMultiplePresenceL(
       
   505     const RPointerArray<MPresenceBuddyInfo2>& aPresenceBuddyInfos,
       
   506     MPresenceCacheWriteHandler2* aHandler)
       
   507     {
       
   508     if (IsActive())
       
   509         return KErrNotReady;
       
   510         
       
   511     delete iPresInfoPack;
       
   512     iPresInfoPack = NULL;    
       
   513     iPresInfoPack = PackPresenceBuddyListLC(aPresenceBuddyInfos);
       
   514     CleanupStack::Pop(iPresInfoPack); 
       
   515     
       
   516     // Package message arguments before sending to the server
       
   517     TIpcArgs args(iPresInfoPack);
       
   518     args.Set(1,aPresenceBuddyInfos.Count());
       
   519                                                             
       
   520     // This is async call to server.
       
   521     SendReceive( NRequest::EWritePresenceInfoAsync, args, iStatus);
       
   522   
       
   523     iAsyncReq = NRequest::EWritePresenceInfoAsync;    
       
   524     if (aHandler)
       
   525         {
       
   526         iWriteHandler = aHandler;
       
   527         }           
       
   528     SetActive();
       
   529            
       
   530     return KErrNone;
       
   531     }
       
   532     
       
   533 // ---------------------------------------------------------------------------
       
   534 // CPresenceCacheClient::ValidateXspId()
       
   535 // ---------------------------------------------------------------------------
       
   536 //
       
   537 TBool CPresenceCacheClient::ValidateXspId(const TDesC& aXspId)
       
   538     {
       
   539     TBool ret(EFalse);
       
   540     _LIT(KColon, ":");
       
   541     TInt pos = aXspId.Find(KColon);
       
   542     if(pos>0) // if colon found and there is something before colon, i.e. xsp id
       
   543         {
       
   544         ret = ETrue;
       
   545         }
       
   546     return ret;
       
   547     }
       
   548     
       
   549 // ---------------------------------------------------------------------------
       
   550 // CPresenceCacheClient::RunL()
       
   551 // ---------------------------------------------------------------------------
       
   552 //
       
   553 void CPresenceCacheClient::RunL()
       
   554     {
       
   555     
       
   556     TInt origStatus = iStatus.Int();
       
   557     switch (iAsyncReq)
       
   558         {
       
   559         case NRequest::EWritePresenceInfoAsync:
       
   560             if(iWriteHandler) // if client had requested the call back
       
   561                 iWriteHandler->HandlePresenceWriteL(origStatus);
       
   562             iAsyncReq = NRequest::ENoRequestMade;
       
   563             break;
       
   564 
       
   565         case NRequest::EPrepReadAllBuddiesPresenceInService:
       
   566             HandlePreparedAllBuddiesPresenceL(origStatus);
       
   567             iAsyncReq = NRequest::ENoRequestMade;
       
   568             break;
       
   569         
       
   570         case NRequest::ENoRequestMade:
       
   571         default:
       
   572             break;
       
   573         }   
       
   574     }
       
   575 
       
   576 // ---------------------------------------------------------------------------
       
   577 // CPresenceCacheClient::DoCancel()
       
   578 // ---------------------------------------------------------------------------
       
   579 //
       
   580 void CPresenceCacheClient::DoCancel()
       
   581     {
       
   582     iAsyncReq = NRequest::ENoRequestMade;
       
   583     iReadHandler = NULL;
       
   584     iWriteHandler = NULL;
       
   585     SendReceive( NRequest::ECancelAsyncOperation);
       
   586     // in CPresenceCacheClientNotification SendReceive( NRequest::ECancelWaitingForNotification)
       
   587     }
       
   588     
       
   589 // ---------------------------------------------------------------------------
       
   590 // CPresenceCacheClient::PackBuddyPresenceInfoLC()
       
   591 // ---------------------------------------------------------------------------
       
   592 //
       
   593 HBufC8* CPresenceCacheClient::PackBuddyPresenceInfoLC(
       
   594     const MPresenceBuddyInfo2* aBuddyPresInfo)
       
   595     {
       
   596     HBufC8* pack(NULL);
       
   597     
       
   598     if ( aBuddyPresInfo )
       
   599         {        
       
   600         pack = TCacheObjectPacker< const MPresenceBuddyInfo2>::PackL( *aBuddyPresInfo );
       
   601         CleanupStack::PushL( pack );
       
   602         }
       
   603 
       
   604     return pack;
       
   605     }
       
   606 
       
   607 // ---------------------------------------------------------------------------
       
   608 // CPresenceCacheClient::PackPresenceBuddyListLC()
       
   609 // ---------------------------------------------------------------------------
       
   610 //
       
   611 HBufC8* CPresenceCacheClient::PackPresenceBuddyListLC(const RPointerArray<MPresenceBuddyInfo2>& aList)
       
   612     {
       
   613     HBufC8* pack(NULL);    
       
   614     pack = TPresenceArrayPacker::PackArrayL( aList ); 
       
   615     CleanupStack::PushL( pack );        
       
   616     return pack;
       
   617     }
       
   618     
       
   619 // end of file