presadap12/impsplugin/src/presencepublishing/cpresencenotificationhandler.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presadap12/impsplugin/src/presencepublishing/cpresencenotificationhandler.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,772 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  IMPS Protocol implementation for Presence Framework
+*
+*/
+
+
+#include <ximpprotocolconnectionhost.h>
+#include "cpresencenotificationhandler.h"
+#include "impsconnectionmanagercontrolif.h"
+#include "impsdebugprint.h"
+#include "CImpsPluginAccessHandler.h"
+#include "CImpsPluginPureDataHandler.h"
+#include "impsplugintags.h"
+
+#include "CPEngXMLParser.h"
+#include "MPEngXMLParser.h"
+#include "CPEngXmlSerializer.h"
+#include "MPEngXmlSerializer.h"
+#include "CImpsPluginConnectionManager.h"
+#include "PEngXMLTags.h"
+
+#include <ximpobjectfactory.h>
+#include <ximpobjectcollection.h>
+#include <protocolpresentitygroupsdatahost.h>
+#include <presentitygroupinfo.h>
+#include <presentitygroupmemberinfo.h>
+#include <ximpidentity.h>
+#include <protocolpresencepublishingdatahost.h>
+#include <protocolpresencedatahost.h>
+#include <presenceobjectfactory.h>
+#include <presencegrantrequestinfo.h>
+
+
+#include <personpresenceinfo.h>
+#include <servicepresenceinfo.h>
+#include <devicepresenceinfo.h>
+#include <presenceinfo.h>
+
+#include <presenceinfofield.h>
+#include <presenceinfofieldcollection.h>
+#include <presenceinfofieldvalueenum.h>
+#include <presenceinfofieldvaluetext.h>
+#include <ximpcontext.h>
+#include <ximpclient.h>
+#include <devicepresenceinfo.h>
+#include <protocolpresencewatchingdatahost.h>
+#include <presencegrantrequestinfo.h>
+#include <protocolpresenceauthorizationdatahost.h>
+#include <e32des16.h>
+#include "PImpsAdapXMLTools.h"
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::CPresenceNotificationHandler
+// ---------------------------------------------------------------------------
+//
+CPresenceNotificationHandler::CPresenceNotificationHandler(
+    MImpsPrtPluginConnectionManager& aConnMan ) :
+
+        CActive( EPriorityNormal ),
+        iConnMan( aConnMan )
+    {
+    IMPS_DP( D_IMPS_LIT( "::CPresenceNotificationHandler Start" ) );
+    CActiveScheduler::Add( this );
+
+    IMPS_DP( D_IMPS_LIT( "::CPresenceNotificationHandler End" ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::ConstructL()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::ConstructL Start-End" ) );
+
+    iParser = CreateXMLParserL();
+
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CPresenceNotificationHandler* CPresenceNotificationHandler::NewL(
+    MImpsPrtPluginConnectionManager& aConnMan )
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::NewL Start" ) );
+
+    CPresenceNotificationHandler* self = new( ELeave )
+    CPresenceNotificationHandler( aConnMan );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::NewL End" ) );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CPresenceNotificationHandler* CPresenceNotificationHandler::NewLC(
+    MImpsPrtPluginConnectionManager& aConnMan )
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::NewLC Start" ) );
+
+    CPresenceNotificationHandler* self =
+        CPresenceNotificationHandler::NewL( aConnMan );
+    CleanupStack::PushL( self );
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::NewLC End" ) );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::~CPresenceNotificationHandler
+// ---------------------------------------------------------------------------
+//
+CPresenceNotificationHandler::~CPresenceNotificationHandler()
+    {
+    IMPS_DP( D_IMPS_LIT( "::~CPresenceNotificationHandler Start" ) );
+
+    Cancel();
+
+    delete iResponse;
+    delete iListId;
+    delete iParser;
+
+    IMPS_DP( D_IMPS_LIT( "::~CPresenceNotificationHandler End" ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::DoCancel()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::DoCancel Start" ) );
+
+    iConnMan.DataHandler().CancelListening();
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::DoCancel End" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::RunL()
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::RunL()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::RunL Start" ) );
+
+    // something is coming from the WV server
+
+    HandleIncomingDataL();
+    StartListeningL();
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::RunL End" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::ProcessIncomingDataL()
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::ProcessIncomingDataL()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::ProcessIncomingDataL Start" ) );
+
+    User::LeaveIfError( iStatus.Int() );
+
+    // get the incoming response from the server with transaction id equals zero
+
+    iResponse = iConnMan.DataHandler().ResponseL( 0 );
+
+    if ( !iResponse )
+        {
+        StartListeningL();
+        return;
+        }
+
+    if ( iParser->DecodeL( *iResponse, KPresenceNotificationRequest, ETrue ) )
+        {
+        //CPrFwTestContextWrapper* wrapper = iWrapperMgr->GetWrapperL( 0 );
+        MXIMPClient* aPresClient = MXIMPClient::NewClientL();
+        CleanupDeletePushL( aPresClient );
+        MXIMPContext* context = aPresClient->NewPresenceContextLC();
+
+        // MXIMPContext* context = wrapper->GetContext();
+
+//   MServicePresenceInfo* srvInfo = context->ObjectFactory().NewServicePresenceInfoLC();
+//   srvInfo->SetServiceTypeL( KServiceType );  // test
+
+        // MDevicePresenceInfo* devinfo = context->ObjectFactory().NewDevicePresenceInfo();
+        if ( iParser->DecodeL( iParser->ResultL(),
+                               KPresenceXMLTag,
+                               ETrue ) )
+            {
+            if ( iParser->DecodeL( *iResponse, KUserIDXMLTag, EFalse ) )
+                {
+                TInt countResults( iParser->Count() );
+                MPEngXMLParser* subParser = CreateXMLParserLC();
+                for ( TInt i = 0 ; i < countResults ; ++i )
+                    {
+                    //NPresenceInfo* info = context->ObjectFactory().NewPresenceInfoLC();
+                    MPresenceInfo* info = iConnMan.HandleToHost().ProtocolPresenceDataHost().PresenceObjectFactory().NewPresenceInfoLC();
+                    MPresenceObjectFactory& prfwObjFact = iConnMan.HandleToHost().ProtocolPresenceDataHost().PresenceObjectFactory();
+                    MXIMPObjectFactory& objFactory = context->ObjectFactory();
+                    MXIMPIdentity* contactIdentity;
+
+                    contactIdentity = objFactory.NewIdentityLC();//1
+                    iParser->DecodeL( *iResponse, KUserIDXMLTag, EFalse );
+                    /**
+                    * UserId string from the presence notification information
+                    */
+                    HBufC16* UserId1;
+                    UserId1 = iParser->ResultAsUnicodeTextL( i );
+                    contactIdentity->SetIdentityL( *UserId1 );
+                    UserId1->Des().Fold();
+                    IMPS_DP( D_IMPS_LIT( " CPresenceNotificationHandler::ProcessIncomingDataL:Userid1::%S" ), UserId1 );
+                    contactIdentity->SetIdentityL( *UserId1 );
+                    delete UserId1;
+                    MPersonPresenceInfo* persInfo = prfwObjFact.NewPersonPresenceInfoLC();
+
+                    // looking online status of user
+                    if ( iParser->DecodeL( *iResponse, KOnlineStatusXMLTag, ETrue ) )
+                        {
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+                                if ( subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ) )
+                                    {
+                                    if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                        {
+                                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                        MPresenceInfoFieldValueText* statusTextField = prfwObjFact.NewTextInfoFieldLC();
+                                        statusTextField->SetTextValueL( _L( "T" ) );
+                                        infoField->SetFieldTypeL( KCommCapStatusXMLTag );
+                                        infoField->SetFieldValue( statusTextField );
+                                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                        CleanupStack::Pop( 2 );
+                                        }
+                                    else
+                                        {
+                                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                        MPresenceInfoFieldValueText* statusTextField = prfwObjFact.NewTextInfoFieldLC();
+                                        statusTextField->SetTextValueL( _L( "F" ) );
+                                        infoField->SetFieldTypeL( KCommCapStatusXMLTag );
+                                        infoField->SetFieldValue( statusTextField );
+                                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                        CleanupStack::Pop( 2 );
+
+                                        }
+                                    }
+
+                                }
+                            }
+                        }
+
+                    //looking for user availability
+
+
+                    if ( iParser->DecodeL( *iResponse, KUserAvailabilityXMLTag, ETrue ) )
+                        {
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+                                if ( subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ) )
+                                    {
+                                    if ( subParser->ResultL().CompareF( KAvailabilityValueAvailable ) == 0 )
+                                        {
+                                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                        MPresenceInfoFieldValueText* useravailibility = prfwObjFact.NewTextInfoFieldLC();
+                                        useravailibility->SetTextValueL( _L( "AVAILABLE" ) );
+                                        infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KAvailability );
+                                        infoField->SetFieldValue( useravailibility );
+                                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                        CleanupStack::Pop( 2 );
+                                        }
+                                    else if ( subParser->ResultL().CompareF( KAvailabilityValueDiscreet ) == 0 )
+                                        {
+                                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                        MPresenceInfoFieldValueText* useravailibility = prfwObjFact.NewTextInfoFieldLC();
+                                        useravailibility->SetTextValueL( _L( "BUSY" ) );
+                                        infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KAvailability );
+                                        infoField->SetFieldValue( useravailibility );
+                                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                        CleanupStack::Pop( 2 );
+                                        }
+                                    else
+                                        {
+                                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                        MPresenceInfoFieldValueText* useravailibility = prfwObjFact.NewTextInfoFieldLC();
+                                        useravailibility->SetTextValueL( _L( "NOTAVAILABLE" ) );
+                                        infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KAvailability );
+                                        infoField->SetFieldValue( useravailibility );
+                                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                        CleanupStack::Pop( 2 );
+                                        }
+                                    }
+
+                                }
+                            }
+                        }
+
+                    //for status text
+
+                    if ( iParser->DecodeL( *iResponse, KStatusTextXMLTag, ETrue ) )
+                        {
+
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+                                if ( subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* TextValue;
+                                    TextValue = subParser->ResultAsUnicodeTextL();
+                                    TextValue->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();//1
+                                    MPresenceInfoFieldValueText* statusTextField = prfwObjFact.NewTextInfoFieldLC();
+                                    statusTextField->SetTextValueL( *TextValue );
+                                    infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KStatusMessage );
+                                    infoField->SetFieldValue( statusTextField );
+                                    persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                    delete TextValue;
+                                    CleanupStack::Pop( 2 );
+                                    }
+                                else
+                                    {
+
+                                    // in colibria server we are not getting presencevale tag
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* statusTextField = prfwObjFact.NewTextInfoFieldLC();
+                                    statusTextField->SetTextValueL( KNullDesC );
+                                    infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KStatusMessage );
+                                    infoField->SetFieldValue( statusTextField );
+                                    persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                    CleanupStack::Pop( 2 );
+                                    }
+                                }
+                            } //KQualifierXMLTag
+
+
+                        }  //KStatusTextXMLTag
+                    else
+                        {
+                        // in Yahoo Status text is not coming when user is available
+                        MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                        MPresenceInfoFieldValueText* statusTextField = prfwObjFact.NewTextInfoFieldLC();
+                        statusTextField->SetTextValueL( KNullDesC );
+                        infoField->SetFieldTypeL( NPresenceInfo::NFieldType::KStatusMessage );
+                        infoField->SetFieldValue( statusTextField );
+                        persInfo->Fields().AddOrReplaceFieldL( infoField );
+                        CleanupStack::Pop( 2 );
+                        }
+
+
+                    //alias attribute
+                    if ( iParser->DecodeL( *iResponse, KAliasXMLTag, ETrue ) )
+                        {
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+                                if ( subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* Alias;
+                                    TInt countResults( subParser->Count() );
+                                    Alias = subParser->ResultAsUnicodeTextL(  );
+                                    Alias->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* aliasField = prfwObjFact.NewTextInfoFieldLC();
+                                    aliasField->SetTextValueL( *Alias );
+                                    infoField->SetFieldTypeL( KAliasXMLTag );
+                                    infoField->SetFieldValue( aliasField );
+                                    persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                    delete Alias;
+                                    CleanupStack::Pop( 2 );
+                                    }
+
+                                }
+                            }
+                        }
+
+                    //status mood
+
+                    if ( iParser->DecodeL( *iResponse, KStatusMood, ETrue ) )
+                        {
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+                                if ( subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* StatusMood;
+                                    TInt countResults( subParser->Count() );
+                                    StatusMood = subParser->ResultAsUnicodeTextL(  );
+                                    StatusMood->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* stausMoodField = prfwObjFact.NewTextInfoFieldLC();
+                                    stausMoodField->SetTextValueL( *StatusMood );
+                                    infoField->SetFieldTypeL( KStatusMood );
+                                    infoField->SetFieldValue( stausMoodField );
+                                    persInfo->Fields().AddOrReplaceFieldL( infoField );
+                                    delete StatusMood;
+                                    CleanupStack::Pop( 2 );
+                                    }
+
+                                }
+                            }
+                        }
+
+                    //client info
+
+                    if ( iParser->DecodeL( *iResponse, KClientInfoXMLTag, ETrue ) )
+                        {
+                        if ( subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse ) )
+                            {
+                            if ( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                                {
+
+                                //client type
+                                if ( subParser->DecodeL( iParser->ResultL(), KClientTypeXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* ClientType;
+                                    TInt countResults( subParser->Count() );
+                                    ClientType = subParser->ResultAsUnicodeTextL(  );
+                                    ClientType->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* clientTypeField = prfwObjFact.NewTextInfoFieldLC();
+                                    //MPresenceObjectFactory& prfwObjFact = iConnMan.HandleToHost().ProtocolPresenceDataHost().PresenceObjectFactory();
+                                    MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                                    clientTypeField->SetTextValueL( *ClientType );
+                                    infoField->SetFieldTypeL( KClientTypeXMLTag );
+                                    infoField->SetFieldValue( clientTypeField );
+                                    devinfo->Fields().AddOrReplaceFieldL( infoField );
+                                    devinfo->SetDeviceNameL( KClientTypeMobilePhoneXMLTag );
+                                    info->AddDevicePresenceL( devinfo );
+                                    delete ClientType;
+                                    CleanupStack::Pop( 3 );
+                                    }
+
+                                // DevManufacturer
+
+
+                                if ( subParser->DecodeL( iParser->ResultL(), KDevManufacturerXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* DevMan;
+                                    TInt countResults( subParser->Count() );
+                                    DevMan = subParser->ResultAsUnicodeTextL(  );
+                                    DevMan->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* devmanufacturerField = prfwObjFact.NewTextInfoFieldLC();
+                                    MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                                    devmanufacturerField->SetTextValueL( *DevMan );
+                                    infoField->SetFieldTypeL( KDevManufacturerXMLTag );
+                                    infoField->SetFieldValue( devmanufacturerField );
+                                    devinfo->Fields().AddOrReplaceFieldL( infoField );
+                                    info->AddDevicePresenceL( devinfo );
+                                    delete DevMan;
+                                    CleanupStack::Pop( 3 );
+                                    }
+                                //model
+                                if ( subParser->DecodeL( iParser->ResultL(), KDeviceModelXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* DeviceModel;
+                                    TInt countResults( subParser->Count() );
+                                    DeviceModel = subParser->ResultAsUnicodeTextL(  );
+                                    DeviceModel->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* devicemodelField = prfwObjFact.NewTextInfoFieldLC();
+                                    MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                                    devicemodelField->SetTextValueL( *DeviceModel );
+                                    infoField->SetFieldTypeL( KDeviceModelXMLTag );
+                                    infoField->SetFieldValue( devicemodelField );
+                                    devinfo->Fields().AddOrReplaceFieldL( infoField );
+                                    info->AddDevicePresenceL( devinfo );
+                                    delete DeviceModel;
+                                    CleanupStack::Pop( 3 );
+                                    }
+
+                                //language
+
+                                if ( subParser->DecodeL( iParser->ResultL(), KClientLanguageXMLTag, EFalse ) )
+                                    {
+                                    HBufC16* PrefLanguage;
+                                    TInt countResults( subParser->Count() );
+                                    PrefLanguage = subParser->ResultAsUnicodeTextL(  );
+                                    PrefLanguage->Des().Fold();
+                                    MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                    MPresenceInfoFieldValueText* LangauageField = prfwObjFact.NewTextInfoFieldLC();
+                                    MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                                    LangauageField->SetTextValueL( *PrefLanguage );
+                                    infoField->SetFieldTypeL( KClientLanguageXMLTag );
+                                    infoField->SetFieldValue( LangauageField );
+                                    devinfo->Fields().AddOrReplaceFieldL( infoField );
+                                    info->AddDevicePresenceL( devinfo );
+                                    delete PrefLanguage;
+                                    CleanupStack::Pop( 3 );
+                                    }
+
+
+                                }
+                            }
+                        }
+
+                    // communication capability
+
+                    RArray<TPtrC8> commCaps;
+                    CleanupClosePushL( commCaps );
+
+                    // parse the commcap attribute values
+                    if ( iParser->DecodeL( *iResponse, KCommCXMLTag, ETrue ) )
+                        {
+                        TInt count( iParser->Count() );
+                        for ( TInt resCount( 0 ); resCount < count; resCount++ )
+                            {
+                            User::LeaveIfError( commCaps.Append( iParser->ResultL( resCount ) ) );
+                            }
+
+                        count = commCaps.Count();
+                        for ( TInt i( 0 ); i < count; i++ )
+                            {
+                            if ( iParser->DecodeL( commCaps[i], KCommCapXMLTagCap, EFalse ) )
+                                {
+                                if ( iParser->ResultL().CompareF( KCommCapIMXMLTag ) == 0 )
+                                    {
+                                    if ( iParser->DecodeL( commCaps[i], KCommCapStatusXMLTag, EFalse ) )
+                                        {
+                                        if ( iParser->ResultL().CompareF( KCommCapStatusOpen ) == 0 )
+                                            {
+
+                                            MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                            MPresenceInfoFieldValueText* StatusField = prfwObjFact.NewTextInfoFieldLC();
+                                            MServicePresenceInfo* srvInfo = prfwObjFact.NewServicePresenceInfoLC();
+                                            StatusField->SetTextValueL( _L( "OPEN" ) );
+                                            infoField->SetFieldTypeL( KCommCapStatusXMLTag );
+                                            infoField->SetFieldValue( StatusField );
+                                            srvInfo->SetServiceTypeL( NPresenceInfo::NServiceType::KInstantMessaging );
+                                            srvInfo->Fields().AddOrReplaceFieldL( infoField );
+                                            info->AddServicePresenceL( srvInfo );
+                                            CleanupStack::Pop( 3 );
+                                            }
+                                        else
+                                            {
+
+                                            MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                                            MPresenceInfoFieldValueText* StatusField = prfwObjFact.NewTextInfoFieldLC();
+                                            MServicePresenceInfo* srvInfo = prfwObjFact.NewServicePresenceInfoLC();
+                                            StatusField->SetTextValueL( _L( "CLOSED" ) );
+                                            infoField->SetFieldTypeL( KCommCapStatusXMLTag );
+                                            infoField->SetFieldValue( StatusField );
+                                            srvInfo->SetServiceTypeL( NPresenceInfo::NServiceType::KInstantMessaging );
+                                            srvInfo->Fields().AddOrReplaceFieldL( infoField );
+                                            info->AddServicePresenceL( srvInfo );
+                                            CleanupStack::Pop( 3 );
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                    CleanupStack::PopAndDestroy(); //commCaps
+                    //end of comm cap
+
+                    // status content
+
+
+
+
+                    /*for future use
+                    //time zone
+
+                    if(iParser->DecodeL( *iResponse,  KTimeZone, ETrue ))
+                        {
+                     if(subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse))
+                    	{
+                    		if( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                    		{
+                    		 if(subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ))
+                    		 {
+                    		    HBufC16* TimeZone;
+                    		 	TInt countResults( subParser->Count() );
+                              TimeZone = subParser->ResultAsUnicodeTextL(  );
+                              TimeZone->Des().Fold();
+                              MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                    		 	MPresenceInfoFieldValueText* TimeZoneField = prfwObjFact.NewTextInfoFieldLC();
+                    		 	MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                    		 	TimeZoneField->SetTextValueL(*TimeZone);
+                    		 	infoField->SetFieldTypeL( KTimeZone);
+                              infoField->SetFieldValue( TimeZoneField);
+                              devinfo->Fields().AddOrReplaceFieldL( infoField );
+                              info->AddDevicePresenceL( devinfo );
+                              delete TimeZone;
+                              CleanupStack::Pop(3);
+                    		 }
+
+                    		}
+                    	}
+                        }
+
+                    //GeoLocation
+
+                    if(iParser->DecodeL( *iResponse,  KGeoLocation, ETrue ))
+                        {
+                    	if(subParser->DecodeL( iParser->ResultL(), KQualifierXMLTag, EFalse))
+                    	{
+                    		if( subParser->ResultL().CompareF( KXMLValueTrue ) == 0 )
+                    		{
+                    		 if(subParser->DecodeL( iParser->ResultL(), KPresenceValueXMLTag, EFalse ))
+                    		 {
+                    		    HBufC16* GeoLocation;
+                    		 	TInt countResults( subParser->Count() );
+                              GeoLocation = subParser->ResultAsUnicodeTextL(  );
+                              GeoLocation->Des().Fold();
+                              MPresenceInfoField* infoField = prfwObjFact.NewInfoFieldLC();
+                    		 	MPresenceInfoFieldValueText* GeoLocField = prfwObjFact.NewTextInfoFieldLC();
+                    		 	MDevicePresenceInfo* devinfo = prfwObjFact.NewDevicePresenceInfoLC();
+                    		 	GeoLocField->SetTextValueL(*GeoLocation);
+                    		 	infoField->SetFieldTypeL( KTimeZone);
+                              infoField->SetFieldValue( GeoLocField);
+                              devinfo->Fields().AddOrReplaceFieldL( infoField );
+                              info->AddDevicePresenceL( devinfo );
+                              delete GeoLocation;
+                              CleanupStack::Pop(3);
+                    		 }
+
+                    		}
+                    	}
+                        }
+                    */
+                    info->SetPersonPresenceL( persInfo );
+                    CleanupStack::Pop( 1 );//persInfo
+                    const TDesC16* contactId;
+                    contactId = &( contactIdentity->Identity() );
+                    IMPS_DP( D_IMPS_LIT( " CPresenceNotificationHandler::ProcessIncomingDataL:contactId::%S" ), contactId );
+                    iConnMan.HandleToHost().ProtocolPresenceDataHost().WatchingDataHost().HandleSubscribedPresentityPresenceL( contactIdentity, info );
+                    CleanupStack::Pop( 2 ); //contactidentity,info
+
+                    }  // end of for loop
+
+                CleanupStack::PopAndDestroy( 1 );  //subParser
+                } //end of userid if
+            }
+        CleanupStack::PopAndDestroy( 2 ); //context,aPresClient
+        }
+    else
+        {
+        if ( iParser->DecodeL( *iResponse,  KPresenceAuthRequest, ETrue ) )
+            {
+            IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::PresenceAuth Request :Start" ) );
+            iParser->DecodeL( *iResponse, KUserIDXMLTag, EFalse );
+            HBufC* AuthreqId;
+            MXIMPObjectFactory& ObjFact = iConnMan.HandleToHost().ObjectFactory();
+            MPresenceObjectFactory& prfwObjFact = iConnMan.HandleToHost().ProtocolPresenceDataHost().PresenceObjectFactory();
+
+            MPresenceGrantRequestInfo* presenceGrant;
+            presenceGrant = prfwObjFact.NewPresenceGrantRequestInfoLC();//1
+            MXIMPIdentity* AuthReqIdentity;
+            AuthReqIdentity = ObjFact.NewIdentityLC();//2
+            AuthreqId = iParser->ResultAsUnicodeTextL();
+            AuthReqIdentity->SetIdentityL( *AuthreqId );
+            AuthreqId->Des().Fold();
+            presenceGrant->SetRequestorIdL( AuthReqIdentity );
+            TPtr8 ptrbuffer( iConnMan.DataHandler().TransferBufferL() );
+            MPEngXMLSerializer* serializer = CreateXmlSerializerLC( ptrbuffer );
+            NImpsAdapXMLTools::AppendTransactionContentTagXmlL( *serializer, iConnMan.GetVersion() );
+            serializer->StartTagL( KStatusTag );
+            serializer->StartTagL( KResultXMLTag );
+            serializer->StartTagL( KCodeXMLTag
+                                 ).NarrowTextL( KWVCodeOK
+                                              ).EndTagL( KCodeXMLTag );
+            serializer->EndTagL( KResultXMLTag );
+            serializer->EndTagL(  KStatusTag );
+            serializer->EndTagL( KTransactionContent );
+            iSendId = iConnMan.DataHandler().SendDataL( iStatus );
+            SetActive();
+            CleanupStack::PopAndDestroy( 1 ); //serializer
+            iConnMan.HandleToHost().ProtocolPresenceDataHost().AuthorizationDataHost().HandlePresenceGrantRequestReceivedL ( presenceGrant );
+            TInt count = iConnMan.PresenceAuthGrantReqList()->Count();
+            iConnMan.PresenceAuthGrantReqList()->Append( *AuthreqId );
+            count = iConnMan.PresenceAuthGrantReqList()->Count();
+            delete AuthreqId;
+            AuthreqId = NULL;
+            CleanupStack::Pop( 2 ); //AuthReqIdentity,presenceGrant
+            IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::PresenceAuth Request :End" ) );
+            }
+        }
+
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::ProcessIncomingDataL End" ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CPresenceNotificationHandler::RunError( TInt  aError )
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::RunError Start %d" ), aError );
+
+    // restartt listening incoming data
+    iConnMan.DataHandler().ListenIncomingData( iStatus );
+    SetActive();
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::RunError End" ) );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::StartListeningL
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::StartListeningL()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::StartListeningL Start" ) );
+
+    // Ready to receive notification from the server
+
+    // signal the scheduler
+    // Fix warning: C2874W: count may be used before being set
+    TInt count = 0;
+    if ( !( this->IsActive() ) )
+        {
+        count = iConnMan.DataHandler().ListenIncomingData( iStatus );
+        SetActive();
+        }
+
+    for ( TInt x( 0 ) ;  x < count ; ++x )
+        {
+        HandleIncomingDataL();
+        }
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::StartListeningL End" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CPresenceNotificationHandler::HandleIncomingDataL
+// ---------------------------------------------------------------------------
+//
+void CPresenceNotificationHandler::HandleIncomingDataL()
+    {
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::HandleIncomingDataL Start" ) );
+
+    ProcessIncomingDataL();
+
+    IMPS_DP( D_IMPS_LIT( "CPresenceNotificationHandler::HandleIncomingDataL End" ) );
+    }
+
+// End of file