2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2003 Match Grun
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 * Functions to define an address query (a request).
30 #include "addrquery.h"
33 * Query list for tracking current queries.
35 static GList *_queryList_ = NULL;
38 * Mutex to protect list from multiple threads.
40 static pthread_mutex_t _queryListMutex_ = PTHREAD_MUTEX_INITIALIZER;
43 * Create new address query.
44 * \return Initialized address query object.
46 AddrQuery *addrqry_create( void ) {
49 qry = g_new0( AddrQuery, 1 );
50 qry->queryType = ADDRQUERY_NONE;
53 qry->searchTerm = NULL;
56 qry->serverObject = NULL;
57 qry->queryObject = NULL;
63 * \param qry Address query object.
65 void addrqry_clear( AddrQuery *qry ) {
66 g_return_if_fail( qry != NULL );
67 g_free( qry->searchTerm );
68 qry->queryType = ADDRQUERY_NONE;
71 qry->searchTerm = NULL;
74 qry->serverObject = NULL;
75 qry->queryObject = NULL;
80 * \param qry Address query object.
82 void addrqry_free( AddrQuery *qry ) {
83 g_return_if_fail( qry != NULL );
90 * \param qry Address query object.
93 void addrqry_set_query_type( AddrQuery *qry, const AddrQueryType value ) {
94 g_return_if_fail( qry != NULL );
95 qry->queryType = value;
100 * \param qry Address query object.
101 * \param value Idle ID.
103 void addrqry_set_idle_id( AddrQuery *qry, const guint value ) {
104 g_return_if_fail( qry != NULL );
109 * Specify search term to be used.
110 * \param qry Address query object.
111 * \param value Search term.
113 void addrqry_set_search_term( AddrQuery* qry, const gchar *value ) {
114 qry->searchTerm = mgu_replace_string( qry->searchTerm, value );
115 g_return_if_fail( qry != NULL );
116 g_strstrip( qry->searchTerm );
120 * Specify server object to be used.
121 * \param qry Address query object.
122 * \param value Server object that performs the search.
124 void addrqry_set_server( AddrQuery* qry, const gpointer value ) {
125 g_return_if_fail( qry != NULL );
126 qry->serverObject = value;
130 * Specify query object to be used.
131 * \param qry Address query object.
132 * \param value Query object that performs the search.
134 void addrqry_set_query( AddrQuery* qry, const gpointer value ) {
135 g_return_if_fail( qry != NULL );
136 qry->queryObject = value;
140 * Display object to specified stream.
141 * \param qry Address query object.
142 * \param stream Output stream.
144 void addrqry_print( const AddrQuery *qry, FILE *stream ) {
145 g_return_if_fail( qry != NULL );
147 fprintf( stream, "AddressQuery:\n" );
148 fprintf( stream, " queryID: %d\n", qry->queryID );
149 fprintf( stream, " idleID: %d\n", qry->idleID );
150 fprintf( stream, " searchTerm: '%s'\n", qry->searchTerm );
155 * \param queryID ID of query being executed.
156 * \param searchTerm Search term. A private copy will be made.
157 * \param callBack Callback function.
158 * \param target Target object to receive data.
160 AddrQuery *qrymgr_add_query(
161 const gint queryID, const gchar *searchTerm, void *callBack,
166 qry = g_new0( AddrQuery, 1 );
167 qry->queryType = ADDRQUERY_NONE;
168 qry->queryID = queryID;
170 qry->searchTerm = g_strdup( searchTerm );
171 qry->callBack = callBack;
173 qry->timeStart = time( NULL );
174 qry->serverObject = NULL;
175 qry->queryObject = NULL;
177 /* Insert in head of list */
178 pthread_mutex_lock( & _queryListMutex_ );
179 _queryList_ = g_list_prepend( _queryList_, qry );
180 pthread_mutex_unlock( & _queryListMutex_ );
186 * Find query in list.
187 * \param queryID ID of query to find.
188 * \return Query object, or <i>NULL</i> if not found.
190 AddrQuery *qrymgr_find_query( const gint queryID ) {
195 pthread_mutex_lock( & _queryListMutex_ );
200 if( q->queryID == queryID ) {
204 node = g_list_next( node );
206 pthread_mutex_unlock( & _queryListMutex_ );
212 * Delete specified query.
213 * \param queryID ID of query to retire.
215 void qrymgr_delete_query( const gint queryID ) {
219 pthread_mutex_lock( & _queryListMutex_ );
226 if( qry->queryID == queryID ) {
231 node = g_list_next( node );
234 /* Free link element and associated query */
236 _queryList_ = g_list_remove_link( _queryList_, nf );
240 pthread_mutex_unlock( & _queryListMutex_ );
244 * Initialize query manager.
246 void qrymgr_initialize( void ) {
253 static void qrymgr_free_all_query( void ) {
257 pthread_mutex_lock( & _queryListMutex_ );
263 node = g_list_next( node );
265 g_list_free( _queryList_ );
267 pthread_mutex_unlock( & _queryListMutex_ );
271 * Teardown query manager.
273 void qrymgr_teardown( void ) {
274 qrymgr_free_all_query();
278 * Display all queries to specified stream.
279 * \param stream Output stream.
281 void qrymgr_print( FILE *stream ) {
285 pthread_mutex_lock( & _queryListMutex_ );
286 fprintf( stream, "=== Query Manager ===\n" );
290 addrqry_print( qry, stream );
291 fprintf( stream, "---\n" );
292 node = g_list_next( node );
294 pthread_mutex_unlock( & _queryListMutex_ );