imservices/ossprotocoladaptation/src/presentitygroups/ccontactsynchandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:49 +0200
changeset 0 e6b17d312c8b
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2007-2008 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:  handles synchronisation of contacts
*
*/


#include <ximpprotocolconnectionhost.h>

#include <ximpobjectfactory.h>
#include <protocolpresentitygroupsdatahost.h>
#include <presentitygroupinfo.h>
#include <presentitygroupmemberinfo.h>
#include <ximpidentity.h>
#include <protocolpresencedatahost.h>
#include <presenceobjectfactory.h>

#include <ximpcontext.h>

#include <devicepresenceinfo.h>

#include <e32des16.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include "msgliterals.h"

#include "ccontactsynchandler.h"

#include "mossprotocolconnectionmanager.h"
#include "ossprotocolpluginlogger.h"
#include "waittimer.h"
#include "cossprotocolconnectionmanager.h"
#include "ossprotocoladaptationuids.h"
#include "ossprotocoladaptutils.h"

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// CContactSyncHandler::CContactSyncHandler
// ---------------------------------------------------------------------------
//
CContactSyncHandler::CContactSyncHandler (
    MOSSProtocolConnectionManager& aConnMan ) :
		CActive ( EPriorityNormal ),
		iConnMan ( aConnMan )
	{
	LOGGER ( TXT ( "CContactSyncHandler::CContactSyncHandler Start" ) );
	CActiveScheduler::Add ( this );

	LOGGER ( TXT ( "CContactSyncHandler::CContactSyncHandler End" ) );
	}


// ---------------------------------------------------------------------------
// CContactSyncHandler::NewL
// ---------------------------------------------------------------------------
//
CContactSyncHandler* CContactSyncHandler::NewL (
    MOSSProtocolConnectionManager& aConnMan )
	{
	LOGGER ( TXT ( "CContactSyncHandler::NewL Start" ) );

	CContactSyncHandler* self = new ( ELeave ) CContactSyncHandler ( aConnMan );

	LOGGER ( TXT ( "CContactSyncHandler::NewL End" ) );
	return self;
	}


// ---------------------------------------------------------------------------
// CContactSyncHandler::~CContactSyncHandler
// ---------------------------------------------------------------------------
//
CContactSyncHandler::~CContactSyncHandler()
	{
	LOGGER ( TXT ( "::~CContactSyncHandler Start" ) );

	Cancel();

	LOGGER ( TXT ( "::~CContactSyncHandler End" ) );
	}


// ---------------------------------------------------------------------------
// CContactSyncHandler::DoCancel()
// ---------------------------------------------------------------------------
//
void CContactSyncHandler::DoCancel()
	{
	LOGGER ( TXT ( "CContactSyncHandler::DoCancel Start" ) );

	iConnMan.DataHandler().CancelContactsChangeListening();

	LOGGER ( TXT ( "CContactSyncHandler::DoCancel End" ) );
	}

// ---------------------------------------------------------------------------
// CContactSyncHandler::RunL()
// ---------------------------------------------------------------------------
//
void CContactSyncHandler::RunL()
	{
	LOGGER ( TXT ( "CContactSyncHandler::RunL Start" ) );

	// something is coming from the xmpp server
	User::LeaveIfError ( iStatus.Int() );

	ProcessAndSendL();
	StartListening();

	LOGGER ( TXT ( "CContactSyncHandler::RunL End" ) );
	}

// ---------------------------------------------------------------------------
// CContactSyncHandler::ProcessAndSendL()
// ---------------------------------------------------------------------------
	
void CContactSyncHandler::ProcessAndSendL()
	{	
	LOGGER ( TXT ( "CContactSyncHandler::ProcessIncomingDataL Start" ) );
    char* pResponse = NULL, *pOrigResponse = NULL;  
    message_hdr_resp* msg_struct = NULL;
    
    while( iConnMan.DataHandler().ContactsChangeResponseCount() ) // process all responses
    	{
    	pOrigResponse = pResponse = iConnMan.DataHandler().ResponseL (200 );
		CleanupStack::PushL(pOrigResponse) ;
	
	 	msg_struct = ( message_hdr_resp* )pResponse;
	 	
		char* contact= pResponse + sizeof ( message_hdr_resp );
		HBufC16* contactName = OssProtocolAdapUtils::ConvertCharToTUint16LC( contact );
		switch ( msg_struct->hdr_req.message_type )
			{
            case ESubscribe_Remote_Pending:
                {                
                break;
                }
            case ETrying_To_Add_Contact_Known:
                {
                iConnMan.GetContactManager().AddContactToLocalL(*contactName);               
                iConnMan.GetContactManager().RemoveInvitationFromLocalL(*contactName);
                break;
                }
            case ESubscribe_RP_Accepted:
                {                
                break;
                }
            case EPublish_RP_Accepted:
                {                
                break;
                }            
            case ESubscribe_Removed_Or_Rejected:
                {
                //removing from the local copy of the contacts
                iConnMan.GetContactManager().RemoveContactFromLocalL(*contactName);                                     
                break;                                              	
                }           
            case EPublish_Removed_Or_Rejected:
                {
                iConnMan.GetContactManager().RemoveInvitationFromLocalL(*contactName);                    
                break;     
                }
            }        
        CleanupStack::PopAndDestroy ( 2 );//pOrigResponse, contactName 
    	}    
	LOGGER ( TXT ( "CContactSyncHandler::ProcessIncomingDataL End" ) );
	}


// ---------------------------------------------------------------------------
// CContactSyncHandler::RunError
// ---------------------------------------------------------------------------
//
TInt CContactSyncHandler::RunError ( TInt  aError )
	{
	LOGGER ( TXT ( "CContactSyncHandler::RunError Start %d" ), aError );

	LOGGER ( TXT ( "CContactSyncHandler::RunError End" ) );
	return KErrNone;
	}

// ---------------------------------------------------------------------------
// CContactSyncHandler::StartListeningL
// ---------------------------------------------------------------------------
//
void CContactSyncHandler::StartListening()
	{
	LOGGER ( TXT ( "CContactSyncHandler::StartListeningL Start" ) );

	if ( ! ( this->IsActive() ) )
		{
		iConnMan.DataHandler().ListenContactsChange( iStatus );
		SetActive();
		}
	LOGGER ( TXT ( "CContactSyncHandler::StartListeningL End" ) );
	}

// End of file