uiservicetab/vimpstengine/src/cvimpstenginepresencesubservice.cpp
changeset 0 5e5d6b214f4f
child 14 9fdee5e1da30
equal deleted inserted replaced
-1:000000000000 0:5e5d6b214f4f
       
     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:  Handles the use of Precense Framework
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 /*#include <ximpclient.h>*/
       
    21 #include <ximpcontext.h>
       
    22 #include <ximpobjectfactory.h>
       
    23 #include <presenceobjectfactory.h>
       
    24 #include <ximpidentity.h> //for MXIMPIdentity
       
    25 #include <presentitygroups.h>
       
    26 #include <presencewatching.h> //for MximpPresenceWatching
       
    27 #include <ximpstatus.h> //Presence info test
       
    28 #include <presentitygroupcontentevent.h>
       
    29 #include <presentitygroupmemberinfo.h>
       
    30 #include <presenceauthorization.h>
       
    31 #include <presentitypresenceevent.h>
       
    32 #include <presencegrantrequestlistevent.h> // Grant request list
       
    33 #include <presencegrantrequestinfo.h>
       
    34 #include <ximpcontextstateevent.h>
       
    35 #include <ximprequestcompleteevent.h>
       
    36 #include <presenceblocklistevent.h>
       
    37 #include <presenceblockinfo.h>
       
    38 
       
    39 
       
    40 #include <presencefeatures.h>
       
    41 #include <presenceinfofilter.h> //info filtter
       
    42 #include <presenceinfofield.h> //MximpPresenceInfoField
       
    43 #include <presenceinfofieldcollection.h> //MximpPresenceInfoFieldCollection
       
    44 #include <presenceinfofieldvaluetext.h> //MximpPresenceInfoFieldValueText
       
    45 #include <presenceinfofieldvalueenum.h>
       
    46 #include <personpresenceinfo.h> // MximpPersonPresenceInfo
       
    47 #include <presencepublishing.h>//MximpPresencePublishing
       
    48 #include <ximperrors.hrh> //ximp errors
       
    49 #include <presenceinfofieldvaluebinary.h>
       
    50 //presence cache headers 
       
    51 #include <presencecachereader2.h> // cache reader
       
    52 
       
    53 
       
    54 #include "cvimpstenginepresencesubservice.h"
       
    55 #include "cvimpststoragemanagerfactory.h"
       
    56 #include "mvimpststoragecontact.h"
       
    57 #include "mvimpststoragecontactlist.h"
       
    58 #include "cvimpstenginerequestmapper.h"
       
    59 #include "cvimpstenginecchhandler.h"
       
    60 #include "mvimpststorageserviceview.h"
       
    61 #include "tvimpstconsts.h"
       
    62 #include "cvimpstengineservicetablefetcher.h"
       
    63 #include "cvimpstenginecchhandler.h"
       
    64 #include "cvimpstenginesessioncntxtobserver.h"
       
    65 #include "vimpstutilsnotemapper.h"
       
    66 #include "vimpstallerrors.h"
       
    67 #include "cvimpstenginerequest.h"
       
    68 #include "cvimpstblockedlistmanager.h"
       
    69 #include "mvimpstengineblockedlistfetcheventobserver.h"
       
    70 
       
    71 #include   <ximpfeatureinfo.h>
       
    72 #include <avabilitytext.h>
       
    73 
       
    74 //Presence Observer
       
    75 #include "mvimpstenginepresencesubserviceeventobserver.h"
       
    76 #include "vimpstdebugtrace.h"
       
    77 #include "vimpstcustomcleanupapi.h" //For customized cleanup function
       
    78 #include "mvimpstengineserviceconnectioneventobserver.h"
       
    79 
       
    80 // CONTANTS
       
    81 const TInt KUriMaxLength = 255; 
       
    82 _LIT( KListNameAllBuddy ,"buddylist" );
       
    83 const TInt KCollationLevel = 1;
       
    84 
       
    85 // Compares alphabetically using MVIMPSTStorageContact::Identification and 
       
    86 // TDesC::CompareC
       
    87 TInt CompareAlphabetically( const TPtrC& aFirst, 
       
    88                             const TPtrC& aSecond )
       
    89     {
       
    90     return aFirst.CompareC( aSecond, KCollationLevel, NULL );
       
    91     }
       
    92 
       
    93 
       
    94 // ================= MEMBER FUNCTIONS =======================
       
    95 
       
    96 // ---------------------------------------------------------------------------
       
    97 // CVIMPSTEnginePresenceSubService::
       
    98 //      CVIMPSTEnginePresenceSubService()
       
    99 // ---------------------------------------------------------------------------
       
   100 //
       
   101 CVIMPSTEnginePresenceSubService::CVIMPSTEnginePresenceSubService( TUint32 aServiceId, 
       
   102         CVIMPSTEngineCchHandler& aCchHandler,
       
   103         CVIMPSTEngineServiceTableFetcher& aTableFetcher,
       
   104         CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver,
       
   105         MVIMPSTEngineServiceConnectionEventObserver& aObserver ) 
       
   106 :iServiceId( aServiceId ),
       
   107 iCchHandler(aCchHandler),
       
   108 iSettingsTableFetcher(aTableFetcher),
       
   109 iXimpEventObserver(aXimpEventObserver),
       
   110     iObserver(aObserver),
       
   111     iChangeStatusSupported ( ETrue ),
       
   112     iChangeStatusMsgSupported( ETrue ),
       
   113     iAvatarSupported( EFalse ),
       
   114     iIsClearingAvatar(EFalse)
       
   115         {
       
   116         TRACE( T_LIT("CVIMPSTEnginePrecenseSubService::CVIMPSTEnginePrecenseSubService start")); 
       
   117         TRACE( T_LIT("CVIMPSTEnginePrecenseSubService::CVIMPSTEnginePrecenseSubService end"));
       
   118         }
       
   119 
       
   120 // ---------------------------------------------------------------------------
       
   121 // CVIMPSTEnginePresenceSubService::ConstructL()
       
   122 // ---------------------------------------------------------------------------
       
   123 //
       
   124 void CVIMPSTEnginePresenceSubService::ConstructL()
       
   125     {
       
   126     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::ConstructL start")); 
       
   127 
       
   128     iCchHandler.RegisterCchObserverL(this,ECCHPresenceSub);
       
   129 
       
   130     TCCHSubserviceState serviceState = ECCHUninitialized;    
       
   131     TInt error = iCchHandler.GetServiceState( 
       
   132             iServiceId, ECCHPresenceSub, serviceState );
       
   133 
       
   134     iServiceState = ResolveServiceStateL(serviceState, error);   
       
   135     //initialize the presence cache.
       
   136     iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL();                                                        
       
   137 
       
   138     iPresenceCacheReader->SetObserverForSubscribedNotifications(this);
       
   139     iServiceName = HBufC::NewL( KVIMPSTUISPSMaxPropertyLength );
       
   140     TPtr serviceNamePtr( iServiceName->Des() );    
       
   141     iSettingsTableFetcher.GetServiceNameL(iServiceId, serviceNamePtr);      
       
   142     iBlockedListMgr = CVIMPSTBlockedListManager::NewL();
       
   143     iBlockListFetchReqPending = EFalse; //req of fetching blocked list has been completed.
       
   144     
       
   145 	iLogoutRequest = EFalse;
       
   146 	iSubscribeToAuthList = EFalse;
       
   147 	iAutoAccept = EFalse;
       
   148     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::ConstructL end")); 
       
   149 
       
   150     }
       
   151 
       
   152 // ---------------------------------------------------------------------------
       
   153 // CVIMPSTEnginePresenceSubService::NewL()
       
   154 // ---------------------------------------------------------------------------
       
   155 //
       
   156 CVIMPSTEnginePresenceSubService* 
       
   157 CVIMPSTEnginePresenceSubService::NewL( TUint32 aServiceId, 
       
   158         CVIMPSTEngineCchHandler& aCchHandler,
       
   159         CVIMPSTEngineServiceTableFetcher& aTableFetcher,
       
   160         CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver,
       
   161         MVIMPSTEngineServiceConnectionEventObserver& aObserver )
       
   162     {
       
   163     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewL start")); 
       
   164     CVIMPSTEnginePresenceSubService* self = NewLC( aServiceId,aCchHandler, aTableFetcher, 
       
   165             aXimpEventObserver,aObserver );
       
   166     CleanupStack::Pop(self);
       
   167     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewL end"));
       
   168     return self;
       
   169     }
       
   170 
       
   171 // ---------------------------------------------------------------------------
       
   172 // CVIMPSTEnginePresenceSubService::NewLC()
       
   173 // ---------------------------------------------------------------------------
       
   174 //
       
   175 CVIMPSTEnginePresenceSubService* 
       
   176 CVIMPSTEnginePresenceSubService::NewLC( TUint32 aServiceId, 
       
   177         CVIMPSTEngineCchHandler& aCchHandler,
       
   178         CVIMPSTEngineServiceTableFetcher& aTableFetcher,
       
   179         CVIMPSTEngineSessionCntxtObserver& aXimpEventObserver,
       
   180         MVIMPSTEngineServiceConnectionEventObserver& aObserver )
       
   181     {
       
   182     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewLC start")); 
       
   183     CVIMPSTEnginePresenceSubService* self =
       
   184     new (ELeave) CVIMPSTEnginePresenceSubService( aServiceId,aCchHandler, aTableFetcher,  aXimpEventObserver,aObserver);
       
   185     CleanupStack::PushL(self);
       
   186     self->ConstructL();
       
   187     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewLC end")); 
       
   188     return self;
       
   189     }
       
   190 
       
   191 // ---------------------------------------------------------------------------
       
   192 // CVIMPSTEnginePresenceSubService::
       
   193 //      ~CVIMPSTEnginePresenceSubService()
       
   194 // ---------------------------------------------------------------------------
       
   195 //
       
   196 CVIMPSTEnginePresenceSubService::~CVIMPSTEnginePresenceSubService()
       
   197     {
       
   198     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewLC start")); 
       
   199 	
       
   200 	iCchHandler.UnRegisterCchObserver(ECCHPresenceSub);
       
   201     
       
   202     delete iServiceName;
       
   203     delete iPresenceCacheReader ; 
       
   204     
       
   205     delete iBlockedListMgr;
       
   206     iBlockedListMgr = NULL;
       
   207        
       
   208     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::NewLC end")); 
       
   209     }
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // CVIMPSTEnginePresenceSubService::
       
   213 //      ServiceState()
       
   214 // ---------------------------------------------------------------------------
       
   215 //
       
   216 
       
   217 TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEnginePresenceSubService::SubServiceState() const
       
   218 	{
       
   219 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService::ServiceState start")); 
       
   220 	return iServiceState;
       
   221 	}
       
   222 
       
   223 // ---------------------------------------------------------------------------
       
   224 // CVIMPSTEnginePresenceSubService::
       
   225 //      Type()
       
   226 // ---------------------------------------------------------------------------
       
   227 //
       
   228 TVIMPSTEnums::SubServiceType CVIMPSTEnginePresenceSubService::Type() const
       
   229 	{
       
   230 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService::Type") ); 
       
   231 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService: [0x%x]"), this );		    	
       
   232 	return TVIMPSTEnums::EPresence;
       
   233 	}
       
   234 
       
   235 // ---------------------------------------------------------------------------
       
   236 // CVIMPSTEnginePresenceSubService::
       
   237 //      Enabled()
       
   238 // ---------------------------------------------------------------------------
       
   239 //
       
   240 
       
   241 TBool CVIMPSTEnginePresenceSubService::Enabled()
       
   242     {
       
   243     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::Enabled start")); 
       
   244     TBool ret = EFalse;
       
   245     if( TVIMPSTEnums::ESVCERegistered == iServiceState)
       
   246         {
       
   247         ret = ETrue;
       
   248         }
       
   249     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::Enabled end")); 
       
   250     return ret;    
       
   251     }
       
   252 
       
   253 // ---------------------------------------------------------------------------
       
   254 // CVIMPSTEnginePresenceSubService::RetrieveSubscribedListL
       
   255 // ---------------------------------------------------------------------------
       
   256 //
       
   257 void CVIMPSTEnginePresenceSubService::RetrieveSubscribedListL()
       
   258     {
       
   259     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RetrieveSubscribedListL start")); 
       
   260 
       
   261     //Create group id
       
   262     TBuf<KUriMaxLength> buffer( KListNameAllBuddy );
       
   263     MXIMPIdentity* groupList = iXimpEventObserver.XimpPresenceContextL().ObjectFactory().NewIdentityLC();
       
   264      __ASSERT_ALWAYS( groupList , User::Leave( KErrNoMemory ) );		
       
   265     groupList->SetIdentityL( buffer );
       
   266     iIsFetchingContact = ETrue;
       
   267     //Subscribe buddy list
       
   268     // do get subscribe list"));
       
   269     TXIMPRequestId operationId = TXIMPRequestId::Null();
       
   270     operationId = iXimpEventObserver.XimpPresentityGroupsL().SubscribePresentityGroupContentL( 
       
   271             *groupList );
       
   272     CVIMPSTEngineRequestMapper* requestMapper =iXimpEventObserver.GetRequestMapper();
       
   273     requestMapper->CreateRequestL(operationId,EFalse,EVIMPSTXimpOperationGetSubscribedList);
       
   274     CleanupStack::PopAndDestroy(); // groupList
       
   275     // list retrieving ok. Waiting for list.;
       
   276     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RetrieveSubscribedListL end")); 
       
   277     }
       
   278 
       
   279 // ---------------------------------------------------------------------------
       
   280 // CVIMPSTEnginePresenceSubService::SubscribePresenceOfSingleContactL
       
   281 // ---------------------------------------------------------------------------
       
   282 //
       
   283 void CVIMPSTEnginePresenceSubService::SubscribePresenceOfSingleContactL( const TDesC& aUriOfTheContact)
       
   284     {
       
   285     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SubscribePrecenseOfSingleContactL start"));
       
   286      __ASSERT_ALWAYS( aUriOfTheContact.Length(), User::Leave( KErrArgument ) );		
       
   287      //if anything is there with colon eg sip:user@presence1. strip the part before :
       
   288     TInt len = aUriOfTheContact.Find(_L(":"));
       
   289     TPtrC buddyId = aUriOfTheContact.Right( aUriOfTheContact.Length() - len - KColon().Length());
       
   290     HBufC* name = HBufC::NewLC( KPropertyMaxLength );
       
   291     TPtr namePtr( name->Des() );
       
   292     namePtr.Zero();
       
   293 
       
   294     // append the service name followed by user id ,seperated by colon
       
   295     namePtr.Append(*iServiceName);
       
   296     namePtr.Append(KColon);
       
   297     namePtr.Append(buddyId);
       
   298     
       
   299     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SubscribeToPresenceCacheL: %S"), &namePtr );
       
   300     iPresenceCacheReader->SubscribePresenceBuddyChangeL(*name);
       
   301     CleanupStack::PopAndDestroy(name); //  name    
       
   302     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SubscribePrecenseOfSingleContactL end"));  
       
   303     }
       
   304 
       
   305 // ---------------------------------------------------------------------------
       
   306 // CVIMPSTEnginePresenceSubService::
       
   307 //      UnsubscribePrecenseOfSingleContactL
       
   308 // ---------------------------------------------------------------------------
       
   309 //
       
   310 void CVIMPSTEnginePresenceSubService::UnSubscribePresenceOfSingleContactL(
       
   311         const TDesC& aUriOfTheContact )
       
   312     {
       
   313     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribePrecenseOfSingleContactL start"));   
       
   314     HBufC* name = HBufC::NewLC( KPropertyMaxLength );
       
   315     TPtr namePtr( name->Des() );
       
   316     namePtr.Zero();
       
   317     // append the service name followed by user id ,seperated by colon
       
   318     namePtr.Append(*iServiceName);
       
   319     namePtr.Append(KColon);
       
   320     namePtr.Append(aUriOfTheContact);
       
   321     
       
   322     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnSubscribeToPresenceCacheL: %S"), &namePtr);
       
   323     iPresenceCacheReader->UnSubscribePresenceBuddyChangeL(*name);
       
   324     CleanupStack::PopAndDestroy(name); //  name                  
       
   325     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribePrecenseOfSingleContactL end")) ;   
       
   326     }
       
   327 
       
   328 // ---------------------------------------------------------------------------
       
   329 // CVIMPSTEnginePresenceSubService::
       
   330 //      DoHandlePresentityGroupContentEventL
       
   331 // ---------------------------------------------------------------------------
       
   332 //
       
   333 void CVIMPSTEnginePresenceSubService::
       
   334 DoHandlePresentityGroupContentEventL(
       
   335         const MXIMPContext& /*aContext*/,
       
   336         const MXIMPBase& aEvent )
       
   337     {
       
   338     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresentityGroupContentEventL start"));
       
   339 	  	      
       
   340     const MPresentityGroupContentEvent& event =
       
   341     	*TXIMPGetInterface< const MPresentityGroupContentEvent >::From( 
       
   342             aEvent,
       
   343             MXIMPBase::EPanicIfUnknown );
       
   344     //this needs to be checked if server contacts is supported only then update to 
       
   345     //store else don't.
       
   346 	TInt supportedFeatures = iXimpEventObserver.GetSupportedFeatures();
       
   347   	if(EVIMPSTFeatureFetch & supportedFeatures)
       
   348 		{   
       
   349 	    TRACE( T_LIT(" -> storing into respective service store" ));
       
   350 	    StoreToVirtualStoreL( event );
       
   351 		}
       
   352 	//this is to ensure the presence for the local sotre contacts is not lost.
       
   353 	TRACE( T_LIT(" -> new member count: %d" ), event.NewMembersCount() );    
       
   354     TRACE( T_LIT(" -> current member count: %d" ), event.CurrentMembersCount() );    
       
   355     TRACE( T_LIT(" -> disappeared member count: %d" ), event.DisappearedMembersCount() );    
       
   356     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresentityGroupContentEventL end"));
       
   357     }
       
   358 
       
   359 // ---------------------------------------------------------------------------
       
   360 // CVIMPSTEnginePresenceSubService::
       
   361 //      DoHandlePresenceGrantRequestListEventL
       
   362 // ---------------------------------------------------------------------------
       
   363 //
       
   364 void CVIMPSTEnginePresenceSubService::
       
   365 DoHandlePresenceGrantRequestListEventL(
       
   366         const MXIMPContext& /*aContext*/,
       
   367         const MXIMPBase& aEvent )
       
   368     {
       
   369     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceGrantRequestListEventL start"));
       
   370     TVIMPSTEnums::TVIMPSTPresenceRequestStatus autoAccept = iSettingsTableFetcher.PresenceRequestStatusL(iServiceId);
       
   371     if(autoAccept == TVIMPSTEnums::ESVCEPresenceRequestStatusAutoAccept)
       
   372         {
       
   373         iAutoAccept = ETrue;
       
   374         }
       
   375     else
       
   376         {
       
   377         iAutoAccept = EFalse;
       
   378         }
       
   379     
       
   380      const MPresenceGrantRequestListEvent& event = 
       
   381      							*TXIMPGetInterface<const MPresenceGrantRequestListEvent >::From( 
       
   382 								aEvent, MXIMPBase::EPanicIfUnknown );
       
   383 
       
   384     TRACE( T_LIT(" -> new watcher count: %d" ), event.NewRequestsCount() );    
       
   385     TRACE( T_LIT(" -> current watcher count: %d" ), event.CurrentRequestsCount() );    
       
   386     HBufC* identbuf(NULL);
       
   387     HBufC* displayName(NULL);
       
   388     TInt newcount     = event.NewRequestsCount();
       
   389     TInt currentcount = event.CurrentRequestsCount();
       
   390     if(newcount)
       
   391         {
       
   392         TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceGrantRequestListEventL newcount =%d" ), newcount );    
       
   393         TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceGrantRequestListEventL iServiceState =%d" ), iServiceState );    
       
   394 
       
   395         for(TInt i=0; i<newcount; i++)
       
   396             {
       
   397             const MPresenceGrantRequestInfo& reqInfo = event.NewRequest ( i );// its always a new request
       
   398             identbuf = reqInfo.RequestorId().Identity().AllocLC();
       
   399             displayName = reqInfo.RequestorDisplayName().AllocLC();
       
   400             TPtr identbufPtr = identbuf->Des();
       
   401             TRACE( T_LIT(" -> identity: %S" ), &identbufPtr );   
       
   402             if(identbuf->Length())
       
   403                 {
       
   404                 TRACE( T_LIT(" -> pass to command process" ));   
       
   405                 if( iAutoAccept &&
       
   406                         TVIMPSTEnums::ESVCERegistered == iServiceState)
       
   407                     {
       
   408                     TInt error = SendPresenceGrantPresentityL( identbufPtr, ETrue );                    
       
   409                     }
       
   410                  else if( iSubServiceObserver )
       
   411                     {
       
   412                     TRACE( T_LIT(" -> informed observer." )); 
       
   413                     iSubServiceObserver->HandleAddRequestEventL( TVIMPSTEnums::EAddItem , *identbuf, *displayName);
       
   414                     }                    
       
   415                 TRACE( T_LIT(" -> pass to command process" )); 
       
   416                 }
       
   417             CleanupStack::PopAndDestroy( displayName );
       
   418             CleanupStack::PopAndDestroy( identbuf );
       
   419             }
       
   420         }
       
   421     else if(currentcount)
       
   422         {
       
   423         const MPresenceGrantRequestInfo& reqInfo = event.CurrentRequest(0 );// its always a new request
       
   424         identbuf = reqInfo.RequestorId().Identity().AllocLC();
       
   425         displayName  = reqInfo.RequestorDisplayName().AllocLC();
       
   426         TPtr identbufPtr = identbuf->Des();
       
   427         TRACE( T_LIT(" -> identity: %S" ), &identbufPtr );   
       
   428         if(identbuf->Length())
       
   429             {
       
   430             TRACE( T_LIT(" -> pass to command process" ));   
       
   431             if( iAutoAccept)
       
   432                 {
       
   433                 TInt error = SendPresenceGrantPresentityL( identbufPtr, ETrue );                    
       
   434                 }
       
   435              else if( iSubServiceObserver )
       
   436                 {
       
   437                 TRACE( T_LIT(" -> informed observer." )); 
       
   438                 iSubServiceObserver->HandleAddRequestEventL(TVIMPSTEnums::EAddItem ,*identbuf, *displayName);
       
   439                 }      
       
   440             TRACE( T_LIT(" -> pass to command process" )); 
       
   441             }
       
   442         CleanupStack::PopAndDestroy( displayName );
       
   443         CleanupStack::PopAndDestroy ( identbuf );
       
   444         }    
       
   445     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceGrantRequestListEventL end"));
       
   446 
       
   447     }
       
   448 
       
   449 // ---------------------------------------------------------------------------
       
   450 // CVIMPSTEnginePresenceSubService::ResolveServiceStateL
       
   451 // ---------------------------------------------------------------------------
       
   452 // 
       
   453 TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEnginePresenceSubService::ResolveServiceStateL(
       
   454         TCCHSubserviceState aState, 
       
   455         TInt aServiceError )
       
   456     {
       
   457 
       
   458     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::ResolveServiceStateL start"));    
       
   459 
       
   460     TVIMPSTEnums::TVIMPSTRegistrationState state = TVIMPSTEnums::ESVCENotRegistered;       
       
   461 
       
   462     TRACE( T_LIT("ResolveServiceStateL() iServiceId: %d, ServiceState: %d"), 
       
   463             iServiceId, aState );       
       
   464 
       
   465     TBool handleServiceStates = ETrue;
       
   466     if ( aServiceError && ECCHDisabled != aState )
       
   467         {    
       
   468         //Only if the Service supports ALR, the state can goto WaitingForNetwork
       
   469         //Still API from CCH is required to know whether ALR is supported or not
       
   470         //Not sure whether the below is right - have mailed to Markus for MoreInfo on this state
       
   471         if ( (KCCHErrorInvalidSettings != aServiceError) && (ECCHConnecting == aState) )        
       
   472             {   
       
   473             TRACE( T_LIT("ResolveServiceStateL() ESVCEWaitingForNetwork") );
       
   474             handleServiceStates = EFalse;  
       
   475             //state = TVIMPSTEnums::ESVCEWaitingForNetwork;
       
   476             state = TVIMPSTEnums::ESVCENotRegistered; 
       
   477             }
       
   478         }
       
   479 
       
   480     if ( handleServiceStates )
       
   481         {        
       
   482         switch ( aState )
       
   483             {
       
   484             case ECCHEnabled:
       
   485                 {
       
   486                 TRACE( T_LIT("ResolveServiceStateL() ESVCERegistered") );
       
   487                 state = TVIMPSTEnums::ESVCEUpdatingContacts;   
       
   488                 break;
       
   489                 }
       
   490             case ECCHDisconnecting:      
       
   491                 {
       
   492                 TRACE( T_LIT("ResolveServiceStateL() ESVCERegistered") );                
       
   493                 state = TVIMPSTEnums::ESVCENetworkDisConnecting;
       
   494                 }
       
   495                 break;
       
   496 
       
   497             case ECCHUninitialized:
       
   498             case ECCHDisabled:  
       
   499                 {
       
   500                 TRACE( T_LIT("ResolveServiceStateL() ESVCENotRegistered") );
       
   501                 state = TVIMPSTEnums::ESVCENotRegistered;                
       
   502                 }
       
   503                 break;
       
   504 
       
   505             case ECCHConnecting:               
       
   506                 {
       
   507                 TRACE( T_LIT("ResolveServiceStateL() ESVCENoNetworkConnecting") );                
       
   508                 state = TVIMPSTEnums::ESVCENetworkConnecting;
       
   509                 }
       
   510                 break;
       
   511 
       
   512             default:
       
   513                 break;
       
   514             }
       
   515         }        
       
   516 
       
   517     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::ResolveServiceStateL end"));
       
   518 
       
   519     return state;  
       
   520 
       
   521     }
       
   522 
       
   523 
       
   524 // ---------------------------------------------------------------------------
       
   525 // CVIMPSTEnginePresenceSubService::CchEventOccuredL
       
   526 // ---------------------------------------------------------------------------
       
   527 //
       
   528 void CVIMPSTEnginePresenceSubService::CchEventOccuredL( 
       
   529         TUint /*aServiceId*/, 
       
   530         TCCHSubserviceState aState, 
       
   531         TInt aServiceError )
       
   532     {
       
   533 
       
   534     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::CchEventOccuredL start"));
       
   535     TRACE( T_LIT("CchEventOccuredL() TCCHSubserviceState : %d, ServiceErr: %d"), 
       
   536             aState, aServiceError );
       
   537 
       
   538     if ( aServiceError && ECCHDisabled != aState )
       
   539         {
       
   540         //we might even end up in waiting for connection state for all
       
   541         //those service which are ALR enabled
       
   542         //So better check here if you get any CCH errors=        
       
   543         iServiceState = ResolveServiceStateL( aState, aServiceError );
       
   544         iObserver.HandleServceConnectionEventL();
       
   545         DoHandleCchErrorL( aServiceError );
       
   546         }
       
   547     else
       
   548         {
       
   549         TVIMPSTEnums::TVIMPSTRegistrationState currentState = 
       
   550         							ResolveServiceStateL( aState, aServiceError );
       
   551         							
       
   552 		if ( TVIMPSTEnums::ESVCERegistered == iServiceState 
       
   553 				&& TVIMPSTEnums::ESVCEUpdatingContacts == currentState )
       
   554 			{
       
   555 			//dont do anything
       
   556 			//updating contacts is a special case
       
   557 			//Once updating contacts, we fetch the groups and once this is done
       
   558 			//we end up changing the state to registered
       
   559 			//but CCH might send the same callback twice	
       
   560 			//to handle this situation we add a check here
       
   561 			//because we might have already moved from Updatin to Registered state
       
   562 			}
       
   563 		else
       
   564 			{
       
   565 			iServiceState = ResolveServiceStateL( aState, aServiceError );    
       
   566 		    iObserver.HandleServceConnectionEventL();			}
       
   567         }   
       
   568 
       
   569     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::CchEventOccuredL end"));
       
   570 
       
   571     }
       
   572 
       
   573 
       
   574 // ---------------------------------------------------------------------------
       
   575 // CVIMPSTEnginePresenceSubService::DoHandleCchErrorL()
       
   576 // ---------------------------------------------------------------------------
       
   577 // 
       
   578 void CVIMPSTEnginePresenceSubService::DoHandleCchErrorL( 
       
   579         TInt aServiceError )
       
   580     {
       
   581 
       
   582     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandleCchErrorL start"));
       
   583     TRACE( T_LIT("DoHandleCchErrorL() ServiceErr: %d"), 
       
   584             aServiceError );
       
   585 
       
   586     if ( aServiceError )
       
   587         {
       
   588         //unsubscribe can only be done, when bind is already done
       
   589         if(TVIMPSTEnums::EVIMPSTBindDone ==iXimpEventObserver.ContextBindStatus())
       
   590             {
       
   591             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandleCchErrorL unscribe and unbind"));
       
   592             TRAP_IGNORE( UnsubscribeListsL() ); 
       
   593             iXimpEventObserver.ServerUnBindL( ETrue );
       
   594             }
       
   595         }
       
   596     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandleCchErrorL end"));
       
   597     }
       
   598 
       
   599 // ---------------------------------------------------------
       
   600 // CVIMPSTEnginePresenceSubService::PublishOwnPresenceL
       
   601 // 
       
   602 // ---------------------------------------------------------    
       
   603 TInt CVIMPSTEnginePresenceSubService::PublishOwnPresenceL(TVIMPSTEnums::TOnlineStatus aStatus, 
       
   604 														  const TDesC& aValue,
       
   605 						         						  const TDesC& aFilename /*= KNullDesC*/, 
       
   606 						         						  const TDesC8& aMimetype /*= KNullDesC8*/,
       
   607 						         						  TBool aIsAvatar /*= EFalse*/ )
       
   608     {
       
   609 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService::PublishOwnPresenceL start"));
       
   610     // Take handles to object factory and publish interface
       
   611     MPresencePublishing& publisher = iXimpEventObserver.XimpPresencePublishingL();
       
   612 
       
   613     //Fill presence doc with presence components and attributes
       
   614     MPresenceInfo* myPresence = iXimpEventObserver.PresenceObjectFactoryL().NewPresenceInfoLC();//1
       
   615     MPersonPresenceInfo *personPresence = iXimpEventObserver.PresenceObjectFactoryL().NewPersonPresenceInfoLC();//2
       
   616     MPresenceInfoFieldCollection& attributeFields = personPresence->Fields();
       
   617 	
       
   618  	MPresenceInfoField* infoField = NULL;
       
   619 	TRACE( T_LIT("PublishOwnPresenceL aIsAvatar: %d"),  aIsAvatar );
       
   620 	// avatar field set || clear
       
   621 	if ( aIsAvatar )
       
   622         {
       
   623         TRACE( T_LIT(" PublishOwnPresenceL adding avatar field"));
       
   624         
       
   625      	infoField = iXimpEventObserver.PresenceObjectFactoryL().NewInfoFieldLC();
       
   626         MPresenceInfoFieldValueBinary* avatarField = iXimpEventObserver.PresenceObjectFactoryL().NewBinaryInfoFieldLC(); 
       
   627         TRACE( T_LIT(" PublishOwnPresenceL processing image data"));
       
   628         CVIMPSTEngineImageHandler* imageHandler = CVIMPSTEngineImageHandler::NewL();
       
   629         CleanupStack::PushL(imageHandler);
       
   630         // get the avatar content from the image processor
       
   631         // returns image content if the  processing succesful 
       
   632         
       
   633         HBufC8* avatarContent = imageHandler->ProcessImageFromFileL( aFilename , aMimetype);
       
   634         TRACE( T_LIT(" PublishOwnPresenceL processing image data completed "));
       
   635         if ( avatarContent )
       
   636 			{
       
   637 			TRACE( T_LIT("PublishOwnPresenceL valid image data found "));
       
   638 			CleanupStack::PushL(avatarContent);
       
   639 			// set a new avatar
       
   640 			avatarField->SetBinaryValueL(*avatarContent);
       
   641  			avatarField->SetMimeTypeL(aMimetype);
       
   642 			CleanupStack::PopAndDestroy(); // avatarContent
       
   643 			}
       
   644 		else
       
   645 			{
       
   646 			TRACE( T_LIT("PublishOwnPresenceL NULL image data found "));
       
   647 			//  clear the avatar 
       
   648 			avatarField->SetBinaryValueL(KNullDesC8);
       
   649 			iIsClearingAvatar = ETrue;  //set iIsClearingAvatar to ETrue
       
   650 			}
       
   651         CleanupStack::PopAndDestroy(imageHandler); // imageHandler
       
   652         
       
   653  	    //Fill presence doc with presence components and attributes
       
   654         infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KAvatar ); 
       
   655         // for clear avatar mimetye is KNUllDesc so set for all the cases
       
   656        	infoField->SetFieldValue( avatarField );  // avatarField ownership transfered
       
   657         CleanupStack::Pop(); // avatarField
       
   658 		attributeFields.AddOrReplaceFieldL(infoField ); // infofield ownership transfered
       
   659         CleanupStack::Pop(); // infoField
       
   660 		infoField = NULL;
       
   661 		TRACE( T_LIT(" PublishOwnPresenceL adding avatar field completed "));
       
   662         }
       
   663 
       
   664     // availabilty field
       
   665     infoField = iXimpEventObserver.PresenceObjectFactoryL().NewInfoFieldLC();//3
       
   666     //based on the state conver it to  ximpfw status.
       
   667     NPresenceInfo::TAvailabilityValues availablity = ConvertPresenceStatus( aStatus );
       
   668     // "availability" attribute
       
   669     MPresenceInfoFieldValueEnum* availabilityField = iXimpEventObserver.PresenceObjectFactoryL().NewEnumInfoFieldLC();//4
       
   670     availabilityField->SetValueL( availablity );
       
   671     infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KAvailabilityEnum ); 
       
   672     infoField->SetFieldValue( availabilityField );
       
   673     CleanupStack::Pop(); // availabilityField
       
   674     attributeFields.AddOrReplaceFieldL(infoField );
       
   675     CleanupStack::Pop(); // infoField
       
   676 
       
   677     //status text field
       
   678     infoField = iXimpEventObserver.PresenceObjectFactoryL().NewInfoFieldLC();//7
       
   679     MPresenceInfoFieldValueText* statustextField = iXimpEventObserver.PresenceObjectFactoryL().NewTextInfoFieldLC();//8
       
   680     //ownership is transfered to statustextField
       
   681     HBufC* statusText = aValue.AllocLC();
       
   682     //ownership is not transferred
       
   683     statustextField->SetTextValueL( *statusText); // some status text
       
   684     CleanupStack::PopAndDestroy();//statusText
       
   685     infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KStatusMessage );
       
   686     infoField->SetFieldValue( statustextField );
       
   687     CleanupStack::Pop(); // statustextField
       
   688     attributeFields.AddOrReplaceFieldL( infoField );
       
   689     CleanupStack::Pop(); // infoField
       
   690 	
       
   691 
       
   692 	myPresence->SetPersonPresenceL(personPresence);
       
   693     CleanupStack::Pop(); // personPresence
       
   694   
       
   695     TXIMPRequestId reqId;
       
   696     reqId = publisher.PublishOwnPresenceL( *myPresence );
       
   697     // wait completion
       
   698     // not own
       
   699     CVIMPSTEngineRequestMapper* mapper = iXimpEventObserver.GetRequestMapper();
       
   700     mapper->CreateRequestL(reqId, ETrue,EVIMPSTXimpOperationPublisOwnPresence);// waite here
       
   701     TInt error = iXimpEventObserver.GetCompletedReqResult(); // get the result error
       
   702     CleanupStack::PopAndDestroy(1); // myPresence
       
   703     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::PublishOwnPresenceL end "));
       
   704     return error;
       
   705     }
       
   706 
       
   707 // ---------------------------------------------------------
       
   708 // CVIMPSTEnginePresenceSubService::UpdateStatusToServerL
       
   709 // 
       
   710 // ---------------------------------------------------------    
       
   711 NPresenceInfo::TAvailabilityValues CVIMPSTEnginePresenceSubService::ConvertPresenceStatus(TVIMPSTEnums::TOnlineStatus aStatus)
       
   712     {
       
   713     NPresenceInfo::TAvailabilityValues availablity;
       
   714     switch(aStatus)
       
   715         {
       
   716         case TVIMPSTEnums::EOffline:
       
   717             {
       
   718             availablity = NPresenceInfo::ENotAvailable;
       
   719             break;
       
   720             }
       
   721         case TVIMPSTEnums::EOnline:
       
   722             {
       
   723             availablity = NPresenceInfo::EAvailable;
       
   724             break;
       
   725             }
       
   726         case TVIMPSTEnums::EInvisible:
       
   727             {
       
   728             availablity = NPresenceInfo::EHidden;
       
   729             break;
       
   730             }
       
   731         case TVIMPSTEnums::EAway:
       
   732             {
       
   733             availablity = NPresenceInfo::EAway;
       
   734             break;
       
   735             }
       
   736         case TVIMPSTEnums::EBusy:
       
   737             {
       
   738             availablity = NPresenceInfo::EBusy;
       
   739             break;
       
   740             }
       
   741         case TVIMPSTEnums::EOnPhone:
       
   742             {
       
   743             availablity = NPresenceInfo::EOnPhone;
       
   744             break;
       
   745             }
       
   746         case TVIMPSTEnums::EDoNotDisturb:
       
   747             {
       
   748             availablity = NPresenceInfo::EDoNotDisturb;
       
   749             break;
       
   750             }
       
   751         default: 
       
   752             {
       
   753             availablity = NPresenceInfo::ENotAvailable;
       
   754             break;
       
   755             }
       
   756         }
       
   757     return availablity;
       
   758     }
       
   759 /// ---------------------------------------------------------
       
   760 // CVIMPSTEnginePresenceSubService::FetchPresenceFromCache
       
   761 // 
       
   762 // ---------------------------------------------------------    
       
   763 TInt  CVIMPSTEnginePresenceSubService::FetchPresenceFromCache()
       
   764     {
       
   765     //TODO::Figure out how to get the service name.
       
   766     // passed the service id to see the member count
       
   767     TInt error( KErrArgument );
       
   768     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceFormCache() start") );
       
   769 	if( iServiceName )
       
   770 		{
       
   771 		TPtr serviceNamePtr = iServiceName->Des();
       
   772 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceFormCache() - %S"), 
       
   773 		        &serviceNamePtr );
       
   774 		// passed the service to register for notification
       
   775 		error = iPresenceCacheReader->AllBuddiesPresenceInService(*iServiceName, this );		
       
   776 		}
       
   777 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceFormCache() end") ); 
       
   778 	return error;
       
   779     }
       
   780 
       
   781 // ---------------------------------------------------------------------------
       
   782 // CVIMPSTEnginePresenceSubService::HandlePresenceReadL
       
   783 // ---------------------------------------------------------------------------
       
   784 //  
       
   785 void CVIMPSTEnginePresenceSubService::HandlePresenceReadL(TInt /*aErrorCode*/,
       
   786         RPointerArray<MPresenceBuddyInfo2>& aPresenceBuddyInfoList)
       
   787     {
       
   788     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL start"));
       
   789     // we have the ownership of  aPresenceBuddyInfoList : Push it to customize cleanupstack
       
   790     // aPresenceBuddyInfoList is collection of owned object and each object need to be deleted
       
   791     CustomCleanupResetAndDestroyPushL(aPresenceBuddyInfoList);
       
   792     MVIMPSTStorageServiceView* storage = 
       
   793     				CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);
       
   794     TInt buddyCount = aPresenceBuddyInfoList.Count();
       
   795     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - count: %d" ), buddyCount );
       
   796     for ( TInt i =0 ; i < buddyCount ; ++i)
       
   797 		{
       
   798 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - buddy index: %d" ), i );
       
   799 		MPresenceBuddyInfo2* buddyinfo = aPresenceBuddyInfoList[i];
       
   800 		// read the buddyID : returns in XSP format
       
   801 		TPtrC buddyXSPId = buddyinfo->BuddyId();
       
   802 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - Status Message: %s" ), &buddyXSPId );
       
   803 		TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
       
   804 		// read the availability /presence state enum value 
       
   805 		MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = buddyinfo->Availability();
       
   806 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - Availability ENUM value: %d" ), availabilityEnum );
       
   807 		TPtrC avablityText = buddyinfo->AvailabilityText();
       
   808 		// convert the presence cache enum value to service tab enum 
       
   809 		TVIMPSTEnums::TOnlineStatus status = ConvertPresenceCacheEnums( availabilityEnum , avablityText);
       
   810 		//  get the GetAnyFiled(which has only pending and blocked states.)
       
   811 		if(TVIMPSTEnums::EUnKnown == status)
       
   812 			{
       
   813 			GetKeyFieldsAndValuesL(*buddyinfo,status);
       
   814 			}
       
   815 		// read the  status message 
       
   816 		TPtrC statusMsg = buddyinfo->StatusMessage();
       
   817 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - Status Message: %s" ), &statusMsg );
       
   818 		TPtrC8 avatarContent = buddyinfo->Avatar();
       
   819 		HBufC8* avatarScaledData = NULL;
       
   820 		if ( avatarContent.Length() )
       
   821 			{
       
   822 			TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - avatarContent Content available" ) );
       
   823 			CVIMPSTEngineImageHandler* imageHandler = CVIMPSTEngineImageHandler::NewL();
       
   824 			CleanupStack::PushL(imageHandler);
       
   825 			TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - imageHandler created " ) );
       
   826 		    avatarScaledData = imageHandler->ProcessImageFromDataL( avatarContent , KNullDesC8() );
       
   827 		    TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL - ProcessImageFromDataL returned " ) );
       
   828 			CleanupStack::PopAndDestroy();//imageHandler
       
   829 			}
       
   830 		if( avatarScaledData && avatarScaledData->Length() )
       
   831 			{
       
   832 			CleanupStack::PushL(avatarScaledData);
       
   833 			storage->UpdatePresenceL(buddyId,status,statusMsg, *avatarScaledData );	
       
   834 			CleanupStack::PopAndDestroy();//avatarScaledData
       
   835 			}
       
   836 		else  
       
   837 			{
       
   838 			storage->UpdatePresenceL(buddyId, status, statusMsg, KNullDesC8 );		
       
   839 			}
       
   840 		}
       
   841     aPresenceBuddyInfoList.ResetAndDestroy();
       
   842  
       
   843     CleanupStack::PopAndDestroy();  //  aPresenceBuddyInfoList
       
   844     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceReadL end"));
       
   845     }
       
   846 
       
   847 // ---------------------------------------------------------------------------
       
   848 // CVIMPSTEnginePresenceSubService::HandlePresenceNotificationL
       
   849 // ---------------------------------------------------------------------------
       
   850 //  
       
   851 void CVIMPSTEnginePresenceSubService::HandlePresenceNotificationL(TInt /*aErrorCode*/,
       
   852         MPresenceBuddyInfo2* aPresenceBuddyInfo)
       
   853     {
       
   854     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceNotificationL start"));    
       
   855        
       
   856     if ( aPresenceBuddyInfo )
       
   857         {
       
   858         CleanupDeletePushL( aPresenceBuddyInfo );
       
   859         DoHandlePresenceNotificationL(*aPresenceBuddyInfo);
       
   860         CleanupStack::PopAndDestroy(1); // aPresenceBuddyInfo
       
   861         
       
   862         }
       
   863     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandlePresenceNotificationL end"));
       
   864     }
       
   865 
       
   866 
       
   867 // ---------------------------------------------------------
       
   868 // CVIMPSTEnginePresenceSubService::SubscribeForAuthorizationL
       
   869 //  
       
   870 // ---------------------------------------------------------    
       
   871 void  CVIMPSTEnginePresenceSubService::SubscribeForAuthorizationL()
       
   872     {
       
   873     TXIMPRequestId req;
       
   874     MPresenceAuthorization& authorization = iXimpEventObserver.XimpAuthorizationL();
       
   875     req = authorization.SubscribePresenceGrantRequestListL();  
       
   876     // mapper is not own
       
   877     CVIMPSTEngineRequestMapper* mapper = iXimpEventObserver.GetRequestMapper(); 
       
   878     mapper->CreateRequestL(req, EFalse,EVIMPSTXimpOperationSubcribeGrantRequestList);
       
   879     
       
   880     iSubscribeToAuthList = ETrue;
       
   881     }
       
   882 // ---------------------------------------------------------
       
   883 // CVIMPSTEnginePresenceSubService::SendPresenceGrantPresentityResponseL
       
   884 //  
       
   885 // ---------------------------------------------------------    
       
   886 TInt CVIMPSTEnginePresenceSubService::SendPresenceGrantPresentityL( const TDesC& aContactId , TBool aResponse )
       
   887     {
       
   888     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SendPresenceGrantPresentityL stat"));  
       
   889     __ASSERT_ALWAYS( aContactId.Length(), User::Leave( KErrArgument ) );
       
   890       
       
   891     // return the response to the server.    
       
   892     MPresenceAuthorization& authorization = iXimpEventObserver.XimpAuthorizationL();
       
   893     // mapper is not own
       
   894     CVIMPSTEngineRequestMapper* mapper = iXimpEventObserver.GetRequestMapper();
       
   895 
       
   896     MXIMPIdentity* contactIdentity = iXimpEventObserver.XimpPresenceContextL().ObjectFactory().NewIdentityLC();
       
   897      __ASSERT_ALWAYS( contactIdentity , User::Leave( KErrNoMemory ) );		
       
   898     contactIdentity->SetIdentityL( aContactId ) ;    
       
   899     TXIMPRequestId req;
       
   900     //accepted the request.
       
   901     if(aResponse)
       
   902         {
       
   903         MPresenceInfoFilter* infoFilt = iXimpEventObserver.PresenceObjectFactoryL().NewPresenceInfoFilterLC();
       
   904         if( infoFilt )
       
   905             {
       
   906             infoFilt->AcceptPersonFilterL( NPresenceInfo::NFieldType::KAcceptAll );
       
   907             req = authorization.GrantPresenceForPresentityL(*contactIdentity ,*infoFilt );
       
   908             CleanupStack::PopAndDestroy(); //infoFilt   	
       
   909             }
       
   910         }
       
   911     else// rejected the request.
       
   912         {        
       
   913         req = authorization.WithdrawPresenceGrantFromPresentityL(*contactIdentity);         
       
   914         }
       
   915     if( iSubServiceObserver && !iAutoAccept )
       
   916         {
       
   917         iSubServiceObserver->HandleAddRequestEventL(TVIMPSTEnums::ERemoveItem ,aContactId, KNullDesC() );
       
   918         }
       
   919     mapper->CreateRequestL(req, !iAutoAccept, EVIMPSTXimpOperationGrantPresenceForPresentity );
       
   920 
       
   921     TInt error = iXimpEventObserver.GetCompletedReqResult(); // get the result error    
       
   922     if( ( ( error == KPREQUESTERRSUCCESSFUL) || ( error == KErrNone )  || iAutoAccept)  )
       
   923         {        
       
   924         MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId) ;
       
   925         if(storage && ( !storage->IsLocalStore() || iAutoAccept  ) && aResponse )
       
   926             {   
       
   927             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SendPresenceGrantPresentityL server store") );
       
   928             storage->CreateNewContactL( aContactId,KNullDesC, ETrue, iAutoAccept ); // ETrue is for invitation item 
       
   929             } 
       
   930         }
       
   931     CleanupStack::PopAndDestroy(); //contactIdentity
       
   932     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::SendPresenceGrantPresentityL end"));
       
   933     return error;
       
   934     }  
       
   935 // ---------------------------------------------------------
       
   936 // CVIMPSTEnginePresenceSubService::HandleSessionContextEventL
       
   937 // ---------------------------------------------------------
       
   938 void CVIMPSTEnginePresenceSubService::HandleSessionContextEventL(const MXIMPContext& aContext,
       
   939         const MXIMPBase& aEvent,
       
   940         TXimpOperation aXimpOperation /*= EVIMPSTXimpOperationNoOperation*/ )
       
   941     {
       
   942     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleSessionContextEventL start"));
       
   943     TInt32 eventId = aEvent.GetInterfaceId();
       
   944 
       
   945     switch( aEvent.GetInterfaceId() )
       
   946         {
       
   947         case MXIMPRequestCompleteEvent::KInterfaceId:
       
   948             {
       
   949             TRACE( T_LIT("InsideCallbackswitch::MXIMPRequestCompleteEvent"));
       
   950             //temp fix TBD
       
   951             //Only use the operations that u r intertest in
       
   952             if ( aXimpOperation <= EVIMPSTXimpOperationUnsubscribe )  
       
   953                 {
       
   954 
       
   955                 const MXIMPRequestCompleteEvent* event =
       
   956                 TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( 
       
   957                         aEvent, MXIMPBase::EPanicIfUnknown );
       
   958                 TRAP_IGNORE( HandleXimpRequestCompleteL( 
       
   959                         aXimpOperation,
       
   960                         event->CompletionResult().ResultCode(),
       
   961                         aEvent ) );
       
   962                 }
       
   963             TRACE( T_LIT("InsideCallback::HandlePresenceContextEvent"));    
       
   964 
       
   965             break;
       
   966             }
       
   967         case MXIMPContextStateEvent::KInterfaceId:
       
   968             {
       
   969             TRACE( T_LIT("InsideCallbackswitch::MXIMPContextStateEvent"));
       
   970             TRACE( T_LIT("InsideCallback::MXIMPContextStateEvent"));
       
   971             break;
       
   972             }
       
   973         case MPresentityGroupContentEvent::KInterfaceId:
       
   974             {
       
   975             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresentityGroupContentEvent"));
       
   976             DoHandlePresentityGroupContentEventL( aContext, aEvent );
       
   977             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresentityGroupContentEvent"));
       
   978             break;  
       
   979             }
       
   980         case MPresenceGrantRequestListEvent::KInterfaceId:
       
   981             {
       
   982             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresenceGrantRequestListEvent"));
       
   983             DoHandlePresenceGrantRequestListEventL( aContext, aEvent );
       
   984             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresenceGrantRequestListEvent"));
       
   985             break;
       
   986             }
       
   987         case MPresenceBlockListEvent::KInterfaceId:
       
   988            {
       
   989            TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresenceBlockListEvent"));
       
   990            DoHandlePresenceBlockListEventL( aContext, aEvent );
       
   991            TRACE( T_LIT("CVIMPSTEnginePresenceSubService::MPresenceBlockListEvent"));
       
   992 
       
   993            break;
       
   994            }
       
   995            
       
   996         default:
       
   997             {
       
   998             break;
       
   999             }
       
  1000         }
       
  1001     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleSessionContextEventL end"));   
       
  1002     }    
       
  1003 
       
  1004 // ---------------------------------------------------------------------------
       
  1005 // CVIMPSTEnginePresenceSubService::HandleListEventCompleteL
       
  1006 // ---------------------------------------------------------------------------
       
  1007 //
       
  1008 void CVIMPSTEnginePresenceSubService::HandleListEventCompleteL(TXimpOperation aType,
       
  1009         TInt aCompleteCode,
       
  1010         const MXIMPBase& /*aEvent*/)
       
  1011     { 
       
  1012     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleListEventCompleteL start"));
       
  1013 
       
  1014     switch ( aType )
       
  1015         {
       
  1016         case EVIMPSTXimpOperationBind:
       
  1017             {
       
  1018             if(iLogoutRequest)
       
  1019                 {
       
  1020                 //since logout is requested, no need to Subscribe and Retrieve list
       
  1021                 break;
       
  1022                 }
       
  1023             if ( KErrNone == aCompleteCode )
       
  1024                 {         
       
  1025 			    SubscribeForAuthorizationL();
       
  1026                 // get the list.
       
  1027                 RetrieveSubscribedListL();
       
  1028                 
       
  1029                 }
       
  1030             break;
       
  1031 
       
  1032             }
       
  1033         case EVIMPSTXimpOperationGetSubscribedList:
       
  1034             {
       
  1035             if(iLogoutRequest)
       
  1036                 {
       
  1037                 //Since logout is requested need not to retrive block list
       
  1038                 break;
       
  1039                 }
       
  1040             // check if blocking is supported then get the blocked list and 
       
  1041             // subscribe those to persence cache.
       
  1042             TInt supportedFeatures = iXimpEventObserver.GetSupportedFeatures();
       
  1043             if ( (EVIMPSTFeatureBlock & supportedFeatures) && (EVIMPSTFeatureUnBlock & supportedFeatures) )
       
  1044                {
       
  1045                RetrieveBlockListL();
       
  1046                }
       
  1047             break;
       
  1048             }
       
  1049         case EVIMPSTXimpOperationUnBind:
       
  1050             {
       
  1051             //Logout request completed
       
  1052             iLogoutRequest = EFalse;
       
  1053             break;
       
  1054             }            
       
  1055         default:
       
  1056             break;   
       
  1057         }
       
  1058     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleListEventCompleteL end"));    
       
  1059     }
       
  1060 
       
  1061 // ---------------------------------------------------------------------------
       
  1062 // CVIMPSTEnginePresenceSubService::HandleXimpRequestCompleteL
       
  1063 // ---------------------------------------------------------------------------
       
  1064 //
       
  1065 void CVIMPSTEnginePresenceSubService::HandleXimpRequestCompleteL(TXimpOperation aType,
       
  1066         TInt aCompleteCode,const MXIMPBase& aEvent )
       
  1067     {
       
  1068     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleXimpRequestCompleteL start"));
       
  1069     switch ( aType )
       
  1070         {
       
  1071         case EVIMPSTXimpOperationBind:
       
  1072         case EVIMPSTXimpOperationGetSubscribedList:
       
  1073         case EVIMPSTXimpOperationGetBlockList:
       
  1074             //case TVIMPSTEnums::ESVCEXimpOperationGetWatcherList:
       
  1075         case EVIMPSTXimpOperationUnBind:        
       
  1076             {
       
  1077             HandleListEventCompleteL( aType, aCompleteCode,aEvent );
       
  1078             break;
       
  1079             }
       
  1080         case EVIMPSTXimpOperationWithdrawPresenceGrant:
       
  1081             {
       
  1082             break;
       
  1083             }
       
  1084         case EVIMPSTXimpOperationBlockPresenceForPresentity:
       
  1085         case EVIMPSTXimpOperationCancelPresenceBlockFromPresentity:
       
  1086         default:
       
  1087             {
       
  1088             break;
       
  1089             }
       
  1090         }
       
  1091 
       
  1092 
       
  1093     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::HandleXimpRequestCompleteL end"));
       
  1094     }
       
  1095 // -----------------------------------------------------------------------------
       
  1096 // CVIMPSTEnginePresenceSubService::StoreToVirtualStoreL
       
  1097 // -----------------------------------------------------------------------------
       
  1098 //  
       
  1099 void CVIMPSTEnginePresenceSubService::StoreToVirtualStoreL(
       
  1100                             const MPresentityGroupContentEvent& aListEvent )
       
  1101     {
       
  1102     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::StoreToVirtualStoreL start"));
       
  1103     TRACE( T_LIT("CurrentMembersCount count = %d"),aListEvent.CurrentMembersCount() );
       
  1104     TRACE( T_LIT("NewMembersCount count = %d"),aListEvent.NewMembersCount() );
       
  1105     TRACE( T_LIT("UpdatedMembersCount count = %d"),aListEvent.UpdatedMembersCount() );
       
  1106     MVIMPSTStorageServiceView* storage = 
       
  1107     CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId) ;	
       
  1108     TLinearOrder< TPtrC > linearOrder (*CompareAlphabetically );
       
  1109     if (storage)
       
  1110         {		
       
  1111         //currMembrCount will be 0 when you login to the service
       
  1112         if( iIsFetchingContact)  
       
  1113             {
       
  1114             // there are contacts process each
       
  1115             TPtrC listName = aListEvent.GroupId().Identity() ;
       
  1116             RArray <TPtrC> firstNameList;
       
  1117             CleanupClosePushL( firstNameList );
       
  1118             RArray <TPtrC> serviceField;
       
  1119             CleanupClosePushL( serviceField );
       
  1120             
       
  1121             firstNameList.Reset();
       
  1122             serviceField.Reset();
       
  1123             // number of contact in this list
       
  1124            TInt currentMembrcount = aListEvent.CurrentMembersCount();
       
  1125            TRACE( T_LIT("currentMembrcount count = %d"),currentMembrcount );
       
  1126             // Handle first current items
       
  1127             for(TInt j = 0; j < currentMembrcount ;j++ )
       
  1128                 {
       
  1129                 const MPresentityGroupMemberInfo& memberInfo = 
       
  1130                     aListEvent.CurrentMember( j ) ;
       
  1131                 const MXIMPIdentity& memberIdentity = memberInfo.GroupMemberId() ;
       
  1132                 TPtrC userId = memberIdentity.Identity();
       
  1133                 TPtrC displayeName = memberInfo.GroupMemberDisplayName();
       
  1134                 serviceField.AppendL(userId );    
       
  1135                 firstNameList.AppendL(displayeName );
       
  1136                 }
       
  1137 
       
  1138             // number of contact in this list
       
  1139             TInt newMembrcount = aListEvent.NewMembersCount() ;
       
  1140             TRACE( T_LIT("newMembrcount count = %d"),newMembrcount );
       
  1141             for(TInt i = 0; i < newMembrcount ;i++ )
       
  1142                 {
       
  1143                 const MPresentityGroupMemberInfo& memberInfo = 
       
  1144                 aListEvent.NewMember( i ) ;
       
  1145                 const MXIMPIdentity& memberIdentity = memberInfo.GroupMemberId() ;
       
  1146                 TPtrC userId = memberIdentity.Identity();
       
  1147                 TPtrC displayeName = memberInfo.GroupMemberDisplayName();
       
  1148                 TInt error = serviceField.InsertInOrder(userId,linearOrder);
       
  1149                 if(KErrAlreadyExists != error)
       
  1150                     {
       
  1151                     firstNameList.Append(displayeName);
       
  1152                     }
       
  1153                 }
       
  1154             TRACE( T_LIT(" calling CreateNewFetchContactsL") );
       
  1155             TRACE( T_LIT(" serviceField count %d"),serviceField.Count());
       
  1156             TRACE( T_LIT(" firstNameList count %d"),firstNameList.Count());
       
  1157 
       
  1158             // If count in both arrays does not match, storage side can panic
       
  1159             __ASSERT_ALWAYS( firstNameList.Count() == serviceField.Count(), User::Leave( KErrCorrupt));
       
  1160             storage->CreateNewFetchContactsL(firstNameList, serviceField);
       
  1161             iIsFetchingContact = EFalse;
       
  1162             
       
  1163             CleanupStack::PopAndDestroy( &serviceField );
       
  1164             CleanupStack::PopAndDestroy( &firstNameList );
       
  1165             }
       
  1166         //in case of delayed fetch contact and add contact 
       
  1167 	 	else 
       
  1168 			{
       
  1169 			// number of contact in this list
       
  1170 			TInt currentMembrcount = aListEvent.CurrentMembersCount() ;
       
  1171 			for(TInt i = 0; i < currentMembrcount ; i++ )
       
  1172                 {
       
  1173                 const MPresentityGroupMemberInfo& memberInfo = 
       
  1174                                                 aListEvent.CurrentMember( i ) ;
       
  1175                 const MXIMPIdentity& memberIdentity = memberInfo.GroupMemberId() ;
       
  1176                 RDebug::Print( _L("CVIMPSTEnginePresenceSubService: newMember %S"), &memberIdentity.Identity() );   
       
  1177                 if ( !storage->FindContactByUserId( memberIdentity.Identity() ) )
       
  1178                     {
       
  1179                     storage->CreateNewContactL( memberIdentity.Identity(), 
       
  1180                              memberInfo.GroupMemberDisplayName(), ETrue, ETrue );     
       
  1181                     }
       
  1182                 }
       
  1183 		    // number of contact in this list
       
  1184 		    TInt newMembrcount = aListEvent.NewMembersCount() ;
       
  1185 		    // there are contacts process each
       
  1186 		    TPtrC listName = aListEvent.GroupId().Identity() ;
       
  1187 		    for(TInt i = 0; i < newMembrcount ;i++ )
       
  1188 		        {
       
  1189 		        const MPresentityGroupMemberInfo& memberInfo = 
       
  1190 		                                        aListEvent.NewMember( i ) ;
       
  1191 		        const MXIMPIdentity& memberIdentity = memberInfo.GroupMemberId() ;
       
  1192 		        TPtrC userId = memberIdentity.Identity();
       
  1193 		        TPtrC displayeName = memberInfo.GroupMemberDisplayName();
       
  1194 		        TRACE( T_LIT("CVIMPSTEnginePresenceSubService: newMember %S"), &userId );	
       
  1195 		        storage->CreateNewContactL(userId,displayeName,ETrue,ETrue); 	
       
  1196 		        }
       
  1197 		   TInt removedMembrcount = aListEvent.DisappearedMembersCount() ;    
       
  1198 		   for(TInt i = 0; i < removedMembrcount ;i++ )
       
  1199 		        {
       
  1200 		        const MPresentityGroupMemberInfo& memberInfo = 
       
  1201 		                                        aListEvent.DisappearedMember( i ) ;
       
  1202 		        const MXIMPIdentity& memberIdentity = memberInfo.GroupMemberId() ;
       
  1203 		        TPtrC userId = memberIdentity.Identity();
       
  1204 				TRACE( T_LIT("CVIMPSTEnginePresenceSubService: deleteMember %S"), &userId );
       
  1205 		    	MVIMPSTStorageContact* contactExist = storage->FindContactByUserId(userId);
       
  1206 		    	if(contactExist)
       
  1207 		    	    {
       
  1208 		    	    storage->RemoveContactL(contactExist);	
       
  1209 		    	    }
       
  1210 		        }
       
  1211 			}
       
  1212          
       
  1213         }
       
  1214     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::StoreToVirtualStoreL end")); 
       
  1215     }
       
  1216 
       
  1217 // ---------------------------------------------------------
       
  1218 // CVIMPSTEnginePresenceSubService::IsChangeOwnStatusSupported
       
  1219 // 
       
  1220 // ---------------------------------------------------------        
       
  1221 
       
  1222 TBool CVIMPSTEnginePresenceSubService::IsChangeOwnStatusSupported() 
       
  1223     {
       
  1224     //TODO:: get the feature supported from ximp and return
       
  1225     return iChangeStatusSupported;
       
  1226     }
       
  1227 
       
  1228 // ---------------------------------------------------------
       
  1229 // CVIMPSTEnginePresenceSubService::IsStatusMsgSupported
       
  1230 // 
       
  1231 // ---------------------------------------------------------        
       
  1232 TBool CVIMPSTEnginePresenceSubService::IsStatusMsgSupported()
       
  1233     {
       
  1234     //TODO:: get the feature supported from ximp and return
       
  1235     return iChangeStatusMsgSupported;
       
  1236     }
       
  1237 
       
  1238 // ---------------------------------------------------------
       
  1239 // CVIMPSTEnginePresenceSubService::IsAvatarSupported
       
  1240 // 
       
  1241 // ---------------------------------------------------------        
       
  1242 TBool CVIMPSTEnginePresenceSubService::IsAvatarSupported()
       
  1243     {
       
  1244     return iAvatarSupported;
       
  1245     }
       
  1246  
       
  1247  // ---------------------------------------------------------
       
  1248 // CVIMPSTEnginePresenceSubService::SetAvatarSupported
       
  1249 // 
       
  1250 // ---------------------------------------------------------        
       
  1251 void CVIMPSTEnginePresenceSubService::SetAvatarSupported(TBool aSupported )
       
  1252     {
       
  1253     iAvatarSupported = aSupported;
       
  1254     }
       
  1255 // ---------------------------------------------------------------------------
       
  1256 // CVIMPSTEnginePresenceSubService::ConvertXimpToClientPresenceStatus
       
  1257 // ---------------------------------------------------------------------------
       
  1258 //  
       
  1259 TVIMPSTEnums::TOnlineStatus CVIMPSTEnginePresenceSubService::ConvertPresenceCacheEnums(MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum,TPtrC aAvabilityText)
       
  1260     {
       
  1261     // convert the presence cache enums to UI enumvalues
       
  1262     // by default if the enum doesnot match then its  TVIMPSTEnums::UnKnown
       
  1263     TVIMPSTEnums::TOnlineStatus status;
       
  1264     switch( aAvailabilityEnum )
       
  1265         {
       
  1266         case MPresenceBuddyInfo2::EBusy:
       
  1267 			{
       
  1268 			status  = TVIMPSTEnums::EBusy;
       
  1269 			if(0==aAvabilityText.Compare(KAwayState))
       
  1270 			    {
       
  1271 			    status  = TVIMPSTEnums::EAway;
       
  1272 			    }
       
  1273 			if(0==aAvabilityText.Compare(KOnPhoneState))
       
  1274 			    {
       
  1275 			    status  = TVIMPSTEnums::EOnPhone;
       
  1276 			    }
       
  1277 			if(0==aAvabilityText.Compare(KDndState))
       
  1278 			    {
       
  1279 			    status  = TVIMPSTEnums::EDoNotDisturb;
       
  1280 			    }
       
  1281             break;
       
  1282 			}
       
  1283         case MPresenceBuddyInfo2::EAvailable:
       
  1284             {
       
  1285             status  = TVIMPSTEnums::EOnline;
       
  1286             break;
       
  1287             }
       
  1288         case MPresenceBuddyInfo2::ENotAvailable:
       
  1289             {
       
  1290             status  = TVIMPSTEnums::EOffline;
       
  1291             break;
       
  1292             }
       
  1293         case MPresenceBuddyInfo2::EUnknownAvailability:
       
  1294             {
       
  1295             status  = TVIMPSTEnums::EUnknown;
       
  1296 			if(0==aAvabilityText.Compare(KInvisibleState))
       
  1297 			    {
       
  1298 			    status  = TVIMPSTEnums::EInvisible;
       
  1299 			    }
       
  1300 			
       
  1301             break;
       
  1302             }   
       
  1303         default:
       
  1304 	        {
       
  1305             status  = TVIMPSTEnums::EUnknown;
       
  1306             break;
       
  1307 	        }
       
  1308         }
       
  1309     return status;
       
  1310     }
       
  1311 
       
  1312 
       
  1313 // ---------------------------------------------------------
       
  1314 // CVIMPSTEnginePresenceSubService::RegisterPresenceEventObserver
       
  1315 // 
       
  1316 // ---------------------------------------------------------	
       
  1317 //TODO::Should be named as RegisterPresenceEventObserverL
       
  1318 void CVIMPSTEnginePresenceSubService::RegisterPresenceEventObserverL(
       
  1319         MVIMPSTEnginePresenceSubServiceEventObserver* aObserver)
       
  1320     {
       
  1321     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RegisterPresenceEventObserver start"));	
       
  1322     __ASSERT_ALWAYS( aObserver, User::Leave( KErrArgument ));		
       
  1323     iSubServiceObserver = aObserver;
       
  1324     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RegisterPresenceEventObserver end"));
       
  1325     }
       
  1326 
       
  1327 // ---------------------------------------------------------
       
  1328 // CVIMPSTEnginePresenceSubService::UnRegisterPresenceEventObserver
       
  1329 // 
       
  1330 // ---------------------------------------------------------	
       
  1331 
       
  1332 void CVIMPSTEnginePresenceSubService::UnRegisterPresenceEventObserver(
       
  1333         MVIMPSTEnginePresenceSubServiceEventObserver* /*aObserver*/)
       
  1334     {
       
  1335     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnRegisterPresenceEventObserver start"));
       
  1336     iSubServiceObserver = NULL;
       
  1337     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnRegisterPresenceEventObserver end"));
       
  1338     }   
       
  1339 // ---------------------------------------------------------------------------
       
  1340 // CVIMPSTEnginePresenceSubService::RetrieveBlockListL
       
  1341 // ---------------------------------------------------------------------------
       
  1342 //
       
  1343 void CVIMPSTEnginePresenceSubService::RetrieveBlockListL()
       
  1344     {
       
  1345     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RetrieveBlockListL start"));
       
  1346 
       
  1347     //Subscribe block list
       
  1348     // do get block list"));
       
  1349     TXIMPRequestId operationId = TXIMPRequestId::Null();
       
  1350     operationId = iXimpEventObserver.XimpAuthorizationL().SubscribePresenceBlockListL();
       
  1351     CVIMPSTEngineRequestMapper* requestMapper =iXimpEventObserver.GetRequestMapper();
       
  1352     requestMapper->CreateRequestL(operationId,EFalse,EVIMPSTXimpOperationGetBlockList);
       
  1353     // list retrieving ok. Waiting for list.;
       
  1354     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RetrieveBlockListL end")); 
       
  1355     }
       
  1356 // ---------------------------------------------------------------------------
       
  1357 // CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL
       
  1358 // ---------------------------------------------------------------------------
       
  1359 //
       
  1360 void CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL(MPresenceBuddyInfo2& aPresenceBuddyInfo)
       
  1361     {
       
  1362     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL start" ) );
       
  1363     MVIMPSTStorageServiceView* storage = 
       
  1364     						CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);
       
  1365     TPtrC ownUserId = storage->OwnContactL().UserId();
       
  1366     // read the buddyID : returns in XSP format
       
  1367     TPtrC buddyXSPId = aPresenceBuddyInfo.BuddyId();
       
  1368     TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
       
  1369     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL buddyId : %s" ), &buddyId );
       
  1370     // read the availability /presence state enum value 
       
  1371     MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = aPresenceBuddyInfo.Availability();
       
  1372     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - Availability ENUM value: %d" ), availabilityEnum );
       
  1373     TPtrC avablityText = aPresenceBuddyInfo.AvailabilityText();
       
  1374     // convert the presence cache enum value to service tab enum 
       
  1375     TVIMPSTEnums::TOnlineStatus status = ConvertPresenceCacheEnums( availabilityEnum, avablityText);
       
  1376     //TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - status: %d" ), status );
       
  1377     //check if its pending or blocked contact.
       
  1378     if(TVIMPSTEnums::EUnKnown == status)
       
  1379         {
       
  1380         GetKeyFieldsAndValuesL(aPresenceBuddyInfo,status);
       
  1381         //TRACE( T_LIT("DoHandlePresenceNotificationL after GetKeyFieldsAndValuesL- status: %d" ), status );
       
  1382         }
       
  1383     TRACE( T_LIT("DoHandlePresenceNotificationL - status: %d" ), status );
       
  1384     // Read  the  status message 
       
  1385     TPtrC statusMsg = aPresenceBuddyInfo.StatusMessage();
       
  1386     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - Status Message: %s" ), &statusMsg );
       
  1387     TPtrC8 avatarContent = aPresenceBuddyInfo.Avatar();
       
  1388     
       
  1389     ////////////////////////////////////////////////////////////////
       
  1390     HBufC8* avatarScaledData = NULL;
       
  1391 	if ( avatarContent.Length() )
       
  1392 		{
       
  1393 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - avatarContent Content available" ) );
       
  1394 		CVIMPSTEngineImageHandler* imageHandler = CVIMPSTEngineImageHandler::NewL();
       
  1395 		CleanupStack::PushL(imageHandler);
       
  1396 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - imageHandler created " ) );
       
  1397 		avatarScaledData = imageHandler->ProcessImageFromDataL( avatarContent , KNullDesC8() );
       
  1398 		TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL - ProcessImageFromDataL returned " ) );
       
  1399 		CleanupStack::PopAndDestroy();//imageHandler
       
  1400 		}
       
  1401     if( avatarScaledData && avatarScaledData->Length())
       
  1402         {
       
  1403         CleanupStack::PushL(avatarScaledData);
       
  1404         storage->UpdatePresenceL(buddyId,status,statusMsg, *avatarScaledData ); 
       
  1405         CleanupStack::PopAndDestroy();//avatarScaledData
       
  1406         }
       
  1407     else if( iIsClearingAvatar ) //clear own avatar
       
  1408         {
       
  1409         storage->UpdatePresenceL(buddyId, status, statusMsg, KNullDesC8, ETrue );
       
  1410         iIsClearingAvatar = EFalse;  
       
  1411         }
       
  1412     else
       
  1413         {
       
  1414         storage->UpdatePresenceL(buddyId, status, statusMsg, KNullDesC8 );      
       
  1415         }
       
  1416 	TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceNotificationL end" ) );
       
  1417     }
       
  1418 // ---------------	------------------------------------------------------------
       
  1419 // CVIMPSTEnginePresenceSubService::
       
  1420 //      DoHandlePresentityGroupContentEventL
       
  1421 // ---------------------------------------------------------------------------
       
  1422 //
       
  1423 void CVIMPSTEnginePresenceSubService::DoHandlePresenceBlockListEventL(
       
  1424                                                         const MXIMPContext& /*aContext*/,
       
  1425                                                         const MXIMPBase& aEvent )
       
  1426     {
       
  1427     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceBlockListEventL start"));
       
  1428     const MPresenceBlockListEvent& event  =
       
  1429         *TXIMPGetInterface< const MPresenceBlockListEvent >::From( 
       
  1430             aEvent,
       
  1431             MXIMPBase::EPanicIfUnknown );
       
  1432     // if the feature is supported then we need to add this contact into virtual store.
       
  1433     // that logic  needs to be implemented.
       
  1434     // inform ui about the state change from updatingcontacts to registered.
       
  1435     if(TVIMPSTEnums::ESVCEUpdatingContacts == iServiceState )
       
  1436         {
       
  1437         TRACE( T_LIT(" -> CVIMPSTEnginePresenceSubService:state is ESVCEUpdatingContacts" ));  
       
  1438         }
       
  1439         
       
  1440     TRACE( T_LIT(" -> new member count: %d" ), event.NewBlocksCount());    
       
  1441 
       
  1442     TInt subscriptionCount  =  event.NewBlocksCount();
       
  1443 
       
  1444     TRACE( T_LIT(" -> subscriptionCount: %d"), subscriptionCount );
       
  1445 
       
  1446         TRACE( T_LIT(" -> handling buddy list" ) );    
       
  1447         HBufC* subsbuf(NULL);        
       
  1448         for( TInt i =0; i < subscriptionCount; i++ )
       
  1449             {
       
  1450             const MPresenceBlockInfo& blockedEntitys = event.NewBlock(i);
       
  1451             const MXIMPIdentity& ident = blockedEntitys.BlockedEntityId();
       
  1452             subsbuf = ident.Identity().AllocLC();
       
  1453             TPtr subsbufPtr = subsbuf->Des();
       
  1454             TRACE( T_LIT(" -> identity: %S"), &subsbufPtr );    
       
  1455 
       
  1456             TRACE( T_LIT(" -> subscribe to cache" ) );    
       
  1457             SubscribePresenceOfSingleContactL(*subsbuf);
       
  1458             iBlockedListMgr->AddToBlockedListL(*subsbuf);
       
  1459             CleanupStack::PopAndDestroy( subsbuf );
       
  1460             }
       
  1461         TInt disappearedCount = event.DisappearedBlocksCount();  
       
  1462                 
       
  1463             for( TInt j =0; j < disappearedCount; j++ )
       
  1464                 {
       
  1465                 const MPresenceBlockInfo& blockedEntitys = event.DisappearedBlock( j );
       
  1466                 const MXIMPIdentity& ident = blockedEntitys.BlockedEntityId();
       
  1467                 subsbuf = ident.Identity().AllocLC();
       
  1468                 TPtr subsbufPtr = subsbuf->Des();
       
  1469                 TRACE( T_LIT(" -> identity: %S"), &subsbufPtr );    
       
  1470               
       
  1471                 iBlockedListMgr->RemoveFromBlockListL( *subsbuf );    
       
  1472                 
       
  1473             CleanupStack::PopAndDestroy( subsbuf );
       
  1474             }
       
  1475         
       
  1476         if(iBlockedListObserver)
       
  1477 	        {
       
  1478 	        iBlockedListObserver->HandleBlockedListFetchCompleteL();
       
  1479 	        iBlockListFetchReqPending = EFalse;
       
  1480 	        }
       
  1481     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::DoHandlePresenceBlockListEventL end"));
       
  1482 
       
  1483     }
       
  1484 
       
  1485 // ---------------------------------------------------------------------------
       
  1486 // CVIMPSTEnginePresenceSubService::AddToBlockListL
       
  1487 // ---------------------------------------------------------------------------
       
  1488 //
       
  1489 TInt CVIMPSTEnginePresenceSubService::AddToBlockListL( const TDesC& aContactId )
       
  1490     {
       
  1491     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::AddToBlockListL start"));
       
  1492     if(TVIMPSTEnums::ESVCERegistered != iServiceState)
       
  1493        return KErrNotSupported;
       
  1494     //if aContactId is zero.
       
  1495     if( 0 == aContactId.Length())
       
  1496        return KErrArgument;
       
  1497     
       
  1498     TRACE( T_LIT(" -> aContactId: %s" ), &aContactId);
       
  1499     TRACE( T_LIT(" -> perform block operation" ) );      
       
  1500     
       
  1501     MXIMPIdentity* identity = iXimpEventObserver.XimpPresenceContextL().ObjectFactory().NewIdentityLC();
       
  1502     
       
  1503     identity->SetIdentityL( aContactId ); 
       
  1504 
       
  1505     TXIMPRequestId reqId = iXimpEventObserver.XimpAuthorizationL().BlockPresenceForPresentityL(*identity );
       
  1506     CVIMPSTEngineRequestMapper* mapper = iXimpEventObserver.GetRequestMapper();
       
  1507     mapper->CreateRequestL(reqId, ETrue,EVIMPSTXimpOperationBlockPresenceForPresentity);// waite here
       
  1508     TInt error = iXimpEventObserver.GetCompletedReqResult(); // get the result error
       
  1509     														 //Contact will be added to blocked list manager,
       
  1510     //Delete avatar of contact
       
  1511     if(KErrNone == error && IsAvatarSupported())
       
  1512 	    {
       
  1513    		MVIMPSTStorageServiceView* storage = 
       
  1514     		CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);
       
  1515 		storage->UpdateAvatarL(aContactId,KNullDesC8);
       
  1516 	    }
       
  1517     //when pres. cache call will come.
       
  1518     CleanupStack::PopAndDestroy(); // identity    
       
  1519     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::AddToBlockListL end"));
       
  1520     return error;
       
  1521     }
       
  1522 
       
  1523 // ---------------------------------------------------------------------------
       
  1524 // CVIMPSTEnginePresenceSubService::RemoveFromBlockListL
       
  1525 // ---------------------------------------------------------------------------
       
  1526 //
       
  1527 TInt CVIMPSTEnginePresenceSubService::RemoveFromBlockListL( const TDesC& aUriOfTheContact )
       
  1528     {
       
  1529     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RemoveFromBlockListL start"));
       
  1530     if(TVIMPSTEnums::ESVCERegistered != iServiceState)
       
  1531        return KErrNotSupported;
       
  1532     //if aUriOfTheCOntact is zero.
       
  1533     if( 0 == aUriOfTheContact.Length())
       
  1534        return KErrNotFound;
       
  1535     
       
  1536     TRACE( T_LIT(" -> aUriOfTheContact: %s" ), &aUriOfTheContact);
       
  1537     TRACE( T_LIT(" -> perform unblock operation" ) );      
       
  1538     
       
  1539     MXIMPIdentity* identity = iXimpEventObserver.XimpPresenceContextL().ObjectFactory().NewIdentityLC();
       
  1540     identity->SetIdentityL( aUriOfTheContact ); 
       
  1541    
       
  1542     TXIMPRequestId reqId = iXimpEventObserver.XimpAuthorizationL().CancelPresenceBlockFromPresentityL(*identity );
       
  1543     CVIMPSTEngineRequestMapper* mapper = iXimpEventObserver.GetRequestMapper();
       
  1544     mapper->CreateRequestL(reqId, ETrue,EVIMPSTXimpOperationCancelPresenceBlockFromPresentity);// waite here
       
  1545     TInt error = iXimpEventObserver.GetCompletedReqResult(); // get the result error
       
  1546     //if blocked contact is unblocked, then remove it from
       
  1547     //locally maintained blocked list..
       
  1548     if(KErrNone == error)
       
  1549 	    {
       
  1550 	    iBlockedListMgr->RemoveFromBlockListL(aUriOfTheContact);
       
  1551 	    }
       
  1552     CleanupStack::PopAndDestroy( 1 ); // identity    
       
  1553     
       
  1554     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::RemoveFromBlockListL end"));
       
  1555     return error;
       
  1556     }
       
  1557     
       
  1558 // ---------------------------------------------------------------------------
       
  1559 // CVIMPSTEnginePresenceSubService::GetBlockedList
       
  1560 // ---------------------------------------------------------------------------
       
  1561 //
       
  1562 RPointerArray<HBufC>* CVIMPSTEnginePresenceSubService::GetBlockedList()
       
  1563 	{
       
  1564 	if(iBlockedListMgr)
       
  1565 		{
       
  1566 		return iBlockedListMgr->BlockedList();
       
  1567 		}
       
  1568 	return NULL;	
       
  1569 	}
       
  1570 
       
  1571 // ---------------------------------------------------------------------------
       
  1572 // CVIMPSTEnginePresenceSubService::GetBlockedList
       
  1573 // ---------------------------------------------------------------------------
       
  1574 //
       
  1575 void CVIMPSTEnginePresenceSubService::ResetBlockedListManagerL()
       
  1576 	{
       
  1577 	iBlockedListMgr->ResetL();
       
  1578 	}
       
  1579 	
       
  1580 // ---------------------------------------------------------------------------
       
  1581 // CVIMPSTEnginePresenceSubService::FetchBlockedListFromServer
       
  1582 // ---------------------------------------------------------------------------
       
  1583 //
       
  1584 void CVIMPSTEnginePresenceSubService::FetchBlockedListFromServerL(MVIMPSTEngineBlockedListFetchEventObserver* aOb)
       
  1585 	{
       
  1586 	if(EFalse == iBlockListFetchReqPending)
       
  1587 		{
       
  1588 		//set the observer to give call back; Fetch from server is completed.
       
  1589 		iBlockedListObserver = aOb;
       
  1590 	
       
  1591 		//unsubscribe blocked list.
       
  1592 	    TXIMPRequestId operationId = TXIMPRequestId::Null();
       
  1593 	    operationId = iXimpEventObserver.XimpAuthorizationL().UnsubscribePresenceBlockListL();
       
  1594 	    CVIMPSTEngineRequestMapper* requestMapper =iXimpEventObserver.GetRequestMapper();
       
  1595 	    requestMapper->CreateRequestL(operationId,ETrue,EVIMPSTXimpOperationGetBlockList);
       
  1596 		
       
  1597 		iBlockListFetchReqPending = ETrue; 
       
  1598 		//subscribe again to get fresh blocked list from server.
       
  1599 		RetrieveBlockListL();
       
  1600 		}
       
  1601 	}
       
  1602 	
       
  1603 	
       
  1604 // ---------------------------------------------------------------------------
       
  1605 // CVIMPSTEnginePresenceSubService::GetKeyFieldsAndValuesL
       
  1606 // ---------------------------------------------------------------------------
       
  1607 //
       
  1608 void CVIMPSTEnginePresenceSubService::GetKeyFieldsAndValuesL(MPresenceBuddyInfo2& aPresenceBuddyInfo,TVIMPSTEnums::TOnlineStatus &aStatus)
       
  1609     {
       
  1610     TPtrC8 value = aPresenceBuddyInfo.GetAnyField( KExtensionKey());
       
  1611     // At any point of time fro remote and blocked contact only one of the keys
       
  1612     // KPendingRequestExtensionValue/KBlockedExtensionValue will be assigned, and not both the keys.
       
  1613     if(value.Compare( KPendingRequestExtensionValue ) == 0)
       
  1614         {
       
  1615         aStatus = TVIMPSTEnums::EPending;
       
  1616         }
       
  1617     else if(value.CompareF( KBlockedExtensionValue ) == 0)
       
  1618         {
       
  1619         aStatus = TVIMPSTEnums::EBlocked;
       
  1620         }
       
  1621     else if(value.CompareF( KServiceExtensionValue ) == 0)
       
  1622         {
       
  1623         aStatus = TVIMPSTEnums::EServiceOut;
       
  1624         }
       
  1625     else if(value.CompareF( KCallForwardExtensionValue ) == 0)
       
  1626         {
       
  1627         aStatus = TVIMPSTEnums::ECallForward;
       
  1628         }
       
  1629     else
       
  1630 		{
       
  1631 		aStatus  = TVIMPSTEnums::EOffline;
       
  1632 		}
       
  1633     }
       
  1634 	
       
  1635 // ---------------------------------------------------------------------------
       
  1636 // CVIMPSTEnginePresenceSubService::UpdatePresenceStateL
       
  1637 // ---------------------------------------------------------------------------
       
  1638 //
       
  1639 void CVIMPSTEnginePresenceSubService::UpdatePresenceStateL()
       
  1640     {
       
  1641     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UpdatePresenceStateL start") );
       
  1642     //inform ui about the state change from updatingcontacts to registered.
       
  1643     iServiceState = TVIMPSTEnums::ESVCERegistered;    
       
  1644     iObserver.HandleServceConnectionEventL();
       
  1645     
       
  1646     TRACE( T_LIT(" -> HandleContactFetchedL:state is ESVCERegistered" )); 
       
  1647     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UpdatePresenceStateL end"));
       
  1648     }
       
  1649 
       
  1650 // ---------------------------------------------------------------------------
       
  1651 // CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL
       
  1652 // ---------------------------------------------------------------------------
       
  1653 //
       
  1654 void CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL(const TDesC& aContact)
       
  1655     {
       
  1656     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL Start"));  
       
  1657     if(aContact.Length() && iServiceName->Length())
       
  1658         {
       
  1659         HBufC* name = HBufC::NewLC( iServiceName->Length() + KColon().Length() + aContact.Length()  ); // 1. on to cleanup stack
       
  1660         TPtr namePtr( name->Des() );
       
  1661         namePtr.Zero();
       
  1662         // append the service name followed by user id ,seperated by colon
       
  1663         namePtr.Append(*iServiceName);
       
  1664         namePtr.Append(KColon);
       
  1665         namePtr.Append(aContact);
       
  1666         TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL namePtr = %S"), &namePtr);  
       
  1667         MPresenceBuddyInfo2* presenceBuddyInfo = iPresenceCacheReader->PresenceInfoLC(namePtr); // 2. on to cleanupstack
       
  1668         if ( presenceBuddyInfo )
       
  1669             {
       
  1670             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL presenceBuddyInfo"));            
       
  1671             DoHandlePresenceNotificationL(*presenceBuddyInfo);
       
  1672             CleanupStack::PopAndDestroy();  // presenceBuddyInfo
       
  1673             TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL presenceBuddyInfo end"));  
       
  1674             }
       
  1675         CleanupStack::PopAndDestroy(name);  // name
       
  1676         }
       
  1677     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::FetchPresenceOfSingleContactL End")); 
       
  1678     }
       
  1679 
       
  1680 // ---------------------------------------------------------------------------
       
  1681 // CVIMPSTEnginePresenceSubService::UnsubscribeListsL
       
  1682 // ---------------------------------------------------------------------------
       
  1683 //
       
  1684 void CVIMPSTEnginePresenceSubService::UnsubscribeListsL()
       
  1685     {
       
  1686     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL IN"));
       
  1687     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL - unsubscribe buddy list"));
       
  1688 
       
  1689     // It is assumed here that buddy list and authorization list has been always
       
  1690     // subscribed if bind has been done. Caller of this function must check
       
  1691     // that session has been bound before calling this.
       
  1692     TBuf<KUriMaxLength> buddyGroupBuffer( KFriendList );
       
  1693     MXIMPIdentity* buddyGroupList = iXimpEventObserver.XimpPresenceContextL().ObjectFactory().NewIdentityLC();
       
  1694     __ASSERT_ALWAYS( buddyGroupList , User::Leave( KErrNoMemory ) );        
       
  1695     buddyGroupList->SetIdentityL( buddyGroupBuffer );        
       
  1696     iXimpEventObserver.XimpPresentityGroupsL().UnsubscribePresentityGroupContentL(
       
  1697                    *buddyGroupList );
       
  1698     CleanupStack::PopAndDestroy(); // buddyGroupList
       
  1699            
       
  1700    // Auth list
       
  1701    if(iSubscribeToAuthList)
       
  1702        {
       
  1703        TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL - unsubscribe auth list"));
       
  1704        iSubscribeToAuthList = EFalse;
       
  1705       iXimpEventObserver.XimpAuthorizationL().UnsubscribePresenceGrantRequestListL();  
       
  1706        }
       
  1707  
       
  1708    // block list
       
  1709    TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL - check if block is supported"));
       
  1710    TInt supportedFeatures = iXimpEventObserver.GetSupportedFeatures();
       
  1711    if ( (EVIMPSTFeatureBlock & supportedFeatures) && (EVIMPSTFeatureUnBlock & supportedFeatures) )
       
  1712        {
       
  1713        TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL - unsubscribe block list"));
       
  1714        iXimpEventObserver.XimpAuthorizationL().UnsubscribePresenceBlockListL();        
       
  1715        }
       
  1716     TRACE( T_LIT("CVIMPSTEnginePresenceSubService::UnsubscribeListsL OUT"));
       
  1717     }
       
  1718 
       
  1719 // End of file