diff options
Diffstat (limited to 'kopete/protocols/groupwise/libgroupwise/tasks/searchusertask.cpp')
-rw-r--r-- | kopete/protocols/groupwise/libgroupwise/tasks/searchusertask.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/kopete/protocols/groupwise/libgroupwise/tasks/searchusertask.cpp b/kopete/protocols/groupwise/libgroupwise/tasks/searchusertask.cpp new file mode 100644 index 00000000..cd199ad8 --- /dev/null +++ b/kopete/protocols/groupwise/libgroupwise/tasks/searchusertask.cpp @@ -0,0 +1,137 @@ +/* + Kopete Groupwise Protocol + searchusertask.cpp - high level search for users on the server - spawns PollSearchResultsTasks + + Copyright (c) 2005 SUSE Linux Products GmbH http://www.suse.com + + Based on Iris, Copyright (C) 2003 Justin Karneges + + Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org> + + ************************************************************************* + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + ************************************************************************* +*/ + +#include <qdatetime.h> +#include <qtimer.h> + +#include "client.h" +#include "gwerror.h" +#include "gwfield.h" +#include "response.h" + +#include "pollsearchresultstask.h" + +#include "searchusertask.h" + +// the delay we allow the server to initially do the search +#define GW_POLL_INITIAL_DELAY 1000 +// the maximum number of times to poll the server +#define GW_POLL_MAXIMUM 5 +// the frequency between subsequent polls +#define GW_POLL_FREQUENCY_MS 8000 + +using namespace GroupWise; + +SearchUserTask::SearchUserTask(Task* parent): RequestTask(parent), m_polls( 0 ) +{ +} + + +SearchUserTask::~SearchUserTask() +{ +} + +void SearchUserTask::search( const QValueList<UserSearchQueryTerm> & query ) +{ + m_queryHandle = QString::number( QDateTime::currentDateTime().toTime_t () ); + Field::FieldList lst; + if ( query.isEmpty() ) + { + setError( 1, "no query terms" ); + return; + } + // object Id identifies the search for later reference + lst.append( new Field::SingleField( NM_A_SZ_OBJECT_ID, 0, NMFIELD_TYPE_UTF8, m_queryHandle ) ); + QValueList<UserSearchQueryTerm>::ConstIterator it = query.begin(); + const QValueList<UserSearchQueryTerm>::ConstIterator end = query.end(); + for ( ; it != end; ++it ) + { + Field::SingleField * fld = new Field::SingleField( (*it).field.ascii(), (*it).operation, 0, NMFIELD_TYPE_UTF8, (*it).argument ); + lst.append( fld ); + } + //lst.append( new Field::SingleField( "Given Name", 0, NMFIELD_TYPE_UTF8, [ NMFIELD_METHOD_EQUAL | NMFIELD_METHOD_MATCHBEGIN | NMFIELD_METHOD_MATCHEND | NMFIELD_METHOD_SEARCH ], searchTerm ); + // Or "Surname", NM_A_SZ_USERID, NM_A_SZ_TITLE, NM_A_SZ_DEPARTMENT in other fields + + createTransfer( "createsearch", lst ); +} + +bool SearchUserTask::take( Transfer * transfer ) +{ + if ( !forMe( transfer ) ) + return false; + Response * response = dynamic_cast<Response *>( transfer ); + if ( !response ) + return false; + if ( response->resultCode() ) + { + kdDebug( GROUPWISE_DEBUG_GLOBAL ) << k_funcinfo << "got return code in response << " << response->resultCode() << endl; + setError( response->resultCode() ); + return true; + } + // now start the results poll timer + QTimer::singleShot( GW_POLL_INITIAL_DELAY, this, SLOT( slotPollForResults() ) ); + return true; +} + +void SearchUserTask::slotPollForResults() +{ + //create a PollSearchResultsTask + PollSearchResultsTask * psrt = new PollSearchResultsTask( client()->rootTask() ); + psrt->poll( m_queryHandle ); + connect( psrt, SIGNAL( finished() ), SLOT( slotGotPollResults() ) ); + psrt->go( true ); +} + +void SearchUserTask::slotGotPollResults() +{ + PollSearchResultsTask * psrt = (PollSearchResultsTask *)sender(); + kdDebug( GROUPWISE_DEBUG_GLOBAL ) << k_funcinfo << "status code is " << psrt->queryStatus() << endl; + m_polls++; + switch ( psrt->queryStatus() ) + { + case PollSearchResultsTask::Pending: + case PollSearchResultsTask::InProgess: + if ( m_polls < GW_POLL_MAXIMUM ) // restart timer + QTimer::singleShot( GW_POLL_FREQUENCY_MS, this, SLOT( slotPollForResults() ) ); + else + setSuccess( psrt->statusCode() ); + break; + case PollSearchResultsTask::Completed: + m_results = psrt->results(); + setSuccess(); + break; + case PollSearchResultsTask::Cancelled: + setError(psrt->statusCode() ); + break; + case PollSearchResultsTask::Error: + setError( psrt->statusCode() ); + break; + case PollSearchResultsTask::TimeOut: + setError( psrt->statusCode() ); + break; + } +} + +QValueList< GroupWise::ContactDetails > SearchUserTask::results() +{ + return m_results; +} + +#include "searchusertask.moc" |