diff -r 000000000000 -r d0f3a028347a libtelepathy/tsrc/src/telepathygabblesearch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libtelepathy/tsrc/src/telepathygabblesearch.cpp Tue Feb 02 01:10:06 2010 +0200 @@ -0,0 +1,430 @@ +/* +* 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 +#include +#include +#include +#include +#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 (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 (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 (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 (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 (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 (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 (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