* each thread running has own data
authorstranger <dariusz.wiechecki@gmail.com>
Tue, 7 Aug 2007 11:56:14 +0000 (11:56 +0000)
committerstranger <dariusz.wiechecki@gmail.com>
Tue, 7 Aug 2007 11:56:14 +0000 (11:56 +0000)
 * Engine API changed (searching functions has additional parameter cb_data which could ovveride default data passing
to returning results callbacks)
 * changing engines according to the new API

git-svn-id: file:///svnroot/mdictionary/trunk@142 5bde0345-f819-0410-ac75-e5045f9217cc

13 files changed:
include/dictionary_engine.h
src/bookmarks/bdb/include/engine_bookmark.h
src/bookmarks/bdb/src/engine_bookmark.c
src/manager/include/ws_manager.h
src/manager/include/ws_mng_searching_threads.h
src/manager/include/ws_mng_threads_utils.h
src/manager/src/ws_mng_callbacks.c
src/manager/src/ws_mng_searching_threads.c
src/manager/src/ws_mng_threads_utils.c
src/plugins/stardict/include/engine_stardict.h
src/plugins/stardict/src/engine_stardict.c
src/plugins/xdxf/include/engine_xdxf.h
src/plugins/xdxf/src/engine_xdxf.c

index 7877c82..20ada28 100644 (file)
@@ -121,14 +121,16 @@ Copyright 2006 ComArch S.A.
 #define         dict_eng_destroy(engine)    \
                         ((engine) -> engine_close( (engine) ))
 //------------------------------------------------------------------------------
-#define         dict_eng_search_word_list(engine,pattern)    \
+#define         dict_eng_search_word_list(engine,pattern,data)    \
                         ((engine) -> engine_search_word_list( (engine),        \
-                                                              (pattern)        \
+                                                              (pattern),       \
+                                                              (data)           \
                                                             ))
 //------------------------------------------------------------------------------
-#define         dict_eng_search_word_translation(engine,word)    \
+#define         dict_eng_search_word_translation(engine,word,data)    \
                         ((engine) -> engine_search_word_translation( (engine), \
-                                                                     (word)    \
+                                                                     (word),   \
+                                                                     (data)    \
                                                                    ))
 //------------------------------------------------------------------------------
 #define         dict_eng_search_word_translation_extended(engine,word)   \
@@ -237,9 +239,11 @@ struct _Engine
         gboolean        (*engine_is_optimized)(Engine* engine);
         void            (*engine_optimize)(Engine* engine);
         void            (*engine_search_word_list)(Engine* engine,
-                                                   gchar* pattern);
+                                                   gchar* pattern,
+                                                  gpointer data);
         void            (*engine_search_word_translation)(Engine* engine,
-                                                          gchar* word);
+                                                          gchar* word,
+                                                         gpointer data);
         void            (*engine_close)(Engine* engine);
         // engine status
         EngineStatus    (*engine_status)(Engine* engine);
index d83b0c2..a4c7ea2 100755 (executable)
@@ -56,9 +56,10 @@ Copyright 2006 ComArch S.A.
 #define TIMER_STOP      FALSE
 //------------------------------------------------------------------------------
 // definitions of version and format which engine handles
-static const gchar* DIC_ENG_VERSION = "0.2"; 
+static const gchar* DIC_ENG_VERSION = "0.2";
 static const gchar* DIC_ENG_FORMAT = "Users' Bookmarks";
-static const gchar* DIC_ENG_DESCRIPTION = "This module handles users' bookmarks. Based on Berkeley DB 1.85";
+static const gchar* DIC_ENG_DESCRIPTION = "This module handles users' "
+                                          "bookmarks. Based on Berkeley DB 1.85";
                            
 //------------------------------------------------------------------------------
 // macro for "printing" gboolean statement - "TRUE" or "FALSE"
@@ -213,10 +214,14 @@ void            bm_engine_set_progress_seed(Engine* engine,
                                          gdouble seed);
 //------------------------------------------------------------------------------
 // implementation ofdict_eng_search_word_list(engine,pattern) function
