lib/silcidcache added.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 20 Sep 2006 19:50:53 +0000 (19:50 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 20 Sep 2006 19:50:53 +0000 (19:50 +0000)
lib/silcutil/DIRECTORY
lib/silcutil/Makefile.ad
lib/silcutil/silcidcache.c [deleted file]
lib/silcutil/silcidcache.h [deleted file]

index c75b2bf0584094928b8284f43097240aac317481..abe7f837a9b70b1093daa7577c097c2a20f2ae04 100644 (file)
@@ -25,7 +25,6 @@
 @LINK=silcdlist.html:SILC Dynamic List Interface
 @LINK=silcvcard.html:SILC VCard Interface
 @LINK=silcapputil.html:SILC Application Utilities
-@LINK=silcidcache.html:SILC ID Cache Interface
 -->
 
 <big><b>SILC Utility Library</b></big>
index 9f5c80ce115c3594b22c679b2ad724d4f0ae89d8..3037fe24656966023bd9dac8f5acb5d2dff943e1 100644 (file)
@@ -67,8 +67,7 @@ libsilcutil_la_SOURCES = \
        silcasync.c     \
        silctime.c      \
        silcmime.c      \
-       silcstack.c     \
-       silcidcache.c
+       silcstack.c
 
 #ifdef SILC_DIST_TOOLKIT
 include_HEADERS =      \
@@ -105,8 +104,7 @@ include_HEADERS =   \
        silcasync.h     \
        silcasync_i.h   \
        silcstack.h     \
-       silcstack_i.h   \
-       silcidcache.h
+       silcstack_i.h
 
 SILC_EXTRA_DIST = tests
 #endif SILC_DIST_TOOLKIT
diff --git a/lib/silcutil/silcidcache.c b/lib/silcutil/silcidcache.c
deleted file mode 100644 (file)
index 0595938..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
-
-  silcidcache.c
-
-  Author: Pekka Riikonen <priikone@silcnet.org>
-
-  Copyright (C) 2000 - 2006 Pekka Riikonen
-
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; version 2 of the License.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-*/
-/* $Id$ */
-
-#include "silc.h"
-#include "silcidcache.h"
-
-/************************** Types and definitions ***************************/
-
-/* ID Cache context */
-struct SilcIDCacheStruct {
-  SilcHashTable id_table;           /* ID hash table */
-  SilcHashTable name_table;         /* Name hash table */
-  SilcHashTable context_table;      /* Context hash table */
-  SilcIDCacheDestructor destructor;  /* Entry destructor */
-  void *context;                    /* Destructor context */
-  SilcIdType id_type;               /* Type of ID cache */
-};
-
-
-/************************ Static utility functions **************************/
-
-/* Callback that is called by the hash table routine when traversing
-   entries in the hash table. */
-
-static void silc_idcache_get_all_foreach(void *key, void *context,
-                                        void *user_context)
-{
-  SilcList *list = user_context;
-  if (!context)
-    return;
-  silc_list_add(*list, context);
-}
-
-/* Cache entry destructor */
-
-static void silc_idcache_destructor(SilcIDCache cache,
-                                   SilcIDCacheEntry entry,
-                                   void *app_context)
-{
-  if (cache->destructor)
-    cache->destructor(cache, entry, cache->destructor, app_context);
-
-  memset(entry, 'F', sizeof(*entry));
-  silc_free(entry);
-}
-
-
-/****************************** Public API **********************************/
-
-/* Allocates new ID cache object. */
-
-SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type,
-                              SilcIDCacheDestructor destructor,
-                              void *destructor_context)
-{
-  SilcIDCache cache;
-
-  SILC_LOG_DEBUG(("Allocating new cache"));
-
-  cache = silc_calloc(1, sizeof(*cache));
-  if (!cache)
-    return NULL;
-
-  cache->id_table = silc_hash_table_alloc(count, silc_hash_id,
-                                         SILC_32_TO_PTR(id_type),
-                                         silc_hash_id_compare,
-                                         SILC_32_TO_PTR(id_type),
-                                         NULL, NULL, TRUE);
-  cache->name_table = silc_hash_table_alloc(count, silc_hash_utf8_string, NULL,
-                                           silc_hash_utf8_compare, NULL,
-                                           NULL, NULL, TRUE);
-  cache->context_table = silc_hash_table_alloc(count, silc_hash_ptr, NULL,
-                                              NULL, NULL, NULL, NULL, TRUE);
-  cache->destructor = destructor;
-  cache->context = destructor_context;
-  cache->id_type = id_type;
-
-  if (!cache->id_table || !cache->name_table || !cache->context_table) {
-    if (cache->id_table)
-      silc_hash_table_free(cache->id_table);
-    if (cache->name_table)
-      silc_hash_table_free(cache->name_table);
-    if (cache->context_table)
-      silc_hash_table_free(cache->context_table);
-    silc_free(cache);
-    return NULL;
-  }
-
-  return cache;
-}
-
-/* Frees ID cache object and cache entries */
-
-void silc_idcache_free(SilcIDCache cache)
-{
-  silc_hash_table_free(cache->id_table);
-  silc_hash_table_free(cache->name_table);
-  silc_hash_table_free(cache->context_table);
-  silc_free(cache);
-}
-
-/* Add new entry to cache */
-
-SilcIDCacheEntry
-silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context)
-{
-  SilcIDCacheEntry c;
-
-  if (!id)
-    return NULL;
-
-  /* Allocate new cache entry */
-  c = silc_calloc(1, sizeof(*c));
-  if (!c)
-    return NULL;
-
-  c->id = id;
-  c->name = name;
-  c->context = context;
-
-  SILC_LOG_DEBUG(("Adding cache entry %p", c));
-
-  /* Add the new entry to the hash tables */
-
-  if (id) {
-    if (silc_idcache_find_by_id_one(cache, id, NULL)) {
-      SILC_LOG_ERROR(("Attempted to add same ID twice to ID Cache"));
-      goto err;
-    }
-    if (!silc_hash_table_add(cache->id_table, id, c))
-      goto err;
-  }
-  if (name)
-    if (!silc_hash_table_add(cache->name_table, name, c))
-      goto err;
-  if (context)
-    if (!silc_hash_table_add(cache->context_table, context, c))
-      goto err;
-
-  return c;
-
- err:
-  if (c->name)
-    silc_hash_table_del_by_context(cache->name_table, c->name, c);
-  if (c->context)
-    silc_hash_table_del_by_context(cache->context_table, c->context, c);
-  if (c->id)
-    silc_hash_table_del_by_context(cache->id_table, c->id, c);
-  silc_free(c);
-
-  return NULL;
-}
-
-/* Delete cache entry from cache. */
-
-SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
-                         void *app_context)
-{
-  SilcBool ret = FALSE;
-
-  SILC_LOG_DEBUG(("Deleting cache entry %p", entry));
-
-  if (entry->name)
-    ret = silc_hash_table_del_by_context(cache->name_table, entry->name,
-                                        entry);
-  if (entry->context)
-    ret = silc_hash_table_del_by_context(cache->context_table, entry->context,
-                                        entry);
-  if (entry->id)
-    ret = silc_hash_table_del_by_context(cache->id_table, entry->id,
-                                        entry);
-
-  if (ret)
-    silc_idcache_destructor(cache, entry, app_context);
-
-  return ret;
-}
-
-/* Deletes ID cache entry by ID. */
-
-SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
-                               void *app_context)
-{
-  SilcIDCacheEntry c;
-
-  if (!silc_hash_table_find(cache->id_table, id, NULL, (void **)&c))
-    return FALSE;
-
-  return silc_idcache_del(cache, c, app_context);
-}
-
-/* Deletes ID cache entry by context. */
-
-SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context,
-                                    void *app_context)
-{
-  SilcIDCacheEntry c;
-
-  if (!silc_hash_table_find(cache->context_table, context, NULL, (void **)&c))
-    return FALSE;
-
-  return silc_idcache_del(cache, c, app_context);
-}
-
-/* Update entry */
-
-SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
-                            void *old_id, void *new_id,
-                            char *old_name, char *new_name)
-{
-  if (old_id && new_id) {
-    if (!silc_hash_table_del_by_context(cache->id_table, old_id, entry))
-      return FALSE;
-
-    if (cache->id_type == SILC_ID_CLIENT)
-      *(SilcClientID *)entry->id = *(SilcClientID *)new_id;
-    if (cache->id_type == SILC_ID_SERVER)
-      *(SilcServerID *)entry->id = *(SilcServerID *)new_id;
-    if (cache->id_type == SILC_ID_CHANNEL)
-      *(SilcChannelID *)entry->id = *(SilcChannelID *)new_id;
-
-    if (!silc_hash_table_add(cache->id_table, entry->id, entry))
-      return FALSE;
-  }
-
-  if (old_name && new_name) {
-    if (!silc_hash_table_del_by_context(cache->name_table, old_name, entry))
-      return FALSE;
-
-    entry->name = new_name;
-
-    if (!silc_hash_table_add(cache->name_table, entry->name, entry))
-      return FALSE;
-  }
-
-  return TRUE;
-}
-
-/* Returns all cache entrys from the ID cache to the `ret' ID Cache List. */
-
-SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list)
-{
-  if (!ret_list)
-    return FALSE;
-
-  if (!silc_hash_table_count(cache->id_table))
-    return FALSE;
-
-  silc_hash_table_foreach(cache->id_table, silc_idcache_get_all_foreach,
-                         ret_list);
-
-  if (!silc_list_count(*ret_list))
-    return FALSE;
-
-  return TRUE;
-}
-
-/* Find ID Cache entry by ID. May return multiple entries. */
-
-SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
-                                SilcList *ret_list)
-{
-  if (!ret_list)
-    return FALSE;
-
-  if (!silc_hash_table_count(cache->id_table))
-    return FALSE;
-
-  silc_hash_table_find_foreach(cache->id_table, id,
-                              silc_idcache_get_all_foreach, ret_list);
-
-  if (!silc_list_count(*ret_list))
-    return FALSE;
-
-  return TRUE;
-}
-
-/* Find one specific ID entry.  Compare full IDs */
-
-SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
-                                    SilcIDCacheEntry *ret)
-{
-  return silc_hash_table_find_ext(cache->id_table, id, NULL, (void *)ret,
-                                 NULL, NULL,
-                                 silc_hash_id_compare_full,
-                                 SILC_32_TO_PTR(cache->id_type));
-}
-
-/* Finds cache entry by context. */
-
-SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
-                                     SilcIDCacheEntry *ret)
-{
-  return silc_hash_table_find(cache->context_table, context, NULL,
-                             (void *)ret);
-}
-
-/* Find ID Cache entry by name. Returns list of cache entries. */
-
-SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
-                                  SilcList *ret_list)
-{
-  if (!ret_list)
-    return FALSE;
-
-  if (!silc_hash_table_count(cache->name_table))
-    return FALSE;
-
-  silc_hash_table_find_foreach(cache->name_table, name,
-                              silc_idcache_get_all_foreach, ret_list);
-
-  if (!silc_list_count(*ret_list))
-    return FALSE;
-
-  return TRUE;
-}
-
-/* Find ID Cache entry by name. Returns one cache entry. */
-
-SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
-                                      SilcIDCacheEntry *ret)
-{
-  return silc_hash_table_find(cache->name_table, name, NULL, (void *)ret);
-}
diff --git a/lib/silcutil/silcidcache.h b/lib/silcutil/silcidcache.h
deleted file mode 100644 (file)
index 402c171..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
-
-  silcidcache.h
-
-  Author: Pekka Riikonen <priikone@silcnet.org>
-
-  Copyright (C) 2000 - 2006 Pekka Riikonen
-
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; version 2 of the License.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-*/
-
-/****h* silccore/SILC ID Cache Interface
- *
- * DESCRIPTION
- *
- * SILC ID Cache is an cache for all kinds of ID's used in the SILC
- * protocol.  Application can save here the ID's it uses and the interface
- * provides fast retrieval of the ID's from the cache.
- *
- * SILC ID Cache is not thread-safe.  If the same cache context must be 
- * used in multithreaded environment concurrency control must be employed.
- *
- ***/
-
-#ifndef SILCIDCACHE_H
-#define SILCIDCACHE_H
-
-/****s* silccore/SilcIDCacheAPI/SilcIDCacheEntry
- *
- * NAME
- *
- *    typedef struct SilcIDCacheEntryStruct { ... } SilcIDCacheEntry;
- *
- * DESCRIPTION
- *
- *    This is an entry in the SILC ID Cache system.  This context is
- *    allocated by adding new entry to ID cache by calling silc_idcache_add.
- *    Each of the fields in the structure are allocated by the caller.
- *
- * SOURCE
- */
-typedef struct SilcIDCacheEntryStruct {
-  struct SilcIDCacheEntryStruct *next;
-  void *id;                           /* Associated ID */
-  char *name;                         /* Associated entry name */
-  void *context;                      /* Associated context */
-} *SilcIDCacheEntry;
-/***/
-
-/****s* silccore/SilcIDCacheAPI/SilcIDCache
- *
- * NAME
- *
- *    typedef struct SilcIDCacheStruct *SilcIDCache;
- *
- * DESCRIPTION
- *
- *    This context is the actual ID Cache and is allocated by
- *    silc_idcache_alloc and given as argument usually to all
- *    silc_idcache_* functions.  It is freed by the
- *    silc_idcache_free function.
- *
- ***/
-typedef struct SilcIDCacheStruct *SilcIDCache;
-
-/****f* silccore/SilcIDCacheAPI/SilcIDCacheDestructor
- *
- * SYNOPSIS
- *
- *    typedef void (*SilcIDCacheDestructor)(SilcIDCache cache,
- *                                          const SilcIDCacheEntry entry,
- *                                          void *destructor_context,
- *                                          void *app_context);
- *
- * DESCRIPTION
- *
- *    Destructor callback given as argument to silc_idcache_alloc.  This
- *    is called when an entry is deleted from the cache.  Application
- *    must free the contents of the `entry'.
- *
- ***/
-typedef void (*SilcIDCacheDestructor)(SilcIDCache cache,
-                                     const SilcIDCacheEntry entry,
-                                     void *destructor_context,
-                                     void *app_context);
-
-/* Prototypes */
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_alloc
- *
- * SYNOPSIS
- *
- *    SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type,
- *                                   SilcIDCacheDestructor destructor,
- *                                   void *destructor_context,
- *                                   SilcBool delete_id, SilcBool delete_name);
- *
- * DESCRIPTION
- *
- *    Allocates new ID cache object. The initial amount of allocated entries
- *    can be sent as argument. If `count' is 0 the system uses default values.
- *    The `id_type' defines the types of the ID's that will be saved to the
- *    cache.
- *
- ***/
-SilcIDCache silc_idcache_alloc(SilcUInt32 count, SilcIdType id_type,
-                              SilcIDCacheDestructor destructor,
-                              void *destructor_context);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_free
- *
- * SYNOPSIS
- *
- *    void silc_idcache_free(SilcIDCache cache);
- *
- * DESCRIPTION
- *
- *    Frees ID cache context and all cache entries.
- *
- ***/
-void silc_idcache_free(SilcIDCache cache);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_add
- *
- * SYNOPSIS
- *
- *    SilcIDCacheEntry
- *    silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context);
- *
- * DESCRIPTION
- *
- *    Add new entry to the cache.  Returns the allocated cache entry if the
- *    entry was added successfully, or NULL if error occurred.  The `name' is
- *    the name associated with the ID, the `id' the actual ID and the
- *    `context' a caller specific context.
- *
- *    The `name', `id' and `context' pointers will be stored in the cache,
- *    and if the caller frees these pointers the caller is also responsible
- *    of deleting the cache entry.
- *
- ***/
-SilcIDCacheEntry
-silc_idcache_add(SilcIDCache cache, char *name, void *id, void *context);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_del
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
- *                              void *app_context);
- *
- * DESCRIPTION
- *
- *    Delete cache entry from cache.  Returns TRUE if the entry was deleted.
- *    The destructor will be called for the entry.  The `app_context' is
- *    delivered to the destructor.
- *
- ***/
-SilcBool silc_idcache_del(SilcIDCache cache, SilcIDCacheEntry entry,
-                         void *app_context);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_del_by_id
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
- *                                    void *app_context);
- *
- * DESCRIPTION
- *
- *    Delete cache entry by ID.  Returns TRUE if the entry was deleted.
- *    The destructor will be called for the entry.  The `app_context' is
- *    delivered to the destructor.
- *
- ***/
-SilcBool silc_idcache_del_by_id(SilcIDCache cache, void *id,
-                               void *app_context);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_del_by_context
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context);
- *
- * DESCRIPTION
- *
- *    Deletes cachen entry by the user specified context.  Returns TRUE
- *    if the entry was deleted.  The destructor will be called for the
- *    entry.  The `app_context' is delivered to the destructor.
- *
- ***/
-SilcBool silc_idcache_del_by_context(SilcIDCache cache, void *context,
-                                    void *app_context);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_update_id
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
- *                                 void *old_id, void *new_id,
- *                                 char *old_name, char *new_name);
- *
- * DESCRIPTION
- *
- *    Updates cache `entry' with new values.  If the `new_id' is non-NULL
- *    then the new value will be copied over the old value in the `entry'.
- *    If the `new_name' is non-NULL then the `entry' will be updated with
- *    `new_name'.  The caller is responsible of freeing the old name if it
- *    was updated with new one.  The old ID value does not need to be freed
- *    as the new value is copied over the old value.
- *
- ***/
-SilcBool silc_idcache_update(SilcIDCache cache, SilcIDCacheEntry entry,
-                            void *old_id, void *new_id,
-                            char *old_name, char *new_name);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_get_all
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list);
- *
- * DESCRIPTION
- *
- *    Returns all cache entries into the SilcList `ret_list' pointer.  Each
- *    entry in the list is SilcIDCacheEntry.  Returns FALSE if the cache
- *    is empty.
- *
- ***/
-SilcBool silc_idcache_get_all(SilcIDCache cache, SilcList *ret_list);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_find_by_id
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
- *                                     SilcList *ret_list);
- *
- * DESCRIPTION
- *
- *    Find ID Cache entry by ID.  This may return multiple entries.
- *    The entires are returned into the `ret_list' SilcList context.
- *    Returns TRUE if entry was found.
- *
- * NOTES
- *
- *    If this function is used to find Client ID (SilcClientID), only the
- *    hash portion of the Client ID is compared.  Use the function
- *    silc_idcache_find_by_id_one to find exact match for Client ID (full
- *    ID is compared and not only the hash).
- *
- *    Comparing only the hash portion of Client ID allows searching of
- *    Client ID's by nickname, because the hash is based on the nickname.
- *    As nicknames are not unique, multiple entries may be found.
- *
- ***/
-SilcBool silc_idcache_find_by_id(SilcIDCache cache, void *id,
-                                SilcList *ret_list);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_find_by_id_one
- *
- * SYNOPSIS
- *
- *     SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
- *                                          SilcIDCacheEntry *ret);
- *
- * DESCRIPTION
- *
- *    Find ID Cache entry by ID.  Returns only one entry from the cache
- *    and the found entry is considered to be exact match.  Returns TRUE
- *    if the entry was found.
- *
- ***/
-SilcBool silc_idcache_find_by_id_one(SilcIDCache cache, void *id,
-                                    SilcIDCacheEntry *ret);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_find_by_context
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
- *                                      SilcIDCacheEntry *ret);
- *
- * DESCRIPTION
- *
- *    Find cache entry by user specified context. Returns TRUE if the
- *    entry was found.
- *
- ***/
-SilcBool silc_idcache_find_by_context(SilcIDCache cache, void *context,
-                                     SilcIDCacheEntry *ret);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_find_by_name
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
- *                                       SilcList *ret_list);
- *
- * DESCRIPTION
- *
- *    Find cache entries by the name associated with the ID.  This may
- *    return multiple entries to the `ret_list' SilcList context.  Returns
- *    TRUE if the entry was found.
- *
- ***/
-SilcBool silc_idcache_find_by_name(SilcIDCache cache, char *name,
-                                  SilcList *ret_list);
-
-/****f* silccore/SilcIDCacheAPI/silc_idcache_find_by_name_one
- *
- * SYNOPSIS
- *
- *    SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
- *                                       SilcIDCacheEntry *ret);
- *
- * DESCRIPTION
- *
- *    Find cache entry by the name associated with the ID.  This returns
- *    one entry and the found entry is considered to be exact match.
- *    Returns TRUE if the entry was found.
- *
- ***/
-SilcBool silc_idcache_find_by_name_one(SilcIDCache cache, char *name,
-                                      SilcIDCacheEntry *ret);
-
-#endif /* SILCIDCACHE_H */