6
#include "rccexternal.h"
7
#include "rcctranslate.h"
11
int rccTranslateInit() {
16
void rccTranslateFree() {
20
rcc_translate rccTranslateOpen(const char *from, const char *to) {
21
#ifdef HAVE_LIBTRANSLATE
22
rcc_translate translate;
24
if ((!from)||(!to)||(!strcasecmp(from,to))) return NULL;
25
if ((strlen(from)!=2)||(strlen(to)!=2)) return NULL;
27
translate = (rcc_translate)malloc(sizeof(rcc_translate_s));
28
if (!translate) return NULL;
30
translate->sock = rccExternalConnect(RCC_EXTERNAL_MODULE_LIBRTRANSLATE);
31
if (translate->sock == -1) {
36
translate->remaining = 0;
37
translate->prefix.cmd.cmd = RCC_EXTERNAL_COMMAND_TRANSLATE;
38
translate->prefix.cmd.size = sizeof(rcc_translate_prefix_s);
39
memcpy(translate->prefix.from, from, 3*sizeof(char));
40
memcpy(translate->prefix.to, to, 3*sizeof(char));
41
rccTranslateSetTimeout(translate, RCC_TRANSLATE_DEFAULT_TIMEOUT);
46
#endif /* HAVE_LIBTRANSLATE */
49
void rccTranslateClose(rcc_translate translate) {
50
#ifdef HAVE_LIBTRANSLATE
51
if (!translate) return;
52
if (translate->sock != -1) rccExternalClose(translate->sock);
54
#endif /* HAVE_LIBTRANSLATE */
57
int rccTranslateSetTimeout(rcc_translate translate, unsigned long us) {
58
#ifdef HAVE_LIBTRANSLATE_TIMED_TRANSLATE
59
if (!translate) return -1;
60
translate->prefix.timeout = us;
64
#endif /* HAVE_LIBTRANSLATE_TIMED_TRANSLATE */
67
char *rccTranslate(rcc_translate translate, const char *buf) {
68
#ifdef HAVE_LIBTRANSLATE
70
rcc_external_command_s resp;
74
if ((!translate)||(!buf)) return NULL;
76
if (!strcmp(translate->prefix.to, "en")) {
78
if ((unsigned char)buf[i]>0x7F) break;
79
if (!buf[i]) return NULL;
82
if (translate->sock == -1) {
83
translate->sock = rccExternalConnect(RCC_EXTERNAL_MODULE_LIBRTRANSLATE);
84
if (translate->sock == -1) return NULL;
85
} else if (translate->remaining) {
86
if (translate->remaining == (size_t)-1) {
87
err = rccExternalRead(translate->sock, (char*)&resp, sizeof(rcc_external_command_s), 0);
89
translate->remaining = resp.size;
92
buffer = (char*)malloc(translate->remaining*sizeof(char));
94
rccExternalClose(translate->sock);
98
err = rccExternalRead(translate->sock, buffer, translate->remaining, 0);
101
translate->remaining = err;
104
translate->remaining = 0;
108
translate->prefix.cmd.size = sizeof(rcc_translate_prefix_s) + len - sizeof(rcc_external_command_s);
109
err = rccExternalWrite(translate->sock, (char*)&translate->prefix, sizeof(rcc_translate_prefix_s) - 1, 0);
111
rccExternalClose(translate->sock);
112
translate->sock = -1;
115
err = rccExternalWrite(translate->sock, buf, len + 1, 0);
117
rccExternalClose(translate->sock);
118
translate->sock = -1;
122
err = rccExternalRead(translate->sock, (char*)&resp, sizeof(rcc_external_command_s), translate->prefix.timeout);
124
if (err == sizeof(rcc_external_command_s)) {
125
translate->remaining = (size_t)-1;
127
rccExternalClose(translate->sock);
128
translate->sock = -1;
132
if ((resp.cmd!=RCC_EXTERNAL_COMMAND_TRANSLATE)||(!resp.size)) return NULL;
134
buffer = (char*)malloc(resp.size*sizeof(char));
136
rccExternalClose(translate->sock);
137
translate->sock = -1;
140
err = rccExternalRead(translate->sock, buffer, resp.size, 0);
142
translate->remaining = err;
150
#endif /* HAVE_LIBTRANSLATE */