libtelepathy/tsrc/src/telepathygabblesearch.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:10:06 +0200
changeset 0 d0f3a028347a
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2008 - 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:    Used for Search Related Test Cases
*
*/



 
//Include files
#include <e32err.h>
#include <e32const.h>
#include <e32base.h>
#include <glib.h>
#include <TestScripterInternal.h>
#include "telepathygabbleutils.h"
#include "telepathygabblesearch.h"
#include "telepathygabbletestdata.h"
#include "tp-chan.h"
#include "tp-conn-gen.h"




//-----------------------------------------------------------------------------
// function_name	: CTelepathyGabbleSearch
// description     	: constructor
//----------------------------------------------------------------------------- 

CTelepathyGabbleSearch::CTelepathyGabbleSearch()
{
}

//-----------------------------------------------------------------------------
// function_name	: ConstructL
// description     	: constructor
//----------------------------------------------------------------------------- 
void CTelepathyGabbleSearch::ConstructL()
{
	
}

//-----------------------------------------------------------------------------
// function_name	: NewL
// description     	: NewL
//----------------------------------------------------------------------------- 
CTelepathyGabbleSearch* CTelepathyGabbleSearch::NewL()
    {
	CTelepathyGabbleSearch* self = new(ELeave) CTelepathyGabbleSearch;
    CleanupStack::PushL( self );
    self->ConstructL();    
    CleanupStack::Pop();
    return self;
    }

//-----------------------------------------------------------------------------
// function_name	:  ~CTelepathyGabbleSearch
// description     	: Destructor
//----------------------------------------------------------------------------- 
CTelepathyGabbleSearch::~CTelepathyGabbleSearch()
    {
    }
    	

//-----------------------------------------------------------------------------
// function_name	: SearchL
// description     	: Used for searching contacts 
//----------------------------------------------------------------------------- 
TInt CTelepathyGabbleSearch::SearchL( GHashTable *aDataToSearch, CTestData* aTestData )
{
	Search_UserData	*userData = new(ELeave) Search_UserData;
	
	userData->data_to_search = aDataToSearch;
	userData->testData = aTestData;

	iTestData = aTestData;

	if( iTestData->GetSearchChan() )
		{
		SearchAgainL( aDataToSearch, iTestData );
		//Run the mainloop
		g_main_loop_run (iTestData->GetMainLoop());	
		}
	else
	{
		if (!tp_conn_request_channel_async( DBUS_G_PROXY( aTestData->GetTpConn() ),
                               TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, 
                               TP_CONN_HANDLE_TYPE_NONE, 0, TRUE,
                               do_search_reply,(gpointer) userData ) )
                               
			{
			return KErrGeneral;	
			}	
		//Run the mainloop
		g_main_loop_run (iTestData->GetMainLoop());	
		DoSearchL( aDataToSearch, aTestData);
	}
	


	
	if(userData)
		{
			delete userData;
			userData = NULL;
		}

	//return the Message_sent that was updated in the callback sendmessage_cb	
	return iTestData->GetSearchState();
}

//-----------------------------------------------------------------------------
// function_name	: SearchAgainL
// description     	: Used for searching contacts second or more number of times
//----------------------------------------------------------------------------- 

 void CTelepathyGabbleSearch::SearchAgainL( GHashTable *aDataToSearch, CTestData* aTestData )
 {
 
	DBusGProxy *search_iface = NULL;
	TpChan *search_chan = NULL;
	
 	if(aTestData)
	 	{
	 	search_chan = aTestData->GetSearchChan();	
	 	}
  	if ( NULL == search_chan ) 
		{
		return ;	
		}
	//Get chan interface					
	search_iface = tp_chan_get_interface( search_chan	, 
		TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK );	
	
	if ( NULL == search_iface ) 
		{
		return ;	
		}					

	//Call the search on tp		      										      
	tp_chan_type_search_async( search_iface, aDataToSearch, searchreply_cb, 
			aTestData );
			

 }


