0
|
1 /*
|
|
2 * $Id: client.c,v 1.2 2001/06/14 18:16:14 ura Exp $
|
|
3 */
|
|
4
|
|
5 /*
|
|
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system.
|
|
7 * This file is part of FreeWnn.
|
|
8 *
|
|
9 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
|
|
10 * Copyright 1991, 1992 by Massachusetts Institute of Technology
|
|
11 *
|
|
12 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp>
|
|
13 *
|
|
14 * This program is free software; you can redistribute it and/or modify
|
|
15 * it under the terms of the GNU General Public License as published by
|
|
16 * the Free Software Foundation; either version 2, or (at your option)
|
|
17 * any later version.
|
|
18 *
|
|
19 * This program is distributed in the hope that it will be useful,
|
|
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
22 * GNU General Public License for more details.
|
|
23 *
|
|
24 * You should have received a copy of the GNU General Public License
|
|
25 * along with GNU Emacs; see the file COPYING. If not, write to the
|
|
26 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
27 *
|
|
28 * Commentary:
|
|
29 *
|
|
30 * Change log:
|
|
31 * '99/04/19 TAOKA Satoshi - 田岡 智志<taoka@infonets.hiroshima-u.ac.jp>
|
|
32 * index() の宣言をコメントアウト。
|
|
33 *
|
|
34 * Last modified date: 19,Apr.1999
|
|
35 *
|
|
36 * Code:
|
|
37 *
|
|
38 */
|
|
39 /* Version 4.0
|
|
40 */
|
|
41 #include <stdio.h>
|
|
42 #include "commonhd.h"
|
|
43 #include "config.h"
|
|
44 #include "sdefine.h"
|
|
45 #include "xim.h"
|
|
46 #include "sheader.h"
|
|
47 #include "ext.h"
|
|
48 #include "rk_spclval.h"
|
|
49 #include "rk_fundecl.h"
|
|
50
|
|
51 /*
|
|
52 * env. control routines
|
|
53 */
|
|
54
|
|
55 char
|
|
56 env_state ()
|
|
57 {
|
|
58 char *p;
|
|
59 char ret = '\0';
|
|
60 /* extern char *index();*/
|
|
61
|
|
62 if ((p = romkan_dispmode ()) == NULL)
|
|
63 return (ret);
|
|
64 if ((p = (char *) index (p, ':')) == NULL)
|
|
65 return (ret);
|
|
66 return (*(p + 1));
|
|
67 }
|
|
68
|
|
69 int
|
|
70 set_cur_env (s)
|
|
71 char s;
|
|
72 {
|
|
73 register WnnEnv *p;
|
|
74 register int i;
|
|
75
|
|
76 for (p = c_c->normal_env; p; p = p->next)
|
|
77 {
|
|
78 for (i = 0; p->env_name_str[i]; i++)
|
|
79 {
|
|
80 if (s == p->env_name_str[i])
|
|
81 {
|
|
82 c_c->cur_normal_env = p;
|
|
83 break;
|
|
84 }
|
|
85 }
|
|
86 }
|
|
87 for (p = c_c->reverse_env; p; p = p->next)
|
|
88 {
|
|
89 for (i = 0; p->env_name_str[i]; i++)
|
|
90 {
|
|
91 if (s == p->env_name_str[i])
|
|
92 {
|
|
93 c_c->cur_reverse_env = p;
|
|
94 break;
|
|
95 }
|
|
96 }
|
|
97 }
|
|
98 return (0);
|
|
99 }
|
|
100
|
|
101 int
|
|
102 get_new_env (wc, ld, rev)
|
|
103 WnnClientRec *wc;
|
|
104 XIMLangDataBase *ld;
|
|
105 int rev;
|
|
106 {
|
|
107 register WnnEnv *p;
|
|
108
|
|
109 if (wc == NULL && ld == NULL)
|
|
110 return (-1);
|
|
111 if (!(p = (WnnEnv *) Malloc (sizeof (WnnEnv))))
|
|
112 {
|
|
113 malloc_error ("allocation of work area");
|
|
114 return (-1);
|
|
115 }
|
|
116 p->host_name = NULL;
|
|
117 p->env = NULL;
|
|
118 p->sticky = 0;
|
|
119 p->envrc_name = NULL;
|
|
120 p->env_name_str[0] = '\0';
|
|
121 if (wc == NULL)
|
|
122 {
|
|
123 if (rev)
|
|
124 {
|
|
125 p->next = ld->reverse_env;
|
|
126 ld->reverse_env = p;
|
|
127 }
|
|
128 else
|
|
129 {
|
|
130 p->next = ld->normal_env;
|
|
131 ld->normal_env = p;
|
|
132 }
|
|
133 }
|
|
134 else
|
|
135 {
|
|
136 if (rev)
|
|
137 {
|
|
138 p->next = wc->reverse_env;
|
|
139 wc->reverse_env = wc->cur_reverse_env = p;
|
|
140 }
|
|
141 else
|
|
142 {
|
|
143 p->next = wc->normal_env;
|
|
144 wc->normal_env = wc->cur_normal_env = p;
|
|
145 }
|
|
146 }
|
|
147 return (0);
|
|
148 }
|
|
149
|
|
150 void
|
|
151 free_env (wnnenv)
|
|
152 WnnEnv *wnnenv;
|
|
153 {
|
|
154 WnnEnv *p, *next;
|
|
155
|
|
156 for (p = wnnenv; p; p = next)
|
|
157 {
|
|
158 if (p->host_name)
|
|
159 Free ((char *) p->host_name);
|
|
160 next = p->next;
|
|
161 Free ((char *) p);
|
|
162 }
|
|
163 }
|
|
164
|
|
165 static int
|
|
166 set_server_name ()
|
|
167 {
|
|
168 if ((def_servername == NULL || *def_servername == '\0') && root_def_servername != NULL && (*(root_def_servername) != '\0'))
|
|
169 if (!(def_servername = alloc_and_copy (root_def_servername)))
|
|
170 {
|
|
171 malloc_error ("allocation of data for wnn");
|
|
172 return (-1);
|
|
173 }
|
|
174
|
|
175 if ((def_reverse_servername == NULL || *def_reverse_servername == '\0') && (root_def_reverse_servername != NULL) && (*(root_def_reverse_servername) != '\0'))
|
|
176 if (!(def_reverse_servername = alloc_and_copy (root_def_reverse_servername)))
|
|
177 {
|
|
178 if (def_servername)
|
|
179 {
|
|
180 Free (def_servername);
|
|
181 def_servername = NULL;
|
|
182 }
|
|
183 malloc_error ("allocation of data for wnn");
|
|
184 return (-1);
|
|
185 }
|
|
186 return (0);
|
|
187 }
|
|
188
|
|
189 static int
|
|
190 create_c_c (xc, xl, root)
|
|
191 register XIMClientRec *xc;
|
|
192 register XIMLangRec *xl;
|
|
193 Bool root;
|
|
194 {
|
|
195 xc->cur_xl = xl;
|
|
196 cur_lang = xl->lang_db;
|
|
197 if (allocate_wnn (xc->user_name) == -1)
|
|
198 {
|
|
199 return (-1);
|
|
200 }
|
|
201 xl->w_c = c_c;
|
|
202 c_c->lang_db = xl->lang_db;
|
|
203 if (root == True)
|
|
204 {
|
|
205 henkan_off_def = root_henkan_off_def;
|
|
206 uumkeyname = root_uumkeyname;
|
|
207 rkfilename = root_rkfilename;
|
|
208 }
|
|
209 c_c->f_table = xl->lang_db->f_table;
|
|
210 if (set_server_name () < 0)
|
|
211 {
|
|
212 free_wnn ();
|
|
213 return (-1);
|
|
214 }
|
|
215 if (initialize_wnn (xl, root) == -1)
|
|
216 {
|
|
217 return (-1);
|
|
218 }
|
|
219 if (connect_server (xl->lang_db) < 0)
|
|
220 {
|
|
221 del_client (c_c, 0);
|
|
222 return (-1);
|
|
223 }
|
|
224 return (0);
|
|
225 }
|
|
226
|
|
227 int
|
|
228 new_client (xc, xl, root)
|
|
229 XIMClientRec *xc;
|
|
230 XIMLangRec *xl;
|
|
231 Bool root;
|
|
232 {
|
|
233 if (IsPreeditArea (xc) || IsPreeditPosition (xc)
|
|
234 #ifdef CALLBACKS
|
|
235 || IsPreeditCallbacks (xc)
|
|
236 #endif /* CALLBACKS */
|
|
237 )
|
|
238 {
|
|
239 if (create_c_c (xc, xl, root) == -1)
|
|
240 {
|
|
241 return (-1);
|
|
242 }
|
|
243 if (create_preedit (xc, xl, 0) < 0)
|
|
244 {
|
|
245 free_wnn ();
|
|
246 return (-1);
|
|
247 }
|
|
248 clear_c_b ();
|
|
249 }
|
|
250 else if (IsPreeditNothing (xc))
|
|
251 {
|
|
252 if (create_preedit (xc, NULL, 0) < 0)
|
|
253 {
|
|
254 return (-1);
|
|
255 }
|
|
256 xc->yes_no = NULL;
|
|
257 }
|
|
258 if (IsStatusArea (xc)
|
|
259 #ifdef CALLBACKS
|
|
260 || IsStatusCallbacks (xc)
|
|
261 #endif /* CALLBACKS */
|
|
262 )
|
|
263 {
|
|
264 xc->cur_xl = xl;
|
|
265 if (create_status (xc, xl, 0) < 0)
|
|
266 {
|
|
267 free_wnn ();
|
|
268 return (-1);
|
|
269 }
|
|
270 if (xc->cur_xl->w_c->h_flag)
|
|
271 {
|
|
272 push_func (xc->cur_xl->w_c, henkan_off);
|
|
273 }
|
|
274 }
|
|
275 else if (IsStatusNothing (xc))
|
|
276 {
|
|
277 if (create_status (xc, NULL, 0) < 0)
|
|
278 {
|
|
279 return (-1);
|
|
280 }
|
|
281 }
|
|
282 return (0);
|
|
283 }
|
|
284
|
|
285 static int
|
|
286 find_same_env (name, p, rev)
|
|
287 char *name;
|
|
288 WnnEnv *p;
|
|
289 int rev;
|
|
290 {
|
|
291 register WnnEnv *pp;
|
|
292 register WnnClientList cc;
|
|
293
|
|
294 for (cc = wnnclient_list; cc; cc = cc->next)
|
|
295 {
|
|
296 pp = rev ? cc->reverse_env : cc->normal_env;
|
|
297 if (pp != p && !strcmp (name, cc->user_name))
|
|
298 {
|
|
299 for (; pp; pp = pp->next)
|
|
300 {
|
|
301 if (!p->host_name && !pp->host_name)
|
|
302 {
|
|
303 if (!*p->env_name_str && !*pp->env_name_str)
|
|
304 {
|
|
305 return (1);
|
|
306 }
|
|
307 else if (*p->env_name_str && *pp->env_name_str && !strcmp (p->env_name_str, pp->env_name_str))
|
|
308 {
|
|
309 return (1);
|
|
310 }
|
|
311 }
|
|
312 else if (p->host_name && pp->host_name && !strcmp (p->host_name, pp->host_name))
|
|
313 {
|
|
314 if (!*p->env_name_str && !*pp->env_name_str)
|
|
315 {
|
|
316 return (1);
|
|
317 }
|
|
318 else if (*p->env_name_str && *pp->env_name_str && !strcmp (p->env_name_str, pp->env_name_str))
|
|
319 {
|
|
320 return (1);
|
|
321 }
|
|
322 }
|
|
323 }
|
|
324 }
|
|
325 }
|
|
326 return (0);
|
|
327 }
|
|
328
|
|
329 void
|
|
330 del_client (wc, level)
|
|
331 register WnnClientRec *wc;
|
|
332 int level;
|
|
333 {
|
|
334 register WnnClientRec *c_c_sv;
|
|
335 register WnnEnv *p;
|
|
336
|
|
337 c_c_sv = c_c;
|
|
338 c_c = wc;
|
|
339 switch (level)
|
|
340 {
|
|
341 case 4:
|
|
342 goto LEVEL4;
|
|
343 case 3:
|
|
344 goto LEVEL3;
|
|
345 case 2:
|
|
346 goto LEVEL2;
|
|
347 case 1:
|
|
348 goto LEVEL1;
|
|
349 default:
|
|
350 break;
|
|
351 }
|
|
352 if (c_c->rk)
|
|
353 rk_close (c_c->rk);
|
|
354 LEVEL1:
|
|
355 destroy_history ();
|
|
356 LEVEL2:
|
|
357 free_areas ();
|
|
358 LEVEL3:
|
|
359 if (c_c->m_table->re_count == 1)
|
|
360 {
|
|
361 Free ((char *) c_c->m_table);
|
|
362 }
|
|
363 else
|
|
364 {
|
|
365 c_c->m_table->re_count--;
|
|
366 }
|
|
367 LEVEL4:
|
|
368 if (c_c->use_server)
|
|
369 {
|
|
370 for (p = c_c->normal_env; p; p = p->next)
|
|
371 {
|
|
372 if (jl_isconnect_e (p->env))
|
|
373 {
|
|
374 if (!find_same_env (username, p, 0))
|
|
375 {
|
|
376 jl_dic_save_all_e (p->env);
|
|
377 }
|
|
378 jl_disconnect (p->env);
|
|
379 }
|
|
380 }
|
|
381 for (p = c_c->reverse_env; p; p = p->next)
|
|
382 {
|
|
383 if (jl_isconnect_e (p->env))
|
|
384 {
|
|
385 if (!find_same_env (username, p, 1))
|
|
386 {
|
|
387 jl_dic_save_all_e (p->env);
|
|
388 }
|
|
389 jl_disconnect (p->env);
|
|
390 }
|
|
391 }
|
|
392 }
|
|
393 free_env (c_c->normal_env);
|
|
394 free_env (c_c->reverse_env);
|
|
395 if (bun_data_)
|
|
396 {
|
|
397 if (c_c->use_server)
|
|
398 {
|
|
399 jl_env_set (bun_data_, NULL);
|
|
400 jl_close (bun_data_);
|
|
401 }
|
|
402 else
|
|
403 {
|
|
404 Free (bun_data_);
|
|
405 }
|
|
406 }
|
|
407
|
|
408 free_wnn ();
|
|
409 c_c = c_c_sv;
|
|
410 }
|
|
411
|
|
412 void
|
|
413 epilogue ()
|
|
414 {
|
|
415 register WnnClientRec *wc;
|
|
416 register WnnEnv *p;
|
|
417
|
|
418 for (wc = wnnclient_list; wc != NULL; wc = wc->next)
|
|
419 {
|
|
420 c_c = wc;
|
|
421 for (p = c_c->reverse_env; p; p = p->next)
|
|
422 {
|
|
423 c_c->cur_reverse_env = p;
|
|
424 disconnect_server (1);
|
|
425 }
|
|
426 for (p = c_c->normal_env; p; p = p->next)
|
|
427 {
|
|
428 c_c->cur_normal_env = p;
|
|
429 disconnect_server (0);
|
|
430 }
|
|
431 }
|
|
432 }
|