summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2003-08-30 22:04:34 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2003-08-30 22:04:34 +0000
commit8d46a343ef7d49dbf489eeedb3c46cd13ee4c38e (patch)
treebf5a5fd48d3e4959b4fae44eed8e2bb3e4cde124
parent663b32ea011492ab90d4b069a5bbc084c29ea66e (diff)
downloadenchant-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.c17
-rw-r--r--src/enchant++.h40
-rw-r--r--src/enchant-provider.h9
-rw-r--r--src/enchant.c149
-rw-r--r--src/enchant.h14
-rw-r--r--tests/test-enchant.c7
-rw-r--r--tests/test-enchantxx.cpp26
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;
}