//-----------------------------------------------------------------------------
// function_name	: GetSearchKeysL
// description     	: Used for getting search keys 
//----------------------------------------------------------------------------- 
TInt CTelepathyGabbleSearch::GetSearchKeysL( CTestData* aTestData )
{
	Search_UserData	*userData = new(ELeave) Search_UserData;
	
	userData->data_to_search = NULL;
	userData->testData = aTestData;

	iTestData = aTestData;
	
	if (!tp_conn_request_channel_async( DBUS_G_PROXY( aTestData->GetTpConn() ),
                               TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, 
                               TP_CONN_HANDLE_TYPE_NONE, 0, TRUE,
                               do_search_reply,(gpointer) userData ) )
                               
		{
		return KErrGeneral;	
		}

	//Run the mainloop
	g_main_loop_run (aTestData->GetMainLoop());
	
	DoSearchL(NULL,aTestData);
		
	if(userData)
		{
			delete userData;
			userData = NULL;
		}

	//return the Message_sent that was updated in the callback sendmessage_cb	
	return iTestData->GetSearchState();
}


void CTelepathyGabbleSearch::do_search_reply( DBusGProxy* /*proxy*/, char *chan_object_path, 
 			GError *error, gpointer user_data )
 {
 	Search_UserData* userData = static_cast<Search_UserData*> (user_data);
 	TpChan *search_chan = NULL;
 	
 	TInt search_state = userData->testData->GetSearchState();
 	
	
	/* Create the object to represent the channel */
	if ( error ) 
		{
		userData->testData->SetSearchState(CTestData::ESearchError);
		return;
		}
	search_chan = tp_chan_new( userData->testData->GetDBusConnection(), CONNMGR_BUS, chan_object_path, 
					TP_IFACE_CHANNEL_TYPE_CONTACT_SEARCH, TP_CONN_HANDLE_TYPE_NONE, 0 );
	                         
	                    
	g_free(chan_object_path);
  
  	
  	if ( NULL == search_chan ) 
		{
		userData->testData->SetSearchState(CTestData::ESearchError);
		return ;	
		}
	
	userData->testData->SetSearchChan( search_chan );	
	
	g_main_loop_quit(userData->testData->GetMainLoop());

  
 }


void CTelepathyGabbleSearch::DoSearchL(GHashTable *aDataToSearch,CTestData *testData)
{
	DBusGProxy *search_iface = NULL;
	TInt testType = testData->GetTestType();
	
	//Get chan interface					
	search_iface = tp_chan_get_interface( testData->GetSearchChan(), 
		TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK );	
	
	if ( NULL == search_iface ) 
		{
		testData->SetSearchState(CTestData::ESearchError);
		return ;	
		}					
   	//Register for the SearchResultReceived signal
	//ownership of the srch_result->user_data is transfered
	dbus_g_proxy_connect_signal( search_iface, "SearchResultReceived",
							G_CALLBACK( search_result_received_cb ),
							(gpointer)this, NULL );
	

	//Register for the SearchStateChanged signal
	dbus_g_proxy_connect_signal( search_iface, "SearchStateChanged",
							G_CALLBACK( search_state_changed_cb ),
							(gpointer)this, NULL );
   	      
    if( testType == CTestData::EGetSearchKeys )
	   {
	   	//Call the getsearchkeys on tp		      										      
		tp_chan_type_search_get_search_keys_async(search_iface,getsearchkeys_cb, testData );

	   }
    else if( testType == CTestData::ESearch )
	   {
	    //Call the search on tp		      										      
		tp_chan_type_search_async( search_iface, aDataToSearch, 
								searchreply_cb, testData);
	   }
	   
	g_main_loop_run(testData->GetMainLoop());   
	   	
}
void CTelepathyGabbleSearch::getsearchkeys_cb( DBusGProxy* /*proxy*/,  gchar* /*instr*/,
  							gchar** keys, GError *error, gpointer user_data )
{
CTestData* testData = static_cast<CTestData*> (user_data);

if(!keys || error )
	{
    testData->SetSearchState( CTestData::ESearchError );
	}

if(keys)
	{
	testData->GetStifLogger()->Log( _L("getsearchkeys_cb:SearchKeysFound") );
	testData->SetSearchState( CTestData::ESearchKeysFound );
	testData->SetSearchKeys(keys);
	}
g_main_loop_quit(testData->GetMainLoop());	
	
}



