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 necessary to access LDAP servers.
38 #include "addrcache.h"
40 #include "ldapquery.h"
41 #include "ldapserver.h"
43 #include "adbookbase.h"
46 * Create new LDAP server interface object.
47 * \return Initialized LDAP server object.
49 LdapServer *ldapsvr_create() {
52 server = g_new0( LdapServer, 1 );
53 server->type = ADBOOKTYPE_LDAP;
54 server->addressCache = addrcache_create();
55 server->retVal = MGU_SUCCESS;
56 server->control = ldapctl_create();
57 server->listQuery = NULL;
58 server->searchFlag = FALSE;
63 * Return name of server.
64 * \param server Server object.
65 * \return Name for server.
67 gchar *ldapsvr_get_name( LdapServer *server ) {
68 g_return_val_if_fail( server != NULL, NULL );
69 return addrcache_get_name( server->addressCache );
73 * Specify name to be used.
74 * \param server Server object.
75 * \param value Name for server.
77 void ldapsvr_set_name( LdapServer* server, const gchar *value ) {
78 g_return_if_fail( server != NULL );
79 addrcache_set_name( server->addressCache, value );
83 * Refresh internal variables to force a file read.
84 * \param server Server object.
86 void ldapsvr_force_refresh( LdapServer *server ) {
87 addrcache_refresh( server->addressCache );
91 * Return status/error code.
92 * \param server Server object.
93 * \return Status/error code.
95 gint ldapsvr_get_status( LdapServer *server ) {
96 g_return_val_if_fail( server != NULL, -1 );
97 return server->retVal;
101 * Return reference to root level folder.
102 * \param server Server object.
103 * \return Root level folder.
105 ItemFolder *ldapsvr_get_root_folder( LdapServer *server ) {
106 g_return_val_if_fail( server != NULL, NULL );
108 printf( "ldapsvr_get_root_folder/start\n" );
109 ldapsvr_print_data( server, stdout );
110 printf( "ldapsvr_get_root_folder/done\n" );
112 return addrcache_get_root_folder( server->addressCache );
116 * Test whether server data has been accessed.
117 * \param server Server object.
118 * \return <i>TRUE</i> if data was accessed.
120 gboolean ldapsvr_get_accessed( LdapServer *server ) {
121 g_return_val_if_fail( server != NULL, FALSE );
122 return server->addressCache->accessFlag;
126 * Specify that server's data whas beed accessed.
127 * \param server Server object.
128 * \param value Value for flag.
130 void ldapsvr_set_accessed( LdapServer *server, const gboolean value ) {
131 g_return_if_fail( server != NULL );
132 server->addressCache->accessFlag = value;
136 * Test whether server data has been modified.
137 * \param server Server object.
138 * \return <i>TRUE</i> if data was modified.
140 gboolean ldapsvr_get_modified( LdapServer *server ) {
141 g_return_val_if_fail( server != NULL, FALSE );
142 return server->addressCache->modified;
146 * Specify modify flag.
147 * \param server Server object.
148 * \param value Value for flag.
150 void ldapsvr_set_modified( LdapServer *server, const gboolean value ) {
151 g_return_if_fail( server != NULL );
152 server->addressCache->modified = value;
156 * Test whether data was read from server.
157 * \param server Server object.
158 * \return <i>TRUE</i> if data was read.
160 gboolean ldapsvr_get_read_flag( LdapServer *server ) {
161 g_return_val_if_fail( server != NULL, FALSE );
162 return server->addressCache->dataRead;
166 * Test whether server is to be used for dynamic searches.
167 * \param server Server object.
168 * \return <i>TRUE</i> if server is used for dynamic searches.
170 gboolean ldapsvr_get_search_flag( LdapServer *server ) {
171 g_return_val_if_fail( server != NULL, FALSE );
172 return server->searchFlag;
176 * Specify that server is to be used for dynamic searches.
177 * \param server Server object.
178 * \param value Name for server.
180 void ldapsvr_set_search_flag( LdapServer *server, const gboolean value ) {
181 g_return_if_fail( server != NULL );
182 server->searchFlag = value;
186 * Specify the reference to control data that will be used for the query. The calling
187 * module should be responsible for creating and destroying this control object.
188 * \param server Server object.
189 * \param ctl Control data.
191 void ldapsvr_set_control( LdapServer *server, LdapControl *ctl ) {
192 g_return_if_fail( server != NULL );
193 addrcache_refresh( server->addressCache );
194 server->control = ctl;
198 * Release LDAP control object.
199 * \param server Server object.
201 static void ldapsvr_release_control( LdapServer *server ) {
202 g_return_if_fail( server != NULL );
203 ldapctl_free( server->control );
204 server->control = NULL;
208 * Free up LDAP server interface object by releasing internal memory.
209 * \param server Server object.
211 void ldapsvr_free( LdapServer *server ) {
212 g_return_if_fail( server != NULL );
214 /* Stop and cancel any queries that may be active */
215 ldapsvr_stop_all_query( server );
216 ldapsvr_cancel_all_query( server );
219 addrcache_clear( server->addressCache );
220 addrcache_free( server->addressCache );
222 /* Free LDAP control block */
223 ldapctl_free( server->control );
224 server->control = NULL;
227 server->type = ADBOOKTYPE_NONE;
228 server->addressCache = NULL;
229 server->retVal = MGU_SUCCESS;
230 server->listQuery = NULL;
231 server->searchFlag = FALSE;
233 /* Now release LDAP object */
238 * Display object to specified stream.
239 * \param server Server object.
240 * \param stream Output stream.
242 void ldapsvr_print_data( LdapServer *server, FILE *stream ) {
246 g_return_if_fail( server != NULL );
248 fprintf( stream, "LdapServer:\n" );
249 fprintf( stream, " ret val: %d\n", server->retVal );
250 fprintf( stream, "srch flag: %s\n",
251 server->searchFlag ? "yes" : "no" );
252 if( server->control ) {
253 ldapctl_print( server->control, stream );
256 fprintf( stream, " control: NULL\n" );
258 addrcache_print( server->addressCache, stream );
259 addritem_print_item_folder( server->addressCache->rootFolder, stream );
263 node = server->listQuery;
265 LdapQuery *qry = node->data;
266 fprintf( stream, " query: %2d : %s\n", i, qry->queryName );
268 node = g_list_next( node );
273 * Add query to server.
274 * \param server Server object.
275 * \param qry Query object.
277 void ldapsvr_add_query( LdapServer *server, LdapQuery *qry ) {
278 g_return_if_fail( server != NULL );
279 g_return_if_fail( qry != NULL );
281 server->listQuery = g_list_append( server->listQuery, qry );
282 qry->server = server;
287 * \param server Server object.
289 void ldapsvr_free_all_query( LdapServer *server ) {
291 g_return_if_fail( server != NULL );
293 node = server->listQuery;
295 LdapQuery *qry = node->data;
298 node = g_list_next( node );
300 g_list_free( server->listQuery );
301 server->listQuery = NULL;
305 * Return link list of persons.
306 * \param server Server object.
307 * \return List of persons.
309 GList *ldapsvr_get_list_person( LdapServer *server ) {
310 g_return_val_if_fail( server != NULL, NULL );
311 return addrcache_get_list_person( server->addressCache );
315 * Return link list of folders. There are no "real" folders that are returned
317 * \param server Server object.
318 * \return List of folders.
320 GList *ldapsvr_get_list_folder( LdapServer *server ) {
321 g_return_val_if_fail( server != NULL, NULL );
322 /* return addrcache_get_list_folder( server->addressCache ); */
327 * Execute specified query.
328 * \param server LDAP server.
329 * \param qry LDAP query.
331 void ldapsvr_execute_query( LdapServer *server, LdapQuery *qry ) {
332 LdapControl *ctlCopy;
334 g_return_if_fail( server != NULL );
335 g_return_if_fail( qry != NULL );
337 /* Copy server's control data to the query */
338 ctlCopy = ldapctl_create();
339 ldapctl_copy( server->control, ctlCopy );
340 ldapqry_set_control( qry, ctlCopy );
341 ldapqry_initialize();
344 printf( "ldapsvr_execute_query::reading with thread...\n" );
345 if( ldapqry_check_search( qry ) ) {
346 ldapqry_read_data_th( qry );
347 if( qry->retVal == LDAPRC_SUCCESS ) {
348 printf( "ldapsvr_execute_query::SUCCESS with thread...\n" );
351 printf( "ldapsvr_execute_query... terminated\n" );
355 * Stop all queries for specified ID.
356 * \param server Server object.
357 * \param queryID Query ID to stop.
359 void ldapsvr_stop_query_id( LdapServer *server, const gint queryID ) {
361 g_return_if_fail( server != NULL );
363 node = server->listQuery;
365 LdapQuery *qry = node->data;
366 if( qry->queryID == queryID ) {
367 /* Notify thread to stop */
368 ldapqry_set_stop_flag( qry, TRUE );
370 node = g_list_next( node );
375 * Stop all queries by notifying each thread to stop.
376 * \param server Server object.
378 void ldapsvr_stop_all_query( LdapServer *server ) {
380 g_return_if_fail( server != NULL );
382 node = server->listQuery;
384 LdapQuery *qry = node->data;
385 ldapqry_set_stop_flag( qry, TRUE );
386 node = g_list_next( node );
391 * Cancel all query threads for server.
392 * \param server Server object.
394 void ldapsvr_cancel_all_query( LdapServer *server ) {
396 g_return_if_fail( server != NULL );
398 node = server->listQuery;
400 LdapQuery *qry = node->data;
401 /* Notify thread to stop */
402 ldapqry_set_stop_flag( qry, TRUE );
403 /* Now cancel thread */
404 ldapqry_cancel( qry );
405 node = g_list_next( node );
410 * Search most recent query for specified search term. The most recent
411 * completed query is returned. If no completed query is found, the most recent
412 * incomplete is returned.
413 * \param server LdapServer.
414 * \param searchTerm Search term to locate.
415 * \return Query object, or <i>NULL</i> if none found.
417 LdapQuery *ldapsvr_locate_query( LdapServer *server, const gchar *searchTerm )
419 LdapQuery *incomplete = NULL;
421 g_return_if_fail( server != NULL );
423 node = server->listQuery;
424 node = g_list_last( node );
425 /* Search backwards for query */
427 LdapQuery *qry = node->data;
428 if( g_strcasecmp( qry->searchValue, searchTerm ) == 0 ) {
429 if( qry->agedFlag ) continue;
430 if( qry->completed ) {
438 node = g_list_previous( node );
444 * Retire aged queries.
445 * \param server LdapServer.
447 void ldapsvr_retire_query( LdapServer *server ) {
454 g_return_if_fail( server != NULL );
455 ctl = server->control;
456 maxAge = ctl->maxQueryAge;
458 /* Identify queries to age and move to deletion list */
460 node = server->listQuery;
462 LdapQuery *qry = node->data;
464 ldapqry_age( qry, maxAge );
465 if( qry->agedFlag ) {
466 /* Delete folder associated with query */
467 ldapqry_delete_folder( qry );
468 listDelete = g_list_append( listDelete, qry );
470 node = g_list_next( node );
474 listQuery = server->listQuery;
477 LdapQuery *qry = node->data;
479 listQuery = g_list_remove( listQuery, qry );
482 node = g_list_next( node );
484 server->listQuery = listQuery;
486 /* Free up deletion list */
487 g_list_free( listDelete );
490 #endif /* USE_LDAP */