diff options
author | Dom Lachowicz <domlachowicz@gmail.com> | 2003-08-30 22:04:34 +0000 |
---|---|---|
committer | Dom Lachowicz <domlachowicz@gmail.com> | 2003-08-30 22:04:34 +0000 |
commit | 8d46a343ef7d49dbf489eeedb3c46cd13ee4c38e (patch) | |
tree | bf5a5fd48d3e4959b4fae44eed8e2bb3e4cde124 | |
parent | 663b32ea011492ab90d4b069a5bbc084c29ea66e (diff) | |
download | enchant-8d46a343ef7d49dbf489eeedb3c46cd13ee4c38e.tar.gz |
error handling functionality
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@20831 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | src/aspell/aspell_provider.c | 17 | ||||
-rw-r--r-- | src/enchant++.h | 40 | ||||
-rw-r--r-- | src/enchant-provider.h | 9 | ||||
-rw-r--r-- | src/enchant.c | 149 | ||||
-rw-r--r-- | src/enchant.h | 14 | ||||
-rw-r--r-- | tests/test-enchant.c | 7 | ||||
-rw-r--r-- | tests/test-enchantxx.cpp | 26 |
7 files changed, 219 insertions, 43 deletions
diff --git a/src/aspell/aspell_provider.c b/src/aspell/aspell_provider.c index 67bb843..05f926d 100644 --- a/src/aspell/aspell_provider.c +++ b/src/aspell/aspell_provider.c @@ -44,13 +44,19 @@ static int aspell_dict_check (EnchantDict * me, const char *const word, size_t len) { PspellManager *manager; - + int val; + manager = (PspellManager *) me->user_data; - if (1 == pspell_manager_check (manager, word, len)) - return 0; - - return 1; + val = pspell_manager_check (manager, word, len); + if (val == 0) + return 1; + else if (val > 0) + return 1; + else { + enchant_dict_set_error (me, pspell_manager_error_message (manager)); + return -1; + } } static char ** @@ -156,6 +162,7 @@ aspell_provider_request_dict (EnchantProvider * me, const char *const tag) g_warning ("Aspell Enchant backend error when requesting '%s' dictionary: %s\n", tag, pspell_error_message(spell_error)); */ + enchant_provider_set_error (me, pspell_error_message(spell_error)); return NULL; } diff --git a/src/enchant++.h b/src/enchant++.h index d1d8099..9c48127 100644 --- a/src/enchant++.h +++ b/src/enchant++.h @@ -40,6 +40,28 @@ namespace enchant { class Broker; + class Exception : public std::exception + { + public: + Exception (const char * ex) + : std::exception () + { + if (ex) + m_ex = ex; + } + + virtual ~Exception () throw() + { + } + + virtual const char * what () throw() { + return m_ex.c_str(); + } + + private: + std::string m_ex; + }; + class Dict { friend class enchant::Broker; @@ -51,10 +73,17 @@ namespace enchant } bool check (const std::string & utf8word) { - if (enchant_dict_check (m_dict, utf8word.c_str(), - utf8word.size()) == 0) + int val; + + val = enchant_dict_check (m_dict, utf8word.c_str(), + utf8word.size()); + if (val == 0) return true; - return false; + else if (val > 0) + return false; + else { + throw Exception (enchant_dict_get_error (m_dict)); + } } void add_to_personal (const std::string & utf8word) { @@ -130,13 +159,12 @@ namespace enchant static Broker * instance () { return &m_instance; } - - + Dict * request_dict (const std::string & lang) { EnchantDict * dict = enchant_broker_request_dict (m_broker, lang.c_str()); if (!dict) { - throw std::exception (); + throw Exception (enchant_broker_get_error (m_broker)); return 0; // not actually reached } diff --git a/src/enchant-provider.h b/src/enchant-provider.h index 9d80f38..43dc3cd 100644 --- a/src/enchant-provider.h +++ b/src/enchant-provider.h @@ -56,11 +56,17 @@ ENCHANT_MODULE_EXPORT (char *) ENCHANT_MODULE_EXPORT (char *) enchant_get_registry_value (const char * const prefix, const char * const key); +ENCHANT_MODULE_EXPORT(void) + enchant_dict_set_error (EnchantDict * dict, const char * const err); + +ENCHANT_MODULE_EXPORT(void) + enchant_provider_set_error (EnchantProvider * provider, const char * const err); + struct str_enchant_dict { void *user_data; void *enchant_private_data; - + int (*check) (struct str_enchant_dict * me, const char *const word, size_t len); @@ -88,6 +94,7 @@ struct str_enchant_provider { void *user_data; void *enchant_private_data; + EnchantBroker * owner; void (*dispose) (struct str_enchant_provider * me); diff --git a/src/enchant.c b/src/enchant.c index 05d57bb..584fc1c 100644 --- a/src/enchant.c +++ b/src/enchant.c @@ -165,6 +165,15 @@ enchant_get_conf_dir (void) #endif } +struct str_enchant_broker +{ + GSList *provider_list; /* list of all of the spelling backend providers */ + GHashTable *dict_map; /* map of language tag -> dictionary */ + GHashTable *provider_ordering; /* map of language tag -> provider order */ + + gchar * error; +}; + typedef struct str_enchant_session { GHashTable *session; @@ -173,6 +182,8 @@ typedef struct str_enchant_session char * personal_filename; char * language_tag; + char * error; + EnchantProvider * provider; } EnchantSession; @@ -274,6 +285,96 @@ enchant_session_destroy (EnchantSession * session) g_free (session->personal_filename); g_free (session->language_tag); g_free (session); + + if (session->error) + g_free (session->error); +} + +static void +enchant_session_clear_error (EnchantSession * session) +{ + if (session->error) { + g_free (session->error); + session->error = NULL; + } +} + +/** + * enchant_dict_set_error + * + * Sets the current runtime error to @err + */ +ENCHANT_MODULE_EXPORT(void) +enchant_dict_set_error (EnchantDict * dict, const char * const err) +{ + EnchantSession * session; + + g_return_if_fail (dict); + + session = (EnchantSession*)dict->enchant_private_data; + + enchant_session_clear_error (session); + session->error = g_strdup (err); +} + +/** + * enchant_dict_get_error + * + * Returns a const char string or NULL describing the last exception. + * WARNING: error is cleared as soon as the next dictionary operation is called + */ +ENCHANT_MODULE_EXPORT(char *) +enchant_dict_get_error (EnchantDict * dict) +{ + EnchantSession * session; + + g_return_val_if_fail (dict, NULL); + + session = (EnchantSession*)dict->enchant_private_data; + + return session->error; +} + +static void +enchant_broker_clear_error (EnchantBroker * broker) +{ + if (broker->error) { + g_free (broker->error); + broker->error = NULL; + } +} + +/** + * enchant_provider_set_error + * + * Sets the current runtime error to @err + */ +ENCHANT_MODULE_EXPORT(void) +enchant_provider_set_error (EnchantProvider * provider, const char * const err) +{ + EnchantBroker * broker; + + g_return_if_fail (provider); + + broker = provider->owner; + g_return_if_fail (broker); + + enchant_broker_clear_error (broker); + broker->error = g_strdup (err); +} + +/** + * enchant_broker_get_error + * + * Returns a const char string or NULL describing the last exception. + * WARNING: error is cleared as soon as the next broker operation is called + */ +ENCHANT_MODULE_EXPORT(char *) +enchant_broker_get_error (EnchantBroker * broker) +{ + g_return_val_if_fail (broker, NULL); + + return broker->error; } /** @@ -285,7 +386,7 @@ enchant_session_destroy (EnchantSession * session) * Will return an "incorrect" value if any of those pre-conditions * are not met. * - * Returns: 0 if the word is correctly spelled, non-zero if not + * Returns: 0 if the word is correctly spelled, positive if not, negative if error */ ENCHANT_MODULE_EXPORT (int) enchant_dict_check (EnchantDict * dict, const char *const word, size_t len) @@ -297,6 +398,7 @@ enchant_dict_check (EnchantDict * dict, const char *const word, size_t len) g_return_val_if_fail (len, 1); session = (EnchantSession*)dict->enchant_private_data; + enchant_session_clear_error (session); /* first, see if it's in our session */ if (enchant_session_contains (session, word, len)) @@ -356,15 +458,16 @@ enchant_dict_add_to_personal (EnchantDict * dict, const char *const word, g_return_if_fail (dict); g_return_if_fail (word); g_return_if_fail (len); + + /* add to enchant-specific backend regardless */ + session = (EnchantSession*)dict->enchant_private_data; + enchant_session_clear_error (session); + enchant_session_add_personal (session, word, len); if (dict->add_to_personal) { (*dict->add_to_personal) (dict, word, len); } - - /* add to enchant-specific backend regardless */ - session = (EnchantSession*)dict->enchant_private_data; - enchant_session_add_personal (session, word, len); } /** @@ -384,6 +487,9 @@ enchant_dict_add_to_session (EnchantDict * dict, const char *const word, g_return_if_fail (word); g_return_if_fail (len); + session = (EnchantSession*)dict->enchant_private_data; + enchant_session_clear_error (session); + if (dict->add_to_session) { (*dict->add_to_session) (dict, word, len); @@ -391,7 +497,6 @@ enchant_dict_add_to_session (EnchantDict * dict, const char *const word, else { /* emulate a session backend if one is not provided for */ - session = (EnchantSession*)dict->enchant_private_data; enchant_session_add (session, word, len); } } @@ -413,11 +518,16 @@ enchant_dict_store_replacement (EnchantDict * dict, const char *const mis, size_t mis_len, const char *const cor, size_t cor_len) { + EnchantSession * session; + g_return_if_fail (dict); g_return_if_fail (mis); g_return_if_fail (mis_len); g_return_if_fail (cor); g_return_if_fail (cor_len); + + session = (EnchantSession*)dict->enchant_private_data; + enchant_session_clear_error (session); /* if it's not implemented, it's not worth emulating */ if (dict->store_replacement) @@ -437,8 +547,13 @@ enchant_dict_store_replacement (EnchantDict * dict, ENCHANT_MODULE_EXPORT (void) enchant_dict_free_suggestions (EnchantDict * dict, char **suggestions) { + EnchantSession * session; + g_return_if_fail (dict); g_return_if_fail (suggestions); + + session = (EnchantSession*)dict->enchant_private_data; + enchant_session_clear_error (session); if (dict->free_suggestions) { @@ -449,13 +564,6 @@ enchant_dict_free_suggestions (EnchantDict * dict, char **suggestions) /***********************************************************************************/ /***********************************************************************************/ -struct str_enchant_broker -{ - GSList *provider_list; /* list of all of the spelling backend providers */ - GHashTable *dict_map; /* map of language tag -> dictionary */ - GHashTable *provider_ordering; /* map of language tag -> provider order */ -}; - typedef EnchantProvider *(*EnchantProviderInitFunc) (void); static void @@ -498,6 +606,7 @@ enchant_load_providers_in_dir (EnchantBroker * broker, const char *dir_name) if (provider) { provider->enchant_private_data = (void *) module; + provider->owner = broker; broker->provider_list = g_slist_append (broker->provider_list, (gpointer)provider); } } @@ -736,7 +845,9 @@ enchant_broker_free (EnchantBroker * broker) g_slist_foreach (broker->provider_list, enchant_provider_free, NULL); g_slist_free (broker->provider_list); - + + enchant_broker_clear_error (broker); + g_free (broker); } @@ -757,6 +868,8 @@ enchant_broker_request_dict (EnchantBroker * broker, const char *const tag) g_return_val_if_fail (broker, NULL); g_return_val_if_fail (tag && strlen(tag), NULL); + + enchant_broker_clear_error (broker); dict = (EnchantDict*)g_hash_table_lookup (broker->dict_map, (gpointer) tag); if (dict) @@ -811,6 +924,8 @@ enchant_broker_describe (EnchantBroker * broker, g_return_if_fail (broker); g_return_if_fail (fn); + enchant_broker_clear_error (broker); + for (list = broker->provider_list; list != NULL; list = g_slist_next (list)) { provider = (EnchantProvider *) list->data; @@ -876,6 +991,8 @@ enchant_broker_free_dict (EnchantBroker * broker, EnchantDict * dict) g_return_if_fail (broker); g_return_if_fail (dict); + enchant_broker_clear_error (broker); + session = (EnchantSession*)dict->enchant_private_data; g_hash_table_remove (broker->dict_map, session->language_tag); @@ -900,6 +1017,8 @@ enchant_broker_dictionary_status (EnchantBroker * broker, g_return_val_if_fail (broker, EDS_UNKNOWN); g_return_val_if_fail (tag && strlen(tag), EDS_UNKNOWN); + enchant_broker_clear_error (broker); + /* don't query the providers if we can just do a quick map lookup */ if (g_hash_table_lookup (broker->dict_map, (gpointer) tag) != NULL) return EDS_EXISTS; @@ -951,6 +1070,8 @@ enchant_broker_set_ordering (EnchantBroker * broker, g_return_if_fail (tag && strlen(tag)); g_return_if_fail (ordering && strlen(ordering)); + enchant_broker_clear_error (broker); + tag_dupl = g_strdup (tag); ordering_dupl = g_strdup (ordering); diff --git a/src/enchant.h b/src/enchant.h index 1902903..590f392 100644 --- a/src/enchant.h +++ b/src/enchant.h @@ -75,6 +75,10 @@ ENCHANT_MODULE_EXPORT (void) ENCHANT_MODULE_EXPORT (void) enchant_dict_free_suggestions (EnchantDict * dict, char **suggestions); +/* const */ +ENCHANT_MODULE_EXPORT(char *) + enchant_dict_get_error (EnchantDict * dict); + ENCHANT_MODULE_EXPORT (EnchantBroker *) enchant_broker_init (void); ENCHANT_MODULE_EXPORT (void) @@ -90,9 +94,13 @@ ENCHANT_MODULE_EXPORT (EnchantDictStatus) const char * const tag); ENCHANT_MODULE_EXPORT (void) -enchant_broker_set_ordering (EnchantBroker * broker, - const char * const tag, - const char * const ordering); + enchant_broker_set_ordering (EnchantBroker * broker, + const char * const tag, + const char * const ordering); + +/* const */ +ENCHANT_MODULE_EXPORT(char *) + enchant_broker_get_error (EnchantBroker * broker); /** * EnchantBrokerDescribeFn diff --git a/tests/test-enchant.c b/tests/test-enchant.c index baabd72..640658f 100644 --- a/tests/test-enchant.c +++ b/tests/test-enchant.c @@ -110,6 +110,7 @@ main (int argc, char **argv) { EnchantBroker *broker; EnchantDict *dict; + const char * err; broker = enchant_broker_init (); @@ -117,7 +118,11 @@ main (int argc, char **argv) if (!dict) { - fprintf (stderr, "Couldn't create dictionary for en_US\n"); + err = enchant_broker_get_error (broker); + if (err) + fprintf (stderr, "Couldn't create dictionary for en_US: %s\n", err); + else + fprintf (stderr, "Couldn't create dictionary for en_US\n"); } else { diff --git a/tests/test-enchantxx.cpp b/tests/test-enchantxx.cpp index 33ad5db..8f92ff7 100644 --- a/tests/test-enchantxx.cpp +++ b/tests/test-enchantxx.cpp @@ -37,20 +37,20 @@ using namespace enchant; static void -enumerate_dicts (const char * const name, - const char * const desc, - const char * const file, - void * ud) +enumerate_dicts_fn (const char * const name, + const char * const desc, + const char * const file, + void * ud) { printf ("%s: '%s' (%s)\n", name, desc, file); } static void -describe_dict (const char * const lang, - const char * const name, - const char * const desc, - const char * const file, - void * ud) +describe_dict_fn (const char * const lang, + const char * const name, + const char * const desc, + const char * const file, + void * ud) { printf ("%s: %s '%s' (%s)\n", lang, name, desc, file); } @@ -110,13 +110,13 @@ main (int argc, char **argv) try { dict = broker->request_dict ("en_US"); - dict->describe (describe_dict); + dict->describe (describe_dict_fn); run_dict_tests (dict); - broker->describe (enumerate_dicts); + broker->describe (enumerate_dicts_fn); delete dict; - } catch (...) { - fprintf (stderr, "Couldn't create dictionary for en_US\n"); + } catch (Exception & ex) { + fprintf (stderr, "Couldn't create dictionary for en_US: %s\n", ex.what()); return 1; } |