* egg/wnn.el (wnn-accept-charset-alist): XEmacs uses sisheng
[elisp/tamago.git] / egg / wnnrpc.el
1 ;;; egg/wnnrpc.el --- WNN Support (low level interface) in Egg
2 ;;;                   Input Method Architecture
3
4 ;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
5
6 ;; Author: NIIBE Yutaka <gniibe@chroot.org>
7 ;;         KATAYAMA Yoshio <kate@pfu.co.jp> ; Korean, Chinese support.
8
9 ;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
10
11 ;; Keywords: mule, multilingual, input method
12
13 ;; This file is part of EGG.
14
15 ;; EGG is free software; you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation; either version 2, or (at your option)
18 ;; any later version.
19
20 ;; EGG is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 ;; GNU General Public License for more details.
24
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
27 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
28 ;; Boston, MA 02111-1307, USA.
29
30 ;;; Commentary:
31
32
33 ;;; Code:
34
35
36 (eval-when-compile
37   (require 'egg-com)
38   (defmacro wnn-file-string ()
39     (string-as-unibyte (decode-coding-string "\e$B#W#n#n$N%U%!%$%k\e(B" 'euc-jp)))
40   (defmacro wnn-hex (n)
41     (string-to-number n 16))
42   (defmacro wnn-const (c)
43     "Macro for WNN constants."
44     (cond ((eq c 'JS_VERSION)               0)
45           ((eq c 'JS_OPEN)                  1)
46           ((eq c 'JS_CLOSE)                 3)
47           ((eq c 'JS_CONNECT)               5)
48           ((eq c 'JS_DISCONNECT)            6)
49           ((eq c 'JS_ENV_EXIST)             7)
50           ((eq c 'JS_ENV_STICKY)            8)
51           ((eq c 'JS_ENV_UNSTICKY)          9)
52           ((eq c 'JS_KANREN)               17)
53           ((eq c 'JS_KANTAN_SHO)           18)
54           ((eq c 'JS_KANZEN_SHO)           19)
55           ((eq c 'JS_KANTAN_DAI)           20)
56           ((eq c 'JS_KANZEN_DAI)           21)
57           ((eq c 'JS_HINDO_SET)            24)
58           ((eq c 'JS_DIC_ADD)              33)
59           ((eq c 'JS_DIC_DELETE)           34)
60           ((eq c 'JS_DIC_USE)              35)
61           ((eq c 'JS_DIC_LIST)             36)
62           ((eq c 'JS_DIC_INFO)             37)
63           ((eq c 'JS_FUZOKUGO_SET)         41)
64           ((eq c 'JS_FUZOKUGO_GET)         48)
65           ((eq c 'JS_WORD_ADD)             49)
66           ((eq c 'JS_WORD_DELETE)          50)
67           ((eq c 'JS_WORD_SEARCH)          51)
68           ((eq c 'JS_WORD_SEARCH_BY_ENV)   52)
69           ((eq c 'JS_WORD_INFO)            53)
70           ((eq c 'JS_WORD_COMMENT_SET)     54)
71           ((eq c 'JS_PARAM_SET)            65)
72           ((eq c 'JS_PARAM_GET)            66)
73           ((eq c 'JS_MKDIR)                81)
74           ((eq c 'JS_ACCESS)               82)
75           ((eq c 'JS_WHO)                  83)
76           ((eq c 'JS_ENV_LIST)             85)
77           ((eq c 'JS_FILE_LIST_ALL)        86)
78           ((eq c 'JS_DIC_LIST_ALL)         87)
79           ((eq c 'JS_FILE_READ)            97)
80           ((eq c 'JS_FILE_WRITE)           98)
81           ((eq c 'JS_FILE_SEND)            99)
82           ((eq c 'JS_FILE_RECEIVE)        100)
83           ((eq c 'JS_HINDO_FILE_CREATE)   101)
84           ((eq c 'JS_DIC_FILE_CREATE)     102)
85           ((eq c 'JS_FILE_REMOVE)         103)
86           ((eq c 'JS_FILE_LIST)           104)
87           ((eq c 'JS_FILE_INFO)           105)
88           ((eq c 'JS_FILE_LOADED)         106)
89           ((eq c 'JS_FILE_LOADED_LOCAL)   107)
90           ((eq c 'JS_FILE_DISCARD)        108)
91           ((eq c 'JS_FILE_COMMENT_SET)    109)
92           ((eq c 'JS_FILE_PASSWORD_SET)   110)
93           ((eq c 'JS_FILE_STAT)           111)
94           ((eq c 'JS_KILL)                112)
95           ((eq c 'JS_HINSI_LIST)          114)
96           ((eq c 'JS_HINSI_NAME)          115)
97           ((eq c 'JS_HINSI_NUMBER)        116)
98           ((eq c 'JS_HINSI_DICTS)         117)
99           ((eq c 'JS_HINSI_TABLE_SET)     118)
100           ((eq c 'JS_ACCESS_ADD_HOST)         (wnn-hex "f00011"))
101           ((eq c 'JS_ACCESS_ADD_USER)         (wnn-hex "f00012"))
102           ((eq c 'JS_ACCESS_REMOVE_HOST)      (wnn-hex "f00013"))
103           ((eq c 'JS_ACCESS_REMOVE_USER)      (wnn-hex "f00014"))
104           ((eq c 'JS_ACCESS_ENABLE)           (wnn-hex "f00015"))
105           ((eq c 'JS_ACCESS_DISABLE)          (wnn-hex "f00016"))
106           ((eq c 'JS_ACCESS_GET_INFO)         (wnn-hex "f00017"))
107           ((eq c 'JS_TEMPORARY_DIC_ADD)       (wnn-hex "f00021"))
108           ((eq c 'JS_TEMPORARY_DIC_DELETE)    (wnn-hex "f00022"))
109           ((eq c 'JS_AUTOLEARNING_WORD_ADD)   (wnn-hex "f00023"))
110           ((eq c 'JS_SET_AUTOLEARNING_DIC)    (wnn-hex "f00024"))
111           ((eq c 'JS_GET_AUTOLEARNING_DIC)    (wnn-hex "f00025"))
112           ((eq c 'JS_IS_LOADED_TEMPORARY_DIC) (wnn-hex "f00026"))
113           ((eq c 'JS_TEMPORARY_WORD_ADD)      (wnn-hex "f00027"))
114           ((eq c 'JS_SET_HENKAN_ENV)          (wnn-hex "f00031"))
115           ((eq c 'JS_GET_HENKAN_ENV)          (wnn-hex "f00032"))
116           ((eq c 'JS_SET_HENKAN_HINSI)        (wnn-hex "f00033"))
117           ((eq c 'JS_GET_HENKAN_HINSI)        (wnn-hex "f00034"))
118           ((eq c 'JS_HENKAN_WITH_DATA)        (wnn-hex "f00035"))
119           ((eq c 'JS_FI_DIC_ADD)              (wnn-hex "f00061"))
120           ((eq c 'JS_FI_HINDO_FILE_CREATE)    (wnn-hex "f00062"))
121           ((eq c 'JS_FI_KANREN)               (wnn-hex "f00065"))
122           ((eq c 'JS_SET_FI_PRIORITY)         (wnn-hex "f00066"))
123           ((eq c 'JS_OPTIMIZE_FI)             (wnn-hex "f00067"))
124           ((eq c 'JS_HENKAN_IKEIJI)           (wnn-hex "f0006f"))
125           ((eq c 'JS_LOCK)                    (wnn-hex "f00071"))
126           ((eq c 'JS_UNLOCK)                  (wnn-hex "f00072"))
127           ((eq c 'JS_FI_DIC_LIST)             (wnn-hex "f00081"))
128           ((eq c 'JS_FI_DIC_LIST_ALL)         (wnn-hex "f00082"))
129           ((eq c 'JS_FUZOKUGO_LIST)           (wnn-hex "f00083"))
130
131           ((eq c 'JLIB_VERSION)       (wnn-hex "4003"))
132           ((eq c 'JLIB_VERSION_WNN6)  (wnn-hex "4f00"))
133
134           ((eq c 'WNN_C_LOCAL)            "!")
135           ((eq c 'WNN_FT_DICT_FILE)         1)
136           ((eq c 'WNN_FT_HINDO_FILE)        2)
137           ((eq c 'WNN_FILE_STRING)       (encode-coding-string
138                                           "\e$B#W#n#n$N%U%!%$%k\e(B" 'euc-jp))
139           ((eq c 'WNN_FILE_STRING_LEN)     16)
140           ((eq c 'WNN_PASSWD_LEN)          16)
141           ((eq c 'WNN_HOST_LEN)            16)
142           ((eq c 'WNN_UNIQ_LEN)            28)
143           ((eq c 'WNN_FILE_HEADER_LEN)    128)
144           ((eq c 'WNN_FILE_HEADER_PAD)     36)
145           ((eq c 'WNN_FILE_BODY_PAD)      116)
146           ((eq c 'WNN_ENVNAME_LEN)         32)
147           ((eq c 'WNN_MAX_ENV_OF_A_CLIENT) 32)
148           ((eq c 'WNN_MAX_DIC_OF_AN_ENV)   30)
149           ((eq c 'WNN_MAX_FILE_OF_AN_ENV)  60)
150
151           ((eq c 'WNN_ACK)                  0)
152           ((eq c 'WNN_NAK)                 -1)
153
154           ((eq c 'WNN_NO_EXIST)             1)
155           ((eq c 'WNN_OPENF_ERR)           16)
156           ((eq c 'WNN_JSERVER_DEAD)        70)
157           ((eq c 'WNN_BAD_VERSION)         73)
158           ((eq c 'WNN_FILE_READ_ERROR)     90)
159           ((eq c 'WNN_FILE_WRITE_ERROR)    91)
160           ((eq c 'WNN_INCORRECT_PASSWD)    94)
161           ((eq c 'WNN_FILE_IN_USE)         95)
162           ((eq c 'WNN_UNLINK)              96)
163           ((eq c 'WNN_FILE_CREATE_ERROR)   97)
164           ((eq c 'WNN_NOT_A_FILE)          98)
165           ((eq c 'WNN_INODE_CHECK_ERROR)   99)
166
167           ((eq c 'WNN_UD_DICT)              2)
168           ((eq c 'WNN_REV_DICT)             3)
169           ((eq c 'CWNN_REV_DICT)       (wnn-hex "103"))
170           ((eq c 'BWNN_REV_DICT)       (wnn-hex "203"))
171           ((eq c 'WNN_COMPACT_DICT)         5)
172           ((eq c 'WNN_FI_SYSTEM_DICT)       6)
173           ((eq c 'WNN_FI_USER_DICT)         7)
174           ((eq c 'WNN_FI_HINDO_FILE)        8)
175           ((eq c 'WNN_GROUP_DICT)           9)
176           ((eq c 'WNN_MERGE_DICT)          10)
177           ((eq c 'WNN_VECT_NO)             -1)
178           ((eq c 'WNN_VECT_BUNSETSU)        2)
179           ((eq c 'WNN_VECT_KANREN)          0)
180           ((eq c 'WNN_VECT_KANZEN)          1)
181           ((eq c 'WNN_VECT_KANTAN)          1))))
182
183 (defconst wnnrpc-error-message
184   '((Japanese .
185      [
186       nil
187       "\e$B%U%!%$%k$,B8:_$7$^$;$s\e(B"
188       nil
189       "\e$B%a%b%j\e(B allocation \e$B$G<:GT$7$^$7$?\e(B"
190       nil
191       "\e$B<-=q$G$O$"$j$^$;$s\e(B"
192       "\e$BIQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
193       "\e$BIUB08l%U%!%$%k$G$O$"$j$^$;$s\e(B"
194       nil
195       "\e$B<-=q%F!<%V%k$,0lGU$G$9\e(B"
196       "\e$BIQEY%U%!%$%k$,;XDj$5$l$?<-=q$NIQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
197       nil
198       nil
199       nil
200       nil
201       nil
202       "\e$B%U%!%$%k$,%*!<%W%s$G$-$^$;$s\e(B"
203       "\e$B@5$7$$IQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
204       "\e$B@5$7$$IUB08l%U%!%$%k$G$O$"$j$^$;$s\e(B"
205       "\e$BIUB08l$N8D?t\e(B, \e$B%Y%/%?D9$5$J$I$,B?2a$.$^$9\e(B"
206       "\e$B$=$NHV9f$N<-=q$O;H$o$l$F$$$^$;$s\e(B"
207       nil
208       nil
209       nil
210       "\e$BIUB08l%U%!%$%k$NFbMF$,@5$7$/$"$j$^$;$s\e(B"
211       "\e$B5?;wIJ;lHV9f$,0[>o$G$9\e(B(hinsi.data \e$B$,@5$7$/$"$j$^$;$s\e(B)"
212       "\e$BL$Dj5A$NIJ;l$,A0C<IJ;l$H$7$FDj5A$5$l$F$$$^$9\e(B"
213       "\e$BIUB08l%U%!%$%k$,FI$_9~$^$l$F$$$^$;$s\e(B"
214       nil
215       nil
216       "\e$B<-=q$N%(%$%s%H%j$,B?2a$.$^$9\e(B"
217       "\e$BJQ49$7$h$&$H$9$kJ8;zNs$,D92a$.$^$9\e(B"
218       "\e$BIUB08l2r@ONN0h$,ITB-$7$F$$$^$9\e(B"
219       nil
220       "\e$B<!8uJdNN0h$,ITB-$7$F$$$^$9\e(B"
221       "\e$B8uJd$,\e(B 1 \e$B$D$b:n$l$^$;$s$G$7$?\e(B"
222       nil
223       nil
224       nil
225       nil
226       "\e$BFI$_$,D92a$.$^$9\e(B"
227       "\e$B4A;z$,D92a$.$^$9\e(B"
228       "\e$B;XDj$5$l$?<-=q$OEPO?2DG=$G$O$"$j$^$;$s\e(B"
229       "\e$BFI$_$ND9$5$,\e(B 0 \e$B$G$9\e(B"
230       "\e$B;XDj$5$l$?<-=q$O5U0z$-2DG=$G$O$"$j$^$;$s\e(B"
231       "\e$B%j!<%I%*%s%j!<$N<-=q$KEPO?\e(B/\e$B:o=|$7$h$&$H$7$^$7$?\e(B"
232       "\e$B4D6-$KB8:_$7$J$$<-=q$KEPO?$7$h$&$H$7$^$7$?\e(B"
233       nil
234       nil
235       "\e$B%j!<%I%*%s%j!<$NIQEY$rJQ99$7$h$&$H$7$^$7$?\e(B"
236       "\e$B;XDj$5$l$?C18l$,B8:_$7$^$;$s\e(B"
237       nil
238       nil
239       nil
240       nil
241       nil
242       nil
243       nil
244       nil
245       nil
246       "\e$B%a%b%j\e(B allocation \e$B$G<:GT$7$^$7$?\e(B"
247       nil
248       nil
249       nil
250       nil
251       nil
252       nil
253       nil
254       "\e$B2?$+$N%(%i!<$,5/$3$j$^$7$?\e(B"
255       "\e$B%P%0$,H/@8$7$F$$$kLOMM$G$9\e(B"
256       "\e$B%5!<%P$,;`$s$G$$$^$9\e(B"
257       "allocation \e$B$K<:GT$7$^$7$?\e(B"
258       "\e$B%5!<%P$H@\B3$G$-$^$;$s$G$7$?\e(B"
259       "\e$BDL?.%W%m%H%3%k$N%P!<%8%g%s$,9g$C$F$$$^$;$s\e(B"
260       "\e$B%/%i%$%"%s%H$N@8@.$7$?4D6-$G$O$"$j$^$;$s\e(B"
261       nil
262       nil
263       nil
264       nil
265       nil
266       "\e$B%G%#%l%/%H%j$r:n$k$3$H$,$G$-$^$;$s\e(B"
267       nil
268       nil
269       nil
270       nil
271       nil
272       nil
273       nil
274       nil
275       nil
276       "\e$B%U%!%$%k$rFI$_9~$`$3$H$,$G$-$^$;$s\e(B"
277       "\e$B%U%!%$%k$r=q$-=P$9$3$H$,$G$-$^$;$s\e(B"
278       "\e$B%/%i%$%"%s%H$NFI$_9~$s$@%U%!%$%k$G$O$"$j$^$;$s\e(B"
279       "\e$B$3$l0J>e%U%!%$%k$rFI$_9~$`$3$H$,$G$-$^$;$s\e(B"
280       "\e$B%Q%9%o!<%I$,4V0c$C$F$$$^$9\e(B"
281       "\e$B%U%!%$%k$,FI$_9~$^$l$F$$$^$9\e(B"
282       "\e$B%U%!%$%k$,:o=|$G$-$^$;$s\e(B"
283       "\e$B%U%!%$%k$,:n@.=PMh$^$;$s\e(B"
284       "WNN \e$B$N%U%!%$%k$G$"$j$^$;$s\e(B"
285       "\e$B%U%!%$%k$N\e(B inode \e$B$H\e(B FILE_UNIQ \e$B$r0lCW$5$;$k;v$,$G$-$^$;$s\e(B"
286       "\e$BIJ;l%U%!%$%k$,Bg$-2a$.$^$9\e(B"
287       "\e$BIJ;l%U%!%$%k$,Bg$-2a$.$^$9\e(B"
288       "\e$BIJ;l%U%!%$%k$,B8:_$7$^$;$s\e(B"
289       "\e$BIJ;l%U%!%$%k$NFbMF$,4V0c$C$F$$$^$9\e(B"
290       nil
291       "\e$BIJ;l%U%!%$%k$,FI$_9~$^$l$F$$$^$;$s\e(B"
292       "\e$BIJ;lL>$,4V0c$C$F$$$^$9\e(B"
293       "\e$BIJ;lHV9f$,4V0c$C$F$$$^$9\e(B"
294       nil
295       "\e$B$=$NA`:n$O%5%]!<%H$5$l$F$$$^$;$s\e(B"
296       "\e$B%Q%9%o!<%I$NF~$C$F$$$k%U%!%$%k$,%*!<%W%s$G$-$^$;$s\e(B"
297       "uumrc \e$B%U%!%$%k$,B8:_$7$^$;$s\e(B"
298       "uumrc \e$B%U%!%$%k$N7A<0$,8m$C$F$$$^$9\e(B"
299       "\e$B$3$l0J>e4D6-$r:n$k$3$H$O$G$-$^$;$s\e(B"
300       "\e$B$3$N%/%i%$%"%s%H$,FI$_9~$s$@%U%!%$%k$G$"$j$^$;$s\e(B"
301       "\e$B<-=q$KIQEY%U%!%$%k$,$D$$$F$$$^$;$s\e(B"
302       "\e$B%Q%9%o!<%I$N%U%!%$%k$,:n@.=PMh$^$;$s\e(B"
303       ])
304     (Chinese-GB .
305      [
306       nil
307       "\e$AND<~2;4fTZ\e(B"
308       nil
309       "\e$ADZ4f\e(Balloc\e$AJ'0\\e(B"
310       nil
311       "\e$A2;JGWV5d\e(B"
312       "\e$A2;JGF56HND<~\e(B"
313       "\e$A2;JGND7(ND<~\e(B"
314       nil
315       "\e$AWV5d1m8qBz\e(B"
316       "\e$AF56HND<~#:2;JGV86(5DWV5d5DF56HND<~\e(B"
317       nil
318       nil
319       nil
320       nil
321       nil
322       "\e$AND<~2;D\4r?*\e(B"
323       "\e$A2;JGU}H75DF56HND<~\e(B"
324       "\e$A2;JGU}H75DND7(ND<~\e(B"
325       "\e$A8=JtSo5D8vJ}!"OrA?3$6H5H3,9}\e(B"
326       "\e$AUb8v:EBk5DWV5d!"C;SPJ9SC\e(B"
327       nil
328       nil
329       nil
330       "\e$AND7(ND<~5DDZH]2;U}H7\e(B"
331       "\e$APiDb4JPT:EBkRl3#\e(Bcixing.data\e$A2;U}H7\e(B"
332       "\e$AN46(Re5D4JPT!"6(ReAKG06K4JPT\e(B"
333       "\e$AND7(ND<~2;D\6AH!\e(B"
334       nil
335       nil
336       "\e$AWV5d5DOnJ}3,9}\e(B"
337       "\e$A1d;;:sWV7{4.5D3$6H3,9}\e(B"
338       "\e$A8=JtSo=bNvSr2;9;\e(B"
339       nil
340       "\e$A4N:n29Sr2;9;\e(B"
341       "\e$A:n29\e(B 1\e$A8vR2C;SP\e(B"
342       nil
343       nil
344       nil
345       nil
346       "\e$A6ARt3$6H3,9}\e(B"
347       "\e$A::WV3$6H3,9}\e(B"
348       "\e$AV86(5DWV5d!"2;D\5GB<\e(B"
349       "\e$A6ARt5D3$6HJG\e(B 0"
350       "\e$AV86(5DWV5d!"2;D\Df2i\e(B"
351       "\e$AV;6A5DWV5d!"5GB<\e(B/\e$AO{3}AK\e(B"
352       "\e$A;7>3VP2;4fTZ5DWV5d!"5GB<AK\e(B"
353       nil
354       nil
355       "\e$AV;6A5DF56H!"1d8|AK\e(B"
356       "\e$AV86(5D5%WV2;4fTZ\e(B"
357       nil
358       nil
359       nil
360       nil
361       nil
362       nil
363       nil
364       nil
365       nil
366       "\e$ADZ4f\e(Balloc\e$AJ'0\\e(B"
367       nil
368       nil
369       nil
370       nil
371       nil
372       nil
373       nil
374       "\e$ASP3v4m7"Iz\e(B"
375       "\e$A:COsSP#b#u#g7"Iz\e(B"
376       "server\e$AK@AK\e(B"
377       "alloc\e$AJ'0\AK\e(B"
378       "\e$A2;D\:M\e(Bserver\e$AA,=S\e(B"
379       "\e$AM(PE9f3L5D0f1>2;7{\e(B"
380       "\e$A2;JG#c#W#n#nSC;'Iz3I5D;7>3\e(B"
381       nil
382       nil
383       nil
384       nil
385       nil
386       "\e$AWSD?B<2;D\44=(\e(B"
387       nil
388       nil
389       nil
390       nil
391       nil
392       nil
393       nil
394       nil
395       nil
396       "\e$AND<~2;D\6AH!\e(B"
397       "\e$AND<~2;D\P43v\e(B"
398       "\e$A2;JG#c#W#n#nSC;'?I6AH!5DND<~\e(B"
399       "\e$ARTIO5DND<~2;D\6AH!\e(B"
400       "password\e$A2;6T\e(B"
401       "\e$AND<~U}TZ6AH!\e(B"
402       "\e$AND<~2;D\O{3}\e(B"
403       "\e$AND<~C;SP44=(3v@4\e(B"
404       "\e$A2;JG#c#W#n#n5DND<~\e(B"
405       "\e$AND<~5D\e(BI-node\e$A:M\e(BFILE_UNIQ\e$A2;D\R;VB\e(B"
406       "\e$A4JPTND<~L+4s\e(B"
407       "\e$A4JPTND<~L+4s\e(B"
408       "\e$A4JPTND<~2;4fTZ\e(B"
409       "\e$A4JPTND<~5DDZH]2;6T\e(B"
410       nil
411       "\e$A4JPTND<~2;D\6AH!\e(B"
412       "\e$A4JPTC{2;6T\e(B"
413       "\e$A4JPT:EBk2;6T\e(B"
414       nil
415       "\e$AUb8v2YWw2;V'3V\e(B"
416       "password\e$A5DJdHkND<~2;D\4r?*\e(B"
417       "uumrc\e$AND<~2;4fTZ\e(B"
418       "uumrc\e$AND<~5DPNJ=4mNs\e(B"
419       "\e$ARTIO;7>32;D\44=(\e(B"
420       "\e$AUb8v#c#W#n#nSC;'!"6AH!5DND<~C;SP\e(B"
421       "\e$AWV5d5DF56HND<~C;SP\e(B"
422       "password\e$A5DND<~C;SP44=(3v@4\e(B"
423       ])
424     (Chinese-CNS .
425      [
426       nil
427       "\e$(GEFG5DbGtGc\e(B"
428       nil
429       "\e$(GDyGt\e(Balloc\e$(GFBZu\e(B"
430       nil
431       "\e$(GDbQRGsL(\e(B"
432       "\e$(GDbQRs"PyEFG5\e(B"
433       "\e$(GDbQREFNNEFG5\e(B"
434       nil
435       "\e$(GGsL(OPV*iH\e(B"
436       "\e$(Gs"PyEFG5!3DbQRQ@LyN{GsL(N{s"PyEFG5\e(B"
437       nil
438       nil
439       nil
440       nil
441       nil
442       "\e$(GEFG5DbWdFTbd\e(B"
443       "\e$(GDbQRF_m}N{s"PyEFG5\e(B"
444       "\e$(GDbQRF_m}N{EFNNEFG5\e(B"
445       "\e$(GOazhk#N{T6m0!#GWbXO[Pya+b>g4\e(B"
446       "\e$(G]UT6f@n#N{GsL(!#JtH4KpFn\e(B"
447       nil
448       nil
449       nil
450       "\e$(GEFNNEFG5N{DyU)DbF_m}\e(B"
451       "\e$(Gapsib$MLf@n#\,Z&\e(Bcixing.data\e$(GDbF_m}\e(B"
452       "\e$(GF\LyexN{b$ML!#LyexD'P)j&b$ML\e(B"
453       "\e$(GEFNNEFG5DbWd{tL=\e(B"
454       nil
455       nil
456       "\e$(GGsL(N{bzm0b>g4\e(B"
457       "\e$(G|H_PG[Gs\JHkN{O[Pyb>g4\e(B"
458       "\e$(GOazhk#fXN5YQDbY\\e(B"
459       nil
460       "\e$(GH9OlfPYQDbY\\e(B"
461       "\e$(GOlfP\e(B 1\e$(GT6D>JtH4\e(B"
462       nil
463       nil
464       nil
465       nil
466       "\e$(G{tSvO[Pyb>g4\e(B"
467       "\e$(GiGGsO[Pyb>g4\e(B"
468       "\e$(GQ@LyN{GsL(!#DbWd`trg\e(B"
469       "\e$(G{tSvN{O[PyQR\e(B 0"
470       "\e$(GQ@LyN{GsL(!#DbWdXKQg\e(B"
471       "\e$(GF7{tN{GsL(!#`trg\e(B/\e$(GV<XfD'\e(B"
472       "\e$(Gt?h:DcDbGtGcN{GsL(!#`trgD'\e(B"
473       nil
474       nil
475       "\e$(GF7{tN{s"Py!#|HJUD'\e(B"
476       "\e$(GQ@LyN{^LGsDbGtGc\e(B"
477       nil
478       nil
479       nil
480       nil
481       nil
482       nil
483       nil
484       nil
485       nil
486       "\e$(GDyGt\e(Balloc\e$(GFBZu\e(B"
487       nil
488       nil
489       nil
490       nil
491       nil
492       nil
493       nil
494       "\e$(GH4Exrc`uFm\e(B"
495       "\e$(GGob/H4$\$o$a`uFm\e(B"
496       "server\e$(GH;D'\e(B"
497       "alloc\e$(GFBZuD'\e(B"
498       "\e$(GDbWdLO\e(Bserver\e$(G]YZY\e(B"
499       "\e$(G]WOj]=a#N{NjF[Db\J\e(B"
500       "\e$(GDbQR$]$q$h$hFnEBFmH)N{t?h:\e(B"
501       nil
502       nil
503       nil
504       nil
505       nil
506       "\e$(GDMFxrgDbWd^6Pz\e(B"
507       nil
508       nil
509       nil
510       nil
511       nil
512       nil
513       nil
514       nil
515       nil
516       "\e$(GEFG5DbWd{tL=\e(B"
517       "\e$(GEFG5DbWdlQEx\e(B"
518       "\e$(GDbQR$]$q$h$hFnEBF+{tL=N{EFG5\e(B"
519       "\e$(GEhD8N{EFG5DbWd{tL=\e(B"
520       "password\e$(GDbhW\e(B"
521       "\e$(GEFG5F_Gc{tL=\e(B"
522       "\e$(GEFG5DbWdV<Xf\e(B"
523       "\e$(GEFG5JtH4^6PzExKt\e(B"
524       "\e$(GDbQR$C$W$h$hN{EFG5\e(B"
525       "\e$(GEFG5N{\e(BI-node\e$(GLO\e(BFILE_UNIQ\e$(GDbWdD!S3\e(B"
526       "\e$(Gb$MLEFG5E4DK\e(B"
527       "\e$(Gb$MLEFG5E4DK\e(B"
528       "\e$(Gb$MLEFG5DbGtGc\e(B"
529       "\e$(Gb$MLEFG5N{DyU)DbhW\e(B"
530       nil
531       "\e$(Gb$MLEFG5DbWd{tL=\e(B"
532       "\e$(Gb$MLGXDbhW\e(B"
533       "\e$(Gb$MLf@n#DbhW\e(B"
534       nil
535       "\e$(G]UT6pgI"DbEEQ=\e(B"
536       "password\e$(GN{rSD+EFG5DbWdFTbd\e(B"
537       "cwnnrc\e$(GEFG5DbGtGc\e(B"
538       "cwnnrc\e$(GEFG5N{J0H"rck(\e(B"
539       "\e$(GEhD8t?h:DbWd^6Pz\e(B"
540       "\e$(G]UT6$C$W$h$hFnEB!#{tL=N{EFG5JtH4\e(B"
541       "\e$(GGsL(N{s"PyEFG5JtH4\e(B"
542       "password\e$(GN{EFG5JtH4^6PzExKt\e(B"
543       ])
544     (Korean .
545      [
546       nil
547       "\e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
548       nil
549       "\e$(C8^8p8.\e(B alloc \e$(C?!<-\e(B \e$(C=GFPG_@>4O4Y\e(B"
550       nil
551       "\e$(C;g@|@L\e(B \e$(C>F4U4O4Y\e(B"
552       "\e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
553       "\e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
554       nil
555       "\e$(C;g@|\e(B \e$(CEW@L:m@L\e(B \e$(C2K\e(B \e$(CC!@>4O4Y\e(B"
556       "\e$(CAvA$5H\e(B \e$(C;g@|@G\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
557       nil
558       nil
559       nil
560       nil
561       nil
562       "\e$(CH-@O@;\e(B \e$(C?-\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
563       "\e$(C8B4B\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
564       "\e$(C8B4B\e(B \e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
565       "\e$(C:N<S>n@G\e(B \e$(C09<v0!\e(B \e$(C3J9+\e(B \e$(C890E3*\e(B \e$(C:$EM@G\e(B \e$(C1f@L0!\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
566       "\e$(C1W\e(B \e$(C9xH#@G\e(B \e$(C;g@|@:\e(B \e$(C;g?k5G0m\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
567       nil
568       nil
569       nil
570       "\e$(C:N<S>n\e(B \e$(CH-@O@G\e(B \e$(C3;?k@L\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
571       "\e$(C0!;s\e(B \e$(CG0;g@G\e(B \e$(C9xH#0!\e(B \e$(CF2834O4Y\e(B. hinsi.data \e$(C0!\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
572       "\e$(C9LA$@G@G\e(B \e$(CG0;g0!\e(B \e$(C@|4\\e(B \e$(CG0;g7N\e(B \e$(CA$@G5G>n\e(B \e$(C@V=@4O4Y\e(B"
573       "\e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
574       nil
575       nil
576       "\e$(C;g@|@G\e(B \e$(C?#F.8.0!\e(B \e$(C3J9+\e(B \e$(C89=@4O4Y\e(B"
577       "\e$(C:/H/GO7A4B\e(B \e$(C9.@Z?-@L\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
578       "\e$(C:N<S>n\e(B \e$(CGX<.\e(B \e$(C?5?*@L\e(B \e$(C:NA7GU4O4Y\e(B"
579       nil
580       "\e$(C4Y@=\e(B \e$(CHD:8\e(B \e$(C?5?*@L\e(B \e$(C:NA7GU4O4Y\e(B"
581       "\e$(CHD:80!\e(B \e$(C>x@>4O4Y\e(B"
582       nil
583       nil
584       nil
585       nil
586       "\e$(CGQ1[@L\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
587       "\e$(CGQ@Z0!\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
588       "\e$(CAvA$5H\e(B \e$(C;g@|@:\e(B \e$(C5n7O\e(B \e$(C:R0!4I@T4O4Y\e(B"
589       "\e$(CGQ1[@G\e(B \e$(C1f@L0!\e(B 0 \e$(C@T4O4Y\e(B"
590       "\e$(CAvA$5H\e(B \e$(C;g@|@:\e(B \e$(C?*B|A6\e(B \e$(C:R0!4I@T4O4Y\e(B"
591       "\e$(C@P1b@|?k\e(B \e$(C;g@|?!\e(B \e$(C5n7O\e(B/\e$(C<R0E\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
592       "\e$(CA8@gGOAv\e(B \e$(C>J4B\e(B \e$(C;g@|?!\e(B \e$(C5n7O\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
593       nil
594       nil
595       "\e$(C@P1b@|?k\e(B \e$(C:s558&\e(B \e$(C0f=E\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
596       "\e$(CAvA$5H\e(B \e$(C4\>n4B\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
597       nil
598       nil
599       nil
600       nil
601       nil
602       nil
603       nil
604       nil
605       nil
606       "\e$(C8^8p8.\e(B alloc \e$(C?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
607       nil
608       nil
609       nil
610       nil
611       nil
612       nil
613       nil
614       "\e$(C?!7/0!\e(B \e$(C9_;}G_@>4O4Y\e(B"
615       "\e$(C9v1W\e(B(Bug)\e$(C0!\e(B \e$(C9_;}G_@>4O4Y\e(B"
616       "\e$(C<-9v\e(B(Server)\e$(C0!\e(B \e$(CAW>n\e(B \e$(C@V@>4O4Y\e(B"
617       "alloc\e$(C?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
618       "\e$(C<-9v\e(B(Server) \e$(C?M\e(B \e$(CA"CKGR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
619       "\e$(CEk=E\e(B \e$(CGA7NEdD]@G\e(B \e$(C9vA/@L\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
620       "\e$(CE,6s@L>HF.0!\e(B \e$(C;}<:GQ\e(B \e$(CH/0f@L\e(B \e$(C>F4U4O4Y\e(B"
621       nil
622       nil
623       nil
624       nil
625       nil
626       "\e$(C5p7:Ed8.8&\e(B \e$(C885i\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
627       nil
628       nil
629       nil
630       nil
631       nil
632       nil
633       nil
634       nil
635       nil
636       "\e$(CH-@O\e(B \e$(C@P1b?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
637       "\e$(CH-@O\e(B \e$(C>21b?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
638       "\e$(CE,6s@L>HF.0!\e(B \e$(C@P>n\e(B \e$(C5e80\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
639       "\e$(C4u\e(B \e$(C@L;s@G\e(B \e$(CH-@O@;\e(B \e$(C@P>n\e(B \e$(C5e81\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
640       "\e$(CFP=:?v5e0!\e(B \e$(CF2834O4Y\e(B"
641       "\e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@V@>4O4Y\e(B"
642       "\e$(CH-@O@;\e(B \e$(C<R0EGR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
643       "\e$(CH-@O@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
644       "kWnn\e$(C@G\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
645       "\e$(CH-@O@G\e(B I-node \e$(C?M\e(B FILE_UNIQ \e$(C8&\e(B \e$(C@OD!=CE3\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
646       "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(CE)1b0!\e(B \e$(C3J9+\e(B \e$(CE.4O4Y\e(B"
647       "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(CE)1b0!\e(B \e$(C3J9+\e(B \e$(CE.4O4Y\e(B"
648       "\e$(CG0;g\e(B \e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
649       "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(C3;?k@L\e(B \e$(CF2834O4Y\e(B"
650       nil
651       "\e$(CG0;g\e(B \e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
652       "\e$(CG0;g\e(B \e$(C@L8'@L\e(B \e$(CF2834O4Y\e(B"
653       "\e$(CG0;g\e(B \e$(C9xH#0!\e(B \e$(CF2834O4Y\e(B"
654       nil
655       "\e$(C1W\e(B \e$(CA6@[@:\e(B \e$(CAv?x5GAv\e(B \e$(C>J=@4O4Y\e(B"
656       "\e$(CFP=:?v5e0!\e(B \e$(C5i>n@V4B\e(B \e$(CH-@O@;\e(B \e$(C?-\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
657       "uumrc \e$(C@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
658       "uumrc \e$(C@G\e(B \e$(CG|=D@L\e(B \e$(CF2834O4Y\e(B"
659       "\e$(C@L\e(B \e$(C@L;s\e(B \e$(CH/0f@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
660       "\e$(CE)6s@L>HF.0!\e(B \e$(C@P>n\e(B \e$(C5e80\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
661       "\e$(C;g@|?!\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
662       "\e$(CFP=:?v5e\e(B \e$(CH-@O@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
663       ]))
664   "Array of WNN error messages.  Indexed by error code.")
665
666 (defvar wnnrpc-timeout 10)
667
668 (defun wnnrpc-message-language (lang)
669   (or (cdr (assq lang egg-message-language-alist)) lang))
670
671 (defun wnnrpc-get-error-message (errno)
672   "Return error message string specified by ERRNO."
673   (let ((msg (cdr (or (assq (wnnrpc-message-language egg-default-language)
674                             wnnrpc-error-message)
675                       (assq (wnnrpc-message-language its-current-language)
676                             wnnrpc-error-message)
677                       (assq 'Japanese wnnrpc-error-message)))))
678     (or (and (< errno (length msg)) (aref msg errno))
679         (format "#%d" errno))))
680
681 (defmacro wnnrpc-call-with-proc (proc vlist send-expr &rest receive-exprs)
682   `(comm-call-with-proc ,proc
683        ((zhuyin its-zhuyin)
684         (comm-accept-timeout wnnrpc-timeout)
685         ,@vlist)
686      ,send-expr ,@receive-exprs))
687
688 (defmacro wnnrpc-call-with-environment (env vlist send-expr &rest rcv-exprs)
689   `(comm-call-with-proc (wnnenv-get-proc ,env)
690        ((zhuyin its-zhuyin)
691         (comm-accept-timeout wnnrpc-timeout)
692         (env-id (wnnenv-get-env-id ,env))
693         ,@vlist)
694      ,send-expr ,@rcv-exprs))
695
696 (defmacro wnnrpc-get-result (&rest body)
697   `(let (result)
698      (comm-unpack (i) result)
699      (if (< result 0)
700        (progn
701          (comm-unpack (i) result)
702          (- result))
703      ,@(or body '(result)))))
704 \f
705 (defun wnnrpc-open-internal (proc version myhostname username)
706   "Open the session.  Return 0 on success, error code on failure."
707   (comm-call-with-proc proc ()
708     (comm-format (u u s s)
709                  (wnn-const JS_OPEN)
710                  version myhostname username)
711     (wnnrpc-get-result)))
712
713 (defun wnnrpc-open (proc myhostname username)
714   "Open the session.  Return wnn4 or wnn6 on success, NIL on failure."
715   (let ((type-list `((wnn6 . ,(wnn-const JLIB_VERSION_WNN6))
716                      (wnn4 . ,(wnn-const JLIB_VERSION))))
717         (result (- (wnn-const WNN_BAD_VERSION)))
718         type version)
719     (while (and type-list (= result (- (wnn-const WNN_BAD_VERSION))))
720       (setq type (caar type-list)
721             version (cdar type-list)
722             type-list (cdr type-list)
723             result (wnnrpc-open-internal proc version myhostname username)))
724     (if (zerop result)
725         type
726       result)))
727
728 (defun wnnrpc-connect (proc envname)
729   "Establish new `connection' and make an environment.
730 Return the identitifation of the environment on success, 
731 or negative error code on failure."
732   (comm-call-with-proc proc ()
733     (comm-format (u s) (wnn-const JS_CONNECT) envname)
734     (wnnrpc-get-result)))
735
736 (defun wnnrpc-file-read (env filename)
737   "Read the file FILENAME on the environment ENV
738 Return non-negative file ID on success, or negative error code on failure."
739   (wnnrpc-call-with-environment env ()
740     (comm-format (u u s) (wnn-const JS_FILE_READ) env-id filename)
741     (wnnrpc-get-result)))
742
743 (defun wnnrpc-set-fuzokugo-file (env fid)
744   "For PROC, on environment ENV-ID, 
745 Set Fuzokugo file specified by FID.
746 Return 0 on success, negate-encoded error code on failure."
747   (wnnrpc-call-with-environment env ()
748     (comm-format (u u i) (wnn-const JS_FUZOKUGO_SET) env-id fid)
749     (wnnrpc-get-result)))
750
751 (defun wnnrpc-set-dictionary (env dic-id freq-id priority dic-rw freq-rw
752                                   dic-passwd freq-passwd reverse)
753   "Set dictionary on server.
754 Return dictionary number on success, negate-encoded error code on faiulure."
755   (wnnrpc-call-with-environment env ()
756     (comm-format (u u i i i u u s s u) (wnn-const JS_DIC_ADD)
757                  env-id dic-id freq-id
758                  priority
759                  (if (numberp dic-rw) dic-rw (if dic-rw 0 1))
760                  (if (numberp freq-rw) freq-rw (if freq-rw 0 1))
761                  dic-passwd freq-passwd
762                  (if reverse 1 0))
763     (wnnrpc-get-result)))
764
765 (defun wnnrpc-set-fi-dictionary (env dic-id freq-id sys dic-rw freq-rw
766                                      dic-passwd freq-passwd)
767   "Set FI dictionary on the server.
768 Return 0 on success, negate-encoded error code on faiulure."
769   (wnnrpc-call-with-environment env ()
770     (comm-format (u u i i u u u s s) (wnn-const JS_FI_DIC_ADD)
771                  env-id dic-id freq-id
772                  (if sys
773                      (wnn-const WNN_FI_SYSTEM_DICT)
774                    (wnn-const WNN_FI_USER_DICT))
775                  (if (numberp dic-rw) dic-rw (if dic-rw 0 1))
776                  (if (numberp freq-rw) freq-rw (if freq-rw 0 1))
777                  dic-passwd freq-passwd)
778     (wnnrpc-get-result)))
779
780 (defun wnnrpc-get-autolearning-dic (env type)
781   "Get id of auto learning dictionary on the server.
782 Return dictionary id + 1 on success, 0 on no dictionary, negate-encoded
783 error code on faiulure."
784   (wnnrpc-call-with-environment env (result)
785     (comm-format (u u u) (wnn-const JS_GET_AUTOLEARNING_DIC)
786                  env-id type)
787     (wnnrpc-get-result
788       (comm-unpack (i) result)
789       (1+ result))))
790
791 (defun wnnrpc-set-autolearning-dic (env type dic-id)
792   "Set auto learning dictionary on the server.
793 Return 0 on success, negate-encoded error code on faiulure."
794   (wnnrpc-call-with-environment env ()
795     (comm-format (u u u i) (wnn-const JS_SET_AUTOLEARNING_DIC)
796                  env-id type dic-id)
797     (wnnrpc-get-result)))
798
799 (defun wnnrpc-version (proc)
800   "Return the version number of WNN server."
801   (comm-call-with-proc proc (result)
802     (comm-format (u) (wnn-const JS_VERSION))
803     (comm-unpack (i) result)
804     result))
805
806 (defun wnnrpc-access (env path mode) 
807   "Check the accessibility of file in the environment ENV.
808 Return 0 when the remote file (dictionary/frequency) of PATH on server
809 can be accessed in mode MODE.  Return Non-zero otherwise."
810   (wnnrpc-call-with-environment env (result)
811     (comm-format (u u u s) (wnn-const JS_ACCESS) env-id mode path)
812     (comm-unpack (i) result)
813     result))
814
815 (defun wnnrpc-mkdir (env path)
816   "Create directory specified by PATH."
817   (wnnrpc-call-with-environment env ()
818     (comm-format (u u s) (wnn-const JS_MKDIR) env-id path)
819     (wnnrpc-get-result)))
820
821 (defun wnnrpc-writable-dic-type (env fi rw)
822   (let ((server (wnnenv-get-server-type env)))
823     (cond (fi                        (wnn-const WNN_FI_USER_DICT))
824           ((or (eq server 'cserver)
825                (eq server 'tserver)) (wnn-const CWNN_REV_DICT))
826           ((eq rw 3)                 (wnn-const WNN_GROUP_DICT))
827           ((eq rw 4)                 (wnn-const WNN_MERGE_DICT))
828           (t                         (wnn-const WNN_REV_DICT)))))
829
830 (defun wnnrpc-dic-file-create (env dicname type comment passwd hpasswd)
831   "Create a dictionary on the server."
832   (wnnrpc-call-with-environment env ()
833     (comm-format (u u s S s s u) (wnn-const JS_DIC_FILE_CREATE)
834                  env-id dicname comment
835                  passwd hpasswd type)
836     (wnnrpc-get-result)))
837
838 (defun wnnrpc-hindo-file-create (env fi dic-id freqname comment passwd)
839   "Create a frequency file on the server."
840   (wnnrpc-call-with-environment env ()
841     (comm-format (u u u s S s)
842                  (if fi
843                      (wnn-const JS_FI_HINDO_FILE_CREATE)
844                    (wnn-const JS_HINDO_FILE_CREATE))
845                  env-id dic-id freqname comment passwd)
846     (wnnrpc-get-result)))
847
848 (defun wnnrpc-file-discard (env fid)
849   "Discard a file specified by FID.  Call this for already-opened file
850 before remove and create new file."
851   (wnnrpc-call-with-environment env ()
852     (comm-format (u u i) (wnn-const JS_FILE_DISCARD)
853                  env-id fid)
854     (wnnrpc-get-result)))
855
856 (defun wnnrpc-file-remove (proc filename passwd)
857   "Remove the file."
858   (comm-call-with-proc proc ()
859     (comm-format (u s s) (wnn-const JS_FILE_REMOVE)
860                  filename (or passwd ""))
861     (wnnrpc-get-result)))
862
863 (defun wnnrpc-set-conversion-parameter (env v)
864   "Set conversion parameter."
865   (wnnrpc-call-with-environment env ()
866     (comm-format (u u i i i i i i i i i i i i i i i i i)
867                  (wnn-const JS_PARAM_SET)
868                  env-id
869                  (aref v  0) (aref v  1) (aref v  2) (aref v  3) (aref v  4)
870                  (aref v  5) (aref v  6) (aref v  7) (aref v  8) (aref v  9)
871                  (aref v 10) (aref v 11) (aref v 12) (aref v 13) (aref v 14)
872                  (aref v 15) (aref v 16))
873     (wnnrpc-get-result)))
874
875 (defun wnnrpc-set-conversion-env-param (env mask v)
876   "Set Wnn6 conversion parameter."
877   (wnnrpc-call-with-environment env ()
878     (comm-format (u u u i i i i i i i i i i i i i i i i i i)
879                  (wnn-const JS_SET_HENKAN_ENV)
880                  env-id mask
881                  (aref v  0) (aref v  1) (aref v  2) (aref v  3) (aref v  4)
882                  (aref v  5) (aref v  6) (aref v  7) (aref v  8) (aref v  9)
883                  (aref v 10) (aref v 11) (aref v 12) (aref v 13) (aref v 14)
884                  (aref v 15) (aref v 16) (aref v 17))
885     (wnnrpc-get-result)))
886
887 (defun wnnrpc-temporary-dic-loaded (env)
888   "Ask to the server whether the temporary dictionary is loaded or not.
889 Return positive if loaded, zero if not, negative on failure."
890   (wnnrpc-call-with-environment env ()
891     (comm-format (u u) (wnn-const JS_IS_LOADED_TEMPORARY_DIC)
892                  env-id)
893     (wnnrpc-get-result)))
894
895 (defun wnnrpc-temporary-dic-add (env reverse)
896   "Add temporary dictionary on the server."
897   (wnnrpc-call-with-environment env ()
898     (comm-format (u u u) (wnn-const JS_TEMPORARY_DIC_ADD)
899                  env-id (if reverse 1 0))
900     (wnnrpc-get-result)))
901
902 (defun wnnrpc-receive-sho-bunsetsu-list (env n-bunsetsu)
903   (let ((proc (wnnenv-get-proc env))
904         slist
905         end start jiritsugo-end dic-no entry freq right-now
906         hinshi status status-backward kangovect evaluation
907         result source fuzokugo)
908     (while (> n-bunsetsu 0)
909       (comm-unpack (i i i i i i i i i i i i)
910                    end start jiritsugo-end
911                    dic-no entry freq right-now hinshi
912                    status status-backward kangovect evaluation)
913       (setq slist
914             (cons
915              (wnn-bunsetsu-create env (1+ (- jiritsugo-end start))
916                                   dic-no entry freq right-now hinshi
917                                   status status-backward kangovect evaluation)
918              slist))
919       (setq n-bunsetsu (1- n-bunsetsu)))
920     (prog1
921         (setq slist (nreverse slist))
922       (while slist
923         (comm-unpack (S S S) result source fuzokugo)
924         (wnn-bunsetsu-set-converted (car slist) result)
925         (wnn-bunsetsu-set-yomi (car slist) source)
926         (wnn-bunsetsu-set-fuzokugo (car slist) fuzokugo)
927         (setq slist (cdr slist))))))
928
929 (defun wnnrpc-receive-dai-bunsetsu-list (env n-dai separate)
930   (let ((proc (wnnenv-get-proc env))
931         n-bunstsu kanji-length dlist slist
932         end start n-sho evaluation
933         n retval)
934     (comm-unpack (i i) n-bunstsu kanji-length)
935     (while (> n-dai 0)
936       (comm-unpack (i i i i) end start n-sho evaluation)
937       (setq dlist (cons (cons n-sho evaluation) dlist)
938             n-dai (1- n-dai)))
939     (setq dlist (nreverse dlist)
940           slist (wnnrpc-receive-sho-bunsetsu-list env n-bunstsu))
941     (if (null separate)
942         (prog1
943             slist
944           (while dlist
945             (setq n (caar dlist))
946             (while (> n 0)
947               (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
948               (wnn-bunsetsu-set-dai-continue (car slist) (> n 1))
949               (setq slist (cdr slist)
950                     n (1- n)))
951             (setq dlist (cdr dlist))))
952       (while dlist
953         (setq retval (cons slist retval)
954               n (caar dlist))
955         (while (> n 1)
956           (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
957           (wnn-bunsetsu-set-dai-continue (car slist) t)
958           (setq slist (cdr slist)
959                 n (1- n)))
960         (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
961         (wnn-bunsetsu-set-dai-continue (car slist)
962                                        (wnn-bunsetsu-connect-next (car slist)))
963         (setq slist (prog1 (cdr slist) (setcdr slist nil))
964               dlist (cdr dlist)))
965       (nreverse retval))))
966
967 (defun wnnrpc-renbunsetsu-conversion (env yomi hinshi fuzokugo v)
968   "Convert YOMI string into Kanji.
969 HINSHI and FUZOKUGO are information of preceding bunsetsu."
970   (wnnrpc-call-with-environment env ()
971     (comm-format (u u S i S i i i) (wnn-const JS_KANREN)
972                  env-id yomi hinshi fuzokugo
973                  (or v (wnn-const WNN_VECT_KANREN))
974                  (if v (wnn-const WNN_VECT_KANREN) (wnn-const WNN_VECT_NO))
975                  (wnn-const WNN_VECT_BUNSETSU))
976      (wnnrpc-get-result
977       (wnnrpc-receive-dai-bunsetsu-list env result nil))))
978
979 (defun wnnrpc-fi-renbunsetsu-conversion (env yomi hinshi fuzokugo v context)
980   "Convert YOMI string into Kanji.
981 HINSHI and FUZOKUGO are information of preceding bunsetsu."
982   (wnnrpc-call-with-environment env (result)
983     (comm-format (u u S i S i i i i i i i S i i i i S) (wnn-const JS_FI_KANREN)
984                  env-id yomi hinshi fuzokugo
985                  (or v (wnn-const WNN_VECT_KANREN))
986                  (if v (wnn-const WNN_VECT_KANREN) (wnn-const WNN_VECT_NO))
987                  (wnn-const WNN_VECT_BUNSETSU)
988                  (wnn-context-dic-no (car context))
989                  (wnn-context-entry (car context))
990                  (wnn-context-jirilen (car context))
991                  (wnn-context-hinshi (car context))
992                  (wnn-context-fuzokugo (car context))
993                  (wnn-context-dic-no (nth 1 context))
994                  (wnn-context-entry (nth 1 context))
995                  (wnn-context-jirilen (nth 1 context))
996                  (wnn-context-hinshi (nth 1 context))
997                  (wnn-context-fuzokugo (nth 1 context)))
998     (setq result (wnnrpc-get-result
999                    (wnnrpc-receive-dai-bunsetsu-list env result nil)))
1000     (prog1
1001         result
1002       (unless (numberp result)
1003         (wnn-bunsetsu-set-fi-rel (car result)
1004                                  (wnnrpc-get-fi-relation-data env))
1005         (while result
1006           (wnn-bunsetsu-set-context (car result) context)
1007           (setq result (cdr result)))))))
1008
1009 (defun wnnrpc-get-fi-relation-data (env)
1010   "Receive FI relation data from the server."
1011   (let ((proc (wnnenv-get-proc env))
1012         fi-dic dic entry offset num result)
1013     (comm-unpack (i) num)
1014     (while (> num 0)
1015       (comm-unpack (i i i i) fi-dic dic entry offset)
1016       (setq result (cons (vector fi-dic dic entry offset -2 -4) result)
1017             num (1- num)))
1018     (nreverse result)))
1019
1020 (defun wnnrpc-tanbunsetsu-conversion (env yomi hinshi fuzoku v)
1021   ""
1022   (wnnrpc-call-with-environment env (kanji-length)
1023     (comm-format (u u S i S i i) (wnn-const JS_KANTAN_SHO)
1024                  env-id yomi hinshi fuzoku
1025                  (or v (wnn-const WNN_VECT_KANTAN))
1026                  (if v (wnn-const WNN_VECT_KANTAN) (wnn-const WNN_VECT_NO)))
1027     (wnnrpc-get-result
1028       (comm-unpack (u) kanji-length)    ; ignore kanji-length
1029       (wnnrpc-receive-sho-bunsetsu-list env result))))
1030
1031 (defun wnnrpc-get-bunsetsu-candidates (env yomi hinshi fuzoku v)
1032   ""
1033   (wnnrpc-call-with-environment env (kanji-length)
1034     (comm-format (u u S i S i i) (wnn-const JS_KANZEN_SHO)
1035                  env-id yomi hinshi fuzoku
1036                  (or v (wnn-const WNN_VECT_KANZEN))
1037                  (if v (wnn-const WNN_VECT_KANZEN) (wnn-const WNN_VECT_NO)))
1038     (wnnrpc-get-result
1039       (comm-unpack (u) kanji-length)    ; ignore kanji-length
1040       (mapcar (lambda (b)
1041                 (wnn-bunsetsu-set-dai-continue b (wnn-bunsetsu-connect-next b))
1042                 (list b))
1043               (wnnrpc-receive-sho-bunsetsu-list env result)))))
1044
1045 (defun wnnrpc-daibunsetsu-conversion (env yomi hinshi fuzoku v)
1046   ""
1047   (wnnrpc-call-with-environment env (n-sho-bunsetsu kanji-size)
1048     (comm-format (u u S i S i i) (wnn-const JS_KANTAN_DAI)
1049                  env-id yomi hinshi fuzoku
1050                  (or v (wnn-const WNN_VECT_KANTAN))
1051                  (if v (wnn-const WNN_VECT_KANTAN) (wnn-const WNN_VECT_NO)))
1052     (wnnrpc-get-result
1053       (wnnrpc-receive-dai-bunsetsu-list env result nil))))
1054
1055 (defun wnnrpc-get-daibunsetsu-candidates (env yomi hinshi fuzoku v)
1056   ""
1057   (wnnrpc-call-with-environment env (n-sho-bunsetsu kanji-size)
1058     (comm-format (u u S i S i i) (wnn-const JS_KANZEN_DAI)
1059                  env-id yomi hinshi fuzoku
1060                  (or v (wnn-const WNN_VECT_KANZEN))
1061                  (if v (wnn-const WNN_VECT_KANZEN) (wnn-const WNN_VECT_NO)))
1062     (wnnrpc-get-result
1063       (wnnrpc-receive-dai-bunsetsu-list env result t))))
1064
1065 (defun wnnrpc-set-frequency (env dicno entry ima hindo)
1066   ""
1067   (wnnrpc-call-with-environment env ()
1068     (comm-format (u u i i i i) (wnn-const JS_HINDO_SET)
1069                  env-id dicno entry ima hindo)
1070     (wnnrpc-get-result)))
1071
1072 (defun wnnrpc-set-fi-priority (env fi-rel)
1073   ""
1074   (wnnrpc-call-with-environment env ()
1075     (progn
1076       (comm-format (u u u) (wnn-const JS_SET_FI_PRIORITY)
1077                    env-id (length fi-rel))
1078       (while fi-rel
1079         (comm-format (i i i i i i)
1080                      (aref (car fi-rel) 0) (aref (car fi-rel) 1)
1081                      (aref (car fi-rel) 2) (aref (car fi-rel) 3)
1082                      (aref (car fi-rel) 4) (aref (car fi-rel) 5))
1083         (setq fi-rel (cdr fi-rel))))
1084     (wnnrpc-get-result)))
1085
1086 (defun wnnrpc-optimize-fi (env context)
1087   ""
1088   (wnnrpc-call-with-environment env (c)
1089     (progn
1090       (comm-format (u u u) (wnn-const JS_OPTIMIZE_FI)
1091                    env-id (length context))
1092       (while context
1093         (setq c (car context)
1094               context (cdr context))
1095         (comm-format (i i i i i S)
1096                      (wnn-context-dic-no c)
1097                      (wnn-context-entry c)
1098                      (wnn-context-right-now c)
1099                      (wnn-context-freq c)
1100                      (wnn-context-length c)
1101                      (concat (wnn-context-converted c)
1102                              (wnn-context-fuzokugo c)))))
1103     (wnnrpc-get-result)))
1104
1105 (defun wnnrpc-close (proc)
1106   ""
1107   (comm-call-with-proc proc ()
1108     (comm-format (u) (wnn-const JS_CLOSE))
1109     (wnnrpc-get-result)))
1110
1111 (defun wnnrpc-env-exist (proc envname)
1112   ""
1113   (comm-call-with-proc proc (result)
1114     (comm-format (u s) (wnn-const JS_ENV_EXIST) envname)
1115     (comm-unpack (i) result)
1116     result))
1117
1118 (defun wnnrpc-make-env-sticky (env)
1119   ""
1120   (wnnrpc-call-with-environment env ()
1121     (comm-format (u u) (wnn-const JS_ENV_STICKY) env-id)
1122     (wnnrpc-get-result)))
1123
1124 (defun wnnrpc-make-env-unsticky (env)
1125   ""
1126   (wnnrpc-call-with-environment env ()
1127     (comm-format (u u) (wnn-const JS_ENV_UNSTICKY) env-id)
1128     (wnnrpc-get-result)))
1129
1130 (defun wnnrpc-disconnect (env)
1131   ""
1132   (wnnrpc-call-with-environment env ()
1133     (comm-format (u u) (wnn-const JS_DISCONNECT) env-id)
1134     (wnnrpc-get-result)))
1135
1136 (defun wnnrpc-add-word (env dictionary yomi kanji comment hinshi initial-freq)
1137   ""
1138   (wnnrpc-call-with-environment env ()
1139     (comm-format (u u u S S S u u) (wnn-const JS_WORD_ADD)
1140                  env-id dictionary yomi kanji comment hinshi initial-freq)
1141     (wnnrpc-get-result)))
1142
1143 (defun wnnrpc-auto-learning (env type yomi kanji comment hinshi initial-freq)
1144   ""
1145   (wnnrpc-call-with-environment env ()
1146     (comm-format (u u u S S S u u) (wnn-const JS_AUTOLEARNING_WORD_ADD)
1147                  env-id type yomi kanji comment hinshi initial-freq)
1148     (wnnrpc-get-result)))
1149
1150 (defun wnnrpc-temporary-learning (env yomi kanji comment hinshi initial-freq)
1151   ""
1152   (wnnrpc-call-with-environment env ()
1153     (comm-format (u u S S S u u) (wnn-const JS_AUTOLEARNING_WORD_ADD)
1154                  env-id yomi kanji comment hinshi initial-freq)
1155     (wnnrpc-get-result)))
1156
1157 (defun wnnrpc-get-dictionary-list-with-environment (env)
1158   ""
1159   (wnnrpc-call-with-environment env (n-dic)
1160     (comm-format (u u) (wnn-const JS_DIC_LIST) env-id)
1161     (comm-unpack (i) n-dic)
1162     (wnnrpc-receive-dictionary-list proc n-dic)))
1163
1164 (defun wnnrpc-get-fi-dictionary-list-with-environment (env mask)
1165   ""
1166   (wnnrpc-call-with-environment env (n-dic)
1167     (comm-format (u u u) (wnn-const JS_FI_DIC_LIST) env-id mask)
1168     (comm-unpack (i) n-dic)
1169     (wnnrpc-receive-dictionary-list proc n-dic)))
1170
1171 (defun wnnrpc-receive-dictionary-list (proc n-dic)
1172   (let (entry dic freq dic-mode freq-mode enable-flag nice
1173         rev comment dicname freqname dic-passwd freq-passwd
1174         type gosuu dic-local-flag freq-local-flag retval)
1175     (while (> n-dic 0)
1176       (comm-unpack (i i i i i i i i S s s s s i i i i)
1177                    entry dic freq dic-mode freq-mode enable-flag nice
1178                    rev comment dicname freqname dic-passwd freq-passwd
1179                    type gosuu dic-local-flag freq-local-flag)
1180       (setq retval (cons
1181                     (vector entry dic freq dic-mode freq-mode enable-flag nice
1182                             rev comment dicname freqname dic-passwd freq-passwd
1183                             type gosuu dic-local-flag freq-local-flag)
1184                     retval)
1185             n-dic (1- n-dic)))
1186     (nreverse retval)))
1187
1188 (defsubst wnndic-get-id (dic) (aref dic 0))
1189 (defsubst wnndic-get-comment (dic) (aref dic 8))
1190 (defsubst wnndic-get-dictname (dic) (aref dic 9))
1191
1192 (defun wnnrpc-get-writable-dictionary-id-list (env)
1193   ""
1194   (wnnrpc-call-with-environment env (dic-list dic)
1195     (comm-format (u u i) (wnn-const JS_HINSI_DICTS) env-id -1)
1196     (wnnrpc-get-result
1197       (while (> result 0)
1198         (comm-unpack (i) dic)
1199         (setq dic-list (nconc dic-list (list dic))
1200               result (1- result)))
1201       dic-list)))
1202
1203 (defun wnnrpc-get-hinshi-list (env dic name)
1204   ""
1205   (wnnrpc-call-with-environment env (hinshi hinshi-list str-size)
1206     (comm-format (u u u S) (wnn-const JS_HINSI_LIST) env-id dic name)
1207     (wnnrpc-get-result
1208       (comm-unpack (u) str-size)        ; ignore
1209       (while (> result 0)
1210         (comm-unpack (S) hinshi)
1211         (setq hinshi-list (nconc hinshi-list (list hinshi))
1212               result (1- result)))
1213       hinshi-list)))
1214
1215 (defun wnnrpc-hinshi-number (proc name)
1216   ""
1217   (wnnrpc-call-with-proc proc ()
1218     (comm-format (u S) (wnn-const JS_HINSI_NUMBER) name)
1219     (wnnrpc-get-result)))
1220
1221 (defun wnnrpc-get-conversion-parameter (env)
1222   ""
1223   (wnnrpc-call-with-environment env (n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9
1224                                      p10 p11 p12 p13 p14 p15)
1225     (comm-format (u u) (wnn-const JS_PARAM_GET) env-id)
1226     (wnnrpc-get-result
1227       (comm-unpack (i i  i i i i i  i i i i i  i i i i i)
1228                    n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9
1229                    p10 p11 p12 p13 p14 p15)
1230       (vector n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15))))
1231
1232 (defun wnnrpc-get-conversion-env-param (env)
1233   ""
1234   (wnnrpc-call-with-environment env (p1 p2 p3 p4 p5 p6 p7 p8 p9
1235                                     p10 p11 p12 p13 p14 p15 p16 p17 p18)
1236     (comm-format (u u) (wnn-const JS_GET_HENKAN_ENV) env-id)
1237     (wnnrpc-get-result
1238       (comm-unpack (i i i i i i i i i i i i i i i i i i)
1239                    p1 p2 p3 p4 p5 p6 p7 p8 p9
1240                    p10 p11 p12 p13 p14 p15 p16 p17 p18)
1241       (vector p1 p2 p3 p4 p5 p6 p7 p8 p9
1242               p10 p11 p12 p13 p14 p15 p16 p17 p18))))
1243
1244 (defun wnnrpc-file-loaded (proc path)
1245   ""
1246   (comm-call-with-proc proc (result)
1247     (comm-format (u s) (wnn-const JS_FILE_LOADED) path)
1248     (comm-unpack (i) result)
1249     result))
1250
1251 (defun wnnrpc-write-file (env fid filename)
1252   (wnnrpc-call-with-environment env ()
1253     (comm-format (u u u s) (wnn-const JS_FILE_WRITE) env-id fid filename)
1254     (wnnrpc-get-result)))
1255
1256 (defun wnnrpc-get-fuzokugo-file (env)
1257   ""
1258   (wnnrpc-call-with-environment env ()
1259     (comm-format (u u) (wnn-const JS_FUZOKUGO_GET) env-id)
1260     (wnnrpc-get-result)))
1261
1262 (defsubst wnnrpc-receive-file-list (proc)
1263   (let ((i 0)
1264         flist
1265         nfiles fid local ref-count type name)
1266     (comm-unpack (i) nfiles)
1267     (while (> nfiles 0)
1268       (comm-unpack (i i i i s) fid local ref-count type name)
1269       (setq flist (nconc flist (list (vector fid local ref-count type name)))
1270             nfiles (1- nfiles)))
1271     flist))
1272
1273 (defun wnnrpc-get-file-list (proc)
1274   ""
1275   (comm-call-with-proc proc ()
1276     (comm-format (u) (wnn-const JS_FILE_LIST_ALL))
1277     (wnnrpc-receive-file-list proc)))
1278
1279 (defun wnnrpc-get-file-list-with-env (env)
1280   ""
1281   (wnnrpc-call-with-environment env ()
1282     (comm-format (u u) (wnn-const JS_FILE_LIST) env-id)
1283     (wnnrpc-receive-file-list proc)))
1284
1285 (defun wnnrpc-file-attribute (env path)
1286   "3: dictionary, 4: hindo file, 5: fuzokugo-file"
1287   (wnnrpc-call-with-environment env (result)
1288     (comm-format (u u s) (wnn-const JS_FILE_STAT) env-id path)
1289     (comm-unpack (i) result)
1290     result))
1291
1292 (defun wnnrpc-get-file-info (env fid)
1293   ""
1294   (wnnrpc-call-with-environment env (name local ref-count type)
1295     (comm-format (u u u) (wnn-const JS_FILE_INFO) env-id fid)
1296     (wnnrpc-get-result
1297       (comm-unpack (s i i i) name local ref-count type)
1298       (vector name local ref-count type))))
1299
1300 (defmacro wnnrpc-receive-vector (n)
1301   `(let ((v (make-vector ,n -1))
1302          (i 0)
1303          j)
1304      (while (< i ,n)
1305        (comm-unpack (i) j)
1306        (aset v i j)
1307        (setq i (1+ i)))
1308      v))
1309
1310 (defun wnnrpc-who (proc)
1311   ""
1312   (comm-call-with-proc proc (who socket username hostname)
1313     (comm-format (u) (wnn-const JS_WHO))
1314     (wnnrpc-get-result
1315       (while (> result 0)
1316         (comm-unpack (i s s) socket username hostname)
1317         (setq who (nconc who
1318                          (list (vector socket username hostname
1319                                        (wnnrpc-receive-vector
1320                                         (wnn-const WNN_MAX_ENV_OF_A_CLIENT)))))
1321               result (1- result)))
1322       who)))
1323
1324 (defun wnnrpc-get-env-list (proc)
1325   (comm-call-with-proc proc (envs id name count fuzokugo dic-max)
1326     (comm-format (u) (wnn-const JS_ENV_LIST))
1327     (wnnrpc-get-result
1328       (while (> result 0)
1329         (comm-unpack (i s i i i) id name count fuzokugo dic-max)
1330         (setq envs (nconc envs
1331                           (list (vector id name count fuzokugo dic-max
1332                                         (wnnrpc-receive-vector
1333                                          (wnn-const WNN_MAX_DIC_OF_AN_ENV))
1334                                         (wnnrpc-receive-vector
1335                                          (wnn-const WNN_MAX_FILE_OF_AN_ENV)))))
1336               result (1- result)))
1337         envs)))
1338
1339 (defun wnnrpc-kill (proc)
1340   ""
1341   (comm-call-with-proc proc (result)
1342     (comm-format (u) (wnn-const JS_KILL))
1343     (comm-unpack (i) result)
1344     result))
1345
1346 (defun wnnrpc-delete-dictionary (env dic)
1347   ""
1348   (wnnrpc-call-with-environment env ()
1349     (comm-format (u u u) (wnn-const JS_DIC_DELETE) env-id dic)
1350     (wnnrpc-get-result)))
1351
1352 (defun wnnrpc-set-flag-on-dictionary (env dic flag)
1353   ""
1354   (wnnrpc-call-with-environment env ()
1355     (comm-format (u u u u) (wnn-const JS_DIC_USE) env-id dic flag)
1356     (wnnrpc-get-result)))
1357
1358 (defun wnnrpc-get-dictionary-list (proc)
1359   ""
1360   (wnnrpc-call-with-proc proc (n-dic)
1361     (comm-format (u) (wnn-const JS_DIC_LIST_ALL))
1362     (comm-unpack (i) n-dic)
1363     (wnnrpc-receive-dictionary-list proc n-dic)))
1364
1365 (defun wnnrpc-delete-word (env dic entry)
1366   ""
1367   (wnnrpc-call-with-environment env ()
1368     (comm-format (u u u u) (wnn-const JS_WORD_DELETE) env-id dic entry)
1369     (wnnrpc-get-result)))
1370
1371 (defun wnnrpc-receive-word (proc yomi)
1372   (let (dic serial hinshi hindo right-now internal-hindo internal-right-now
1373         kanji comment l l1)
1374     (comm-unpack (i) dic)
1375     (while (>= dic 0)
1376       (comm-unpack (i i i i i i) serial hinshi hindo right-now
1377                    internal-hindo internal-right-now)
1378       (setq l (cons (vector dic serial hinshi hindo right-now
1379                             internal-hindo internal-right-now
1380                             yomi nil nil)
1381                     l))
1382       (comm-unpack (i) dic))
1383     (setq l (nreverse l)
1384           l1 l)
1385     (while l1
1386       (comm-unpack (S S) kanji comment)
1387       (aset (car l1) 8 kanji)
1388       (aset (car l1) 9 comment)
1389       (setq l1 (cdr l1)))
1390     l))
1391
1392 (defun wnnrpc-search-word-in-dictionary (env dic yomi)
1393   ""
1394   (wnnrpc-call-with-environment env (n-entries len)
1395     (comm-format (u u u S) (wnn-const JS_WORD_SEARCH) env-id dic yomi)
1396     (comm-unpack (u u) n-entries len)   ; ignore
1397     (wnnrpc-receive-word proc yomi)))
1398
1399 (defun wnnrpc-search-word (env yomi)
1400   ""
1401   (wnnrpc-call-with-environment env (n-entries len)
1402     (comm-format (u u S) (wnn-const JS_WORD_SEARCH_BY_ENV) env-id yomi)
1403     (comm-unpack (u u) n-entries len)   ; ignore
1404     (wnnrpc-receive-word proc yomi)))
1405
1406 (defun wnnrpc-get-word-info (env dic entry)
1407   ""
1408   (wnnrpc-call-with-environment env (n-entries len yomi)
1409     (comm-format (u u u u) (wnn-const JS_WORD_INFO) env-id dic entry)
1410     (wnnrpc-get-result
1411       (comm-unpack (S) yomi)
1412       (comm-unpack (u u) n-entries len) ; ignore
1413       (wnnrpc-receive-word proc yomi))))
1414
1415 (defun wnnrpc-set-comment-on-word (env dic entry comment)
1416   ""
1417   (wnnrpc-call-with-environment env ()
1418     (comm-format (u u u u S) (wnn-const JS_WORD_COMMENT_SET)
1419                  env-id dic entry comment)
1420     (wnnrpc-get-result)))
1421
1422 (defun wnnrpc-get-dictionary-info (env dic)
1423   ""
1424   (wnnrpc-call-with-environment env ()
1425     (comm-format (u u u) (wnn-const JS_DIC_INFO) env-id dic)
1426     (wnnrpc-get-result
1427       (wnnrpc-receive-dictionary-list proc 1))))
1428
1429 (defun wnnrpc-set-file-comment (env fid comment)
1430   ""
1431   (wnnrpc-call-with-environment env ()
1432     (comm-format (u u u S) (wnn-const JS_FILE_COMMENT_SET) env-id fid comment)
1433     (wnnrpc-get-result)))
1434
1435 (defun wnnrpc-hinshi-name (proc hinshi)
1436   ""
1437   (wnnrpc-call-with-proc proc ()
1438     (comm-format (u u) (wnn-const JS_HINSI_NAME) hinshi)
1439     (wnnrpc-get-result
1440       (comm-unpack (S) result)
1441       result)))
1442
1443 (defun wnnrpc-set-file-password (env fid which old new)
1444   "WHICH: 1: DIC, 2: HINDO, 3(0): Both"
1445   (wnnrpc-call-with-environment env ()
1446     (comm-format (u u u u s s) (wnn-const JS_FILE_PASSWORD_SET)
1447                  env-id fid which old new)
1448     (wnnrpc-get-result)))
1449
1450 (defun wnnrpc-set-hinshi-table (env dic hinshi-table)
1451   ""
1452   (wnnrpc-call-with-environment env ()
1453     (comm-format (u u u S) (wnn-const JS_HINSI_TABLE_SET)
1454                  env-id dic hinshi-table)
1455     (wnnrpc-get-result)))
1456 \f
1457 (defmacro wnnrpc-with-temp-buffer (&rest body)
1458   `(with-temp-buffer
1459      (let ((coding-system-for-read 'binary)
1460            (coding-system-for-write 'binary))
1461        (set-buffer-multibyte nil)
1462        ,@body)))
1463
1464 (defmacro wnnrpc-with-write-file (filename error-handler &rest body)
1465   `(condition-case error
1466        (with-temp-file ,filename
1467          (let ((coding-system-for-read 'binary)
1468                (coding-system-for-write 'binary))
1469            (set-buffer-multibyte nil)
1470            ,@body))
1471      (file-error ,error-handler)))
1472
1473 (defmacro wnnrpc-terminate-current-command (errno)
1474   `(progn
1475      (comm-call-with-proc-1 proc ()
1476        (comm-format (i) (wnn-const WNN_NAK)))
1477      (- (wnn-const ,errno))))
1478
1479 (defun wnnrpc-get-local-filename (name)
1480   (if (and (string-match (wnn-const WNN_C_LOCAL) name)
1481            (string= (substring name 0 (match-beginning 0)) wnn-system-name))
1482       (substring name (match-end 0))
1483     name))
1484
1485 ;; <header> ::= (<type> <uniq> <uniq> <passwd>)
1486 ;; <uniq>   ::= string
1487 ;; <passwd> ::= string
1488
1489 (defun wnnrpc-scan-file-header ()
1490   (let ((proc nil)
1491         type uniq1 uniq2 passwd)
1492     (if (and (> (point-max) (wnn-const WNN_FILE_HEADER_LEN))
1493              (equal (buffer-substring 1 (1+ (wnn-const WNN_FILE_STRING_LEN)))
1494                     (wnn-const WNN_FILE_STRING)))
1495         (progn
1496           (goto-char (1+ (wnn-const WNN_FILE_STRING_LEN)))
1497           (comm-unpack (i v v v)
1498                        type
1499                        uniq1 (wnn-const WNN_UNIQ_LEN)
1500                        uniq2 (wnn-const WNN_UNIQ_LEN)
1501                        passwd (wnn-const WNN_PASSWD_LEN))
1502           (list type uniq1 uniq2 passwd)))))
1503
1504 (defun wnnrpc-get-file-header (filename)
1505   (wnnrpc-with-temp-buffer
1506     (if (null (file-readable-p filename))
1507         (list nil (make-string (wnn-const WNN_UNIQ_LEN) 0) "" "")
1508       (insert-file-contents filename nil 0 (wnn-const WNN_FILE_HEADER_LEN))
1509       (wnnrpc-scan-file-header))))
1510
1511 (defun wnnrpc-check-local-file (path &optional preserve)
1512   (let ((header (wnnrpc-get-file-header path)))
1513     (cond ((null header)
1514            (- (wnn-const WNN_NOT_A_FILE)))
1515           ((null (car header))
1516            (if (file-exists-p path) 
1517                (- (wnn-const WNN_OPENF_ERR))
1518              (- (wnn-const WNN_NO_EXIST))))
1519           (t
1520            (if (wnnrpc-check-inode header path)
1521                header
1522              (if preserve
1523                  (- (wnn-const WNN_INODE_CHECK_ERROR))
1524                (wnnrpc-change-file-uniq header path)
1525                (wnnrpc-check-local-file path t)))))))
1526
1527 (defsubst wnnrpc-get-inode (uniq)
1528   (+ (lsh (aref uniq 8) 24)
1529      (lsh (aref uniq 9) 16)
1530      (lsh (aref uniq 10) 8)
1531      (aref uniq 11)))
1532
1533 (defun wnnrpc-check-inode (header path)
1534   (let ((inode (nth 10 (file-attributes path))))
1535     (and inode (= inode (wnnrpc-get-inode (nth 1 header))))))
1536
1537 (defun wnnrpc-make-uniq (attributes)
1538   (wnnrpc-with-temp-buffer
1539     (let ((ctime (nth 6 attributes))
1540           (ino (nth 10 attributes))
1541           (devno (nth 11 attributes)))
1542       (if (numberp devno)
1543           (comm-format (U i u V)
1544                        ctime devno ino
1545                        wnn-system-name (wnn-const WNN_HOST_LEN))
1546         ;; Emacs 21 returns returns negative devno as 16 bits uint pair
1547         (comm-format (U U u V)
1548                      ctime (list (car devno) (cdr devno)) ino
1549                      wnn-system-name (wnn-const WNN_HOST_LEN)))
1550       (buffer-string))))
1551
1552 (defun wnnrpc-change-file-uniq (header path &optional new)
1553   (wnnrpc-with-write-file path
1554       nil
1555     (insert-file-contents path)
1556     (if (wnnrpc-scan-file-header)
1557         (let ((uniq (wnnrpc-make-uniq (file-attributes path))))
1558           (goto-char (1+ (wnn-const WNN_FILE_STRING_LEN)))
1559           (delete-region (point) (1+ (wnn-const WNN_FILE_HEADER_LEN)))
1560           (comm-format (u v v v v)
1561                        (car header)
1562                        uniq (wnn-const WNN_UNIQ_LEN)
1563                        (if new uniq (nth 1 header)) (wnn-const WNN_UNIQ_LEN)
1564                        (nth 3 header) (wnn-const WNN_PASSWD_LEN)
1565                        "" (wnn-const WNN_FILE_HEADER_PAD))
1566           t))))
1567
1568 (defun wnnrpc-check-passwd (proc passwd header)
1569   (let ((env-id -1))
1570     (unwind-protect
1571         (if (< (setq env-id (wnnrpc-connect proc "")) 0)
1572             -1
1573           (wnnrpc-call-with-environment (wnnenv-create proc env-id)
1574               (file-id)
1575             (comm-format (u u v) (wnn-const JS_FILE_SEND)
1576                          env-id
1577                          (nth 1 header) (wnn-const WNN_UNIQ_LEN))
1578             (comm-unpack (i) file-id)
1579             (if (>= file-id 0)
1580                 (progn
1581                   (wnnrpc-get-result)   ; ignore result code
1582                   (- (wnn-const WNN_FILE_IN_USE)))
1583               (wnnrpc-get-result
1584                 (comm-call-with-proc-1 proc ()
1585                   (comm-format (s B)
1586                                (concat wnn-system-name "!TEMPFILE")
1587                                (wnnrpc-make-dummy-dictionary header))
1588                   (wnnrpc-get-result
1589                     (let ((egg-fixed-euc (list egg-fixed-euc egg-fixed-euc)))
1590                       (wnnrpc-set-dictionary (wnnenv-create proc env-id)
1591                                              result -1 1 t t
1592                                              passwd "" nil))))))))
1593       (if (>= env-id 0)
1594           (wnnrpc-disconnect (wnnenv-create proc env-id))))))
1595
1596 (defun wnnrpc-make-dummy-dictionary (header)
1597   (wnnrpc-with-temp-buffer
1598     (comm-format (v u v v v v u v)
1599                  (wnn-const WNN_FILE_STRING) (wnn-const WNN_FILE_STRING_LEN)
1600                  (wnn-const WNN_FT_DICT_FILE)
1601                  (nth 1 header) (wnn-const WNN_UNIQ_LEN)
1602                  (nth 1 header) (wnn-const WNN_UNIQ_LEN)
1603                  (nth 3 header) (wnn-const WNN_PASSWD_LEN)
1604                  "" (wnn-const WNN_FILE_HEADER_PAD)
1605                  (wnn-const WNN_REV_DICT)
1606                  "" (wnn-const WNN_FILE_BODY_PAD))
1607     (buffer-string)))
1608
1609 (defun wnnrpc-file-loaded-local (proc path &optional preserve)
1610   ""
1611   (let ((header (wnnrpc-check-local-file path preserve)))
1612     (if (numberp header)
1613         -1
1614       (comm-call-with-proc proc (result)
1615         (comm-format (u v) (wnn-const JS_FILE_LOADED_LOCAL)
1616                      (nth 1 header) (wnn-const WNN_UNIQ_LEN))
1617         (comm-unpack (i) result)
1618         result))))
1619
1620 (defun wnnrpc-file-receive (env fid local-filename)
1621   ""
1622   (condition-case err
1623       (wnnrpc-call-with-environment env (filename)
1624         (comm-format (u u u) (wnn-const JS_FILE_RECEIVE)
1625                      env-id fid)
1626         (comm-unpack (s) filename)
1627         (if (null local-filename)
1628             (setq local-filename (wnnrpc-get-local-filename filename)))
1629         (let ((header (wnnrpc-get-file-header local-filename))
1630               contents)
1631           (if (null header)
1632               (wnnrpc-terminate-current-command WNN_NOT_A_FILE)
1633             (comm-call-with-proc-1 proc ()
1634               (comm-format (u v) (wnn-const WNN_ACK)
1635                            (nth 1 header) (wnn-const WNN_UNIQ_LEN)))
1636             (wnnrpc-get-result
1637               (cond
1638                ((= result 0) 0)
1639                ((null (file-writable-p local-filename))
1640                 (wnnrpc-terminate-current-command WNN_FILE_WRITE_ERROR))
1641                (t
1642                 (wnnrpc-with-write-file local-filename
1643                     (- (wnn-const WNN_FILE_WRITE_ERROR))            
1644                   (comm-call-with-proc proc ()
1645                     (comm-format (u) (wnn-const WNN_ACK))
1646                     (comm-unpack (B) contents))
1647                   (insert contents)
1648                   (if (= result 2)
1649                       (insert-file-contents local-filename nil (1- (point))))
1650                   (save-excursion
1651                     (set-buffer (process-buffer proc))
1652                     (wnnrpc-get-result)))))))))
1653     ((quit error)
1654      (wnnrpc-call-with-environment env ()
1655        (comm-format (i) (wnn-const WNN_NAK)))
1656      (signal (car err) (cdr err)))))
1657
1658 (defun wnnrpc-file-send (env filename)
1659   ""
1660   (let ((header (wnnrpc-check-local-file filename)))
1661     (if (numberp header)
1662         header
1663       (condition-case err
1664           (wnnrpc-call-with-environment env (file-id)
1665             (comm-format (u u v) (wnn-const JS_FILE_SEND)
1666                          env-id
1667                          (nth 1 header) (wnn-const WNN_UNIQ_LEN))
1668             (comm-unpack (i) file-id)
1669             (if (>= file-id 0)
1670                 (wnnrpc-get-result
1671                   (wnnenv-set-client-file env filename)
1672                   file-id)
1673               (wnnrpc-get-result
1674                 (comm-call-with-proc-1 proc ()
1675                   (comm-format (s B)
1676                                (concat wnn-system-name "!" filename)
1677                                (wnnrpc-with-temp-buffer
1678                                  (insert-file-contents filename)
1679                                  (buffer-string)))
1680                   (wnnrpc-get-result
1681                     (wnnenv-set-client-file env filename)
1682                     result)))))
1683         ((quit error)
1684          (wnnrpc-call-with-environment env ()
1685            (comm-format (s B B B B B B) "" "" "" "" "" "" ""))
1686          (signal (car err) (cdr err)))))))
1687
1688 (defun wnnrpc-file-remove-client (proc name passwd)
1689   (let (header)
1690     (cond
1691      ((/= (wnnrpc-file-loaded-local proc name) -1)
1692       (- (wnn-const WNN_FILE_IN_USE)))
1693      ((null (file-readable-p name))
1694       (- (wnn-const WNN_FILE_READ_ERROR)))
1695      ((null (numberp (car (setq header (wnnrpc-get-file-header name)))))
1696       (- (wnn-const WNN_NOT_A_FILE)))
1697      ((< (wnnrpc-check-passwd proc passwd header) 0)
1698       (- (wnn-const WNN_INCORRECT_PASSWD)))
1699      (t
1700       (condition-case nil
1701           (progn
1702             (delete-file name)
1703             0)
1704         (error (- (wnn-const WNN_UNLINK))))))))
1705
1706 (defun wnnrpc-dic-file-create-client (env dicname type comment passwd hpasswd)
1707   (if (and (null (file-exists-p dicname))
1708            (file-writable-p dicname)
1709            (or (eq type (wnn-const WNN_REV_DICT))
1710                (eq type (wnn-const CWNN_REV_DICT))
1711                (eq type (wnn-const BWNN_REV_DICT))
1712                (eq type (wnn-const WNN_UD_DICT))
1713                (and (wnnenv-is-wnn6 env)
1714                     (eq type (wnn-const WNN_FI_USER_DICT))))
1715            (wnnrpc-create-and-move-to-client env nil dicname type
1716                                              comment passwd hpasswd))
1717       0
1718     (- (wnn-const WNN_FILE_CREATE_ERROR))))
1719           
1720
1721 (defun wnnrpc-hindo-file-create-client (env fi dic-id freqname comment passwd)
1722   (if (and (null (file-exists-p freqname))
1723            (file-writable-p freqname)
1724            (wnnrpc-create-and-move-to-client env dic-id freqname fi
1725                                              comment passwd nil))
1726       0
1727     (- (wnn-const WNN_FILE_CREATE_ERROR))))
1728
1729 (defun wnnrpc-make-temp-name (env)
1730   (let ((n 0)
1731         (temp-form "usr/temp"))
1732     (while (= (wnnrpc-access env (concat temp-form (number-to-string n)) 0) 0)
1733       (setq n (1+ n)))
1734     (concat temp-form (number-to-string n))))
1735
1736 (defun wnnrpc-create-and-move-to-client (env dic-id filename type
1737                                              comment passwd hpasswd)
1738   (let ((tempfile (wnnrpc-make-temp-name env))
1739         (created -1)
1740         (fid -1))
1741     (unwind-protect
1742         (progn
1743           (if (numberp type)
1744               (setq created (wnnrpc-dic-file-create env tempfile type
1745                                                     comment passwd hpasswd))
1746             (setq created (wnnrpc-hindo-file-create env type dic-id tempfile
1747                                                     comment passwd)))
1748           (if (and (>= created 0)
1749                    (>= (setq fid (wnnrpc-file-read env tempfile)) 0)
1750                    (>= (wnnrpc-file-receive env fid filename) 0))
1751               (wnnrpc-change-file-uniq (wnnrpc-get-file-header filename)
1752                                        filename t)
1753             (condition-case nil (delete-file filename) (error))
1754             nil))
1755       (if (>= fid 0)
1756           (wnnrpc-file-discard env fid))
1757       (if (>= created 0)
1758           (wnnrpc-file-remove (wnnenv-get-proc env) tempfile passwd)))))
1759
1760 (defun wnnrpc-read-passwd-file (filename)
1761   (cond
1762    ((null filename) "")
1763    ((null (file-readable-p filename)) (- (wnn-const WNN_FILE_READ_ERROR)))
1764    (t 
1765     (wnnrpc-with-temp-buffer
1766       (insert-file-contents filename nil 0 (1- (wnn-const WNN_PASSWD_LEN)))
1767       (goto-char 1)
1768       (if (and (search-forward-regexp "[\0\n]" nil 0)
1769                (= (preceding-char) 0))
1770           (backward-char))
1771       (buffer-substring 1 (point))))))
1772
1773 ;;; egg/wnnrpc.el ends here.