ximpfw/presence/srcpresencecache/presencecacheclient/presencecacheclient.cpp
changeset 0 e6b17d312c8b
equal deleted inserted replaced
-1:000000000000 0:e6b17d312c8b
       
     1 /*
       
     2 * Copyright (c) 2007 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 <presenceinfofieldcollection.h>
       
    22 #include <presencebuddyinfo.h>
       
    23 #include <ximpidentity.h>
       
    24 #include <prescachewritehandler.h>
       
    25 #include <prescachereadhandler.h>
       
    26 #include <presencebuddyinfolist.h>
       
    27 #include <personpresenceinfo.h>
       
    28 #include <presenceinfofield.h>
       
    29 #include <presenceinfo.h>
       
    30 
       
    31 #include "presencecacheclient.h"
       
    32 #include "presencecachedefs.h"
       
    33 #include "ximpobjecthelpers.h"
       
    34 #include "presenceinfoimp.h"
       
    35 #include "personpresenceinfoimp.h"
       
    36 #include "presenceinfofieldimp.h"
       
    37 #include "ximpidentityimp.h"
       
    38 #include "presencebuddyinfoimp.h"
       
    39 #include "presencebuddyinfolistimp.h"
       
    40 #include "presenceobjectfactoryimp.h"
       
    41 #include "presencecacheclientnotification.h"
       
    42 
       
    43 
       
    44 //Include Cache server namespace
       
    45 using namespace NCacheSrv;
       
    46 
       
    47 
       
    48 // ============================ MEMBER FUNCTIONS =============================
       
    49 
       
    50 // ---------------------------------------------------------------------------
       
    51 // CPresenceCacheClient::NewL()
       
    52 // ---------------------------------------------------------------------------
       
    53 //
       
    54 EXPORT_C CPresenceCacheClient* CPresenceCacheClient::NewL()
       
    55     {
       
    56     CPresenceCacheClient* self = new( ELeave ) CPresenceCacheClient();
       
    57     CleanupStack::PushL( self );
       
    58     self->ConstructL();
       
    59     CleanupStack::Pop();
       
    60     return self;    
       
    61     }
       
    62 
       
    63 // ---------------------------------------------------------------------------
       
    64 // CPresenceCacheClient::CreateReaderL()
       
    65 // ---------------------------------------------------------------------------
       
    66 //
       
    67 EXPORT_C MPresenceCacheReader* CPresenceCacheClient::CreateReaderL()
       
    68     {
       
    69     return NewL();
       
    70     }
       
    71     
       
    72 // ---------------------------------------------------------------------------
       
    73 // CPresenceCacheClient::CreateWriterL()
       
    74 // ---------------------------------------------------------------------------
       
    75 //
       
    76 EXPORT_C MPresenceCacheWriter* CPresenceCacheClient::CreateWriterL()
       
    77     {
       
    78     return NewL();
       
    79     }
       
    80     
       
    81 // ---------------------------------------------------------------------------
       
    82 // CPresenceCacheClient::~CPresenceCacheClient()
       
    83 // ---------------------------------------------------------------------------
       
    84 //
       
    85 CPresenceCacheClient::~CPresenceCacheClient()
       
    86     {
       
    87     delete iNotifyHandler;    
       
    88     Cancel();
       
    89     RSessionBase::Close();
       
    90     delete iPresObjFactory;
       
    91     }
       
    92     
       
    93 // ---------------------------------------------------------------------------
       
    94 // CPresenceCacheClient::CPresenceCacheClient()
       
    95 // ---------------------------------------------------------------------------
       
    96 //
       
    97 CPresenceCacheClient::CPresenceCacheClient(): CActive( EPriorityStandard ), 
       
    98                                             iWriteHandler(NULL),
       
    99                                             iReadHandler(NULL),
       
   100                                             iAsyncReq(NRequest::ENoRequestMade)
       
   101     {
       
   102         
       
   103     }
       
   104 
       
   105 // ---------------------------------------------------------------------------
       
   106 // CPresenceCacheClient::ConstructL()
       
   107 // ---------------------------------------------------------------------------
       
   108 //
       
   109 void CPresenceCacheClient::ConstructL()
       
   110     {
       
   111     Connect();
       
   112     CActiveScheduler::Add( this );
       
   113     iPresObjFactory = CPresenceObjectFactoryImp::NewL();      
       
   114     }
       
   115     
       
   116 // -----------------------------------------------------------------------------
       
   117 // CPresenceCacheClient::Connect()
       
   118 // Connects to the server and create a session.
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 TInt CPresenceCacheClient::Connect()
       
   122     {
       
   123     TInt error = StartServer();
       
   124 
       
   125     if ( KErrNone == error )
       
   126         {
       
   127         error = CreateSession( NName::KSymbianServer,
       
   128                                Version(),
       
   129                                NRequest::KMsgSlotCount );
       
   130         }
       
   131     return error;
       
   132     }
       
   133     
       
   134       
       
   135 // ----------------------------------------------------
       
   136 // CPresenceCacheClient::StartServer
       
   137 //
       
   138 // ----------------------------------------------------
       
   139 //
       
   140 TInt CPresenceCacheClient::StartServer()
       
   141     {
       
   142     TInt result;
       
   143     TRequestStatus status = KRequestPending; 
       
   144 
       
   145     TFindServer findCacheServer( NName::KSymbianServer );
       
   146     TFullName name;
       
   147 
       
   148     result = findCacheServer.Next( name );
       
   149     if ( result == KErrNone )
       
   150         {
       
   151         // Server already running
       
   152         return KErrNone;
       
   153         }
       
   154 
       
   155     RProcess server;
       
   156     result = server.Create( NName::KExecutable, KNullDesC );       
       
   157     if( result != KErrNone )
       
   158         return result;     
       
   159     server.Rendezvous( status );    	
       
   160     status != KRequestPending ? server.Kill( 0 ) : server.Resume();
       
   161     //Wait for start or death 
       
   162     User::WaitForRequest( status );	
       
   163     result = server.ExitType() == EExitPanic ? KErrGeneral : status.Int();
       
   164     server.Close();
       
   165     
       
   166     return result;	    
       
   167     }
       
   168     
       
   169 // -----------------------------------------------------------------------------
       
   170 // CPresenceCacheClient::Version()
       
   171 // Gets the version number.
       
   172 // -----------------------------------------------------------------------------
       
   173 //
       
   174 TVersion CPresenceCacheClient::Version() const
       
   175     {
       
   176     return( TVersion( NVersion::KMajor,
       
   177                       NVersion::KMinor,
       
   178                       NVersion::KBuild ) );
       
   179     }
       
   180  
       
   181 
       
   182 // ---------------------------------------------------------------------------
       
   183 // CPresenceCacheClient::PresenceInfoLC()
       
   184 // ---------------------------------------------------------------------------
       
   185 //    
       
   186 MPresenceInfo* CPresenceCacheClient::PresenceInfoLC(const MXIMPIdentity& aIdentity)
       
   187     {
       
   188     CPresenceInfoImp* presInfo(NULL);
       
   189     
       
   190     if(!ValidateXspId(aIdentity.Identity()))
       
   191         return presInfo;
       
   192     
       
   193     TInt sizeOfPresInfo(0);
       
   194     TPckgBuf<TInt> sizePckg;
       
   195     
       
   196     HBufC8* myIdPack = PackIdentityLC(aIdentity);                
       
   197                       
       
   198     // Package message arguments before sending to the server
       
   199     TIpcArgs args;
       
   200     args.Set(1, myIdPack);
       
   201     args.Set(2, &sizePckg);    
       
   202         
       
   203     // We will get either size(+ve) or error code(+ve) after this call
       
   204     TInt err = SendReceive( NRequest::EPrepReadPresenceInfoSync, args );
       
   205     sizeOfPresInfo = sizePckg();
       
   206     
       
   207     CleanupStack::PopAndDestroy(myIdPack);
       
   208     
       
   209     if(sizeOfPresInfo && (err==KErrNone)) // If found
       
   210         {
       
   211         presInfo = CPresenceInfoImp::NewLC();    
       
   212         HBufC8* presInfoDes = HBufC8::NewLC(sizeOfPresInfo);                        
       
   213         TPtr8 ptrBuf( presInfoDes->Des() );                        
       
   214                                
       
   215         SendReceive( NRequest::EGetLastPreparedPacket, TIpcArgs(&ptrBuf) );
       
   216         
       
   217         TXIMPObjectPacker< CPresenceInfoImp >::UnPackL( *presInfo, *presInfoDes );
       
   218         CleanupStack::PopAndDestroy(presInfoDes);
       
   219         }
       
   220     
       
   221     return presInfo;
       
   222     }
       
   223 
       
   224 // ---------------------------------------------------------------------------
       
   225 // CPresenceCacheClient::BuddyCountInAllServices()
       
   226 // ---------------------------------------------------------------------------
       
   227 //    
       
   228 TInt CPresenceCacheClient::BuddyCountInAllServices()
       
   229     {
       
   230     TInt buddyCount(0);
       
   231     TPckgBuf<TInt> buddyCountPckg;
       
   232                       
       
   233     // Package message arguments before sending to the server
       
   234     TIpcArgs args(&buddyCountPckg);
       
   235         
       
   236     // This call waits for the server to complete the request before
       
   237     // proceeding.
       
   238     TInt err = SendReceive( NRequest::EBuddyCountInAllServices, args );
       
   239     buddyCount = buddyCountPckg();
       
   240     
       
   241     return (err<0) ? err  : buddyCount;
       
   242     }
       
   243     
       
   244 // ---------------------------------------------------------------------------
       
   245 // CPresenceCacheClient::BuddyCountInService()
       
   246 // ---------------------------------------------------------------------------
       
   247 //
       
   248 TInt CPresenceCacheClient::BuddyCountInService(const TDesC& aServiceName)
       
   249     {
       
   250     TInt buddyCount(0);
       
   251     TPckgBuf<TInt> buddyCountPckg;
       
   252     
       
   253     // Package message arguments before sending to the server
       
   254     TIpcArgs args(&buddyCountPckg);
       
   255     args.Set(1, &aServiceName);
       
   256         
       
   257     // This call waits for the server to complete the request before
       
   258     // proceeding.
       
   259     TInt err = SendReceive( NRequest::EBuddyCountInService, args );
       
   260     buddyCount = buddyCountPckg();
       
   261     
       
   262     return (err<0) ? err  : buddyCount;
       
   263     }
       
   264 
       
   265 // ---------------------------------------------------------------------------
       
   266 // CPresenceCacheClient::ServicesCount()
       
   267 // ---------------------------------------------------------------------------
       
   268 //
       
   269 TInt CPresenceCacheClient::ServicesCount()
       
   270     {
       
   271     TInt serviceCount(0);
       
   272     TPckgBuf<TInt> serviceCountPckg;
       
   273     
       
   274     // Package message arguments before sending to the server
       
   275     TIpcArgs args(&serviceCountPckg);
       
   276         
       
   277     // This call waits for the server to complete the request before
       
   278     // proceeding.
       
   279     TInt err = SendReceive( NRequest::EGetServiceCount, args );
       
   280     serviceCount = serviceCountPckg();
       
   281     
       
   282     return (err<0) ? err  : serviceCount;
       
   283     }
       
   284 
       
   285 // ---------------------------------------------------------------------------
       
   286 // CPresenceCacheClient::ServicesLC()
       
   287 // ---------------------------------------------------------------------------
       
   288 //
       
   289 /* Implementation is not updated because no one is using this functionality
       
   290 CDesC16Array* CPresenceCacheClient::ServicesLC()
       
   291     {
       
   292     CDesC16Array* services(NULL); 
       
   293     
       
   294     // This call waits for the server to complete the request before
       
   295     // proceeding.
       
   296     TInt size = SendReceive( NRequest::EPrepGetAllServices);
       
   297     if(size>0)
       
   298     	{
       
   299         HBufC8* servicesDes = HBufC8::NewLC(size);                        
       
   300         TPtr8 ptrBuf( servicesDes->Des() );                        
       
   301                                
       
   302         SendReceive( NRequest::EGetAllServices, TIpcArgs(&ptrBuf) );
       
   303         
       
   304         services =  UnPackServicesLC(*servicesDes);
       
   305         CleanupStack::Pop(services);
       
   306         CleanupStack::PopAndDestroy(servicesDes);
       
   307         CleanupStack::PushL(services);
       
   308     	}
       
   309     return services;
       
   310     }*/                               
       
   311                                                 
       
   312 // ---------------------------------------------------------------------------
       
   313 // CPresenceCacheClient::AllBuddiesPresenceInService()
       
   314 // ---------------------------------------------------------------------------
       
   315 //
       
   316 TInt CPresenceCacheClient::AllBuddiesPresenceInService(const TDesC& aServiceName, 
       
   317                                             MPresCacheReadHandler* aHandler)
       
   318     {
       
   319     if (IsActive())
       
   320         return KErrNotReady;
       
   321     
       
   322     if(!aHandler || (aServiceName.Length()==NULL) )
       
   323         return KErrArgument;
       
   324     else
       
   325         iReadHandler = aHandler;
       
   326     
       
   327     // Package message arguments before sending to the server
       
   328     TIpcArgs args(&aServiceName);
       
   329         
       
   330     // This call is async
       
   331     SendReceive( NRequest::EPrepReadAllBuddiesPresenceInService, args, iStatus );
       
   332     
       
   333     iAsyncReq = NRequest::EPrepReadAllBuddiesPresenceInService;
       
   334     
       
   335     SetActive(); 
       
   336     
       
   337     return KErrNone;
       
   338         
       
   339     }
       
   340     
       
   341 // ---------------------------------------------------------------------------
       
   342 // CPresenceCacheClient::SubscribePresenceBuddyChangeL
       
   343 // ---------------------------------------------------------------------------
       
   344 //
       
   345 TInt CPresenceCacheClient::SubscribePresenceBuddyChangeL(
       
   346                                                 const MXIMPIdentity& aIdentity)
       
   347     {
       
   348     if(!ValidateXspId(aIdentity.Identity()))
       
   349         return KErrArgument;
       
   350 
       
   351     if ( !iNotifyClient )
       
   352     	{
       
   353     	return KErrNotReady;
       
   354     	}
       
   355     
       
   356     if ( !iNotifyHandler )
       
   357     	{
       
   358     	iNotifyHandler = CPresenceCacheClientNotification::NewL( *this );  	    	
       
   359     	}
       
   360     
       
   361     TInt ret = iNotifyHandler->SubscribePresenceBuddyChangeL( aIdentity);
       
   362     return ret; 
       
   363     }  
       
   364     
       
   365 // ---------------------------------------------------------------------------
       
   366 // CPresenceCacheClient::UnSubscribePresenceBuddyChangeL
       
   367 // ---------------------------------------------------------------------------
       
   368 //
       
   369 void CPresenceCacheClient::UnSubscribePresenceBuddyChangeL(
       
   370                         const MXIMPIdentity& aIdentity)
       
   371     {
       
   372     if(!ValidateXspId(aIdentity.Identity()))
       
   373         return;
       
   374     
       
   375     if ( iNotifyHandler )
       
   376     	{
       
   377     	iNotifyHandler->UnsubscribePresenceBuddyChangeL( aIdentity);  	    	
       
   378     	} 
       
   379     }      
       
   380                                            
       
   381 // ---------------------------------------------------------------------------
       
   382 // CPresenceCacheClient::SetObserverForSubscribedNotifications
       
   383 // ---------------------------------------------------------------------------
       
   384 //
       
   385 TInt CPresenceCacheClient::SetObserverForSubscribedNotifications(
       
   386     MPresCacheReadHandler* aHandler)
       
   387     {
       
   388     if ( !aHandler )
       
   389     	{
       
   390     	return KErrArgument;
       
   391     	}
       
   392     iNotifyClient = aHandler;
       
   393     return KErrNone;               
       
   394     }                                          
       
   395                                              
       
   396     
       
   397 // ---------------------------------------------------------------------------
       
   398 // CPresenceCacheClient::HandlePreparedAllBuddiesPresenceL()
       
   399 // ---------------------------------------------------------------------------
       
   400 //
       
   401 void CPresenceCacheClient::HandlePreparedAllBuddiesPresenceL(TInt aError)
       
   402     {
       
   403     TInt status = aError; // size comes in status
       
   404     CPresenceBuddyInfoListImp* buddyInfoList(NULL);
       
   405     if(status>0) // if anything found
       
   406         {
       
   407         buddyInfoList = CPresenceBuddyInfoListImp::NewLC(KNullDesC);    
       
   408         HBufC8* buddyInfosDes = HBufC8::NewLC(status);                        
       
   409         TPtr8 ptrBuf( buddyInfosDes->Des() );                        
       
   410                                
       
   411         status = SendReceive( NRequest::EGetLastAsyncPreparedPacket, TIpcArgs(&ptrBuf) );
       
   412         
       
   413         TXIMPObjectPacker< CPresenceBuddyInfoListImp >::UnPackL( *buddyInfoList, *buddyInfosDes );
       
   414         CleanupStack::PopAndDestroy(buddyInfosDes);
       
   415         CleanupStack::Pop(buddyInfoList); // ownership will transfer to client
       
   416         }
       
   417     
       
   418     if(iReadHandler)
       
   419         iReadHandler->HandlePresenceReadL(status, buddyInfoList);
       
   420     else if(buddyInfoList) // if failed to transfer ownership and created object
       
   421         delete buddyInfoList; 
       
   422     }
       
   423 
       
   424 // ---------------------------------------------------------------------------
       
   425 // CPresenceCacheClient::WritePresenceL()
       
   426 // ---------------------------------------------------------------------------
       
   427 //
       
   428 TInt CPresenceCacheClient::WritePresenceL(
       
   429                                 const MPresenceBuddyInfo* aPresenceBuddyInfo)
       
   430     {
       
   431     if(!aPresenceBuddyInfo)
       
   432         return KErrArgument;
       
   433     
       
   434     if(!ValidateXspId(aPresenceBuddyInfo->BuddyId()->Identity()))
       
   435         return KErrArgument;
       
   436         
       
   437 
       
   438     HBufC8* presInfoPack = PackBuddyPresenceInfoLC(aPresenceBuddyInfo);
       
   439     
       
   440     // Package message arguments before sending to the server
       
   441     TIpcArgs args(presInfoPack);
       
   442                                                             
       
   443        
       
   444     // This call waits for the server to complete the request before
       
   445     // proceeding.
       
   446     TInt err = SendReceive( NRequest::EWritePresenceInfoSync, args );
       
   447     
       
   448     CleanupStack::PopAndDestroy(presInfoPack);    
       
   449     
       
   450     return err;
       
   451     
       
   452     }
       
   453 
       
   454 // ---------------------------------------------------------------------------
       
   455 // CPresenceCacheClient::DeletePresenceL()
       
   456 // ---------------------------------------------------------------------------
       
   457 //
       
   458 TInt CPresenceCacheClient::DeletePresenceL(const MXIMPIdentity& aIdentity)
       
   459     {
       
   460     HBufC8* idPack = PackIdentityLC(aIdentity);
       
   461     
       
   462     // Package message arguments before sending to the server
       
   463     TIpcArgs args(idPack);
       
   464        
       
   465     // This call waits for the server to complete the request before
       
   466     // proceeding.
       
   467     TInt err = SendReceive( NRequest::EDeletePresence, args );
       
   468     
       
   469     CleanupStack::PopAndDestroy(idPack);    
       
   470     
       
   471     return err;
       
   472     }
       
   473     
       
   474 
       
   475 // ---------------------------------------------------------------------------
       
   476 // CPresenceCacheClient::CancelWrite()
       
   477 // ---------------------------------------------------------------------------
       
   478 //
       
   479 TInt CPresenceCacheClient::CancelWrite()
       
   480     {
       
   481     TInt ret(KErrNotFound);
       
   482     if(IsActive())
       
   483         {
       
   484         Cancel();
       
   485         ret = KErrNone;
       
   486         }
       
   487     return ret;
       
   488     }
       
   489 
       
   490 // ---------------------------------------------------------------------------
       
   491 // CPresenceCacheClient::CancelRead()
       
   492 // ---------------------------------------------------------------------------
       
   493 //
       
   494 TInt CPresenceCacheClient::CancelRead()
       
   495     {
       
   496     TInt ret(KErrNotFound);
       
   497     if(IsActive())
       
   498         {
       
   499         Cancel();
       
   500         ret = KErrNone;
       
   501         }
       
   502     return ret;
       
   503     }
       
   504 
       
   505 // ---------------------------------------------------------------------------
       
   506 // CPresenceCacheClient::DeleteService()
       
   507 // ---------------------------------------------------------------------------
       
   508 //
       
   509 TInt CPresenceCacheClient::DeleteService(const TDesC& aServiceName)
       
   510     {
       
   511     return SendReceive( NRequest::EDeleteService, TIpcArgs(&aServiceName) );
       
   512     }
       
   513     
       
   514 // ---------------------------------------------------------------------------
       
   515 // CPresenceCacheClient::PresenceObjectFactory()
       
   516 // ---------------------------------------------------------------------------
       
   517 //
       
   518 MPresenceObjectFactory& CPresenceCacheClient::PresenceObjectFactory() const
       
   519     {
       
   520     return *iPresObjFactory;
       
   521     }
       
   522     
       
   523 // ---------------------------------------------------------------------------
       
   524 // CPresenceCacheClient::NewIdentityLC()
       
   525 // ---------------------------------------------------------------------------
       
   526 //
       
   527 MXIMPIdentity* CPresenceCacheClient::NewIdentityLC()
       
   528     {
       
   529     return CXIMPIdentityImp::NewLC();  
       
   530     }
       
   531 
       
   532 // ---------------------------------------------------------------------------
       
   533 // CPresenceCacheClient::NewPresenceInfoLC()
       
   534 // ---------------------------------------------------------------------------
       
   535 //    
       
   536 MPresenceInfo* CPresenceCacheClient::NewPresenceInfoLC()
       
   537     {
       
   538     return CPresenceInfoImp::NewLC();    
       
   539     }
       
   540 
       
   541 // ---------------------------------------------------------------------------
       
   542 // CPresenceCacheClient::NewBuddyPresenceInfoLC()
       
   543 // ---------------------------------------------------------------------------
       
   544 //    
       
   545 MPresenceBuddyInfo* CPresenceCacheClient::NewBuddyPresenceInfoLC()
       
   546     {
       
   547     return CPresenceBuddyInfoImp::NewLC();
       
   548     }
       
   549 
       
   550 // ---------------------------------------------------------------------------
       
   551 // CPresenceCacheClient::NewPresenceBuddyInfoListLC()
       
   552 // ---------------------------------------------------------------------------
       
   553 //    
       
   554 MPresenceBuddyInfoList* CPresenceCacheClient::NewPresenceBuddyInfoListLC(
       
   555                                                         const TDesC& aServiceName)
       
   556     {
       
   557     return CPresenceBuddyInfoListImp::NewLC(aServiceName);
       
   558     }
       
   559                                                 
       
   560 // ---------------------------------------------------------------------------
       
   561 // CPresenceCacheClient::WritePresenceL()
       
   562 // ---------------------------------------------------------------------------
       
   563 //
       
   564 TInt CPresenceCacheClient::WritePresenceL(
       
   565                             const MPresenceBuddyInfoList* aPresenceBuddyInfos,
       
   566                                             MPresCacheWriteHandler* aHandler)
       
   567     {
       
   568     if (IsActive())
       
   569         return KErrNotReady;
       
   570     if(!aPresenceBuddyInfos)
       
   571         return KErrArgument;
       
   572     
       
   573     HBufC8* presInfoPack = PackPresenceBuddyListLC(aPresenceBuddyInfos);
       
   574     
       
   575     // Package message arguments before sending to the server
       
   576     TIpcArgs args(presInfoPack);
       
   577     args.Set(1,aPresenceBuddyInfos->Count());
       
   578                                                             
       
   579     // This is async call to server.
       
   580     SendReceive( NRequest::EWritePresenceInfoAsync, args, iStatus);
       
   581     
       
   582     iAsyncReq = NRequest::EWritePresenceInfoAsync;
       
   583     
       
   584     if(aHandler)
       
   585         iWriteHandler = aHandler;    
       
   586     
       
   587     CleanupStack::PopAndDestroy(presInfoPack);
       
   588     
       
   589     SetActive(); 
       
   590     
       
   591     return KErrNone;
       
   592     }
       
   593     
       
   594 // ---------------------------------------------------------------------------
       
   595 // CPresenceCacheClient::ValidateXspId()
       
   596 // ---------------------------------------------------------------------------
       
   597 //
       
   598 TBool CPresenceCacheClient::ValidateXspId(const TDesC& aXspId)
       
   599     {
       
   600     TBool ret(EFalse);
       
   601     _LIT(KColon, ":");
       
   602     TInt pos = aXspId.Find(KColon);
       
   603     if(pos>0) // if colon found and there is something before colon, i.e. xsp id
       
   604         {
       
   605         ret = ETrue;
       
   606         }
       
   607     return ret;
       
   608     }
       
   609     
       
   610 // ---------------------------------------------------------------------------
       
   611 // CPresenceCacheClient::RunL()
       
   612 // ---------------------------------------------------------------------------
       
   613 //
       
   614 void CPresenceCacheClient::RunL()
       
   615     {
       
   616     
       
   617     TInt origStatus = iStatus.Int();
       
   618     switch (iAsyncReq)
       
   619         {
       
   620         case NRequest::EWritePresenceInfoAsync:
       
   621             if(iWriteHandler) // if client had requested the call back
       
   622                 iWriteHandler->HandlePresenceWriteL(origStatus);
       
   623             iAsyncReq = NRequest::ENoRequestMade;
       
   624             break;
       
   625 
       
   626         case NRequest::EPrepReadAllBuddiesPresenceInService:
       
   627             HandlePreparedAllBuddiesPresenceL(origStatus);
       
   628             iAsyncReq = NRequest::ENoRequestMade;
       
   629             break;
       
   630         
       
   631         case NRequest::ENoRequestMade:
       
   632         default:
       
   633             break;
       
   634         }   
       
   635     }
       
   636 
       
   637 // ---------------------------------------------------------------------------
       
   638 // CPresenceCacheClient::DoCancel()
       
   639 // ---------------------------------------------------------------------------
       
   640 //
       
   641 void CPresenceCacheClient::DoCancel()
       
   642     {
       
   643     iAsyncReq = NRequest::ENoRequestMade;
       
   644     iReadHandler = NULL;
       
   645     iWriteHandler = NULL;
       
   646     SendReceive( NRequest::ECancelAsyncOperation);
       
   647     SendReceive( NRequest::ECancelWaitingForNotification);
       
   648     }
       
   649     
       
   650 // ---------------------------------------------------------------------------
       
   651 // CPresenceCacheClient::PackBuddyPresenceInfoLC()
       
   652 // ---------------------------------------------------------------------------
       
   653 //
       
   654 HBufC8* CPresenceCacheClient::PackBuddyPresenceInfoLC(
       
   655                                     const MPresenceBuddyInfo* aBuddyPresInfo)
       
   656     {
       
   657     HBufC8* pack(NULL);
       
   658     if(aBuddyPresInfo)
       
   659         {
       
   660         const CPresenceBuddyInfoImp* pifImp = 
       
   661             TXIMPGetImpClassOrPanic< const CPresenceBuddyInfoImp >::From( *aBuddyPresInfo );    
       
   662         
       
   663         pack = TXIMPObjectPacker< const CPresenceBuddyInfoImp>::PackL( *pifImp );
       
   664         CleanupStack::PushL( pack );
       
   665         }
       
   666 
       
   667     return pack;
       
   668     }
       
   669 
       
   670 // ---------------------------------------------------------------------------
       
   671 // CPresenceCacheClient::PackPresenceBuddyListLC()
       
   672 // ---------------------------------------------------------------------------
       
   673 //
       
   674 HBufC8* CPresenceCacheClient::PackPresenceBuddyListLC(const MPresenceBuddyInfoList* aList)
       
   675     {
       
   676     HBufC8* pack(NULL);
       
   677     if(aList)
       
   678         {
       
   679         const CPresenceBuddyInfoListImp* pifImp = 
       
   680             TXIMPGetImpClassOrPanic< const CPresenceBuddyInfoListImp >::From( *aList );    
       
   681         
       
   682         pack = TXIMPObjectPacker< CPresenceBuddyInfoListImp>::PackL(*pifImp);
       
   683         CleanupStack::PushL( pack );
       
   684         }
       
   685     return pack;
       
   686     }
       
   687 
       
   688 // ---------------------------------------------------------------------------
       
   689 // CPresenceCacheClient::PackIdentityLC()
       
   690 // ---------------------------------------------------------------------------
       
   691 //
       
   692 HBufC8* CPresenceCacheClient::PackIdentityLC(const MXIMPIdentity& aIdentity)
       
   693     {
       
   694     HBufC8* pack(NULL);
       
   695     
       
   696     const CXIMPIdentityImp* pifImp = 
       
   697         TXIMPGetImpClassOrPanic< const CXIMPIdentityImp >::From(aIdentity);    
       
   698     
       
   699     pack = TXIMPObjectPacker< CXIMPIdentityImp>::PackL( *pifImp );
       
   700     CleanupStack::PushL( pack );
       
   701 
       
   702     return pack;
       
   703     }
       
   704 
       
   705 // ---------------------------------------------------------------------------
       
   706 // CPresenceCacheClient::UnPackServicesLC()
       
   707 // ---------------------------------------------------------------------------
       
   708 //
       
   709 /*
       
   710 CDesCArray* CPresenceCacheClient::UnPackServicesLC(TDesC8& aServicesBuffer)
       
   711 	{
       
   712     CArrayFixFlat<TUid>* services = new (ELeave) CArrayFixFlat<TUid>(1);
       
   713     CleanupStack::PushL(services);
       
   714     
       
   715     RDesReadStream rs;
       
   716     CleanupClosePushL( rs );
       
   717     rs.Open( aServicesBuffer ); // CSI: 65 #
       
   718 
       
   719     // read the object count
       
   720     TInt objCount( rs.ReadInt32L() );
       
   721     TUid service;
       
   722 
       
   723 	for ( TInt count = 0; count < objCount; count++ )
       
   724         {
       
   725         rs>>service;
       
   726 		services->AppendL(service);
       
   727 		}
       
   728 
       
   729     CleanupStack::PopAndDestroy(); // rs
       
   730     return services;
       
   731 	}*/
       
   732     
       
   733 // end of file