-void            bm_engine_search_word_list(Engine* engine, gchar* pattern);
+void            bm_engine_search_word_list(Engine* engine,
+                                           gchar* pattern,
+                                           gpointer data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_search_word_translation(engine,word) function
-void            bm_engine_search_word_translation(Engine* engine, gchar* word);
+void            bm_engine_search_word_translation(Engine* engine,
+                                                  gchar* word,
+                                                  gpointer data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_get_last_state(engine) function
 EngineStatus    bm_engine_status(Engine* engine);
index 98a05cd..8fa3ad5 100755 (executable)
@@ -493,7 +493,9 @@ gchar* bm_engine_get_icon_path(Engine* engine) {
 
 //------------------------------------------------------------------------------
 // searching word by concrete engine
-void bm_engine_search_word_translation(Engine* engine, gchar* word)
+void bm_engine_search_word_translation(Engine* engine,
+                                       gchar* word,
+                                       gpointer cb_data)
 {
         LOGS("Bookmark/%s->%s() called.\n-->PARAM:engine at adress=%p\n"
              "-->PARAM:word=\'%s\'\n",
@@ -557,7 +559,11 @@ void bm_engine_search_word_translation(Engine* engine, gchar* word)
         bm_timer(TIMER_START,"callback for returning word's translation START");
         // calling callback for word translation
 
-        data->cb_search_word_trans(tran, word, data->cb_search_word_trans_data, ENGINE_NO_ERROR);
+       if ( NULL == cb_data )
+       {
+               cb_data = data->cb_search_word_trans_data;
+       }
+        data->cb_search_word_trans(tran, word, cb_data, ENGINE_NO_ERROR);
                
         bm_timer(TIMER_STOP,"callback for returning word's translation END");
 //         if(data->auto_free) {
@@ -870,7 +876,9 @@ gboolean bm_engine_is_optimized(Engine* engine)
 }
 //------------------------------------------------------------------------------
 
-void bm_engine_search_word_list(Engine* engine, gchar* pattern)
+void bm_engine_search_word_list(Engine* engine,
+                                gchar* pattern,
+                                gpointer cb_data)
 {
         LOGS("Bookmark/%s->%s() called. Searching words list\n"
              "-->PARAM:engine at adress=%p\n"
@@ -944,7 +952,11 @@ void bm_engine_search_word_list(Engine* engine, gchar* pattern)
         bm_timer(TIMER_START,"callback for returning words LIST START");
         // calling callback for word translation
 
-        data->cb_search_word_list(result , pattern, data->cb_search_word_list_data, ENGINE_NO_ERROR);
+       if ( NULL == cb_data )
+       {
+               cb_data = data->cb_search_word_list_data;
+       }
+        data->cb_search_word_list(result, pattern, cb_data, ENGINE_NO_ERROR);
 
 
        /* if(data->auto_free) {
index 05acf05..db3b90c 100644 (file)
@@ -29,18 +29,6 @@ Copyright 2006 ComArch S.A.
 extern "C" {
 #endif
 
-
-
-//------------------
-//#include <gconf/gconf-client.h>
-//#include <glib/gstdio.h>
-
-
-//#include <string.h>
-// -------------------
-
-
-
 #if SQLITE==0
        #define LIBRARY "/usr/lib/libsqlite.so.0"
 #elif SQLITE==3
@@ -119,20 +107,6 @@ struct _WSMngSearchData
        GModule* bookmark_library;
 };
 
-struct _search_t {
-       WSMngSearchData *data;
-       gchar           *word;
-       GThread         *thread;
-
-        GArray          *word_list;
-        gchar           *trans;
-};
-typedef struct _search_t search_t;
-
-
-void         ws_mng_init (WSMngSearchData *data);
-void         ws_mng_init_dbus (WSMngSearchData *data);
-void         ws_mng_close (WSMngSearchData *data);
 
 
 #ifdef __cplusplus
index ef18262..74e2a71 100644 (file)
@@ -80,7 +80,7 @@ void         ws_mng_on_found_translation (gchar* translation,
  */
 gint         ws_mng_compare_strings (gconstpointer a, gconstpointer b);
 
-void         ws_remove_multiple_words(WSMngSearchData* user_data);
+void         ws_remove_multiple_words(WSMngSearchAtom* user_data);
 
 #ifdef __cplusplus
        }
index 61f9af8..e499ac1 100644 (file)
@@ -26,11 +26,23 @@ Copyright 2006-2007 ComArch S.A.
        extern "C" {
 #endif
 
-/* functions for critical sections and thread handling  */
-gboolean     try_lock_was_locked(WSMngSearchData* data, gchar* fun);
-gboolean     is_rec_locked(GStaticRecMutex* m);
-void         stop_if_needed(WSMngSearchData* data);
 
+struct _WSMngSearchAtom {
+       WSMngSearchData *data;
+       gchar           *word;
+       GThread         *thread;
+
+        GArray          *word_list;
+        gchar           *trans;
+};
+typedef struct _WSMngSearchAtom WSMngSearchAtom;
+
+/* functions for critical sections and thread handling  */
+gboolean         try_lock_was_locked(WSMngSearchData* data, gchar* fun);
+gboolean         is_rec_locked(GStaticRecMutex* m);
+void             stop_if_needed(WSMngSearchAtom* data);
+void             free_search_atom(WSMngSearchAtom* data);
+WSMngSearchAtom *create_search_atom(WSMngSearchData* app_data, gchar* word);
 #ifdef __cplusplus
        }
 #endif
index 30ac0c8..14db422 100644 (file)
@@ -58,22 +58,31 @@ void ws_mng_on_search_word(GError *error,
 
        /* get the word passed by dbus */
        osso_data = &g_array_index (word, osso_rpc_t, 0);
-       search_t* tmp = (search_t*)g_try_malloc( sizeof(search_t) );
-
+       gchar* tmp = NULL;
        if (( g_utf8_strchr(osso_data->value.s, -1, '*') == NULL ) && 
            ( g_utf8_strchr(osso_data->value.s, -1, '?') == NULL ))
        {
-               tmp->word = g_strconcat(osso_data->value.s, "*", NULL); 
+               tmp = g_strconcat(osso_data->value.s, "*", NULL);
        }
        else
        {
-               tmp->word = g_strdup(osso_data->value.s);
+               tmp = g_strdup(osso_data->value.s);
+       }
+
+       /* create and init searching data - separate for each thread */
+       WSMngSearchAtom* search_data = NULL;
+       search_data = create_search_atom(search, tmp);
+       g_free(tmp);
+       if (NULL == search_data)
+       {
+               return;
        }
-       tmp->data = search;
-       tmp->thread = NULL;
 
        g_debug("[L-word] creating GThread object...");
-       tmp->thread = g_thread_create (ws_mng_search_word, tmp, TRUE, NULL);
+       search_data->thread = g_thread_create (ws_mng_search_word,
+                                              search_data,
+                                              TRUE,
+                                              NULL);
        g_debug("[L-word] GThread object created. Exiting from CREATOR.");
 
        g_static_mutex_unlock( search->thread_creation );
@@ -89,7 +98,8 @@ void ws_mng_on_search_word(GError *error,
 * @param error error messages
 * @param user_data user data passed to function
 */
-void ws_mng_on_search_translation (GError *error, GArray *word,
+void ws_mng_on_search_translation (GError *error,
+                                   GArray *word,
                                    gpointer user_data)
 {
         g_debug("[L-tran] ->%s", __FUNCTION__);
@@ -99,14 +109,23 @@ void ws_mng_on_search_translation (GError *error, GArray *word,
        /* ---> CRITICAL SECTION for this function */
        g_static_mutex_lock(data->thread_creation);
 
-        osso_rpc_t *osso_data;
         /* get the data sended by dbus */
-        osso_data = &g_array_index (word, osso_rpc_t, 0); 
-        /* get the word sended by dbus */
-        data->word = g_strdup(osso_data->value.s);
+        osso_rpc_t *osso_data;
+        osso_data = &g_array_index (word, osso_rpc_t, 0);
+
+       /* create and init searching data - separate for each thread */
+       WSMngSearchAtom* search_data = NULL;
+       search_data = create_search_atom(data, osso_data->value.s);
+       if (NULL == search_data)
+       {
+               return;
+       }
 
         g_debug("[L-tran] creating GThread object...");
-       g_thread_create (ws_mng_search_translation, data, TRUE, NULL);
+       search_data->thread = g_thread_create (ws_mng_search_translation,
+                                              search_data,
+                                              TRUE,
+                                              NULL);
        g_debug("[L-tran] GThread object created. Exiting from CREATOR.");
 
 
index 109ec9c..1d82dc9 100644 (file)
@@ -28,8 +28,8 @@ Copyright 2006 ComArch S.A.
 gpointer ws_mng_search_word (gpointer user_data)
 {
         g_debug("[T-word] %s: Entering thread...", __FUNCTION__);
-       search_t* data = (search_t*)user_data;
-        WSMngSearchData *search = data->data;
+       WSMngSearchAtom *search_atom = (WSMngSearchAtom*)user_data;
+        WSMngSearchData *search = search_atom->data;
 
        /* enter into CRITICAL SECTION */
        if (try_lock_was_locked(search,(gchar*)__FUNCTION__))
@@ -41,20 +41,21 @@ gpointer ws_mng_search_word (gpointer user_data)
        g_static_rec_mutex_unlock(search->action_stop);
 
        /* if another thread was run after this one - exit */
-       stop_if_needed(search);
+       stop_if_needed(search_atom);
 
        g_debug("[T-word] %s - from now this thread is \'singleton\' ",
                __FUNCTION__
               );
        ws_dbus_notify(search->dbus_data, WS_DBUS_WORDS_LIST_STARTED);
        /* creating new GArray for word list */
-       search->word_list = g_array_new(TRUE, TRUE, sizeof(gchar*));
+       search_atom->word_list = g_array_new(TRUE, TRUE, sizeof(gchar*));
 
        g_debug("[T-word] %s - start searching... ",__FUNCTION__);
         if (search->bookmark_mode)
        {       /* search only in user bookmarks */
                dict_eng_search_word_list(search->bookmark,
-                                         data->word);
+                                         search_atom->word,
+                                         search_atom);
        }
        else
        {       /* search for word in each dictionary */
@@ -66,43 +67,43 @@ gpointer ws_mng_search_word (gpointer user_data)
                                continue;
                        }
 
-                       stop_if_needed(search);
+                       stop_if_needed(search_atom);
                        Engine* dict = g_array_index(search->dict,Engine *,i);
-                       dict_eng_search_word_list(dict, data->word);
+                       dict_eng_search_word_list(dict, search_atom->word, search_atom);
                }
        }
        g_debug("[T-word] %s - searching finished.",__FUNCTION__);
 
        /* if another thread was run after this one - exit */
-       stop_if_needed(search);
+       stop_if_needed(search_atom);
 
        /* sort and cleaning words list - only if there were more than one
         * dictionary loaded */
        if ((FALSE == search->bookmark_mode) || (1 < search->dict->len))
        {
-               g_array_sort(search->word_list, ws_mng_compare_strings);
-               ws_remove_multiple_words(search);
+               g_array_sort(search_atom->word_list, ws_mng_compare_strings);
+               ws_remove_multiple_words(search_atom);
        }
 
        /* if another thread was run after this one - exit */
-       stop_if_needed(search);
+       stop_if_needed(search_atom);
 
-       ws_dbus_server_return_words(search->dbus_data, search->word_list);
+       ws_dbus_server_return_words(search->dbus_data, search_atom->word_list);
        ws_dbus_notify(search->dbus_data, WS_DBUS_WORDS_LIST_FINISHED);
 
        /* free memory used by each word from word list */
        gint i = 0;
-       for (; i < search->word_list->len; i++)
+       for (; i < search_atom->word_list->len; i++)
        {
-               g_free(g_array_index(search->word_list,gchar* ,i));
+               g_free(g_array_index(search_atom->word_list,gchar* ,i));
        }
 
        /* free memory used by GArray */
-       g_array_free(search->word_list, TRUE);
-       search->word_list = NULL;
+       g_array_free(search_atom->word_list, TRUE);
+       search_atom->word_list = NULL;
 
-       g_free(data->word);
-       g_free(data);
+       g_free(search_atom->word);
+       g_free(search_atom);
        g_debug("[T-word] %s - leaving thread!", __FUNCTION__);
        g_static_mutex_unlock(search->action_working);
        return NULL;
@@ -123,13 +124,13 @@ void ws_mng_on_found_word(GArray* list,
 {
         g_debug("[T-word-ret]-> %s", __FUNCTION__);
 
-        WSMngSearchData *data = (WSMngSearchData *) user_data;
+        WSMngSearchAtom* search_atom = (WSMngSearchAtom*)user_data;
        static gint i = 0;
        for (i = 0; i < list->len; i++)
        {
                /* copy word found by search engine */
                gchar* new_word = g_strdup(g_array_index(list, gchar*, i));
-               g_array_append_val(data->word_list, new_word); 
+               g_array_append_val(search_atom->word_list, new_word); 
                
         }
 
@@ -145,7 +146,8 @@ void ws_mng_on_found_word(GArray* list,
 gpointer ws_mng_search_translation (gpointer data)
 {
         g_debug("[T-tran] %s: Entering thread...", __FUNCTION__);
-        WSMngSearchData *search = (WSMngSearchData *) data;
+       WSMngSearchAtom* search_atom = (WSMngSearchAtom*)data;
+        WSMngSearchData* search = search_atom->data;
 
        /* ---> CRITICAL SECTION for this function */
        if (try_lock_was_locked(search,(gchar*)__FUNCTION__))
@@ -156,7 +158,7 @@ gpointer ws_mng_search_translation (gpointer data)
        }
        g_static_rec_mutex_unlock(search->action_stop);
        /* if another thread was run after this one - exit */
-       stop_if_needed(search);
+       stop_if_needed(search_atom);
 
        g_debug("[T-tran] %s - from now this thread is \'singleton\' ",
                __FUNCTION__
@@ -167,31 +169,32 @@ gpointer ws_mng_search_translation (gpointer data)
        if (search->bookmark_mode)
        {
                dict_eng_search_word_translation(search->bookmark,
-                                                search->word);
+                                                search_atom->word,
+                                                search_atom);
        }
        else
        {
                gint i;
                for (i = 0; i < search->dict->len; i++)
                {
-                       stop_if_needed(search);
+                       stop_if_needed(search_atom);
                        if (NULL == g_array_index(search->dict, Engine*, i) )
                        {
                                continue;
                        }
                        dict_eng_search_word_translation(
                                        g_array_index(search->dict, Engine*, i),
-                                       search->word
-                                      );
+                                       search_atom->word,
+                                       search_atom);
                }
        }
        g_debug("[T-tran] %s - searching finished.",__FUNCTION__);
 
        /* if another thread was run after this one - exit */
-       stop_if_needed(search);
+       stop_if_needed(search_atom);
 
        /* send translation to gui */
-       ws_dbus_server_return_translations(search->dbus_data, search->trans);
+       ws_dbus_server_return_translations(search->dbus_data, search_atom->trans);
        ws_dbus_notify(search->dbus_data, WS_DBUS_TRANSLATION_FINISHED);
 
        g_free(search->trans);
@@ -217,15 +220,12 @@ void ws_mng_on_found_translation(gchar* translation,
                                  )
 {
         g_debug("->%s", __FUNCTION__);
-        WSMngSearchData *data = (WSMngSearchData *) user_data;
-
-       /* if user want to stop searching */
-       stop_if_needed(data);
+        WSMngSearchAtom* search_atom = (WSMngSearchAtom*)user_data;
 
        /* we get already the first translation */
-       if ((NULL != translation) && (NULL == data->trans))
+       if ((NULL != translation) && (NULL == search_atom->trans))
        {       /* concatenate tags and searched word and translation */
-               data->trans = g_strconcat("<PATTERN_OPEN>",
+               search_atom->trans = g_strconcat("<PATTERN_OPEN>",
                                          pattern,
                                          "<PATTERN_CLOSED><TRANSLATION_OPEN>",
                                          translation,
@@ -236,21 +236,18 @@ void ws_mng_on_found_translation(gchar* translation,
        else if (NULL != translation)
        {       /* if there was stored translation *
                 * copy stored translation to temporary variable*/
-               gchar* tmp = g_strconcat(data->trans,
+               gchar* tmp = g_strconcat(search_atom->trans,
                                         "<TRANSLATION_OPEN>",
                                         translation,
                                         "<TRANSLATION_CLOSED>",
                                         NULL);
                /* free memory used by stored old translation */
-               gchar* loc_tmp = data->trans;
-               data->trans = tmp;
+               gchar* loc_tmp = search_atom->trans;
+               search_atom->trans = tmp;
                g_free(loc_tmp);
                tmp = loc_tmp = NULL;
        }
 
-       /* if user want to stop searching */
-       stop_if_needed(data);
-
        g_debug("<-%s", __FUNCTION__);
 }
 
@@ -278,9 +275,9 @@ gint ws_mng_compare_strings (gconstpointer a, gconstpointer b)
        return result;
 }
 
-void ws_remove_multiple_words(WSMngSearchData* user_data)
+void ws_remove_multiple_words(WSMngSearchAtom* user_data)
 {
-       WSMngSearchData* search = (WSMngSearchData*)user_data;
+       WSMngSearchAtom* search = (WSMngSearchAtom*)user_data;
        gint j = 0;
        gint i = 0;
        gint result = -1;
@@ -294,7 +291,7 @@ void ws_remove_multiple_words(WSMngSearchData* user_data)
        }
        else
        {
-               ws_dbus_notify(search->dbus_data, WS_DBUS_WORDS_LIST_FULL);
+               ws_dbus_notify(search->data->dbus_data, WS_DBUS_WORDS_LIST_FULL);
        }
 
        for (i = 0; i < temp-1; i++)
index efcae5c..f8f1b44 100644 (file)
@@ -57,7 +57,7 @@ gboolean is_rec_locked(GStaticRecMutex* m)
 
 /* added by Dariusz Wiechecki
  * stop current thread if there is such a need - newer thread is waiting */
-void stop_if_needed(WSMngSearchData* data)
+void stop_if_needed(WSMngSearchAtom* data)
 {
        static GStaticMutex _loc;
        static GStaticMutex* loc = NULL;
@@ -69,17 +69,63 @@ void stop_if_needed(WSMngSearchData* data)
                return;
        }
 
+       WSMngSearchData* app_data = data->data;
        /* critical section for calling is_rec_locked() function*/
        g_static_mutex_lock(loc);
-       if ( is_rec_locked(data->action_stop) )
+       if ( is_rec_locked(app_data->action_stop) )
        {
                g_debug("[T-leaving] <---- Leaving thread (not finished).\n");
-               ws_dbus_notify(data->dbus_data, WS_DBUS_WORDS_LIST_FINISHED);
-               ws_dbus_notify(data->dbus_data, WS_DBUS_TRANSLATION_FINISHED);
-               /* TODO clean after this thread!!!! */
-               g_static_mutex_unlock(data->action_working);
+               ws_dbus_notify(app_data->dbus_data, WS_DBUS_WORDS_LIST_FINISHED);
+               ws_dbus_notify(app_data->dbus_data, WS_DBUS_TRANSLATION_FINISHED);
+               free_search_atom(data);
+               g_static_mutex_unlock(app_data->action_working);
                g_static_mutex_unlock(loc);
                g_thread_exit (NULL);
        }
        g_static_mutex_unlock(loc);
 }
+
+void free_search_atom(WSMngSearchAtom* data)
+{
+       g_debug("[T-clear] Cleaning after thread\n");
+       g_assert(NULL != data);
+       if (NULL != data->word)
+       {
+               g_free(data->word);
+       }
+       if (NULL != data->trans)
+       {
+               g_free(data->trans);
+       }
+       if (NULL != data->word_list)
+       {
+               /* free memory used by each word from word list */
+               gint i = 0;
+               for (; i < data->word_list->len; i++)
+               {
+                       g_free(g_array_index(data->word_list,gchar* ,i));
+               }
+               /* free memory used by GArray */
+               g_array_free(data->word_list, TRUE);
+               data->word_list = NULL;
+       }
+       g_free(data);
+}
+
+WSMngSearchAtom *create_search_atom(WSMngSearchData* app_data, gchar* word)
+{
+       WSMngSearchAtom* search_data = NULL;
+       search_data = (WSMngSearchAtom*)g_try_malloc(sizeof(WSMngSearchAtom));
+       if (NULL == search_data)
+       {
+               g_debug("[L-*] allocatting memmory for data failed!");
+               return NULL;
+       }
+        /* get the word sended by dbus */
+        search_data->word = g_strdup(word);
+       search_data->data = app_data;
+       search_data->word_list = NULL;
+       search_data->trans = NULL;
+
+       return search_data;
+}
index 1520f17..fe68b17 100755 (executable)
@@ -300,10 +300,14 @@ void            sd_engine_set_progress_seed(Engine* engine,
                                          gdouble seed);
 //------------------------------------------------------------------------------
 // implementation ofdict_eng_search_word_list(engine,pattern) function
-void            sd_engine_search_word_list(Engine* engine, gchar* pattern);
+void            sd_engine_search_word_list(Engine* engine,
+                                           gchar* pattern,
+                                           gpointer cb_data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_search_word_translation(engine,word) function
-void            sd_engine_search_word_translation(Engine* engine, gchar* word);
+void            sd_engine_search_word_translation(Engine* engine,
+                                                  gchar* word,
+                                                  gpointer cb_data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_get_last_state(engine) function
 EngineStatus    sd_engine_status(Engine* engine);
index c86e187..f96fe76 100755 (executable)
@@ -339,7 +339,9 @@ Engine* sd_engine_create(gchar* location,
  * @param engine <b>Engine*</b> to search in
  * @param pattern <b>gchar*</b> to search for
  */
-void sd_engine_search_word_list(Engine* engine, gchar* pattern)
+void sd_engine_search_word_list(Engine* engine,
+                                gchar* pattern,
+                                gpointer cb_data)
 {
        eg_debug("-> %s() called. Searching words list\n"
                "--->PARAM:engine at adress=%p\n"
@@ -428,9 +430,13 @@ void sd_engine_search_word_list(Engine* engine, gchar* pattern)
 
        sd_timer(TIMER_STOP,(gchar*)__FUNCTION__);
         sd_timer(TIMER_START,"callback for returning words LIST START");
+       if (NULL == cb_data )
+       {
+               cb_data = data->cb_search_word_list_data;
+       }
         data->cb_search_word_list(result,
                                pattern,
-                               data->cb_search_word_list_data,
+                               cb_data,
                                ENGINE_NO_ERROR
                                );
         sd_timer(TIMER_STOP,"callback for returning word LIST END");
@@ -448,7 +454,9 @@ void sd_engine_search_word_list(Engine* engine, gchar* pattern)
  * @param engine <b>Engine*</b> to search in
  * @param word <b>gchar*</b> to search for
  */
-void sd_engine_search_word_translation(Engine* engine, gchar* word)
+void sd_engine_search_word_translation(Engine* engine,
+                                       gchar* word,
+                                       gpointer cb_data)
 {
        eg_debug("-> %s() called.\n"
                "-->PARAM:engine at adress=%p\n"
@@ -463,6 +471,11 @@ void sd_engine_search_word_translation(Engine* engine, gchar* word)
        SDData* data = (SDData*)(engine->engine_data);
        gchar* trans0 = NULL;
 
+       if (NULL == cb_data )
+       {
+               cb_data = data->cb_search_word_list_data;
+       }
+
        FilePart* part = sd_find_file_part(data, word);
        if(!part)
        {
@@ -474,7 +487,7 @@ void sd_engine_search_word_translation(Engine* engine, gchar* word)
 
                data->cb_search_word_trans(NULL,
                                        word,
-                                       data->cb_search_word_trans_data,
+                                       cb_data,
                                        ENGINE_NO_ERROR
                                        );
                return;
@@ -492,7 +505,7 @@ void sd_engine_search_word_translation(Engine* engine, gchar* word)
 
                data->cb_search_word_trans(NULL,
                                        word,
-                                       data->cb_search_word_trans_data,
+                                       cb_data,
                                        ENGINE_NO_ERROR
                                        );
                return;
@@ -515,7 +528,7 @@ void sd_engine_search_word_translation(Engine* engine, gchar* word)
 
                data->cb_search_word_trans(NULL,
                                        word,
-                                       data->cb_search_word_trans_data,
+                                       cb_data,
                                        ENGINE_NO_ERROR
                                        );
                return;
@@ -527,7 +540,7 @@ void sd_engine_search_word_translation(Engine* engine, gchar* word)
 
        data->cb_search_word_trans(trans,
                                word,
-                               data->cb_search_word_trans_data,
+                               cb_data,
                                ENGINE_NO_ERROR
                                );
        
index 23efe6e..c611cc8 100644 (file)
@@ -231,12 +231,17 @@ static gchar* word_translation_cache(XDXFData* data, gchar* word);
 // return translation of word but using only xdxf dictionary file
 static gchar* word_translation_xdxf(XDXFData* data, gchar* word);
 //------------------------------------------------------------------------------
-
 // return translation of word using cache file
-static void word_list_cache(XDXFData* data, gchar* pattern, GArray* result);
+static void word_list_cache(XDXFData* data,
+                            gchar* pattern,
+                            GArray* result,
+                            gpointer cb_data);
 //------------------------------------------------------------------------------
 // return translation of word but using only xdxf dictionary file
-static void word_list_xdxf(XDXFData* data, gchar* pattern, GArray* result);
+static void word_list_xdxf(XDXFData* data,
+                           gchar* pattern,
+                           GArray* result,
+                           gpointer cb_data);
 //------------------------------------------------------------------------------
 
 
@@ -293,10 +298,14 @@ void            xdxf_engine_set_progress_seed(Engine* engine,
                                          gdouble seed);
 //------------------------------------------------------------------------------
 // implementation ofdict_eng_search_word_list(engine,pattern) function
-void            xdxf_engine_search_word_list(Engine* engine, gchar* pattern);
+void            xdxf_engine_search_word_list(Engine* engine,
+                                             gchar* pattern,
+                                             gpointer data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_search_word_translation(engine,word) function
-void            xdxf_engine_search_word_translation(Engine* engine, gchar* word);
+void            xdxf_engine_search_word_translation(Engine* engine,
+                                                    gchar* word,
+                                                    gpointer data);
 //------------------------------------------------------------------------------
 // implementation of dict_eng_search_word_translation_extended(engine,word)
 // function
index 3639e98..fb05efc 100644 (file)
@@ -179,7 +179,9 @@ static gchar* word_translation_xdxf(XDXFData* data, gchar* word) {
 }
 //------------------------------------------------------------------------------
 // searching word by concrete engine
-void xdxf_engine_search_word_translation(Engine* engine, gchar* word)
+void xdxf_engine_search_word_translation(Engine* engine,
+                                         gchar* word,
+                                         gpointer user_data)
 {
         g_debug("XDXF/%s->%s() called.\n"
                 "-->PARAM:engine at adress=%p\n"
@@ -228,9 +230,15 @@ void xdxf_engine_search_word_translation(Engine* engine, gchar* word)
         //timer(TIMER_STOP,(gchar*)__FUNCTION__);
         //timer(TIMER_START,"callback for returning word's translation START");
         // calling callback for word translation
+       gpointer tmp = user_data;
+       if (NULL == tmp)
+       {
+               tmp = data->cb_search_word_trans_data;
+       }
+       
         data->cb_search_word_trans(trans,
                                    word,
-                                   data->cb_search_word_trans_data,
+                                   tmp,
                                    ENGINE_NO_ERROR
                                   );
         //timer(TIMER_STOP,"callback for returning word's translation END");
@@ -1416,7 +1424,10 @@ static void search_word_list_text(void *data, const XML_Char *txt, int len)
 }
 //------------------------------------------------------------------------------
 // return translation of word using cache file
-static void word_list_cache(XDXFData* data, gchar* pattern, GArray* result) {
+static void word_list_cache(XDXFData* data,
+                            gchar* pattern,
+                            GArray* result,
+                            gpointer cb_data) {
         gnome_vfs_seek(data->cache, GNOME_VFS_SEEK_START, 0);        
         //GnomeVFSResult vfs_result;
         GnomeVFSFileSize bytes_readed;
@@ -1487,7 +1498,7 @@ static void word_list_cache(XDXFData* data, gchar* pattern, GArray* result) {
         //timer(TIMER_START,"callback for returning words list START");
         data->cb_search_word_list(result,
                                   pattern,
-                                  data->cb_search_word_list_data,
+                                  cb_data,
                                   ENGINE_NO_ERROR
                                  );
        g_free(casefold_pattern); casefold_pattern = NULL;
@@ -1495,7 +1506,10 @@ static void word_list_cache(XDXFData* data, gchar* pattern, GArray* result) {
 }
 //------------------------------------------------------------------------------
 // return translation of word but using only xdxf dictionary file
-static void word_list_xdxf(XDXFData* data, gchar* pattern, GArray* result)
+static void word_list_xdxf(XDXFData* data,
+                           gchar* pattern,
+                           GArray* result,
+                           gpointer cb_data)
 {
         gnome_vfs_seek(data->xdxf, GNOME_VFS_SEEK_START, 0);
         GnomeVFSResult vfs_result;
@@ -1595,13 +1609,15 @@ static void word_list_xdxf(XDXFData* data, gchar* pattern, GArray* result)
         //timer(TIMER_START,"callback for returning words list START");
         data->cb_search_word_list(result,
                                   pattern,
-                                  data->cb_search_word_list_data,
+                                  cb_data,
                                   ENGINE_NO_ERROR
                                  );
         //timer(TIMER_STOP,"callback for returning words list END");
 }
 //------------------------------------------------------------------------------
-void xdxf_engine_search_word_list(Engine* engine, gchar* pattern)
+void xdxf_engine_search_word_list(Engine* engine,
+                                  gchar* pattern,
+                                  gpointer user_data)
 {
         g_debug("XDXF/%s->%s() called. Searching words list\n"
                 "-->PARAM:engine at adress=%p\n"
@@ -1626,35 +1642,25 @@ void xdxf_engine_search_word_list(Engine* engine, gchar* pattern)
                 //timer(TIMER_STOP,(gchar*)__FUNCTION__);
                 return;
         };
+
+       gpointer cb_data =  user_data;
+       if ( NULL == cb_data )
+       {
+               cb_data = data->cb_search_word_list_data;
+       }
         GArray* result = g_array_new(TRUE,FALSE,sizeof(gchar*));
         // dictionary is optimized so search in cache file
         if(data->cache != NULL)
        {
-                word_list_cache(data, pattern, result);
+                word_list_cache(data, pattern, result, cb_data);
         }
         // dictionary is not optimized so search directly fom XDXF file
         else
        {
-                word_list_xdxf(data, pattern, result);
+                word_list_xdxf(data, pattern, result, cb_data);
         };
        guint i = 0;
-        /*if(data->auto_free == TRUE)
-       {
-                g_debug("XDXF/%s->%s() deleting all dynamic data because "
-                        "AUTO_FREE=TRUE\n",
-                        __FILE__,
-                        __FUNCTION__
-                       );
-                gchar* tmp;
-                
-                while((tmp = g_array_index(result, gchar*, i)) != NULL) 
-                {
-                        g_free(tmp); tmp = NULL;
-                        i++;
-                }
-               g_array_free(result, TRUE);
-               result = NULL;
-        };*/
+
        if (result!=NULL){
                for (i=0; i<result->len; i++)
                {