void CTelepathyGabbleSearch::searchreply_cb( DBusGProxy* /*proxy*/, GError *error, gpointer user_data ) 
{
 CTestData* testData = static_cast<CTestData*> (user_data);
 TInt testType = testData->GetTestType();
 
 testData->GetStifLogger()->Log( _L("searchreply_cb") );
 
 if ( testType == CTestData::ESearch )
 	{
		if(error)
			 {
			 	testData->GetStifLogger()->Log( _L("Error in search") );
			 	testData->SetSearchState(CTestData::ESearchError);
			 	tp_chan_close_async( DBUS_G_PROXY( testData->GetSearchChan() ), search_chan_closed_cb, testData );
			 }
	}
 
}


	

void CTelepathyGabbleSearch::search_result_received_cb ( DBusGProxy* /*proxy*/,
										guint       /*contact_handle*/,
										GHashTable	*values, 
										gpointer	user_data
									   )
{
CTelepathyGabbleSearch* search_userData = static_cast<CTelepathyGabbleSearch*> (user_data);
guint result_count = 0;
 
//iTestData->GetStifLogger()->Log( _L("search_result_received_cb") );
search_userData->GetTestData()->GetStifLogger()->Log( _L("search_result_received_cb") );

if(values )	
	result_count = g_hash_table_size(values);


//do this later
/*if(result_count)
	{
	g_hash_table_foreach(values,setfield_foreach,NULL);	
	}*/

	
}

void CTelepathyGabbleSearch::search_state_changed_cb ( DBusGProxy* /*proxy*/,
										guint       search_state,
										gpointer	user_data
									   )
{
CTelepathyGabbleSearch* search_userData = static_cast<CTelepathyGabbleSearch*> (user_data);
DBusGProxy *search_iface = NULL;
GError **err = NULL;
guint *state = NULL;
TpChan *search_chan = NULL;
CTestData* testData = search_userData->GetTestData();

if(search_userData && testData )
	{
	testData->GetStifLogger()->Log( _L("search_state_changed_cb") );	
	search_chan = testData->GetSearchChan();
	}


if( search_state == TP_CHANNEL_CONTACT_SEARCH_STATE_AFTER && search_userData  && search_chan )
	{
	testData->SetSearchState(CTestData::ESearchCompleted);	
	search_iface = tp_chan_get_interface( search_chan, 
		TELEPATHY_CHAN_IFACE_CONTACTSEARCH_QUARK );	
	tp_chan_type_search_get_search_state( search_iface,state,err);
	g_main_loop_quit(testData->GetMainLoop());	
	}
	
}

void CTelepathyGabbleSearch::search_chan_closed_cb ( DBusGProxy* /*proxy*/,
										  GError *error,
										gpointer	user_data
									   )
{
CTestData* testData = static_cast<CTestData*> (user_data);

testData->GetStifLogger()->Log( _L("search_chan_closed_cb") );
if(error)
	{
	testData->GetStifLogger()->Log( _L("search_chan_closed_cb : Error ") );
	testData->SetSearchState(CTestData::ESearchError);
	}
else
	{
	
	TInt testType = testData->GetTestType();
	if( testType == CTestData::EGetSearchKeys )
		{
		testData->SetSearchState(CTestData::ESearchKeysFound);
		testData->GetStifLogger()->Log( _L("search_chan_closed_cb : SearchKeysFound ") );
		}
	else if( testType == CTestData::ESearch )
		{
		testData->SetSearchState(CTestData::ESearchCompleted);
		testData->GetStifLogger()->Log( _L("search_chan_closed_cb : SearchCompleted ") );
		}
	}
g_main_loop_quit(testData->GetMainLoop());	
}

CTestData* CTelepathyGabbleSearch::GetTestData()
	 {
	 return iTestData;	
	 }

/*void  CTelepathyGabbleSearch::setfield_foreach (gpointer key, gpointer value, gpointer user_data)
{
  gchar *k = (gchar *) key;
  const char *v = g_value_get_string ( (const GValue*)value);
  CTestData* testdata = static_cast<CTestData*> (user_data);

  //testdata->GetStifLogger()->Log( _L("setfield_foreach") );

}*/

void CTelepathyGabbleSearch::CloseChannel( CTestData* aTestdata )
	{
		if( aTestdata->GetSearchChan() )
			{
			tp_chan_close_async( DBUS_G_PROXY( aTestdata->GetSearchChan() ), search_chan_closed_cb, aTestdata );	
			}
		//Run the mainloop
		g_main_loop_run (aTestdata->GetMainLoop());				
	}

//  End of File