Added lib/silcapputil for SILC application specific util routines.
[silc.git] / lib / silcapputil / silcidcache.h
1 /*
2
3   silcidcache.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2000 - 2006 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 /****h* silcidcache/SILC ID Cache Interface
21  *
22  * DESCRIPTION
23  *
24  * SILC ID Cache is an cache for all kinds of ID's used in the SILC
25  * protocol.  Application can save here the ID's it uses and the interface
26  * provides fast retrieval of the ID's from the cache.
27  *
28  * SILC ID Cache is not thread-safe.  If the same cache context must be 
29  * used in multithreaded environment concurrency control must be employed.
30  *
31  ***/
32
33 #ifndef SILCIDCACHE_H
34 #define SILCIDCACHE_H
35
36 /****s* silcidcache/SilcIDCacheAPI/SilcIDCacheEntry
37  *
38  * NAME
39  *
40  *    typedef struct SilcIDCacheEntryStruct { ... } SilcIDCacheEntry;
41  *
42  * DESCRIPTION
43  *
44  *    This is an entry in the SILC ID Cache system.  This context is
45  *    allocated by adding new entry to ID cache by calling silc_idcache_add.
46  *    Each of the fields in the structure are allocated by the caller.
47  *
48  * SOURCE
49  */
50 typedef struct SilcIDCacheEntryStruct {
51   struct SilcIDCacheEntryStruct *next;
52   void *id;                            /* Associated ID */
53   char *name;                          /* Associated entry name */
54   void *context;                       /* Associated context */
55 } *SilcIDCacheEntry;
56 /***/
57
58 /****s* silcidcache/SilcIDCacheAPI/SilcIDCache
59  *
60  * NAME
61  *
62  *    typedef struct SilcIDCacheStruct *SilcIDCache;
63  *
64  * DESCRIPTION
65  *
66  *    This context is the actual ID Cache and is allocated by
67  *    silc_idcache_alloc and given as argument usually to all
68  *    silc_idcache_* functions.  It is freed by the
69  *    silc_idcache_free function.
70  *
71  ***/
72 typedef struct SilcIDCacheStruct *SilcIDCache;
73
74 /****f* silcidcache/SilcIDCacheAPI/SilcIDCacheDestructor
75  *
76  * SYNOPSIS
77  *
78  *    typedef void (*SilcIDCacheDestructor)(SilcIDCache cache,
79  *                                          const SilcIDCacheEntry entry,
80  *                                          void *destructor_context,
81  *                                          void *app_context);
82  *
83  * DESCRIPTION
84  *
85  *    Destructor callback given as argument to silc_idcache_alloc.  This
86  *    is called when an entry is deleted from the cache.  Application
87  *    must free the contents of the `entry'.
88  *
89  ***/
90 typedef void (*SilcIDCacheDestructor)(SilcIDCache cache,
91                                       const SilcIDCacheEntry entry,
92                                       void *destructor_context,
93                                       void *app_context);
94
95 /* Prototypes */
96
97 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_alloc
98  *
99  * SYNOPSIS
100  *
101  *    SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type,
102  *                                   SilcIDCacheDestructor destructor,
103  *                                   void *destructor_context,
104  *                                   SilcBool delete_id, SilcBool delete_name);
105  *
106  * DESCRIPTION
107  *
108  *    Allocates new ID cache object. The initial amount of allocated entries
109  *    can be sent as argument. If `count' is 0 the system uses default values.
110  *    The `id_type' defines the types of the ID's that will be saved to the
111  *    cache.
112  *
113  ***/
114 SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type,
115                                SilcIDCacheDestructor destructor,
116                                void *destructor_context);
117
118 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_free
119  *
120  * SYNOPSIS
121  *
122  *    void silc_idcache_free(SilcIDCache cache);
123  *
124  * DESCRIPTION
125  *
126  *    Frees ID cache context and all cache entries.
127  *
128  ***/
129 void silc_idcache_free(SilcIDCache cache);
130
131 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_add
132  *
133  * SYNOPSIS
134  *
135  *    SilcIDCacheEntry
136  *    silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context);
137  *
138  * DESCRIPTION
139  *
140  *    Add new entry to the cache.  Returns the allocated cache entry if the
141  *    entry was added successfully, or NULL if error occurred.  The `name' is
142  *    the name associated with the ID, the `id' the actual ID and the
143  *    `context' a caller specific context.
144  *
145  *    The `name', `id' and `context' pointers will be stored in the cache,
146  *    and if the caller frees these pointers the caller is also responsible
147  *    of deleting the cache entry.
148  *
149  ***/
150 SilcIDCacheEntry
151 silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context);
152
153 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_del
154  *
155  * SYNOPSIS
156  *
157  *    SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
158  *                              void *app_context);
159  *
160  * DESCRIPTION
161  *
162  *    Delete cache entry from cache.  Returns TRUE if the entry was deleted.
163  *    The destructor will be called for the entry.  The `app_context' is
164  *    delivered to the destructor.
165  *
166  ***/
167 SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
168                           void *app_context);
169
170 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_del_by_id
171  *
172  * SYNOPSIS
173  *
174  *    SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
175  *                                    void *app_context);
176  *
177  * DESCRIPTION
178  *
179  *    Delete cache entry by ID.  Returns TRUE if the entry was deleted.
180  *    The destructor will be called for the entry.  The `app_context' is
181  *    delivered to the destructor.
182  *
183  ***/
184 SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
185                                 void *app_context);
186
187 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_del_by_context
188  *
189  * SYNOPSIS
190  *
191  *    SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context);
192  *
193  * DESCRIPTION
194  *
195  *    Deletes cachen entry by the user specified context.  Returns TRUE
196  *    if the entry was deleted.  The destructor will be called for the
197  *    entry.  The `app_context' is delivered to the destructor.
198  *
199  ***/
200 SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context,
201                                      void *app_context);
202
203 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_update_id
204  *
205  * SYNOPSIS
206  *
207  *    SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
208  *                                 void *old_id, void *new_id,
209  *                                 char *old_name, char *new_name);
210  *
211  * DESCRIPTION
212  *
213  *    Updates cache `entry' with new values.  If the `new_id' is non-NULL
214  *    then the new value will be copied over the old value in the `entry'.
215  *    If the `new_name' is non-NULL then the `entry' will be updated with
216  *    `new_name'.  The caller is responsible of freeing the old name if it
217  *    was updated with new one.  The old ID value does not need to be freed
218  *    as the new value is copied over the old value.
219  *
220  ***/
221 SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
222                              void *old_id, void *new_id,
223                              char *old_name, char *new_name);
224
225 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_get_all
226  *
227  * SYNOPSIS
228  *
229  *    SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list);
230  *
231  * DESCRIPTION
232  *
233  *    Returns all cache entries into the SilcList `ret_list' pointer.  Each
234  *    entry in the list is SilcIDCacheEntry.  Returns FALSE if the cache
235  *    is empty.
236  *
237  ***/
238 SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list);
239
240 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_id
241  *
242  * SYNOPSIS
243  *
244  *    SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
245  *                                     SilcList *ret_list);
246  *
247  * DESCRIPTION
248  *
249  *    Find ID Cache entry by ID.  This may return multiple entries.
250  *    The entires are returned into the `ret_list' SilcList context.
251  *    Returns TRUE if entry was found.
252  *
253  * NOTES
254  *
255  *    If this function is used to find Client ID (SilcClientID), only the
256  *    hash portion of the Client ID is compared.  Use the function
257  *    silc_idcache_find_by_id_one to find exact match for Client ID (full
258  *    ID is compared and not only the hash).
259  *
260  *    Comparing only the hash portion of Client ID allows searching of
261  *    Client ID's by nickname, because the hash is based on the nickname.
262  *    As nicknames are not unique, multiple entries may be found.
263  *
264  ***/
265 SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
266                                  SilcList *ret_list);
267
268 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_id_one
269  *
270  * SYNOPSIS
271  *
272  *     SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
273  *                                          SilcIDCacheEntry *ret);
274  *
275  * DESCRIPTION
276  *
277  *    Find ID Cache entry by ID.  Returns only one entry from the cache
278  *    and the found entry is considered to be exact match.  Returns TRUE
279  *    if the entry was found.
280  *
281  ***/
282 SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
283                                      SilcIDCacheEntry *ret);
284
285 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_context
286  *
287  * SYNOPSIS
288  *
289  *    SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
290  *                                      SilcIDCacheEntry *ret);
291  *
292  * DESCRIPTION
293  *
294  *    Find cache entry by user specified context. Returns TRUE if the
295  *    entry was found.
296  *
297  ***/
298 SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
299                                       SilcIDCacheEntry *ret);
300
301 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_name
302  *
303  * SYNOPSIS
304  *
305  *    SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
306  *                                       SilcList *ret_list);
307  *
308  * DESCRIPTION
309  *
310  *    Find cache entries by the name associated with the ID.  This may
311  *    return multiple entries to the `ret_list' SilcList context.  Returns
312  *    TRUE if the entry was found.
313  *
314  ***/
315 SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
316                                    SilcList *ret_list);
317
318 /****f* silcidcache/SilcIDCacheAPI/silc_idcache_find_by_name_one
319  *
320  * SYNOPSIS
321  *
322  *    SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
323  *                                       SilcIDCacheEntry *ret);
324  *
325  * DESCRIPTION
326  *
327  *    Find cache entry by the name associated with the ID.  This returns
328  *    one entry and the found entry is considered to be exact match.
329  *    Returns TRUE if the entry was found.
330  *
331  ***/
332 SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
333                                        SilcIDCacheEntry *ret);
334
335 #endif /* SILCIDCACHE_H */