10
#endif /* HAVE_UNISTD_H */
11
#ifdef HAVE_SYS_TYPES_H
12
# include <sys/types.h>
13
#endif /* HAVE_SYS_TYPES_H */
14
#ifdef HAVE_SYS_STAT_H
15
# include <sys/stat.h>
16
#endif /* HAVE_SYS_STAT_H */
18
#ifdef HAVE_LIBTRANSLATE
19
#include <translate.h>
20
#endif /* HAVE_LIBTRANSLATE */
22
#include "../src/rccexternal.h"
23
#include "../src/rcctranslate.h"
24
#include "../src/rccdb4.h"
25
#include "rcclibtranslate.h"
28
#ifdef HAVE_LIBTRANSLATE
29
static TranslateSession *session = NULL;
30
static db4_context db4ctx = NULL;
32
static int exitflag = 0;
33
static GMutex *mutex = NULL;
34
static GCond *cond = NULL;
35
static GQueue *queue = NULL;
36
static GThread *thread = NULL;
39
static char *rccCreateKey(const char *from, const char *to, const char *data, size_t *keysize) {
42
*keysize = strlen(data) + 4;
43
res = (char*)malloc((*keysize+1)*sizeof(char));
44
if (res) sprintf(res,"%s%s%s",from,to,data);
48
static void *rccLibPostponed(void *info) {
59
data = (char*)g_queue_pop_head(queue);
61
g_mutex_unlock(mutex);
63
memcpy(from, data, 2);
64
memcpy(to, data + 2, 2);
65
result = translate_session_translate_text(session, data + 4, from, to, NULL, NULL, NULL);
68
rccDb4SetKey(db4ctx, data, strlen(data), result);
75
g_cond_wait(cond, mutex);
78
g_mutex_unlock(mutex);
82
#endif /* HAVE_LIBTRANSLATE */
85
int rccLibTranslateInit(const char *rcc_home_dir) {
86
#ifdef HAVE_LIBTRANSLATE
91
const char *http_proxy;
93
if (!translate_init(NULL)) return -1;
95
http_proxy = getenv("HTTP_PROXY");
96
if (!http_proxy) http_proxy = getenv("http_proxy");
97
translate_set_proxy(http_proxy);
99
list = translate_get_services();
101
session = translate_session_new(list);
103
g_slist_foreach(list, (GFunc) g_object_unref, NULL);
107
size = strlen(rcc_home_dir) + 32;
108
dbname = (char*)malloc(size*sizeof(char));
110
sprintf(dbname,"%s/.rcc/",rcc_home_dir);
111
mkdir(dbname, 00644);
113
sprintf(dbname,"%s/.rcc/libtranslate.db/",rcc_home_dir);
114
mkdir(dbname, 00644);
116
db4ctx = rccDb4CreateContext(dbname, 0);
120
mutex = g_mutex_new();
123
queue = g_queue_new();
125
thread = g_thread_create(rccLibPostponed, NULL, TRUE, NULL);
127
#endif /* HAVE_LIBTRANSLATE */
132
void rccLibTranslateFree() {
133
#ifdef HAVE_LIBTRANSLATE
139
g_thread_join(thread);
145
ptr = g_queue_pop_head(queue);
159
if (db4ctx) rccDb4FreeContext(db4ctx);
160
g_object_unref(session);
163
#endif /* HAVE_LIBTRANSLATE */
167
static char *rccLibTranslateDo(const char *from, const char *to, const char *text, unsigned long timeout) {
168
#ifdef HAVE_LIBTRANSLATE
173
if ((!session)||(!from)||(!to)||(!text)) return NULL;
174
if ((strlen(from)!=2)||(strlen(to)!=2)) return NULL;
177
key = rccCreateKey(from,to,text,&keysize);
179
result = rccDb4GetKey(db4ctx, key, keysize);
186
# ifdef HAVE_LIBTRANSLATE_TIMED_TRANSLATE
187
result = translate_session_timed_translate_text(session, text, from, to, timeout, NULL, NULL, NULL);
189
result = translate_session_translate_text(session, text, from, to, NULL, NULL, NULL);
190
# endif /* HAVE_LIBTRANSLATE_TIMED_TRANSLATE */
192
if ((db4ctx)&&(key)) {
194
rccDb4SetKey(db4ctx, key, keysize, result);
199
g_queue_push_tail(queue, key);
200
g_mutex_unlock(mutex);
208
#endif /* HAVE_LIBTRANSLATE */
212
void *rccLibTranslate(void *info) {
214
#ifdef HAVE_LIBTRANSLATE
215
unsigned char connected = 1;
216
rcc_translate_prefix_s prefix;
217
ssize_t readed, writed, res;
220
char *translated = NULL;
221
#endif /* HAVE_LIBTRANSLATE */
223
if (!info) return NULL;
225
s = ((rcc_external_info)info)->s;
228
#ifdef HAVE_LIBTRANSLATE
230
readed = read(s, &prefix, sizeof(rcc_translate_prefix_s)-1);
231
if ((readed<=0)||(readed != (sizeof(rcc_translate_prefix_s)-1))) break;
233
switch (prefix.cmd.cmd) {
234
case RCC_EXTERNAL_COMMAND_CLOSE:
237
case RCC_EXTERNAL_COMMAND_TRANSLATE:
238
size = 1 + prefix.cmd.size + sizeof(rcc_external_command_s) - sizeof(rcc_translate_prefix_s);
239
buffer = (char*)malloc(size);
241
for (readed = 0; (readed < size)&&(connected); readed += res) {
242
res = read(s, buffer + readed, size - readed);
243
if (res<=0) connected = 0;
249
if ((prefix.from[2])||(prefix.to[2])||(buffer[readed-1])) goto respond;
251
translated = rccLibTranslateDo(prefix.from, prefix.to, buffer, prefix.timeout);
253
prefix.cmd.cmd = RCC_EXTERNAL_COMMAND_TRANSLATE;
254
prefix.cmd.size = strlen(translated) + 1;
258
res = write(s, &prefix.cmd, sizeof(rcc_external_command_s));
259
if (res == sizeof(rcc_external_command_s)) {
260
for (writed = 0; (writed < prefix.cmd.size)&&(connected); writed += res) {
261
res = write(s, translated + writed, prefix.cmd.size - writed);
262
if (res<=0) connected = 0;
264
} else connected = 0;
266
if (prefix.cmd.size) free(translated);
268
} else connected = 0;
271
buffer = (char*)malloc(prefix.cmd.size);
273
for (readed = 0; (readed < prefix.cmd.size)&&(connected); readed += res) {
274
res = read(s, buffer + readed, prefix.cmd.size - readed);
275
if (res<=0) connected = 0;
278
} else connected = 0;
281
#endif /* HAVE_LIBTRANSLATE */