simpledatamodeladapter/src/presenceplugindata.cpp
branchGCC_SURGE
changeset 28 d9861ae9169c
parent 23 77cb48a03620
parent 26 04ca1926b01c
equal deleted inserted replaced
23:77cb48a03620 28:d9861ae9169c
     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:  IETF SIMPLE Protocol implementation for XIMP Framework
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32std.h>
       
    20 #include <e32base.h>
       
    21 #include <s32strm.h>
       
    22 #include <e32def.h>
       
    23 #include <e32svr.h>
       
    24 #include <e32math.h> 
       
    25 #include <utf.h>
       
    26 #include <ximpbase.h>
       
    27 #include <ximpobjectfactory.h>
       
    28 #include <ximpobjectcollection.h>
       
    29 #include <presenceobjectfactory.h>
       
    30 #include <presenceinfo.h>
       
    31 #include <personpresenceinfo.h>
       
    32 #include <presenceinfofieldcollection.h>
       
    33 #include <presenceinfofield.h>
       
    34 #include <presenceinfofieldvaluetext.h>
       
    35 #include <presenceinfofieldvalueenum.h>
       
    36 #include <ximpidentity.h>
       
    37 #include <msimpledocument.h>
       
    38 #include <msimpleelement.h>
       
    39 #include <msimplepresencelist.h>
       
    40 #include <msimplemeta.h>
       
    41 #include <simpleutils.h>
       
    42 #include <presencecachewriter2.h>
       
    43 #include <presencebuddyinfo.h>
       
    44 #include <spsettings.h>
       
    45 #include <spentry.h>
       
    46 #include <spproperty.h>
       
    47 #include <spdefinitions.h>
       
    48 #include <avabilitytext.h>
       
    49 #include <cvimpstsettingsstore.h>
       
    50 
       
    51 #include "presenceplugindata.h"
       
    52 #include "presenceplugincommon.h"
       
    53 #include "presencepluginvirtualgroup.h"
       
    54 
       
    55 // ---------------------------------------------------------------------------
       
    56 // CPresencePluginData::CPresencePluginData
       
    57 // ---------------------------------------------------------------------------
       
    58 //
       
    59 CPresencePluginData::CPresencePluginData( 
       
    60 	MPresencePluginConnectionObs& aObs,
       
    61 	TInt aServiceId ):
       
    62 	iConnObs( aObs ), 
       
    63 	iServiceId( aServiceId ),
       
    64 	iPresenceCacheWriter( NULL )
       
    65     {
       
    66     }
       
    67 
       
    68 // ---------------------------------------------------------------------------
       
    69 // CPresencePluginData::~CPresencePluginData
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 CPresencePluginData::~CPresencePluginData()
       
    73     {
       
    74     DP_SDA("CPresencePluginData::~CPresencePluginData");
       
    75     delete iPresenceCacheWriter;
       
    76     }
       
    77 
       
    78 // ---------------------------------------------------------------------------
       
    79 // CPresencePluginData::NewL
       
    80 // ---------------------------------------------------------------------------
       
    81 //
       
    82 CPresencePluginData* CPresencePluginData::NewL( 
       
    83 	MPresencePluginConnectionObs& aObs, TInt aServiceId )
       
    84     {
       
    85     CPresencePluginData* self = CPresencePluginData::NewLC( 
       
    86 		aObs,
       
    87 		aServiceId );
       
    88     CleanupStack::Pop( self );
       
    89     return self;
       
    90     }
       
    91 
       
    92 
       
    93 // ---------------------------------------------------------------------------
       
    94 // CPresencePluginData::ConstructL
       
    95 // ---------------------------------------------------------------------------
       
    96 //
       
    97 void CPresencePluginData::ConstructL()
       
    98     {
       
    99     DP_SDA("CPresencePluginData::ConstructL");
       
   100     iPresenceCacheWriter =  MPresenceCacheWriter2::CreateWriterL();
       
   101     }
       
   102 
       
   103 // ---------------------------------------------------------------------------
       
   104 // CPresencePluginData::NewLC
       
   105 // ---------------------------------------------------------------------------
       
   106 //
       
   107 CPresencePluginData* CPresencePluginData::NewLC(
       
   108     MPresencePluginConnectionObs& aObs, TInt aServiceId )
       
   109     {
       
   110     CPresencePluginData* self =
       
   111     	new( ELeave ) CPresencePluginData( aObs, aServiceId );
       
   112     CleanupStack::PushL( self );
       
   113     self->ConstructL();
       
   114     return self;
       
   115     }
       
   116 
       
   117 // ---------------------------------------------------------------------------
       
   118 // CPresencePluginData::NotifyToBlockedToXIMPL
       
   119 // ---------------------------------------------------------------------------
       
   120 //
       
   121 void CPresencePluginData::NotifyToBlockedToXIMPL(
       
   122     MPresenceObjectFactory& aPresenceFactory,
       
   123     MPresenceInfo& aPrInfo,
       
   124     const TDesC& aUnicodeNoteContent )
       
   125     {
       
   126     DP_SDA("CPresencePluginData::NotifyToBlockedToXIMPL");
       
   127     MPersonPresenceInfo* persInfo =
       
   128         aPresenceFactory.NewPersonPresenceInfoLC();
       
   129     MPresenceInfoFieldCollection& coll = persInfo->Fields();
       
   130     
       
   131     //Set pending
       
   132     using namespace NPresenceInfo::NFieldType;
       
   133     using namespace NPresencePlugin::NPresenceStates;
       
   134     
       
   135     MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   136     field->SetFieldTypeL( KAvailabilityEnum );
       
   137         
       
   138     // use mapped enums to pass status    
       
   139     MPresenceInfoFieldValueEnum* enumField = 
       
   140         aPresenceFactory.NewEnumInfoFieldLC();
       
   141     
       
   142     // HOX: BLOCKED ENUM NEEDED TO XIMP
       
   143     enumField->SetValueL( NPresenceInfo::ENotAvailable ); 
       
   144     field->SetFieldValue( enumField );
       
   145         
       
   146     coll.AddOrReplaceFieldL( field );
       
   147     CleanupStack::Pop( 2 );            // >> field, enumField      
       
   148     
       
   149     // Add status msg field
       
   150     MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC();
       
   151     noteField->SetFieldTypeL( KStatusMessage );
       
   152         
       
   153     MPresenceInfoFieldValueText* textField = 
       
   154         aPresenceFactory.NewTextInfoFieldLC();
       
   155     textField->SetTextValueL( aUnicodeNoteContent );
       
   156     
       
   157     noteField->SetFieldValue( textField );
       
   158         
       
   159     coll.AddOrReplaceFieldL( noteField );
       
   160     CleanupStack::Pop( 2 );            // >> noteField, enumField      
       
   161     
       
   162     aPrInfo.SetPersonPresenceL( persInfo );
       
   163     CleanupStack::Pop();   // >> persInfo
       
   164     DP_SDA("CPresencePluginData::NotifyToBlockedToXIMPL end");
       
   165     }
       
   166 
       
   167 // ---------------------------------------------------------------------------
       
   168 // CPresencePluginData::NotifyToPendingToXIMPL
       
   169 // ---------------------------------------------------------------------------
       
   170 //
       
   171 void CPresencePluginData::NotifyToPendingToXIMPL(
       
   172     MPresenceObjectFactory& aPresenceFactory,
       
   173     MPresenceInfo& aPrInfo,
       
   174     const TDesC& aUnicodeNoteContent )
       
   175     {
       
   176     DP_SDA("CPresencePluginData::NotifyToPendingToXIMP");
       
   177     MPersonPresenceInfo* persInfo =
       
   178         aPresenceFactory.NewPersonPresenceInfoLC();
       
   179     MPresenceInfoFieldCollection& coll = persInfo->Fields();
       
   180     
       
   181     //Set pending
       
   182     using namespace NPresenceInfo::NFieldType;
       
   183     using namespace NPresencePlugin::NPresenceStates;
       
   184     
       
   185     MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   186     field->SetFieldTypeL( KAvailabilityEnum );
       
   187         
       
   188     // use mapped enums to pass status    
       
   189     MPresenceInfoFieldValueEnum* enumField = 
       
   190         aPresenceFactory.NewEnumInfoFieldLC();
       
   191     enumField->SetValueL( NPresenceInfo::ERemotePending );
       
   192     field->SetFieldValue( enumField );
       
   193         
       
   194     coll.AddOrReplaceFieldL( field );
       
   195     CleanupStack::Pop( 2 );            // >> field, enumField      
       
   196     
       
   197     // Add status msg field
       
   198     MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC();
       
   199     noteField->SetFieldTypeL( KStatusMessage );
       
   200         
       
   201     MPresenceInfoFieldValueText* textField = 
       
   202         aPresenceFactory.NewTextInfoFieldLC();
       
   203     textField->SetTextValueL( aUnicodeNoteContent );
       
   204     
       
   205     noteField->SetFieldValue( textField );
       
   206         
       
   207     coll.AddOrReplaceFieldL( noteField );
       
   208     CleanupStack::Pop( 2 );            // >> noteField, enumField      
       
   209     
       
   210     aPrInfo.SetPersonPresenceL( persInfo );
       
   211     CleanupStack::Pop();   // >> persInfo
       
   212     DP_SDA("CPresencePluginData::NotifyToPendingToXIMP end");
       
   213     }
       
   214 
       
   215 // ---------------------------------------------------------------------------
       
   216 // CPresencePluginData::NotifyActiveToPrInfoL
       
   217 // ---------------------------------------------------------------------------
       
   218 //
       
   219 void CPresencePluginData::NotifyToActiveToXIMPL(
       
   220     MPresenceObjectFactory& aPresenceFactory,
       
   221     MPresenceInfo& aPrInfo,
       
   222     const TDesC& aUnicodeNoteContent,
       
   223     NPresenceInfo::TAvailabilityValues aAvailability )
       
   224     {
       
   225     DP_SDA("CPresencePluginData::NotifyToActiveToXIMPL");
       
   226     MPersonPresenceInfo* persInfo =
       
   227         aPresenceFactory.NewPersonPresenceInfoLC();
       
   228     MPresenceInfoFieldCollection& coll = persInfo->Fields();
       
   229     
       
   230     //Set pending
       
   231     using namespace NPresenceInfo::NFieldType;
       
   232     using namespace NPresencePlugin::NPresenceStates;
       
   233     
       
   234     MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   235     field->SetFieldTypeL( KAvailabilityEnum );
       
   236         
       
   237     // use mapped enums to pass status    
       
   238     MPresenceInfoFieldValueEnum* enumField = 
       
   239         aPresenceFactory.NewEnumInfoFieldLC();
       
   240     enumField->SetValueL( aAvailability );
       
   241     field->SetFieldValue( enumField );
       
   242         
       
   243     coll.AddOrReplaceFieldL( field );
       
   244     CleanupStack::Pop( 2 );            // >> field, enumField      
       
   245     
       
   246     // Add status msg field
       
   247     MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC();
       
   248     noteField->SetFieldTypeL( KStatusMessage );
       
   249         
       
   250     MPresenceInfoFieldValueText* textField = 
       
   251         aPresenceFactory.NewTextInfoFieldLC();
       
   252     textField->SetTextValueL( aUnicodeNoteContent );
       
   253     
       
   254     noteField->SetFieldValue( textField );
       
   255         
       
   256     coll.AddOrReplaceFieldL( noteField );
       
   257     CleanupStack::Pop( 2 );            // >> noteField, enumField      
       
   258     
       
   259     aPrInfo.SetPersonPresenceL( persInfo );
       
   260     CleanupStack::Pop();   // >> persInfo
       
   261     DP_SDA("CPresencePluginData::NotifyToActiveToXIMPL end");
       
   262     }
       
   263         
       
   264 // ---------------------------------------------------------------------------
       
   265 // CPresencePluginData::NotifyTerminatedToPrInfoL
       
   266 // ---------------------------------------------------------------------------
       
   267 //
       
   268 void CPresencePluginData::NotifyTerminatedToXIMPL(
       
   269     MPresenceObjectFactory& aPresenceFactory,
       
   270     MPresenceInfo& aPrInfo,
       
   271     const TDesC& aUnicodeNoteContent )
       
   272     {
       
   273     DP_SDA("CPresencePluginData::NotifyTerminatedToXIMPL");
       
   274     MPersonPresenceInfo* persInfo =
       
   275         aPresenceFactory.NewPersonPresenceInfoLC();
       
   276     MPresenceInfoFieldCollection& coll = persInfo->Fields();
       
   277     
       
   278     //Set pending
       
   279     using namespace NPresenceInfo::NFieldType;
       
   280     using namespace NPresencePlugin::NPresenceStates;
       
   281     
       
   282     MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   283     field->SetFieldTypeL( KAvailabilityEnum );
       
   284         
       
   285     // use mapped enums to pass status    
       
   286     MPresenceInfoFieldValueEnum* enumField = 
       
   287         aPresenceFactory.NewEnumInfoFieldLC();
       
   288     enumField->SetValueL( NPresenceInfo::EOffline );
       
   289     field->SetFieldValue( enumField );
       
   290         
       
   291     coll.AddOrReplaceFieldL( field );
       
   292     CleanupStack::Pop( 2 );            // >> field, enumField      
       
   293     
       
   294     // Add status msg field
       
   295     MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC();
       
   296     noteField->SetFieldTypeL( KStatusMessage );
       
   297         
       
   298     MPresenceInfoFieldValueText* textField = 
       
   299         aPresenceFactory.NewTextInfoFieldLC();
       
   300     textField->SetTextValueL( aUnicodeNoteContent );
       
   301     
       
   302     noteField->SetFieldValue( textField );
       
   303         
       
   304     coll.AddOrReplaceFieldL( noteField );
       
   305     CleanupStack::Pop( 2 );            // >> noteField, enumField      
       
   306     
       
   307     aPrInfo.SetPersonPresenceL( persInfo );
       
   308     CleanupStack::Pop();   // >> persInfo
       
   309     DP_SDA("CPresencePluginData::NotifyTerminatedToXIMPL end");
       
   310     }
       
   311 
       
   312 // ---------------------------------------------------------------------------
       
   313 // CPresencePluginData::NotifyToPrInfoL
       
   314 // ---------------------------------------------------------------------------
       
   315 //
       
   316 void CPresencePluginData::NotifyToPrInfoL(
       
   317     MXIMPObjectFactory& /*aFactory*/,
       
   318     MPresenceObjectFactory& aPresenceFactory,
       
   319     MSimpleDocument& aDocument,
       
   320     MPresenceInfo& aPrInfo )
       
   321     {
       
   322     DP_SDA("CPresencePluginData::NotifyToPrInfoL");
       
   323     MPersonPresenceInfo* persInfo =
       
   324         aPresenceFactory.NewPersonPresenceInfoLC();
       
   325     DP_SDA("CPresencePluginData::NotifyToPrInfoL persInfo");
       
   326 
       
   327     if( !aDocument.EntityURI() )
       
   328     	{
       
   329     	DP_SDA("CPresencePluginData::NotifyToPrInfoL entity URL not valid");
       
   330     	User::Leave( KErrCancel );
       
   331     	}
       
   332  
       
   333     MPresenceInfoFieldCollection& coll = persInfo->Fields();
       
   334     
       
   335     DP_SDA("CPresencePluginData::NotifyToPrInfoL collection");
       
   336     // Search own person info. Notice: Extend supported attributes later
       
   337     TBool basicElementFound = EFalse;
       
   338     TBool activitiesElementFound = EFalse;
       
   339     TBool noteElemFound = EFalse;
       
   340         
       
   341     DP_SDA("CPresencePluginData::NotifyToPrInfoL RPointerArray");
       
   342     RPointerArray<MSimpleElement> elems;
       
   343     DP_SDA("CPresencePluginData::NotifyToPrInfoL Push elems");
       
   344     CleanupClosePushL( elems );
       
   345     DP_SDA("CPresencePluginData::NotifyToPrInfoL aDocument");
       
   346     TInt err = aDocument.SimpleElementsL( elems );
       
   347     
       
   348     DP_SDA2("CPresencePluginData::NotifyToPrInfoL err %d", err);
       
   349     
       
   350     RPointerArray<MSimpleElement> basicElems;
       
   351 	CleanupClosePushL( basicElems );
       
   352 	MSimpleElement* basicSimpleElem(NULL);
       
   353 	
       
   354 	RPointerArray<MSimpleElement> activitiesElems;
       
   355 	CleanupClosePushL( activitiesElems );
       
   356 	MSimpleElement* activitiesSimpleElem(NULL);
       
   357 	MSimpleElement* noteSimpleElem(NULL);
       
   358 		
       
   359     if ( !err )
       
   360         {
       
   361         DP_SDA("CPresencePluginData::NotifyToPrInfoL, elements ok");       
       
   362         TInt count = elems.Count();
       
   363         DP_SDA2("CPresencePluginData::NotifyToPrInfoL, element count: %d", count );       
       
   364         
       
   365         using namespace NPresencePlugin::NPresence;
       
   366 
       
   367         MSimpleElement* elem = NULL;
       
   368         TPtrC8 p8;
       
   369 
       
   370         for ( TInt i = 0; i < count; i++ )
       
   371             {
       
   372             DP_SDA2("CPresencePluginData::NotifyToPrInfoL, handling elem[%d]", i );
       
   373             
       
   374             elem = elems[i];
       
   375             p8.Set( elem->LocalName());
       
   376             if (!( p8.CompareF( KPresencePerson8 )) ||
       
   377                 !( p8.CompareF( KPresenceTuple8 )) )
       
   378                 {
       
   379                 // person element found
       
   380                 RPointerArray<MSimpleElement> elems2;
       
   381                 CleanupClosePushL( elems2 );
       
   382                 elem->SimpleElementsL( elems2 );
       
   383                 TInt count2 = elems2.Count();
       
   384                 DP_SDA2("CPresencePluginData::NotifyToPrInfoL count2 %d", count2);
       
   385                 for ( TInt j = 0; j < count2; j++ )
       
   386                     {
       
   387                     DP_SDA("CPresencePluginData::NotifyToPrInfoL 4");
       
   388                     //
       
   389                     MSimpleElement* elem2 = elems2[j];
       
   390                     
       
   391                     //FIND BASIC/ACTIVITIES ELEMENT
       
   392                     if ( !elem2->LocalName().CompareF( KPresenceStatus8 ) &&
       
   393                         !basicElementFound )
       
   394              	        {
       
   395              	        DP_SDA("NotifyToPrInfoL PresenceStatus");
       
   396              	        //Get elem2 childs
       
   397 			            elem2->SimpleElementsL( basicElems );
       
   398 			            TInt count3 = basicElems.Count();  //Child count
       
   399 			            for ( TInt k = 0; k < count3; k++ )
       
   400 			                {
       
   401 			                MSimpleElement* tempElem = basicElems[k];
       
   402 			                if ( !tempElem->LocalName().CompareF( 
       
   403 			                		KPresenceBasic8 ))
       
   404 			                    {
       
   405 			                    DP_SDA("NotifyToPrInfoL basic elem true");
       
   406 			                    basicSimpleElem = basicElems[k];
       
   407 			                    basicElementFound = ETrue;
       
   408 			                    }
       
   409 			                else if( !tempElem->LocalName().CompareF( 
       
   410 			                		KPresenceActivities8 ))
       
   411 			                    {
       
   412 			                    DP_SDA("NotifyToPrInfoL activities under basic");
       
   413 			                    activitiesSimpleElem = basicElems[k];
       
   414 			                    activitiesElementFound = ETrue;
       
   415 			                    }
       
   416 			                } 
       
   417              	        }
       
   418              	    
       
   419                     //FIND ACTIVITIES ELEMENT
       
   420              	    if ( basicElementFound  && 
       
   421              	        !elem2->LocalName().CompareF( KPresenceActivities8 ) )
       
   422              	        {
       
   423              	        DP_SDA("NotifyToPrInfoL activities found outside basic");
       
   424 			            elem2->SimpleElementsL( activitiesElems );
       
   425 			            TInt count4 = activitiesElems.Count();
       
   426 			            for ( TInt l = 0; l < count4; l++ )
       
   427 			                {
       
   428 			                activitiesSimpleElem = activitiesElems[l];
       
   429 			                activitiesElementFound = ETrue;
       
   430 			                DP_SDA("CPresencePluginData::NotifyToPrInfoL 6");
       
   431 			                }
       
   432              	        }
       
   433              	    // Check note field    
       
   434              	    if ( basicElementFound  && 
       
   435              	        !elem2->LocalName().CompareF( KPresenceNote8 ) )
       
   436              	        {
       
   437              	        DP_SDA("NotifyToPrInfoL note field found inside tuple");
       
   438 			            noteSimpleElem = elem2;
       
   439              	        }             	    
       
   440                     }   
       
   441                 DP_SDA("NotifyToPrInfoL ALL DONE"); 
       
   442                 CleanupStack::PopAndDestroy( &elems2 );
       
   443                 
       
   444                 if( basicElementFound && activitiesElementFound && noteElemFound )
       
   445                     {
       
   446                     DP_SDA("NotifyToPrInfoL ALL DONE break out"); 
       
   447                     //Just handle first status information from document
       
   448                     // In future server should support <timestamp>
       
   449                     //Also client should be can handle timestaps if there are present
       
   450                     break;
       
   451                     }
       
   452                 }
       
   453      	    // Check note field    
       
   454      	    else if ( basicElementFound && !( p8.CompareF( KPresenceNote8 )) &&
       
   455      	         !noteSimpleElem )
       
   456      	        {
       
   457      	        DP_SDA("NotifyToPrInfoL note field found outside tuple");
       
   458 	            noteSimpleElem = elem;
       
   459      	        }             	    
       
   460             }                
       
   461         }
       
   462     
       
   463     if ( basicElementFound )
       
   464     	{
       
   465     	DP_SDA("NotifyToPrInfoL basic proceed to handling");
       
   466     	SingleUserStatusToXIMPL( 
       
   467             aPresenceFactory, basicSimpleElem, 
       
   468     		activitiesSimpleElem, noteSimpleElem, coll );  
       
   469     	}
       
   470     CleanupStack::PopAndDestroy( &activitiesElems );
       
   471     CleanupStack::PopAndDestroy( &basicElems );
       
   472     CleanupStack::PopAndDestroy( &elems );
       
   473 
       
   474     aPrInfo.SetPersonPresenceL( persInfo );
       
   475     CleanupStack::Pop();   // >> persInfo
       
   476     
       
   477     // TODO2: Notice: the following crashes in old PrFW version
       
   478     /*
       
   479     aPrInfo.AddDevicePresenceL ( NULL );
       
   480     aPrInfo.AddServicePresenceL( NULL );
       
   481     */
       
   482     DP_SDA("CPresencePluginData::NotifyToPrInfoL end");        
       
   483     }
       
   484 
       
   485 // ---------------------------------------------------------------------------
       
   486 // CPresencePluginData::CacheEntriesFromPrInfo
       
   487 // ---------------------------------------------------------------------------
       
   488 //
       
   489 void CPresencePluginData::CacheEntriesFromPrInfo(
       
   490     MPresenceInfo& aPrInfo,
       
   491     MPresenceBuddyInfo2::TAvailabilityValues& aAvailability,
       
   492     TPtr& aExtendedAvailability,
       
   493     TPtr& aStatusMessage )
       
   494     {
       
   495     DP_SDA("CPresencePluginData::CacheEntriesFromPrInfoL");
       
   496     
       
   497     DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status enum field");
       
   498     MPresenceInfoField* statusEnumInfoField = NULL;
       
   499     MPersonPresenceInfo* presInfo = aPrInfo.PersonPresence();
       
   500     if ( presInfo )
       
   501         {
       
   502         DP_SDA(" -> CacheEntriesFromPrInfoL, has person presence, get field");
       
   503         presInfo->Fields().LookupFieldByFieldType( 
       
   504             statusEnumInfoField, 
       
   505             NPresenceInfo::NFieldType::KAvailabilityEnum );
       
   506         DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status enum field done, check item");
       
   507         if ( statusEnumInfoField )
       
   508             {
       
   509             DP_SDA(" -> status enum field found");
       
   510             const MPresenceInfoFieldValueEnum* availability = 
       
   511             TXIMPGetInterface< const MPresenceInfoFieldValueEnum >::From( 
       
   512                 statusEnumInfoField->FieldValue(), MXIMPBase::EPanicIfUnknown );
       
   513              switch( availability->Value() )
       
   514                 {
       
   515                 case NPresenceInfo::EAvailable:
       
   516                     {
       
   517                     DP_SDA(" -> status enum field => available");
       
   518                     aAvailability = MPresenceBuddyInfo2::EAvailable;
       
   519                     aExtendedAvailability.Copy( KDefaultAvailableStatus() );
       
   520                     }
       
   521                     break;
       
   522                     
       
   523                 case NPresenceInfo::EBusy:
       
   524                     {
       
   525                     DP_SDA(" -> status enum field => busy");
       
   526                     aAvailability = MPresenceBuddyInfo2::EBusy;
       
   527                     aExtendedAvailability.Copy( KDndState() );
       
   528                     }
       
   529                     break;
       
   530                     
       
   531                 case NPresenceInfo::EOnPhone:
       
   532                     {
       
   533                     DP_SDA(" -> status enum field => on phone");
       
   534                     aAvailability = MPresenceBuddyInfo2::EBusy;
       
   535                     aExtendedAvailability.Copy( KOnPhoneState() );
       
   536                     }
       
   537                     break;
       
   538                     
       
   539                 case NPresenceInfo::EAway:
       
   540                     {
       
   541                     DP_SDA(" -> status enum field => away");
       
   542                     aAvailability = MPresenceBuddyInfo2::EBusy;
       
   543                     aExtendedAvailability.Copy( KAwayState() );
       
   544                     }
       
   545                     break;
       
   546                 
       
   547                 case NPresenceInfo::EDoNotDisturb:
       
   548                     {
       
   549                     DP_SDA(" -> status enum field => dnd");
       
   550                     aAvailability = MPresenceBuddyInfo2::EBusy;
       
   551                     aExtendedAvailability.Copy( KDndState() );
       
   552                     }
       
   553                     break;
       
   554                 
       
   555                 case NPresenceInfo::EOffline:
       
   556                 case NPresenceInfo::ENotAvailable:
       
   557                 default:
       
   558                     {
       
   559                     DP_SDA(" -> status enum field => offline/not available/default");
       
   560                     aAvailability = MPresenceBuddyInfo2::ENotAvailable;
       
   561                     aExtendedAvailability.Copy( KInvisibleState() );
       
   562                     }
       
   563                     break;
       
   564                 }        
       
   565             }
       
   566         else
       
   567             {
       
   568             DP_SDA(" -> status enum not found => set unknown");
       
   569             aAvailability = MPresenceBuddyInfo2::EUnknownAvailability;
       
   570             aExtendedAvailability.Copy( KNullDesC() );
       
   571             }
       
   572         DP_SDA(" -> fetch status message field");    
       
   573         MPresenceInfoField* statusMsgInfoField = NULL;
       
   574         presInfo->Fields().LookupFieldByFieldType( 
       
   575             statusMsgInfoField, 
       
   576             NPresenceInfo::NFieldType::KStatusMessage );
       
   577         DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status message field done, check item");    
       
   578         if ( statusMsgInfoField )
       
   579             {
       
   580             DP_SDA(" -> status msg field found");
       
   581             const MPresenceInfoFieldValueText* statusMsg = 
       
   582             TXIMPGetInterface< const MPresenceInfoFieldValueText >::From( 
       
   583                 statusMsgInfoField->FieldValue(), MXIMPBase::EPanicIfUnknown );
       
   584             if ( statusMsg && statusMsg->TextValue().Length() )
       
   585                 {
       
   586                 DP_SDA(" -> status msg field found, copy content");
       
   587                 aStatusMessage.Copy( statusMsg->TextValue() );
       
   588                 }
       
   589             }
       
   590         else
       
   591             {
       
   592             DP_SDA(" -> status msg field not found, set empty");
       
   593             aStatusMessage.Copy( KNullDesC() );
       
   594             }
       
   595         }
       
   596         
       
   597     DP_SDA("CPresencePluginData::CacheEntriesFromPrInfoL out");    
       
   598     }
       
   599 
       
   600 // ---------------------------------------------------------------------------
       
   601 // CPresencePluginData::SingleUserStatusToXIMPL
       
   602 // ---------------------------------------------------------------------------
       
   603 //
       
   604 void CPresencePluginData::SingleUserStatusToXIMPL(
       
   605     MPresenceObjectFactory& aPresenceFactory,
       
   606     MSimpleElement* aBasicElement,
       
   607     MSimpleElement* aActivitiesElement,
       
   608     MSimpleElement* aNoteElement,
       
   609     MPresenceInfoFieldCollection& aCollection )
       
   610     {
       
   611     DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL");
       
   612 
       
   613     using namespace NPresenceInfo::NFieldType;
       
   614     using namespace NPresencePlugin::NPresenceStates;
       
   615     
       
   616     //Get aBasicElem content 
       
   617     HBufC* nodeContent = aBasicElement->ContentUnicodeL();
       
   618     CleanupStack::PushL( nodeContent );
       
   619     
       
   620     TBuf<KBufSize100> basicContentBuf; 
       
   621     basicContentBuf.Copy( *nodeContent );
       
   622     DP_SDA2("SingleUserStatusToXIMPL basicContent %S", &basicContentBuf);
       
   623     
       
   624     TBuf<KBufSize100> activitiesContentBuf;
       
   625     
       
   626     if ( !aActivitiesElement )
       
   627         {
       
   628         activitiesContentBuf.Copy( KPresenceUnknow );
       
   629         DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL activities NULL");
       
   630         }
       
   631     else
       
   632         {
       
   633         activitiesContentBuf.Copy( aActivitiesElement->LocalName() );
       
   634         DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else");
       
   635         }
       
   636         
       
   637     if ( nodeContent )
       
   638         {
       
   639         using namespace NPresenceInfo::NFieldType;
       
   640         MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   641         field->SetFieldTypeL( KAvailabilityEnum );
       
   642         
       
   643         // use mapped enums to pass status    
       
   644         MPresenceInfoFieldValueEnum* enumField = 
       
   645             aPresenceFactory.NewEnumInfoFieldLC();
       
   646 
       
   647         // Busy case
       
   648         if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   649             !activitiesContentBuf.CompareF ( KPresenceBusy ) )
       
   650             {
       
   651             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/busy");
       
   652             enumField->SetValueL( NPresenceInfo::EBusy );
       
   653             }
       
   654         // On-The-Phone case
       
   655         else if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   656             !activitiesContentBuf.CompareF ( KPresenceOnThePhone ) )
       
   657             {
       
   658             DP_SDA("CPresencePluginData::SingleUserStatusToXIMPL open/on-the-phone");
       
   659             enumField->SetValueL( NPresenceInfo::EOnPhone );
       
   660             }
       
   661         //Away case  
       
   662         else if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   663             !activitiesContentBuf.CompareF ( KPresenceAway ) )
       
   664             {
       
   665             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/away");
       
   666             enumField->SetValueL( NPresenceInfo::EAway );
       
   667             }
       
   668         //Dnd case  
       
   669         else if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   670             !activitiesContentBuf.CompareF ( KPresenceDoNotDisturb ) )
       
   671             {
       
   672             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/dnd");
       
   673             enumField->SetValueL( NPresenceInfo::EDoNotDisturb );
       
   674             }            
       
   675         // Unknown open
       
   676         else if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   677             !activitiesContentBuf.CompareF ( KPresenceUnknow ) )
       
   678             {
       
   679             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/unknown");
       
   680             enumField->SetValueL( NPresenceInfo::EAvailable );
       
   681             }
       
   682         // availale open
       
   683         else if ( !nodeContent->Des().CompareF( KPresenceOpen ) &&
       
   684             !activitiesContentBuf.CompareF ( KPresenceAvailable ) )
       
   685             {
       
   686             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/available");
       
   687             enumField->SetValueL( NPresenceInfo::EAvailable );
       
   688             }            
       
   689         //Unknown closed
       
   690         else if ( !nodeContent->Des().CompareF( KPresenceClosed ) &&
       
   691             !activitiesContentBuf.CompareF ( KPresenceUnknow ) )
       
   692             {
       
   693             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL closed/unknown");
       
   694             enumField->SetValueL( NPresenceInfo::EOffline );
       
   695             }
       
   696         //Else set status according to basic status
       
   697         else
       
   698             {
       
   699             if ( !nodeContent->Des().CompareF( KPresenceOpen ) )
       
   700                 {
       
   701                 DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else open");
       
   702                 enumField->SetValueL( NPresenceInfo::EAvailable );
       
   703                 }
       
   704             else
       
   705                 {
       
   706                 DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else closed");
       
   707                 enumField->SetValueL( NPresenceInfo::ENotAvailable );
       
   708                 }
       
   709             }
       
   710         
       
   711         field->SetFieldValue( enumField );        
       
   712         aCollection.AddOrReplaceFieldL( field );
       
   713         
       
   714         CleanupStack::Pop( 2 );            // >> field, enumField      
       
   715         
       
   716         DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL check for note");
       
   717         // Handle notes field if found
       
   718         if ( aNoteElement )
       
   719             {
       
   720             DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL note elems found");
       
   721             // consider mapping note text to enum value if value not mapped
       
   722             UserNoteToXIMPL( aPresenceFactory, aNoteElement, 
       
   723                 aCollection );
       
   724             }
       
   725         }
       
   726     CleanupStack::PopAndDestroy( nodeContent );
       
   727     DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL end");
       
   728     }
       
   729 
       
   730 // ---------------------------------------------------------------------------
       
   731 // CPresencePluginData::UserNoteToXIMPL
       
   732 // ---------------------------------------------------------------------------
       
   733 //
       
   734 void CPresencePluginData::UserNoteToXIMPL(
       
   735     MPresenceObjectFactory& aPresenceFactory,
       
   736     MSimpleElement* aElement,
       
   737     MPresenceInfoFieldCollection& aCollection )
       
   738     {
       
   739     DP_SDA(" CPresencePluginData::UserNoteToXIMPL IN");
       
   740     HBufC* nodeContent = aElement->ContentUnicodeL();
       
   741     CleanupStack::PushL( nodeContent );
       
   742     if ( nodeContent )
       
   743         {
       
   744         DP_SDA(" CPresencePluginData::UserNoteToXIMPL - content found");
       
   745         // Save note, convert from unicode
       
   746         // notice: consider xml::lang-attribute
       
   747         // note <-> KStatusMessage
       
   748         // notice: no need to consider namespaces in XML?
       
   749         using namespace NPresenceInfo::NFieldType;
       
   750         
       
   751         DP_SDA(" CPresencePluginData::UserNoteToXIMPL - create fields");
       
   752         MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC();
       
   753         field->SetFieldTypeL( KStatusMessage );
       
   754         MPresenceInfoFieldValueText* text =
       
   755         	aPresenceFactory.NewTextInfoFieldLC();
       
   756         text->SetTextValueL( nodeContent->Des() );
       
   757         field->SetFieldValue( text );
       
   758         CleanupStack::Pop();            // >> text
       
   759         aCollection.AddOrReplaceFieldL( field );
       
   760         CleanupStack::Pop();            // >> field     
       
   761         DP_SDA("  -> fields added to collection");
       
   762         }
       
   763     CleanupStack::PopAndDestroy( nodeContent );
       
   764     DP_SDA(" CPresencePluginData::UserNoteToXIMPL OUT");
       
   765     }
       
   766 
       
   767 // ---------------------------------------------------------------------------
       
   768 // CPresencePluginData::NotifyListToPrInfoL
       
   769 // ---------------------------------------------------------------------------
       
   770 //
       
   771 void CPresencePluginData::NotifyListToPrInfoL(
       
   772     MXIMPObjectFactory& aFactory,
       
   773     MPresenceObjectFactory& aPresenceFactory,
       
   774     MSimplePresenceList& aList,
       
   775     RPointerArray<MPresenceInfo>& aEntities,
       
   776     RPointerArray<MXIMPIdentity>& aActives,
       
   777     RPointerArray<MXIMPIdentity>& aTerminated )
       
   778     {
       
   779     DP_SDA(" CPresencePluginData::NotifyListToPrInfoL");
       
   780     // Split array into individual prInfos
       
   781 
       
   782     aEntities.Reset();
       
   783     RPointerArray<MSimpleDocument> docs;
       
   784     CleanupClosePushL( docs );
       
   785     // get documents, ownership is not transferred.
       
   786     aList.GetDocuments( docs );
       
   787 
       
   788     TInt count = docs.Count();
       
   789 
       
   790     // active presentities
       
   791     for ( TInt i = 0; i < count; i++ )
       
   792         {
       
   793         MPresenceInfo* info =
       
   794             aPresenceFactory.NewPresenceInfoLC();//<< info
       
   795         aEntities.Append( info );
       
   796         // aEntities may contain entries even this method leaves
       
   797         CleanupStack::Pop();// >> info
       
   798 
       
   799         NotifyToPrInfoL( aFactory, aPresenceFactory, *docs[i], *info );
       
   800         // Add SIp identity to active users list
       
   801         MXIMPIdentity* active = aFactory.NewIdentityLC();// << active
       
   802         aActives.Append( active );
       
   803         CleanupStack::Pop();// >> active
       
   804 
       
   805         // Convert SIP entity URI from UTF to Unicode.
       
   806         const TDesC8* pUri8 = (docs[i])->EntityURI();
       
   807         HBufC16* uri16 = NULL;
       
   808         uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *pUri8 );
       
   809         CleanupStack::PushL( uri16 );  // << uri16
       
   810         active->SetIdentityL( uri16->Des() );
       
   811         CleanupStack::PopAndDestroy( uri16 );// >> uri16
       
   812         }
       
   813 
       
   814     using namespace NPresencePlugin::NPresence;
       
   815 
       
   816     // Search "terminated" presentities
       
   817     MSimpleMeta* meta = aList.MetaData();
       
   818     // ownership in not transferred
       
   819     if ( meta && !meta->LocalName().CompareF( KPresenceList8 ))
       
   820         {
       
   821         // list element found
       
   822         RPointerArray<MSimpleElement> elems2;
       
   823         CleanupClosePushL( elems2 );
       
   824         meta->SimpleElementsL( elems2);
       
   825         TInt count2 = elems2.Count();
       
   826 
       
   827         for ( TInt i = 0; i < count2; i++ )
       
   828             {
       
   829             MSimpleElement* elem2 = elems2[i];
       
   830             if ( !elem2->LocalName().CompareF( KPresenceResource8 ))
       
   831                 {
       
   832                 // resource element
       
   833                 RPointerArray<MSimpleElement> elems3;
       
   834                 CleanupClosePushL( elems3 );
       
   835                 meta->SimpleElementsL( elems3 );
       
   836                 TInt count3 = elems3.Count();
       
   837 
       
   838                 for ( TInt j=0; j < count3; j++ )
       
   839                     {
       
   840                     MSimpleElement* elem3 = elems3[i];
       
   841 
       
   842                     if ( !elem3->LocalName().CompareF( KPresenceInstance8 ))
       
   843                         {
       
   844                         // instance element
       
   845                         const TDesC8* stateVal =
       
   846                             elem3->AttrValue( KPresenceState8 );
       
   847                         if ( stateVal && stateVal->
       
   848                             CompareF( KPresenceTerminated8 ))
       
   849                             {
       
   850                             // get next entity if this is not state="terminated"
       
   851                             break;
       
   852                             }
       
   853                         // Save resource element URI into list of
       
   854                         // "terminated" users.
       
   855                         const TDesC8* uri8 = elem2->AttrValue( KPresenceUri8 );
       
   856                         MXIMPIdentity* terminated =
       
   857                             aFactory.NewIdentityLC();// << terminated
       
   858                         aTerminated.Append( terminated );
       
   859                         CleanupStack::Pop();                   // >> terminated
       
   860 
       
   861                         // Convert SIP entity URI from UTF to Unicode.
       
   862                         HBufC16* uri16 = NULL;
       
   863                         uri16 =
       
   864                             CnvUtfConverter::ConvertToUnicodeFromUtf8L( *uri8 );
       
   865                         CleanupStack::PushL( uri16 );  // << uri16
       
   866                         terminated->SetIdentityL( uri16->Des() );
       
   867                         CleanupStack::PopAndDestroy( uri16 );  // >> uri16
       
   868                         }
       
   869                     }
       
   870                 CleanupStack::PopAndDestroy( &elems3 );
       
   871                 } // resource element
       
   872             }// for (i); list element subelement
       
   873         CleanupStack::PopAndDestroy( &elems2 );
       
   874         }
       
   875 
       
   876     CleanupStack::PopAndDestroy( &docs );
       
   877     DP_SDA(" CPresencePluginData::NotifyListToPrInfoL end");
       
   878     }
       
   879 
       
   880 // ---------------------------------------------------------------------------
       
   881 // CPresencePluginData::AddPrPersToSimpleDocumentL
       
   882 // ---------------------------------------------------------------------------
       
   883 //
       
   884 void CPresencePluginData::AddPrPersToSimpleDocumentL(
       
   885     const MPersonPresenceInfo* aInfo,
       
   886     MSimpleDocument& aDocument,
       
   887     const TDesC8& aSipId, TInt aTupleId )
       
   888     {
       
   889     DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL start");
       
   890     iNumBuf = aTupleId;
       
   891     // notice: later: generate random id.
       
   892 
       
   893     using namespace NPresencePlugin::NPresence;
       
   894     using namespace NPresenceInfo::NFieldType;
       
   895 
       
   896     const MPresenceInfoFieldCollection& coll = aInfo->Fields();
       
   897 
       
   898     const MPresenceInfoField* statusEmumField = NULL;
       
   899     const MPresenceInfoField* messageField = NULL;
       
   900 
       
   901     TInt myCount = coll.FieldCount();
       
   902     for ( TInt i = 0; i < myCount; i++ )
       
   903         {
       
   904         DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL 1");
       
   905         
       
   906         const MPresenceInfoField& field =  coll.FieldAt( i );
       
   907         const TDesC8& fieldType = field.FieldType();
       
   908         TBuf<KBufSize100> printBuf;
       
   909         printBuf.Copy( fieldType );
       
   910    
       
   911         if ( !fieldType.Compare( KAvatar ) )
       
   912            {
       
   913            // Do nothing in sawfis, maybe later?
       
   914            }
       
   915         else if ( !fieldType.Compare( KAvailabilityEnum ) )
       
   916             {
       
   917             DP_SDA("AddPrPersToSimpleDocumentL Avaibility");
       
   918             statusEmumField = &field;
       
   919             DP_SDA("AddPrPersToSimpleDocumentL Avaibility done");
       
   920             }          
       
   921         else if ( !fieldType.Compare( KStatusMessage ) )
       
   922             {
       
   923             DP_SDA("AddPrPersToSimpleDocumentL statusmessage");
       
   924             messageField = &field;
       
   925             }
       
   926         }
       
   927     if ( statusEmumField )
       
   928         {
       
   929         DoCreateDocumentL( aDocument, aSipId, 
       
   930             statusEmumField, messageField );            
       
   931         }
       
   932     
       
   933         
       
   934     DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL end");
       
   935     }
       
   936     
       
   937     
       
   938 // ---------------------------------------------------------------------------
       
   939 // CPresencePluginData::CreatePresenceUri8LC
       
   940 // ---------------------------------------------------------------------------
       
   941 //
       
   942 HBufC8* CPresencePluginData::CreatePresenceUri8LC( 
       
   943     const TDesC8& aPresentityUri )
       
   944     {
       
   945     DP_SDA("CPresencePluginData::CreatePresenceUri8LC ");
       
   946     const TInt KMyLenSipPrefix = 4;
       
   947     const TInt KMyLenSipsPrefix = 5;
       
   948     _LIT8( KMySip8, "sip:" );
       
   949     _LIT8( KMySips8, "sips:" ); 
       
   950     TInt uriLen = aPresentityUri.Length();
       
   951     DP_SDA2( "CPresencePluginData::CreatePresenceUri8LC - param length: %d ", uriLen );
       
   952     
       
   953     //For debugging purposes
       
   954     //TBuf<256> tmpPresentityUri; 
       
   955     //tmpPresentityUri.Copy( aPresentityUri );
       
   956     //DP_SDA2( "CPresencePluginData::CreatePresenceUri8LC - URI: %S ", &tmpPresentityUri );
       
   957     
       
   958     HBufC8* buf = HBufC8::NewLC( uriLen );
       
   959     TPtr8 pBuf( buf->Des() );
       
   960     
       
   961     //SIP uri check
       
   962     if ( !aPresentityUri.Left( KMyLenSipPrefix ).CompareF( KMySip8 ) )
       
   963         {
       
   964         DP_SDA("CPresencePluginData::CreatePresenceUri8LC (sip:) prefix in SIP URI ");
       
   965         pBuf.Append( aPresentityUri );
       
   966         }
       
   967     else if ( !aPresentityUri.Left( KMyLenSipsPrefix ).CompareF( KMySips8 ) )
       
   968         {
       
   969         DP_SDA( "CPresencePluginData::CreatePresenceUri8LC (sips:) prefix in SIP URI " );
       
   970         pBuf.Append( aPresentityUri );
       
   971         }
       
   972     else // No prefix, strange ...
       
   973         {
       
   974         DP_SDA( "CPresencePluginData::CreatePresenceUri8LC NO prefix in SIP URI, adding... " );
       
   975         // Maybe should check which prefix to use,
       
   976         // but assume that no secure is used if prefix missing
       
   977         TInt len = aPresentityUri.Length() + KMyLenSipPrefix;
       
   978         buf = buf->ReAllocL( len );
       
   979         //update pointer after realloc
       
   980         CleanupStack::Pop( buf );
       
   981         CleanupStack::PushL( buf );
       
   982         // Since realloc may have changed the location in memory
       
   983         // we must also reset ptr
       
   984         pBuf.Set( buf->Des() );
       
   985         pBuf.Append( KMySip8 );
       
   986         pBuf.Append( aPresentityUri );
       
   987         }   
       
   988     return buf; 
       
   989     } 
       
   990     
       
   991 // ---------------------------------------------------------------------------
       
   992 // CPresencePluginData::RemovePrefixLC
       
   993 // ---------------------------------------------------------------------------
       
   994 //
       
   995 HBufC16* CPresencePluginData::RemovePrefixLC( 
       
   996     const TDesC& aPresentityUri )
       
   997     {
       
   998     DP_SDA2("CPresencePluginData::RemovePrefixLC, uri: %S", &aPresentityUri );
       
   999 
       
  1000     HBufC* withouPrefix = HBufC::NewLC( KBufSize255 );
       
  1001     TPtr withouPrefixPtr( withouPrefix->Des() );
       
  1002     
       
  1003     TInt prefixLocation = aPresentityUri.Locate( ':' );
       
  1004     DP_SDA2("CPresencePluginData::RemovePrefixLC, prefix pos: %d", prefixLocation );
       
  1005     if ( KErrNotFound != prefixLocation )
       
  1006         {
       
  1007         DP_SDA("CPresencePluginData::RemovePrefixLC - has prefix");        
       
  1008         withouPrefixPtr.Copy( aPresentityUri.Mid( prefixLocation+1 ) );
       
  1009         DP_SDA("CPresencePluginData::RemovePrefixLC - copy ok");        
       
  1010         }
       
  1011     else
       
  1012         {
       
  1013         DP_SDA("CPresencePluginData::RemovePrefixLC - has no prefix");        
       
  1014         withouPrefixPtr.Copy( aPresentityUri );
       
  1015         }    
       
  1016         
       
  1017     //DP_SDA2("CPresencePluginData::RemovePrefixLC - returns %S", *withouPrefix );            
       
  1018     return withouPrefix;
       
  1019     }     
       
  1020        
       
  1021 // ---------------------------------------------------------------------------
       
  1022 // CPresencePluginData::DoCreateDocumentL()
       
  1023 // ---------------------------------------------------------------------------
       
  1024 //    
       
  1025 void CPresencePluginData::DoCreateDocumentL( 
       
  1026     MSimpleDocument& aDocument,
       
  1027     const TDesC8& aSipId,
       
  1028     const MPresenceInfoField* aStatusField,
       
  1029     const MPresenceInfoField* aMessageField )
       
  1030     {    
       
  1031     DP_SDA("CPresencePluginData::DoCreateDocumentL ");
       
  1032     const TInt KNumBuf = 20;
       
  1033     const TInt KTupleBuf = 10;
       
  1034     
       
  1035     using namespace NPresencePlugin::NPresence;
       
  1036     using namespace NPresencePlugin::NPresenceStates;
       
  1037     using namespace NPresenceInfo::NFieldType;
       
  1038 
       
  1039     TBuf<KNumBuf> numBuf;
       
  1040     TBuf<KTupleBuf> tupleBuf;
       
  1041 
       
  1042     tupleBuf.Copy( KIndent );
       
  1043     numBuf.Num( iNumBuf );
       
  1044     tupleBuf.Append( numBuf );
       
  1045     DP_SDA2("CPresencePluginData::DoCreateDocumentL id %d", iNumBuf);
       
  1046 	DP_SDA("CPresencePluginData::DoCreateDocumentL 2");
       
  1047     
       
  1048 	//Add tuple id to document
       
  1049     MSimpleElement* tuple = aDocument.AddSimpleElementL( KPresenceTuple8 );
       
  1050     CleanupClosePushL( *tuple );
       
  1051     tuple->AddAttrL( KPresenceId8, tupleBuf);
       
  1052     
       
  1053     //Presence status field
       
  1054     MSimpleElement* status = tuple->AddSimpleElementL( KPresenceStatus8 );
       
  1055     CleanupClosePushL( *status );
       
  1056     
       
  1057     //basic field
       
  1058     MSimpleElement* basic = status->AddSimpleElementL( KPresenceBasic8 );
       
  1059     CleanupClosePushL( *basic );
       
  1060     
       
  1061     basic->SetContentUnicodeL( DoCheckBasicStatusValueL( *aStatusField ) );
       
  1062     
       
  1063     DP_SDA("CPresencePluginData::DoCreateDocumentL Basic ok, check msg"); 
       
  1064     
       
  1065     if ( aMessageField )
       
  1066         {
       
  1067         DP_SDA("CPresencePluginData::DoCreateDocumentL message field"); 
       
  1068         //Creating note 
       
  1069         MSimpleElement* note =
       
  1070             aDocument.AddSimpleElementL( KPresenceNote8 );
       
  1071         CleanupClosePushL( *note );        
       
  1072         
       
  1073         // Get status msg field from info field
       
  1074         const MPresenceInfoFieldValueText* textField = 
       
  1075             TXIMPGetInterface< 
       
  1076                 const MPresenceInfoFieldValueText >::From(
       
  1077                 aMessageField->FieldValue(), 
       
  1078                     MXIMPBase::EPanicIfUnknown );
       
  1079         note->SetContentUnicodeL( textField->TextValue() );
       
  1080         CleanupStack::PopAndDestroy( note );
       
  1081         }
       
  1082 
       
  1083     /* Basic model example
       
  1084     <tuple id="c8dqui">
       
  1085           <status>
       
  1086             <basic>open</basic>
       
  1087           </status>
       
  1088              <ts:basic>closed</ts:basic>
       
  1089           </ts:timed-status>
       
  1090           <contact>sip:someone@example.com</contact>
       
  1091         </tuple>
       
  1092     <note>sleeping</note>    
       
  1093     </presence>
       
  1094     */
       
  1095     
       
  1096     DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence person");
       
  1097     //Creatin person presence field
       
  1098     MSimpleElement* pers =
       
  1099     	aDocument.AddSimpleElementL( KSimpleNsPDM, KPresencePerson8 );
       
  1100     CleanupClosePushL( *pers );
       
  1101     TBuf<KBufSize10> buf;
       
  1102     TBuf<KBufSize20> personId;
       
  1103     personId.Copy( KPersonId );
       
  1104     buf.Num( iNumBuf );
       
  1105     personId.Append( buf );
       
  1106     pers->AddAttrL( KPresenceId8, personId );
       
  1107     DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence person ok");
       
  1108     
       
  1109     HBufC8* urlBuf = CreatePresenceUri8LC( aSipId );
       
  1110     DP_SDA("CPresencePluginData::DoCreateDocumentL Push urlBuf"); 
       
  1111       
       
  1112     aDocument.SetEntityURIL( urlBuf->Des() );
       
  1113     DP_SDA("CPresencePluginData::DoCreateDocumentL 2");
       
  1114 
       
  1115     DP_SDA("CPresencePluginData::DoCreateDocumentLC Rich presence activities");
       
  1116     MSimpleElement* activ = pers->AddSimpleElementL( 
       
  1117         KSimpleNsRPID, KPresenceActivities8 );
       
  1118     CleanupClosePushL( *activ );
       
  1119     
       
  1120     //unknown used if person presence is just open or closed
       
  1121     MSimpleElement* unknown = activ->AddSimpleElementL( 
       
  1122         KSimpleNsRPID, DoCheckActivitiesValueL( *aStatusField ) );
       
  1123     DP_SDA("CPresencePluginData::DoCreateDocumentL, unknown/status element created");  
       
  1124     CleanupClosePushL( *unknown );
       
  1125    
       
  1126     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy unknown");  
       
  1127     CleanupStack::PopAndDestroy( unknown );
       
  1128     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy activ");  
       
  1129     CleanupStack::PopAndDestroy( activ ); 
       
  1130     
       
  1131     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy urlBuf");
       
  1132     CleanupStack::PopAndDestroy( urlBuf );
       
  1133 
       
  1134     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy pers");  
       
  1135     CleanupStack::PopAndDestroy( pers );    
       
  1136     DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence activities ok");
       
  1137 
       
  1138     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy basic");
       
  1139     CleanupStack::PopAndDestroy( basic );
       
  1140     
       
  1141     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy status");
       
  1142     CleanupStack::PopAndDestroy( status );
       
  1143     
       
  1144     DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy tuple");
       
  1145     CleanupStack::PopAndDestroy( tuple );   
       
  1146     DP_SDA("CPresencePluginData::DoCreateDocumentL end");    
       
  1147     }
       
  1148 
       
  1149 // ---------------------------------------------------------------------------
       
  1150 // CPresencePluginData::DoCheckBasicStatusValueL()
       
  1151 // ---------------------------------------------------------------------------
       
  1152 //
       
  1153 TPtrC CPresencePluginData::DoCheckBasicStatusValueL(
       
  1154 	const MPresenceInfoField& aField )
       
  1155 	{
       
  1156     using namespace NPresencePlugin::NPresence;
       
  1157     using namespace NPresencePlugin::NPresenceStates;
       
  1158     using namespace NPresenceInfo::NFieldType;
       
  1159     
       
  1160 	TPtrC basicStatus( KPresenceOpen ); //default status open
       
  1161 	//First check what is person status value
       
  1162 	const MXIMPBase& storage = aField.FieldValue();
       
  1163     const MPresenceInfoFieldValueEnum* enumObject =
       
  1164           TXIMPGetInterface< const MPresenceInfoFieldValueEnum >::
       
  1165           From( storage,MXIMPBase::EReturnNullIfUnknown );
       
  1166     
       
  1167     __ASSERT_ALWAYS( NULL != enumObject, User::Leave( KErrArgument ) );
       
  1168 
       
  1169     DP_SDA2(" DoCheckBasicStatusValueL - enumValue: %d", enumObject->Value() );
       
  1170     switch ( enumObject->Value() )
       
  1171         {
       
  1172         case NPresenceInfo::EAvailable:
       
  1173             {
       
  1174 			DP_SDA("DoCheckBasicStatusValueL stopPublish false status open");
       
  1175 			iConnObs.SetStopPublishState( EFalse );
       
  1176 			basicStatus.Set( KPresenceOpen );
       
  1177             }
       
  1178             break;
       
  1179             
       
  1180         case NPresenceInfo::EOffline:
       
  1181         case NPresenceInfo::EHidden:
       
  1182         case NPresenceInfo::ENotAvailable:
       
  1183             {
       
  1184 			//If state is closed we can stop publish
       
  1185 			//if client is going to offline
       
  1186 			DP_SDA("DoCheckBasicStatusValueL stopPublish true status Closed");
       
  1187 			iConnObs.SetStopPublishState( ETrue );
       
  1188 			basicStatus.Set( KPresenceClosed );                
       
  1189             }
       
  1190             break;                
       
  1191             
       
  1192         default:
       
  1193             {
       
  1194 			DP_SDA("DoCheckBasicStatusValueL stopPublish false else open");
       
  1195 			iConnObs.SetStopPublishState( EFalse );
       
  1196 			basicStatus.Set( KPresenceOpen );                
       
  1197             }
       
  1198             break;    
       
  1199         }
       
  1200     return basicStatus;
       
  1201 	}
       
  1202 
       
  1203 // ---------------------------------------------------------------------------
       
  1204 // CPresencePluginData::DoCheckActivitiesValueL()
       
  1205 // ---------------------------------------------------------------------------
       
  1206 //
       
  1207 TPtrC8 CPresencePluginData::DoCheckActivitiesValueL(
       
  1208 	const MPresenceInfoField& aField )
       
  1209 	{
       
  1210 	using namespace NPresencePlugin::NPresence;
       
  1211     using namespace NPresencePlugin::NPresenceStates;
       
  1212     using namespace NPresenceInfo::NFieldType;
       
  1213     
       
  1214 	TPtrC8 activities( KPresenceUnknow8 ); //default activities unknown
       
  1215 	
       
  1216 	const MXIMPBase& storage = aField.FieldValue();
       
  1217     const MPresenceInfoFieldValueEnum* enumObject =
       
  1218           TXIMPGetInterface< const MPresenceInfoFieldValueEnum >::
       
  1219           From( storage,MXIMPBase::EReturnNullIfUnknown );
       
  1220     
       
  1221     __ASSERT_ALWAYS( NULL != enumObject, User::Leave( KErrArgument ) );
       
  1222 
       
  1223     DP_SDA2(" DoCheckActivitiesValueL - enumValue: %d", enumObject->Value() );
       
  1224     switch ( enumObject->Value() )
       
  1225         {
       
  1226         case NPresenceInfo::EAvailable:
       
  1227             {
       
  1228             DP_SDA("DoCheckActivitiesValueL - available, set publish");
       
  1229     		iConnObs.SetStopPublishState( EFalse );
       
  1230     		DP_SDA("DoCheckActivitiesValueL - available, set value");
       
  1231     		activities.Set( KPresenceUnknow8 );
       
  1232     		DP_SDA("DoCheckActivitiesValueL - available, ok");
       
  1233             }
       
  1234             break;
       
  1235             
       
  1236         case NPresenceInfo::EOffline:
       
  1237         case NPresenceInfo::ENotAvailable:
       
  1238             {
       
  1239             DP_SDA("DoCheckActivitiesValueL - offline/not available");
       
  1240     		iConnObs.SetStopPublishState( ETrue );
       
  1241     		activities.Set( KPresenceUnknow8 );
       
  1242             }
       
  1243             break;                
       
  1244             
       
  1245         case NPresenceInfo::EBusy:
       
  1246             {
       
  1247             DP_SDA("DoCheckActivitiesValueL - busy");
       
  1248     		iConnObs.SetStopPublishState( EFalse );
       
  1249     		activities.Set( KPresenceBusy8 );
       
  1250             }
       
  1251             break;
       
  1252             
       
  1253         case NPresenceInfo::EExtAway:
       
  1254         case NPresenceInfo::EAway:
       
  1255             {
       
  1256             DP_SDA("DoCheckActivitiesValueL - away");
       
  1257     		iConnObs.SetStopPublishState( EFalse );
       
  1258     		activities.Set( KPresenceAway8 );
       
  1259             }
       
  1260             break;
       
  1261             
       
  1262         case NPresenceInfo::EOnPhone:
       
  1263             {
       
  1264             DP_SDA("DoCheckActivitiesValueL - on phone");
       
  1265     		iConnObs.SetStopPublishState( EFalse );
       
  1266     		activities.Set( KPresenceOnThePhone8 );
       
  1267             }
       
  1268             break;
       
  1269 
       
  1270         
       
  1271         case NPresenceInfo::EDoNotDisturb:
       
  1272             {
       
  1273             DP_SDA("DoCheckActivitiesValueL - dnd");
       
  1274     		iConnObs.SetStopPublishState( EFalse );
       
  1275     		activities.Set( KPresenceDoNotDisturb8 );
       
  1276             }
       
  1277             break;
       
  1278             
       
  1279         default:
       
  1280             {
       
  1281 			DP_SDA("DoCheckActivitiesValueL default => unknown");
       
  1282     		iConnObs.SetStopPublishState( EFalse );
       
  1283     		activities.Set( KPresenceUnknow8  );
       
  1284             }
       
  1285             break;    
       
  1286         }
       
  1287     DP_SDA("DoCheckActivitiesValueL - done and return");        
       
  1288     return activities;
       
  1289 	}
       
  1290 
       
  1291 // ---------------------------------------------------------------------------
       
  1292 // CPresencePluginData::DoCheckNoteValueL()
       
  1293 // ---------------------------------------------------------------------------
       
  1294 //
       
  1295 TPtrC CPresencePluginData::DoCheckNoteValueL(
       
  1296     const MPresenceInfoField& aField )
       
  1297     {
       
  1298     using namespace NPresencePlugin::NPresence;
       
  1299     using namespace NPresencePlugin::NPresenceStates;
       
  1300     using namespace NPresenceInfo::NFieldType;
       
  1301     
       
  1302     TPtrC note( KPresenceUnknow ); //default activities unknown
       
  1303     //First check what is person status value
       
  1304     const MXIMPBase& storage = aField.FieldValue();
       
  1305     const MPresenceInfoFieldValueText* text =
       
  1306           TXIMPGetInterface< const MPresenceInfoFieldValueText >::
       
  1307           From( storage,MXIMPBase::EReturnNullIfUnknown );
       
  1308     
       
  1309     __ASSERT_ALWAYS( NULL != text, User::Leave( KErrArgument ) );
       
  1310 
       
  1311     TBuf<KBufSize200> buffer;
       
  1312     buffer.Copy( text->TextValue() );
       
  1313 
       
  1314     //Check if status is closed
       
  1315     if( !buffer.CompareF( KPresenceClosed ) )
       
  1316         {
       
  1317         //If state is closed we can stop publish 
       
  1318         //if client is going to offline
       
  1319         DP_SDA("DoCheckNoteValueL stopPublish true closed");
       
  1320         iConnObs.SetStopPublishState( ETrue );
       
  1321         note.Set( KPresenceOffline );       
       
  1322         }
       
  1323     else if( !buffer.CompareF( KPresenceOpen ) )
       
  1324         {
       
  1325         DP_SDA("DoCheckNoteValueL stopPublish false open");
       
  1326         iConnObs.SetStopPublishState( EFalse );
       
  1327         note.Set( KPresenceAvailable );
       
  1328         }
       
  1329     else if( !buffer.CompareF( KPresenceBusy ) )
       
  1330         {
       
  1331         DP_SDA("DoCheckNoteValueL activities BUSY");
       
  1332         iConnObs.SetStopPublishState( EFalse );
       
  1333         note.Set( KPresenceBusy );
       
  1334         }
       
  1335     else if( !buffer.CompareF( KPresenceOnThePhone ) )
       
  1336         {
       
  1337         DP_SDA("DoCheckNoteValueL activities OnThePhone");
       
  1338         iConnObs.SetStopPublishState( EFalse );
       
  1339         note.Set( KPresenceOnThePhone );
       
  1340         }
       
  1341     else if( !buffer.CompareF( KPresenceAway ) )
       
  1342         {
       
  1343         DP_SDA("DoCheckNoteValueL activities OnThePhone");
       
  1344         iConnObs.SetStopPublishState( EFalse );
       
  1345         note.Set( KPresenceAway );
       
  1346         }
       
  1347     else
       
  1348         {
       
  1349         DP_SDA("DoCheckNoteValueL stopPublish false");
       
  1350         iConnObs.SetStopPublishState( EFalse );
       
  1351         note.Set( KPresenceUnknow  );
       
  1352         }
       
  1353     return note;
       
  1354     }
       
  1355 
       
  1356 
       
  1357 // ---------------------------------------------------------------------------
       
  1358 // CPresencePluginData::GenerateTupleId()
       
  1359 // ---------------------------------------------------------------------------
       
  1360 //
       
  1361 TInt CPresencePluginData::GenerateTupleId()
       
  1362     {
       
  1363     // Generate unique session tuple id
       
  1364     DP_SDA("CPresencePluginData::GenerateTupleId start");
       
  1365     const TInt KMaxRand = KMaxNumber;
       
  1366     TInt64 seed;
       
  1367     TTime time;
       
  1368     time.HomeTime();
       
  1369     seed = time.Int64();
       
  1370     TInt random = Math::Rand( seed ) % KMaxRand;
       
  1371     DP_SDA("CPresencePluginData::GenerateTupleId 1");
       
  1372     return random; 
       
  1373     }
       
  1374 
       
  1375 // ---------------------------------------------------------------------------
       
  1376 // CPresencePluginData::ServiceId()
       
  1377 // ---------------------------------------------------------------------------
       
  1378 //
       
  1379 TInt CPresencePluginData::ServiceId()
       
  1380     {
       
  1381     return iServiceId;
       
  1382     }
       
  1383     
       
  1384 // ---------------------------------------------------------------------------
       
  1385 // CPresencePluginData::WriteBlockItemsToCacheL()
       
  1386 // ---------------------------------------------------------------------------
       
  1387 //    
       
  1388 void CPresencePluginData::WriteStatusToCacheL(
       
  1389     const TDesC& aPresentityId, 
       
  1390     MPresenceBuddyInfo2::TAvailabilityValues aAvailability,
       
  1391     const TDesC& aAvailabilityText,
       
  1392     const TDesC& aStatusMessage )
       
  1393     {
       
  1394     DP_SDA( "CPresencePluginData::WriteStatusToCacheL start" );
       
  1395     DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, aStatus: %d", 
       
  1396         aAvailability );
       
  1397     DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, availabilityText: %S", 
       
  1398         &aAvailabilityText );
       
  1399     DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, statusMessage: %S", 
       
  1400         &aStatusMessage );
       
  1401     
       
  1402     CSPSettings* spSettings = CSPSettings::NewL();
       
  1403     CleanupStack::PushL( spSettings );
       
  1404     // Resolve service name (cache xsp identifier)
       
  1405     CSPEntry* entry = CSPEntry::NewLC();
       
  1406     spSettings->FindEntryL( ServiceId(), *entry );
       
  1407 
       
  1408     TInt cacheUriLength = ( entry->GetServiceName().Length() + 
       
  1409         aPresentityId.Length() + 1 );
       
  1410     
       
  1411     DP_SDA2(" -> cache uri length: %d", cacheUriLength );    
       
  1412     
       
  1413     HBufC* cacheUri = HBufC::NewLC( cacheUriLength );
       
  1414     TPtr cacheUriPtr( cacheUri->Des() );
       
  1415     
       
  1416     DP_SDA(" -> WriteStatusToCacheL - form cache entry");
       
  1417     cacheUriPtr.Append( entry->GetServiceName() );
       
  1418     cacheUriPtr.Append( ':' );
       
  1419     cacheUriPtr.Append( aPresentityId );
       
  1420     
       
  1421     MPresenceBuddyInfo2* buddyPresInfo = MPresenceBuddyInfo2::NewLC();
       
  1422     buddyPresInfo->SetIdentityL( cacheUriPtr );
       
  1423 
       
  1424     TBuf<20> buf;
       
  1425     TBool handled = EFalse;
       
  1426     
       
  1427     buf.Copy( KBlockedExtensionValue );
       
  1428    
       
  1429     if( aAvailabilityText.Compare( buf ) == 0 )
       
  1430         {
       
  1431         DP_SDA( " -> WriteStatusToCacheL - set Blocked" );
       
  1432         buddyPresInfo->SetAnyFieldL( KExtensionKey, KBlockedExtensionValue );
       
  1433         handled = ETrue;
       
  1434         }
       
  1435     
       
  1436     buf.Copy( KPendingRequestExtensionValue );
       
  1437     
       
  1438     if ( aAvailabilityText.Compare( buf ) == 0 )
       
  1439         {
       
  1440         DP_SDA( " -> WriteStatusToCacheL - set Pending request" );
       
  1441         buddyPresInfo->SetAnyFieldL( KExtensionKey, KPendingRequestExtensionValue );
       
  1442         handled = ETrue;
       
  1443         }
       
  1444     
       
  1445     if ( !handled )
       
  1446         {
       
  1447         DP_SDA( " -> WriteStatusToCacheL - set availability text" );
       
  1448             buddyPresInfo->SetAvailabilityL( aAvailability, aAvailabilityText );
       
  1449         }
       
  1450     
       
  1451     if ( aStatusMessage.Length() )
       
  1452         {
       
  1453         DP_SDA( " -> WriteStatusToCacheL - set status message" ); 
       
  1454         buddyPresInfo->SetStatusMessageL( aStatusMessage );
       
  1455         }
       
  1456 
       
  1457     DP_SDA( " -> WriteStatusToCacheL - write presence to cache" );    
       
  1458     TInt cacheError = iPresenceCacheWriter->WritePresenceL( buddyPresInfo );
       
  1459     DP_SDA2( "CPresencePluginEntityWatcher::WriteStatusToCacheL error: %d", 
       
  1460         cacheError );
       
  1461     
       
  1462     DP_SDA( " -> destroy buddy info" );    
       
  1463     CleanupStack::PopAndDestroy(); // buddyPresInfo
       
  1464     DP_SDA(" -> destroy uri");    
       
  1465     CleanupStack::PopAndDestroy( cacheUri );
       
  1466 
       
  1467     DP_SDA(" -> destroy sp entry");        
       
  1468     CleanupStack::PopAndDestroy( entry );        
       
  1469     DP_SDA(" -> destroy sp");        
       
  1470     CleanupStack::PopAndDestroy( spSettings );
       
  1471     DP_SDA("CPresencePluginData::WriteStatusToCacheL end");
       
  1472     }     
       
  1473     
       
  1474 // ---------------------------------------------------------------------------
       
  1475 // CPresencePluginData::RemoveCacheL()
       
  1476 // ---------------------------------------------------------------------------
       
  1477 //      
       
  1478 void CPresencePluginData::RemoveCacheL()
       
  1479     {
       
  1480     DP_SDA("CPresencePluginData::RemoveCacheL");
       
  1481     
       
  1482     // Resolve service name (cache xsp identifier)
       
  1483     CSPSettings* spSettings = CSPSettings::NewL();
       
  1484     CleanupStack::PushL( spSettings );
       
  1485     CSPEntry* entry = CSPEntry::NewLC();
       
  1486     DP_SDA2(" -> RemoveCacheL look for service: %d", ServiceId() );
       
  1487     spSettings->FindEntryL( ServiceId(), *entry );
       
  1488 
       
  1489     DP_SDA(" -> RemoveCacheL cache xsp identifier found");
       
  1490     TInt cacheUriLength = entry->GetServiceName().Length();
       
  1491     DP_SDA2(" -> cache uri length: %d", cacheUriLength );    
       
  1492     
       
  1493     HBufC* cacheUri = HBufC::NewLC( cacheUriLength );
       
  1494     TPtr cacheUriPtr( cacheUri->Des() );
       
  1495     
       
  1496     DP_SDA(" -> RemoveCacheL - form cache entry");
       
  1497     cacheUriPtr.Append( entry->GetServiceName() );
       
  1498     
       
  1499     DP_SDA(" -> RemoveCacheL - delete cache entries");
       
  1500     TInt error = iPresenceCacheWriter->DeleteService( cacheUriPtr );
       
  1501     DP_SDA2(" -> RemoveCacheL - delete error: %d", error );
       
  1502     CleanupStack::PopAndDestroy( cacheUri );
       
  1503 
       
  1504     DP_SDA(" -> destroy sp entry");        
       
  1505     CleanupStack::PopAndDestroy( entry );        
       
  1506     DP_SDA(" -> destroy sp");        
       
  1507     CleanupStack::PopAndDestroy( spSettings );
       
  1508     DP_SDA("CPresencePluginData::RemoveCacheL out");
       
  1509     }
       
  1510     
       
  1511 // ---------------------------------------------------------------------------
       
  1512 // CPresencePluginData::DeletePresenceL()
       
  1513 // ---------------------------------------------------------------------------
       
  1514 //      
       
  1515 void CPresencePluginData::DeletePresenceL( const TDesC& aIdentity )
       
  1516     {
       
  1517     DP_SDA("CPresencePluginData::DeletePresenceL");
       
  1518     
       
  1519     // Resolve service name (cache xsp identifier)
       
  1520     CSPSettings* spSettings = CSPSettings::NewL();
       
  1521     CleanupStack::PushL( spSettings );
       
  1522     CSPEntry* entry = CSPEntry::NewLC();
       
  1523     DP_SDA2(" -> DeletePresenceL look for service: %d", ServiceId() );
       
  1524     spSettings->FindEntryL( ServiceId(), *entry );
       
  1525 
       
  1526     DP_SDA(" -> DeletePresenceL cache xsp identifier found");
       
  1527     TInt cacheUriLength = ( entry->GetServiceName().Length() + 
       
  1528         aIdentity.Length() + 1 );
       
  1529     DP_SDA2(" -> cache uri length: %d", cacheUriLength );    
       
  1530     
       
  1531     HBufC* cacheUri = HBufC::NewLC( cacheUriLength );
       
  1532     TPtr cacheUriPtr( cacheUri->Des() );
       
  1533     
       
  1534     DP_SDA(" -> DeletePresenceL - form cache entry");
       
  1535     cacheUriPtr.Append( entry->GetServiceName() );
       
  1536     cacheUriPtr.Append( ':' );
       
  1537     cacheUriPtr.Append( aIdentity );
       
  1538 
       
  1539     iPresenceCacheWriter->DeletePresenceL( cacheUriPtr );
       
  1540     
       
  1541     CleanupStack::PopAndDestroy( cacheUri ); 
       
  1542     CleanupStack::PopAndDestroy( entry ); 
       
  1543     DP_SDA(" -> destroy sp");        
       
  1544     CleanupStack::PopAndDestroy( spSettings );
       
  1545     DP_SDA("CPresencePluginData::DeletePresenceL out");
       
  1546     }    
       
  1547     
       
  1548 // ---------------------------------------------------------------------------
       
  1549 // CPresencePluginData::StorePresenceOwnPresenceL()
       
  1550 // ---------------------------------------------------------------------------
       
  1551 //    
       
  1552 void CPresencePluginData::StorePresenceOwnPresenceL(
       
  1553     const TUint aServiceId, 
       
  1554     NPresenceInfo::TAvailabilityValues aAvailability,
       
  1555     const TDesC& aStatusMessage )
       
  1556     {  
       
  1557     DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL IN");
       
  1558     DP_SDA2(" -> aServiceId: %d", aServiceId );
       
  1559         
       
  1560     DP_SDA2(" -> SAVE AVAILABILITY VALUE: %d", aAvailability );
       
  1561     DP_SDA2(" -> SAVE STATUS MESSAGE: %S", &aStatusMessage );
       
  1562        
       
  1563     MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC();
       
  1564     
       
  1565     DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL 1");
       
  1566     
       
  1567     // Store availability value to uiservicetabsettings
       
  1568     TInt availabilityInt = ( ( TInt ) aAvailability );
       
  1569     User::LeaveIfError( settings->SetL( 
       
  1570         aServiceId, EServicePresenceAvailablilityValue, availabilityInt ) );
       
  1571     
       
  1572     DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL 2");
       
  1573     
       
  1574     // Store custom status message to uiservicetabsettings
       
  1575     User::LeaveIfError( settings->SetL( 
       
  1576         aServiceId, EServiceCustomStatusMessage, aStatusMessage ) );
       
  1577     
       
  1578     CleanupStack::PopAndDestroy(); //settings
       
  1579     
       
  1580     DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL OUT");
       
  1581     }
       
  1582     
       
  1583 // ---------------------------------------------------------------------------
       
  1584 // CPresencePluginData::ReadDocumentIdL()
       
  1585 // ---------------------------------------------------------------------------
       
  1586 //    
       
  1587 void CPresencePluginData::ReadDocumentIdL(
       
  1588     const TInt aServiceId, 
       
  1589     TDes8& aDocumentId )
       
  1590     {  
       
  1591     DP_SDA("CPresencePluginData::ReadDocumentIdL IN");
       
  1592     
       
  1593     DP_SDA2(" -> aServiceId: %d", aServiceId );
       
  1594     
       
  1595     MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC();
       
  1596     
       
  1597     RBuf8 documentId;
       
  1598     CleanupClosePushL( documentId );
       
  1599     documentId.CreateL( KBufSize255 );
       
  1600     
       
  1601     TInt error = settings->GetL( 
       
  1602         aServiceId, EServicePresenceSessionIdentifier, documentId );
       
  1603     
       
  1604     DP_SDA2(" -> ERROR: %d", error );
       
  1605     DP_SDA2(" -> DOCUMENT ID LENGTH: %d", documentId.Length() );
       
  1606         
       
  1607     if ( !error && documentId.Length() )
       
  1608         {
       
  1609         aDocumentId.Copy( documentId );
       
  1610         
       
  1611         TBuf<KBufSize255> printDocumentId;
       
  1612         printDocumentId.Copy( aDocumentId );
       
  1613         DP_SDA("CPresencePluginData::ReadDocumentIdL - 1");
       
  1614         DP_SDA2(" -> READ DOCUMENT ID: %S", &printDocumentId );
       
  1615         }
       
  1616     else if ( KErrNotFound == error || !documentId.Length() )
       
  1617         {
       
  1618         DP_SDA("CPresencePluginData::ReadDocumentIdL - 2");
       
  1619         // If document id lenght is zero (KNullDesC8) or error
       
  1620         // is KErrNotFound leave with KErrNotFound
       
  1621         User::Leave( KErrNotFound );
       
  1622         }
       
  1623     else
       
  1624         {
       
  1625         User::Leave( error );
       
  1626         }
       
  1627     
       
  1628     CleanupStack::PopAndDestroy( &documentId );
       
  1629     CleanupStack::PopAndDestroy(); //settings
       
  1630     
       
  1631     DP_SDA("CPresencePluginData::ReadDocumentIdL OUT");
       
  1632     }   
       
  1633     
       
  1634 // ---------------------------------------------------------------------------
       
  1635 // CPresencePluginData::DeletePresenceVariablesL()
       
  1636 // ---------------------------------------------------------------------------
       
  1637 //    
       
  1638 void CPresencePluginData::DeletePresenceVariablesL( const TInt aServiceId )
       
  1639     {  
       
  1640     DP_SDA("CPresencePluginData::DeletePresenceVariablesL IN");
       
  1641     DP_SDA2(" -> aServiceId: %d", aServiceId );
       
  1642         
       
  1643     MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC();
       
  1644     
       
  1645     // Reset availability value in uiservicetabsettings
       
  1646     User::LeaveIfError( settings->SetL( 
       
  1647         aServiceId, EServicePresenceAvailablilityValue, KErrNotFound ) );
       
  1648        
       
  1649     // Reset status message in uiservicetabsettings
       
  1650     User::LeaveIfError( settings->SetL( 
       
  1651         aServiceId, EServiceCustomStatusMessage, KNullDesC ) );
       
  1652     
       
  1653     // Reset document id value in uiservicetabsettings
       
  1654     User::LeaveIfError( settings->SetL( 
       
  1655         aServiceId, EServicePresenceSessionIdentifier, KNullDesC8 ) );
       
  1656     
       
  1657     CleanupStack::PopAndDestroy(); // settings
       
  1658     
       
  1659     DP_SDA("CPresencePluginData::DeletePresenceVariablesL OUT");
       
  1660     }   
       
  1661         
       
  1662 // End of file