Tizen 2.1 base
[external/enchant.git] / src / zemberek / zemberek_provider.cpp
1 /* Copyright (C) 2006 Barış Metin <baris@pardus.org.tr>
2  * Copyright (C) 2007 Serkan Kaba <serkan_kaba@yahoo.com>
3  * 
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02110-1301, USA.
18  *
19  * In addition, as a special exception, Dom Lachowicz
20  * gives permission to link the code of this program with
21  * non-LGPL Spelling Provider libraries (eg: a MSFT Office
22  * spell checker backend) and distribute linked combinations including
23  * the two.  You must obey the GNU Lesser General Public License in all
24  * respects for all of the code used other than said providers.  If you modify
25  * this file, you may extend this exception to your version of the
26  * file, but you are not obligated to do so.  If you do not wish to
27  * do so, delete this exception statement from your version.
28  */
29
30 #include <glib.h>
31 #include <string.h>
32
33 #include "enchant.h"
34 #include "enchant-provider.h"
35
36 #include "zemberek.h"
37
38 ENCHANT_PLUGIN_DECLARE("Zemberek")
39
40 extern "C" {
41
42 ENCHANT_MODULE_EXPORT(EnchantProvider *)
43   init_enchant_provider(void);
44
45 static int
46 zemberek_dict_check (EnchantDict * me, const char *const word, size_t len)
47 {
48     Zemberek *checker;
49     checker = (Zemberek *) me->user_data;
50     return checker->checkWord(word);
51 }
52
53 static char**
54 zemberek_dict_suggest (EnchantDict * me, const char *const word,
55                      size_t len, size_t * out_n_suggs)
56 {
57     Zemberek *checker;
58     checker = (Zemberek *) me->user_data;
59     return checker->suggestWord (word, out_n_suggs);
60 }
61
62 static void
63 zemberek_provider_dispose(EnchantProvider *me)
64 {
65     g_free(me);
66 }
67
68 static EnchantDict*
69 zemberek_provider_request_dict(EnchantProvider *me, const char *tag)
70 {
71     if (!((strcmp(tag, "tr") == 0) || (strncmp(tag, "tr_", 3) == 0)))
72         return NULL; // only handle turkish
73
74     try
75       {
76         Zemberek* checker = new Zemberek();
77
78         EnchantDict* dict = g_new0(EnchantDict, 1);
79         dict->user_data = (void *) checker;
80         dict->check = zemberek_dict_check;
81         dict->suggest = zemberek_dict_suggest;
82
83         return dict;
84       }
85     catch(...)
86       {
87         // will fail if zemberek service isn't running
88         return NULL;
89       }
90 }
91
92 static void
93 zemberek_provider_dispose_dict (EnchantProvider * me, EnchantDict * dict)
94 {
95     Zemberek *checker;
96     checker = (Zemberek *) dict->user_data;
97     delete checker;
98     g_free (dict);
99 }
100
101 static const char *
102 zemberek_provider_identify (EnchantProvider * me)
103 {
104         return "zemberek";
105 }
106
107 static const char *
108 zemberek_provider_describe (EnchantProvider * me)
109 {
110         return "Zemberek Provider";
111 }
112
113 static void
114 zemberek_provider_free_string_list (EnchantProvider * me, char **str_list)
115 {
116         g_strfreev (str_list);
117 }
118
119 static char **
120 zemberek_provider_list_dicts (EnchantProvider * me,
121                               size_t * out_n_dicts)
122 {
123   if (!zemberek_service_is_running ())
124     {
125         *out_n_dicts = 0;
126         return NULL;
127     }
128   else
129     {
130         char ** out_list = NULL;
131         *out_n_dicts = 1;
132         out_list = g_new0 (char *, 2);
133         out_list[0] = g_strdup ("tr");
134
135         return out_list;
136     }
137 }
138
139 EnchantProvider *
140 init_enchant_provider(void)
141 {
142     EnchantProvider *provider;
143
144     provider = g_new0(EnchantProvider, 1);
145     provider->dispose = zemberek_provider_dispose;
146     provider->request_dict = zemberek_provider_request_dict;
147     provider->dispose_dict = zemberek_provider_dispose_dict;
148     provider->identify = zemberek_provider_identify;
149     provider->describe = zemberek_provider_describe;
150     provider->list_dicts = zemberek_provider_list_dicts;
151     provider->free_string_list = zemberek_provider_free_string_list;
152
153     return provider;
154 }
155
156 }