% Copyright 1994 NEC Corporation, Tokyo, Japan.
%
% Permission to use, copy, modify, distribute and sell this software
% and its documentation for any purpose is hereby granted without
% fee, provided that the above copyright notice appear in all copies
% and that both that copyright notice and this permission notice
% appear in supporting documentation, and that the name of NEC
% Corporation not be used in advertising or publicity pertaining to
% distribution of the software without specific, written prior
% permission.  NEC Corporation makes no representations about the
% suitability of this software for any purpose.  It is provided "as
% is" without express or implied warranty.
%
% NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
% INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
% NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
% CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
% USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
% OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
% PERFORMANCE OF THIS SOFTWARE. 
%
% sccs_id[]="%Z% NEC UNIX( PC-UX/EWS-UX ) %M% %R%.%L% %E% %U%";
% rcs_id[]="$Id: protocol.tex,v 1.14 1994/04/26 09:20:57 ohmori Exp $";
%
% 改版履歴
% 92/06/23      初版
% 93/02/01	ちょっとてを入れた。
% 93/03/12	ずいぶん手を入れた．
% 93/03/17	いろいろ間違っていたので直した．
% 94/04/13	R9.1での追加プロトコルとタイプの修正を行った。
%
\documentstyle[canna]{jarticle}
\setlength{\parindent}{10pt}
\def\kake{\mbox{$\times$}}

\def\path{\sl}
\def\keyword{\em}
\def\var{\em}
\def\func{\it}
\def\farg{\it}

% プロトコルタイプの定義

\def\reqtypeini{Type 0}
\def\reqtypefin{Type 1}
\def\reqtypedupcx{Type 2}
\def\reqtypediclis{Type 3}
\def\reqtypesuby{Type 4}
\def\reqtypeauto{Type 5}
\def\reqtypecanlis{Type 6}
\def\reqtyperesiz{Type 7}
\def\reqtypeghin{Type 8}
\def\reqtypeglex{Type 9}
\def\reqtypeendc{Type 10}
\def\reqtypestoy{Type 11}
\def\reqtypedefw{Type 12}
\def\reqtypesimpl{Type 13}
\def\reqtypecnv{Type 14}
\def\reqtypemndic{Type 15}
\def\reqtyperendic{Type 16}
\def\reqtypeext{Type 17}
\def\reqtypegtxt{Type 18}
\def\reqtypecpdic{Type 21}

\def\reptypeini{Type 0}
\def\reptypesrvi{Type 1}
\def\reptypefin{Type 2}
\def\reptypeghin{Type 3}
\def\reptypegstat{Type 4}
\def\reptypecrcx{Type 5}
\def\reptypediclis{Type 6}
\def\reptypecnv{Type 7}
\def\reptypesimpl{Type 8}
\def\reptypeglex{Type 9}
\def\reptypeqdic{Type 10}

\def\reqInitialize{\reqtypeini}
\def\reqFinalize{\reqtypefin}
\def\reqCreateContext{\reqtypefin}
\def\reqDuplicateContext{\reqtypedupcx}
\def\reqCloseContext{\reqtypedupcx}
\def\reqGetDictionaryList{\reqtypediclis}
\def\reqGetDirectoryList{\reqtypediclis}
\def\reqMountDictionary{\reqtypemndic}
\def\reqUnmountDictionary{\reqtypemndic}
\def\reqRemountDictionary{\reqtypemndic}
\def\reqGetMountDictionaryList{\reqtypediclis}
\def\reqQueryDictionary{\reqtypemndic}
\def\reqDefineWord{\reqtypedefw}
\def\reqDeleteWord{\reqtypedefw}
\def\reqBeginConvert{\reqtypecnv}
\def\reqEndConvert{\reqtypeendc}
\def\reqGetCandidacyList{\reqtypecanlis}
\def\reqGetYomi{\reqtypecanlis}
\def\reqSubstYomi{\reqtypesuby}
\def\reqStoreYomi{\reqtypestoy}
\def\reqStoreRange{\reqtypestoy}
\def\reqGetLastYomi{\reqtypediclis}
\def\reqFlushYomi{\reqtypeendc}
\def\reqRemoveYomi{\reqtypeendc}
\def\reqGetSimpleKanji{\reqtypesimpl}
\def\reqResizePause{\reqtyperesiz}
\def\reqGetHinsi{\reqtypeghin}
\def\reqGetLex{\reqtypeglex}
\def\reqGetStatus{\reqtyperesiz}
\def\reqSetLocale{\reqtypemndic}
\def\reqAutoConvert{\reqtypeauto}
\def\reqQueryExtensions{\reqtypeext}
\def\reqSetApplicationName{\reqtypemndic}
\def\reqNoticeGroupName{\reqtypemndic}
\def\reqGetServerInfo{\reqtypefin}
\def\reqGetAccessControlList{\reqtypefin}
\def\reqCreateDictionary{\reqtypemndic}
\def\reqDeleteDictionary{\reqtypemndic}
\def\reqRenameDictionary{\reqtyperendic}
\def\reqGetWordTextDictionary{\reqtypegtxt}
\def\reqListDictionary{\reqtypegtxt}
\def\reqSync{\reqtypemndic}
\def\reqChmodDictionary{\reqtypemndic}
\def\reqCopyDictionary{\reqtypecpdic}


\def\repInitialize{\reptypeini}
\def\repFinalize{\reptypefin}
\def\repCreateContext{\reptypecrcx}
\def\repDuplicateContext{\reptypecrcx}
\def\repCloseContext{\reptypefin}
\def\repGetDictionaryList{\reptypediclis}
\def\repGetDirectoryList{\reptypediclis}
\def\repMountDictionary{\reptypefin}
\def\repUnmountDictionary{\reptypefin}
\def\repRemountDictionary{\reptypefin}
\def\repGetMountDictionaryList{\reptypediclis}
\def\repQueryDictionary{\reptypeqdic}
\def\repDefineWord{\reptypefin}
\def\repDeleteWord{\reptypefin}
\def\repBeginConvert{\reptypecnv}
\def\repEndConvert{\reptypefin}
\def\repGetCandidacyList{\reptypecnv}
\def\repGetYomi{\reptypecnv}
\def\repSubstYomi{\reptypecnv}
\def\repStoreYomi{\reptypecnv}
\def\repStoreRange{\reptypeghin}
\def\repGetLastYomi{\reptypecnv}
\def\repFlushYomi{\reptypecnv}
\def\repRemoveYomi{\reptypefin}
\def\repGetSimpleKanji{\reptypesimpl}
\def\repResizePause{\reptypecnv}
\def\repGetHinsi{\reptypeghin}
\def\repGetLex{\reptypeglex}
\def\repGetStatus{\reptypegstat}
\def\repSetLocale{\reptypefin}
\def\repAutoConvert{\reptypefin}
\def\repQueryExtensions{\reptypefin}
\def\repSetApplicationName{\reptypefin}
\def\repNoticeGroupName{\reptypefin}
\def\repGetServerInfo{\reptypesrvi}
\def\repGetAccessControlList{\reptypediclis}
\def\repCreateDictionary{\reptypefin}
\def\repDeleteDictionary{\reptypefin}
\def\repRenameDictionary{\reptypefin}
\def\repGetWordTextDictionary{\reptypecnv}
\def\repListDictionary{\reptypediclis}
\def\repSync{\reptypefin}
\def\repChmodDictionary{\reptypecrcx}
\def\repCopyDictionary{\reptypefin}


\begin{document}

\thispagestyle{empty}

\renewcommand{\thepage}{\roman{page}}
\vspace*{\fill}
\begin{center}
\LARGE\dg\bf
日本語入力システム

『かんな』

\vspace{1cm}

かな漢字変換プロトコル仕様書

プロトコルバージョン3.2

--- 第七版 ---
\end{center}
\vfill
\begin{center}

1994年4月13日

大森~~~~~浩充

ohmori@d1.bs2.mt.nec.co.jp

NEC

舩橋~~~~~一司

funahasi@oa2.kb.nec.co.jp

NECソフトウェア神戸

\end{center}
\vfill
\newpage

\tableofcontents

\newpage
\setcounter{page}{1}
\renewcommand{\thepage}{\arabic{page}}
\setcounter{section}{0}
%
%
\section*{はじめに}
\addcontentsline{toc}{section}{はじめに}
 本仕様書は、日本語入力システム『かんな』における
サーバプロセス(cannaserver)とク
ライアントプロセスとのインタフェースとなるかな漢字変換プロトコルの仕様
を定義するものである。

本仕様書では、新規に追加するワイドキャラプロトコルについてのみ記述する。
既存のEUCプロトコルについては他の文書
\footnote{日本語入力システム『かんな』 かな漢字変換プロトコル仕様書 
プロトコルバージョン~1.2}
を参照の事。
また、本仕様書に基づいて作成されるサーバプロセス(cannaserver)とクライア
ントは既存のEUCプロトコル
\footnote{プロトコルバージョン1.0,1.1,1.2が存在する}
を同時にサポートするものとする。

%
\section{プロトコルバージョン履歴}

かんなバージョンとプロトコルバージョンの対応表を以下に示す。

\begin{tabular}{|c|c|c|} \hline
かんなバージョン & プロトコルバージョン & 備考 \\ \hline
2.1 & 2.0 & \\  \hline
2.2 & 2.1 & \\  \hline
3.1 & 3.0 & SetApplicationNameの追加 \\  \hline
3.2 & 3.2 & NoticeGroupName他追加 \\  \hline
\end{tabular}

※プロトコルバージョン3.1は欠番

%
%
\section{プロトコルフォーマット}
%
\subsection{リクエストフォーマット}
各リクエストは、以下のような4オクテットのヘッダ部を持つ。

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    リクエスト名 & 1 & CARD8 & メジャーコード \\
    NONE         & 1 & CARD8 & マイナーコード \\
    データ長     & 2 & CARD16 & ヘッダ部を除いたデータ部の長さ \\
\hline
\end{tabular}

指定した長さが必要な長さよりも長いか短い場合にはエラーを発生する。

リクエスト中の未使用オクテットは0でなければならない。

メジャーコードには、コアプロトコルとして主にかな漢字変換処理に関連した
リクエストが定義されており、マイナーコードには\underline{直接には}かな
漢字変換に関係の無いリクエストが定義されている。

メジャー・マイナーリクエストには1〜255までのシーケンシャルな番号を定
義する。\footnote{例外的なリクエストもある．}
  
応答は、リクエストと同じ型のヘッダを持っている。

(ただし、初期化処理だけは従来互換の立場から特別なプロトコルで行う。)

%
\newpage
%
\subsection{共通タイプ}

プロトコルのフィールドの記述のために以下の記述子を用いる。

\begin{tabular}{|l|p{24em}|} \hline
\multicolumn{1}{|c|}{記述子} & 
\multicolumn{1}{c|}{意味} \\ \hline
OCTET       & 8ビット(1オクテット)の値 \\
INT8        & 8ビットの符号付き整数 \\
INT16       & 16ビットの符号付き整数 \\
INT32       & 32ビットの符号付き整数 \\
CARD8       & 8ビットの符号無し整数 \\
CARD16      & 16ビットの符号無し整数 \\
CARD32      & 32ビットの符号無し整数 \\
STRING8     & LIST of OCTET\footnotemark \\
STRING16    & LIST of CARD16\footnotemark \\ 
LIST of FOO & LIST of FOOは，FOOタイプの要素のリスト意味する．
長さフィールドのサイズは一定ではない． \\ 
\hline
\end{tabular}

\addtocounter{footnote}{-1}
\footnotetext{いわゆるEUC文字列．}
\addtocounter{footnote}{1}
\footnotetext{いわゆるワイドキャラクタ文字列．SVR3.2 の
 JAE においてプロセスコードとして定義されているエンコーディングを用いる．}
%
\newpage
%
\subsection{プロトコルのタイプ分け}

全部で40のプロトコルに関して、リクエストとリプライそれぞれ、20、11 の
タイプに分けることができる。リクエストの20のタイプおよびリプライの 11 
のタイプを以下に示す。

\begin{tabular}{|l|l|l l l l l l l l l|} \hline
\multicolumn{11}{|c|}{リクエスト} \\ \hline
\multicolumn{1}{|c|}{要求型} &
\multicolumn{1}{c|}{例} &
\multicolumn{9}{c|}{リクエストフィールド} \\ \hline
\reqtypeini    & Initialize        & I32& I32& S8 & S8 &&&&& \\
\reqtypefin    & Finalize          & C8 & C8 & C16&&&&&& \\
\reqtypedupcx  & DuplicateContext  & C8 & C8 & C16& I16&&&&& \\
\reqtypediclis & GetDictionaryList & C8 & C8 & C16& I16& C16&&&& \\
\reqtypesuby   & SubstYomi         & C8 & C8 & C16& I16& C16& C16& C16 & S16& \\
\reqtypeauto   & AutoConvert       & C8 & C8 & C16& I16& C16& I32&&& \\
\reqtypecanlis & GetCandidateList  & C8 & C8 & C16& I16& I16& C16&&& \\
\reqtyperesiz  & ResizePause       & C8 & C8 & C16& I16& I16& I16&&& \\
\reqtypeghin   & GetHinshi         & C8 & C8 & C16& I16& I16& I16& C16&& \\
\reqtypeglex   & GetLex            & C8 & C8 & C16& I16& I16& I16& I16&& \\
\reqtypeendc   & EndConvert        & C8 & C8 & C16& I16& I16& I32& 
\multicolumn{3}{l|}{LIST of I16} \\
\reqtypestoy   & StoreYomi         & C8 & C8 & C16& I16& I16& S16&&& \\
\reqtypedefw   & DefineWord        & C8 & C8 & C16& I16& S16& S8&&& \\
\reqtypesimpl  & GetSimpleKanji    & C8 & C8 & C16& I16& S8 & S16& C16& C16& C16 \\
\reqtypecnv    & BeginConvert      & C8 & C8 & C16& I32& I16& S16&&& \\
\reqtypemndic  & MountDictionary   & C8 & C8 & C16& I32& I16& S8 &&& \\
\reqtyperendic & RenameDictionary  & C8 & C8 & C16& I32& I16& S8 & S8 && \\
\reqtypeext    & QueryExtensions   & C8 & C8 & C16& S8 &&&&& \\
\reqtypegtxt   & GetWordTextDictionary  & C8 & C8 & C16& I16& S8 &C16&&& \\
\reqtypecpdic  & CopyDictionary    & C8 & C8 & C16& I16& I32& S8 & S8 & S8 & \\
\hline\hline
\multicolumn{11}{|c|}{リプライ} \\ \hline
\multicolumn{1}{|c|}{返答型} &
\multicolumn{1}{c|}{例} &
\multicolumn{9}{c|}{リプライフィールド} \\ \hline
\reptypeini  & Initialize    & I32 & or & C16 & I16 &&&&& \\
\reptypesrvi & GetServerInfo & C8 & C8 & C16 & C8 & C8 & C8 & C32 & \ldots &\\
\reptypefin  & Finalize      & C8 & C8 & C16 & I8 &&&&& \\
\reptypeghin & GetHinshi     & C8 & C8 & C16 & I16 & S16 &&&& \\
\reptypegstat & GetStatus & C8 & C8 & C16 & I8 &
\multicolumn{5}{l|}{LIST of I32} \\
\reptypecrcx & CreateContext & C8 & C8 & C16 & I16 &&&&& \\
\reptypediclis & GetDictionaryList & C8 & C8 & C16 & I16 & S8 &&&& \\
\reptypecnv  & BeginConvert  & C8 & C8 & C16 & I16 & S16&&&& \\
\reptypesimpl & GetSimpleKanji & C8 & C8 & C16 & I16 & S16 & S16 &&& \\
\reptypeglex & GetLex        & C8 & C8 & C16 & I16 &
\multicolumn{5}{l|}{LIST of I32} \\
\reptypeqdic & QueryDictionary & C8 & C8 & C16 & I8 & S8 & S8 &
\multicolumn{3}{l|}{LIST of I32} \\
\hline
\end{tabular}

※リプライType3とType7は同じような気がしますが.....

\newpage
%
%
\section{かな漢字変換サーバプロトコル仕様}

クライアントでサーバが発行するリクエストは以下の通りである。
以下の表で、
プロトコルバージョン 2.0 で新規に追加したものは先頭に「*」を付けて、プロ
トコルバージョン 2.1 で新規に追加したものは先頭に「**」を付けて、プロ
トコルバージョン 3.0 で新規に追加したものは先頭に「+」を付けて、プロトコ
ルバージョン 3.2 で新規に追加したものは先頭に「++」を付けて示してある。

\begin{tabular}{|c@{}l|l|c|l|l|}\hline
\multicolumn{6}{|c|}{コアプロトコル(minor op code 0x00)} \\\hline
\multicolumn{2}{|c}{要求名} & \multicolumn{1}{|c}{機能}
        & \multicolumn{1}{|c|}{要求番号}
        & \multicolumn{1}{|c|}{要求型}
        & \multicolumn{1}{|c|}{返答型}
 \\\hline
        & Initialize	     	& 初期化処理		   & 0x01 &
\reqInitialize & \repInitialize \\

        & Finalize 	     	& 終了処理		   & 0x02 &
\reqFinalize & \repFinalize \\

        & CreateContext		& コンテクスト作成	   & 0x03 &
\reqCreateContext & \repCreateContext \\

	& DuplicateContext	& コンテクスト複写	   & 0x04 &
\reqDuplicateContext & \repDuplicateContext \\

	& CloseContext		& コンテクスト削除	   & 0x05 &
\reqCloseContext & \repCloseContext \\

	& GetDictionaryList	& 辞書テーブル一覧	   & 0x06 &
\reqGetDictionaryList & \repGetDictionaryList \\

    {*} & GetDirectoryList	& 辞書ディレクトリ一覧	   & 0x07 &
\reqGetDirectoryList & \repGetDirectoryList \\

	& MountDictionary	& 辞書リスト追加	   & 0x08 &
\reqMountDictionary & \repMountDictionary \\

	& UnmountDictionary	& 辞書リスト削除	   & 0x09 &
\reqUnmountDictionary & \repUnmountDictionary \\

	& RemountDictionary	& 辞書リスト変更	   & 0x0a &
\reqRemountDictionary & \repRemountDictionary \\

	& GetMountDictionaryList & 辞書リスト一覧	   & 0x0b &
\reqGetMountDictionaryList & \repGetMountDictionaryList \\

    {*} & QueryDictionary	& 登録可能辞書の問い合わせ & 0x0c &
\reqQueryDictionary & \repQueryDictionary \\

	& DefineWord		& 単語登録		   & 0x0d &
\reqDefineWord & \repDefineWord \\

	& DeleteWord		& 単語削除		   & 0x0e &
\reqDeleteWord & \repDeleteWord \\

	& BeginConvert		& 変換開始		   & 0x0f &
\reqBeginConvert & \repBeginConvert \\

	& EndConvert		& 変換終了		   & 0x10 &
\reqEndConvert & \repEndConvert \\

	& GetCandidacyList	& 候補一覧		   & 0x11 &
\reqGetCandidacyList & \repGetCandidacyList \\

	& GetYomi		& 読みがな取得		   & 0x12 &
\reqGetYomi & \repGetYomi \\

    {*} & SubstYomi		& 自動変換		   & 0x13 &
\reqSubstYomi & \repSubstYomi \\

	& StoreYomi		& 読みがな変更		   & 0x14 &
\reqStoreYomi & \repStoreYomi \\

    {*} & StoreRange		& カレント文節のみの再変換 & 0x15 &
\reqStoreRange & \repStoreRange \\

    {*} & GetLastYomi		& 未決文節の読み取得	   & 0x16 &
\reqGetLastYomi & \repGetLastYomi \\

    {*} & FlushYomi		& 強制変換		   & 0x17 &
\reqFlushYomi & \repFlushYomi \\

    {*} & RemoveYomi		& 読みバッファ削除	   & 0x18 &
\reqRemoveYomi & \repRemoveYomi \\

    {*} & GetSimpleKanji	& 限定候補の取り出し	   & 0x19 &
\reqGetSimpleKanji & \repGetSimpleKanji \\

	& ResizePause		& 区切り変更		   & 0x1a &
\reqResizePause & \repResizePause \\

    {*} & GetHinshi		& 品詞情報		   & 0x1b &
\reqGetHinsi & \repGetHinsi \\

	& GetLex		& 形態素情報		   & 0x1c  &
\reqGetLex & \repGetLex \\

	& GetStatus		& 解析情報		   & 0x1d &
\reqGetStatus & \repGetStatus \\

    {*} & SetLocale		& locale情報セット	   & 0x1e &
\reqSetLocale & \repSetLocale \\

    {*} & AutoConvert		& 自動変換開始		   & 0x1f &
\reqAutoConvert & \repAutoConvert \\

    {*} & QueryExtensions	& 拡張プロトコルの問い合わせ & 0x20 &
\reqQueryExtensions & \repQueryExtensions \\

    {+} & SetApplicationName	& アプリケーション名登録 & 0x21 &
\reqSetApplicationName & \repSetApplicationName \\

    {++} & NoticeGroupName	& グループ名の通知  & 0x22 &
\reqNoticeGroupName & \repNoticeGroupName \\
\hline
\end{tabular}
\newpage

\begin{tabular}{|c@{}l|l|c|l|l|}\hline
\multicolumn{6}{|c|}{拡張プロトコル(minor op code 0x01)}\\\hline
\multicolumn{2}{|c}{要求名} & \multicolumn{1}{|c}{機能}
 & \multicolumn{1}{|c|}{要求番号}
 & \multicolumn{1}{|c|}{要求型}
 & \multicolumn{1}{|c|}{返答型}
 \\\hline
	& GetServerInfo		& サーバ情報取得	& 0x01 &
\reqGetServerInfo & \repGetServerInfo \\

	& GetAccessControlList  & サーバ使用許可	& 0x02 &
\reqGetAccessControlList & \repGetAccessControlList \\

	& CreateDictionary	& 辞書作成		& 0x03 &
\reqCreateDictionary & \repCreateDictionary \\

	& DeleteDictionary	& 辞書削除		& 0x04 &
\reqDeleteDictionary & \repDeleteDictionary \\

	& RenameDictionary	& 辞書名変更		& 0x05 &
\reqRenameDictionary & \repRenameDictionary \\

	& GetWordTextDictionary & 単語情報取得		& 0x06 &
\reqGetWordTextDictionary & \repGetWordTextDictionary \\

	& ListDictionary	& 辞書テーブル一覧	& 0x07 &
\reqListDictionary & \repListDictionary \\

    {++} & Sync			& 辞書情報の更新	& 0x08 &
\reqSync & \repSync \\

    {++} & ChmodDictionary	& 辞書のREAD$/$WRITE権の通知 & 0x09 &
\reqChmodDictionary & \repChmodDictionary \\

    {++} & CopyDictionary	& 辞書の複写	& 0x0a &
\reqCopyDictionary & \repCopyDictionary \\
\hline	
\end{tabular}
\newpage

%
\subsection{初期化処理: Initialize}
かな漢字変換サーバとクライアントとの接続を確立し，かな漢字変換環境を構築する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqInitialize)

クライアントは，接続のセットアップ時に以下の要求パケットを発行する．

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    Initialize	& 4 	& INT32 & MSBfirst固定 \\
    データ長	& 4 	& INT32 & MSBfirst固定 \\
    バージョン番号	& 可変長 & STRING8 & ''メジャー番号．マイナー番号:'' \\
    ユーザ名	& 可変長 & STRING8 & \\
\hline
\end{tabular}

バージョン番号は，クライアントのプロトコルバージョンを示す．プロトコル
バージョンには，メジャー番号とマイナー番号とがある．将来プロトコルの修
正が必要になった時に用いられ，一般に互換性の無い変更が行われるとメジャ
ー番号が増やされ，小さな上位互換の変更が行われた場合はマイナー番号が増
やされる．本仕様書で定義するのはメジャー番号が2,マイナー番号が0である．
\footnote{本来は，メジャー・マイナー番号を文字列にする必要はないのだが，
従来互換を考慮した場合可変長(文字列)にせざるをえない．} 
\item 応答パケット(\repInitialize)

サーバからは，4オクテットの応答パケットが返される．

正常終了すると以下のパケットが返される．

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    サーバマイナーバージョン & 2 & CARD16 & MSBfirst \\
    コンテクスト番号 & 2 & INT16 & MSBfirst\\
\hline
\end{tabular}

また，クライアントのプロトコルメジャー番号がサーバのそれより大きい
場合などのエラー時には，

エラー時:

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    エラー状態 & 4 & INT32 & \begin{tabular}{@{}l}
    MSBfirst \\
    エラー時: $-$1/\\
    バージョンミスマッチ時:\\
    RETURN\_VERSION\_ERROR\_STAT\\
    \end{tabular}\\
\hline
\end{tabular}

以後，整数型のデータを送受信する場合のバイトオーダはMSBfirstで行わな
ければならない．
\end{itemize}
\item 説明

本仕様書で規定されたプロトコルを用いて通信を行うサーバあるいはライブ
ラリの場合，古いプロトコルとの接続性を確保するために，古いプロトコル
バージョンを持つサーバあるいはライブラリと通信する場合には，自動的に
EUCプロトコルを使用する機能を持つ．
\end{enumerate}
\newpage
%
\subsection{終了処理: Finalize}
かな漢字変換処理を終了する．サーバ及びクライアントに確保されて
いたすべての資源を解放する．
また、学習内容で辞書に反映されていないものがあれば辞書に反映する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqFinalize)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    Finalize & 1 & CARD8 &  0x02 \\
    NONE     & 1 & CARD8 &  0x00 \\
    データ長 & 2 & CARD16 & 0 \\
\hline
\end{tabular}

\item 応答パケット(\repFinalize)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    Finalize & 1 & CARD8 & 0x02 \\
    NONE     & 1 & CARD8 & 0x00 \\
    データ長 & 2 & CARD16 & 1 \\
    終了状態 & 1 & INT8 & 正常時: 0$/$エラー時: $-1$ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{コンテクスト作成: CreateContext}
変換コンテクストを作成し，その変換コンテクストを表すコンテクスト番号を返す．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqCreateContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CreateContext & 1 & CARD8 & 0x03 \\
    NONE          & 1 & CARD8 & 0x00 \\
    データ長      & 2 & CARD16 & 0 \\
\hline
\end{tabular}

\item 応答パケット(\repCreateContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CreateContext 	 & 1 & CARD8 & 0x03 \\
    NONE          	 & 1 & CARD8 & 0x00 \\
    データ長      	 & 2 & CARD16 & 2 \\
    コンテクスト番号 & 2 & INT16 & 	エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{コンテクスト複写: DuplicateContext}
指定された変換コンテクストを複製し，新しい変換コンテクストを生成しそれ
を表すコンテクスト番号を返す．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqDuplicateContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DuplicateContext & 1 & CARD8 & 0x04 \\
    NONE             & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 2 \\
    コンテクスト番号 & 2 & INT16 & \\
\hline
\end{tabular}

\item 応答パケット(\repDuplicateContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DuplicateContext & 1 & CARD8 & 0x04 \\
    NONE             & 1 & CARD8 & 0x00 \\
    データ長 & 2 & CARD16 & 2 \\
    コンテクスト番号 & 2 & INT16 & エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{コンテクスト削除: CloseContext}
コンテクストが使用している資源を解放する．
その後コンテクストは未定義となる．

\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqCloseContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CloseContext & 1 & CARD8 & 0x05 \\
    NONE	     & 1 & CARD8 & 0x00 \\
    データ長     & 2 & CARD16 & 2 \\
    コンテクスト番号 & 2 & INT16 & \\
\hline
\end{tabular}

\item 応答パケット(\repCloseContext)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CloseContext & 1 & CARD8 & 0x05 \\
    NONE	     & 1 & CARD8 & 0x00 \\
    データ長     & 2 & CARD16 & 1 \\
    終了状態   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書テーブル一覧: GetDictionaryList}
辞書テーブル
\footnote{辞書リスト（マウントリスト）に登録可能な辞書群．}
に登録されている辞書一覧を取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetDictionaryList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetDictionaryList & 1 & CARD8 & 0x06 \\
    NONE     	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & 4 \\
    コンテクスト番号  & 2 & INT16 & \\
    辞書名リストのバッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetDictionaryList)

\begin{minipage}{\linewidth}
\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetDictionaryList & 1 & CARD8 & 0x06 \\
    NONE     	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & \\
    辞書数 		  & 2 & INT16 & エラー時: $-$1 \\
    辞書名リスト 	  & 可変長 & STRING8 & 辞書名@
\footnote{@は文字列の区切りを表す．以後，全ての@は文字列の区切り
を表し，そのデータは0x00の意味で使用する．} ...@辞書名@@ \\
\hline
\end{tabular}
\end{minipage}
\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書ディレクトリ一覧: GetDirectoryList}
辞書ディレクトリ
\footnote{辞書テーブル(dics.dir)を持った，ディレクトリ．}
にある辞書の一覧を取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetDirectoryList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetDirectoryList & 1 & CARD8 & 0x07 \\
    NONE             & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 4 \\
    コンテクスト番号 & 2 & INT16 & \\
    バッファサイズ   & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetDirectoryList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetDirectoryList & 1 & CARD8 & 0x07 \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    辞書数		 & 2 & INT16 & エラー時: $-$1 \\
    辞書ディレクトリ名リスト & 可変長 & STRING8 & 辞書名@...@辞書名@@\\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書リスト追加: MountDictionary}
指定された辞書をかな漢字変換で利用されるようにする。
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqMountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    MountDictionary  & 1 & CARD8 & 0x08 \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repMountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    MountDictionary & 1 & CARD8 & 0x08 \\
    NONE     	& 1 & CARD8 & 0x00 \\
    データ長 	& 2 & CARD16 & 1 \\
    終了状態 	& 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwMountDicの modeは 32bit必要である．

\end{enumerate}
\newpage
%
\subsection{辞書リスト削除: UnmountDictionary}
指定された辞書がかな漢字変換で利用されないようにする。
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqUnmountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    UnmountDictionary & 1 & CARD8 & 0x09 \\
    NONE    	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & \\
    モード 		  & 4 & INT32 & \\
    コンテクスト番号  & 2 & INT16 & \\
    辞書名 		  & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repUnmountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    UnmountDictionary & 1 & CARD8 & 0x09 \\
    NONE    	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & \\
    終了状態 	  & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書リスト変更: RemountDictionary}
使用辞書の辞書リストの順番を変更する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqRemountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RemountDictionary & 1 	   & CARD8   & 0x0a\\
    NONE     	  & 1 	   & CARD8   & 0x00 \\
    データ長 	  & 2 	   & CARD16  & \\
    優先度 		  & 4 	   & INT32   & \\
    コンテクスト番号  & 2 	   & INT16   & \\
    辞書名 		  & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repRemountDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RemountDictionary & 1 & CARD8   & 0x0a \\
    NONE     	  & 1 & CARD8   & 0x00 \\
    データ長 	  & 2 & CARD16  & 1 \\
    終了状態 	  & 1 & INT8    & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書リスト一覧: GetMountDictionaryList}
辞書テーブルに登録されている辞書リスト
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetMountDictionaryList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetMountDictionaryList & 1 & CARD8 & 0x0b \\
    NONE     	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & 4 \\
    コンテクスト番号  & 2 & INT16 & \\
    辞書名リストのバッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetMountDictionaryList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetMountDictionaryList & 1 & CARD8 & 0x0b \\
    NONE     	  & 1 & CARD8 & 0x00 \\
    データ長 	  & 2 & CARD16 & \\
    辞書数 		  & 2 & INT16 & エラー時: $-$1 \\
    辞書名リスト 	  & 可変長 & STRING8 & 辞書名@...@辞書名@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{登録可能辞書の問い合わせ: QueryDictionary}
指定した辞書の情報を得る
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqQueryDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    QueryDictionary  & 1 & CARD8 & 0x0c \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    モード 		 & 4 & INT32  & 0 \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repQueryDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    MountDictionary & 1 & CARD8 & 0x0c \\
    NONE     	& 1 & CARD8 & 0x00 \\
    データ長 	& 2 & CARD16 & 1 \\
    終了状態 	& 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
    辞書名 	& 可変長 & STRING8 & 辞書名@ \\
    辞書ファイル名 & 可変長 & STRING8 & 辞書ファイル名@ \\
    辞書情報\footnotemark & 可変長 & LIST of INT32 & \\
\hline
\end{tabular}

\footnotetext{struct DicInfoの大きさが28バイトである．}
\end{itemize}
\item{説明}

サーバは，辞書情報として RkwQueryDicが返す struct DicInfoを展開した形で，
応答パケットに乗せる．RKCは受け取ったデータを新たに確保した struct DicInfo
に再設定しなければならない．
\end{enumerate}
\newpage
%
\subsection{単語登録: DefineWord}
辞書に新しい単語を登録する
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqDefineWord)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DefineWord 	 & 1 & CARD8 & 0x0d \\
    NONE   	   	 & 1 & CARD8 & 0x00 \\
    データ長   	 & 2 &  CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    単語情報 	 & 可変長 & STRING16 & 文字列@@ \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repDefineWord)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DefineWord & 1 & CARD8 & 0x0d \\
    NONE   	   & 1 & CARD8 & 0x00 \\
    データ長   & 2 & CARD16 & 1  \\
    終了状態   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{単語削除: DeleteWord}
辞書から単語を削除する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqDeleteWord)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DeleteWord 	 & 1 & CARD8 & 0x0e \\
    NONE         	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    単語情報 	 & 可変長 & STRING16 & 文字列@@ \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repDeleteWord)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DeleteWord & 1 & CARD8 & 0x0e \\
    NONE       & 1 & CARD8 & 0x00 \\
    データ長   & 2 & CARD16 & 1 \\
    終了状態   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{変換開始: BeginConvert}
読みのかな文字列に対し，連文節変換モードでかな漢字変換を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqBeginConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    BeginConvert 	 & 1 & CARD8  & 0x0f \\
    NONE         	 & 1 & CARD8  & 0x00 \\
    データ長     	 & 2 & CARD16 &  \\
    モード		 & 4 & INT32  & \\
    コンテクスト番号 & 2 & INT16  & \\
    読み 		 & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\item 応答パケット(\repBeginConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    BeginConvert & 1 & CARD8 & 0x0f \\
    NONE         & 1 & CARD8 & 0x00 \\
    データ長     & 2 & CARD16 &  \\
    文節数       & 2 & INT16 & エラー時: $-$1 \\
    各文節の最優先候補のリスト & 可変長 & STRING16 & \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwBgnBunの modeは 32bit必要である．

自動変換を行うためには，AutoConvertを使用する．
\end{enumerate}
\newpage
%
\subsection{変換終了: EndConvert}
現在のかな漢字変換作業を終了し，必要に応じて学習を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqEndConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    EndConvert 	 & 1 & CARD8 & 0x10 \\
    NONE   	   	 & 1 & CARD8 & 0x00 \\
    データ長   	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    文節数 		 & 2 & INT16 & \\
    モード 		 & 4 & INT32 & 0なら学習しない \\
    各文節のカレント候補番号リスト & 可変長 & LIST of INT16 & \\
\hline
\end{tabular}

\item 応答パケット(\repEndConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    EndConvert  & 1 & CARD8 & 0x10 \\
    NONE   	    & 1 & CARD8 & 0x00 \\
    データ長    & 2 & CARD16 & 1 \\
    終了状態    & 1 & INT8 & 正常時: 0/エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwEndBunの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{候補要求: GetCandidacyList}
指定された文節のすべての候補文字列と読みを取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetCandidacyList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetCandidacyList & 1 & CARD8 & 0x11 \\
    NONE    	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 6 \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    バッファサイズ 	 & 2 & CARD16 &\\
\hline
\end{tabular}

\item 応答パケット(\repGetCandidacyList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetCandidacyList & 1 & CARD8 & 0x11 \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    候補数	 	 & 2 & INT16 & エラー時: $-$1 \\
    候補文字列のリスト$+$読み & 可変長 & STRING16 & 候補@@...@@候補@@読み@@@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{読みがな取得: GetYomi}
カレント文節の読みがなを取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetYomi  & 1 & CARD8 & 0x12 \\
    NONE     & 1 & CARD8 & 0x00 \\
    データ長 & 2 & CARD16 & 6 \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    読みのバッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetYomi    & 1 & CARD8 & 0x12 \\
    NONE       & 1 & CARD8 & 0x00 \\
    データ長   & 2 & CARD16 & \\
    読みの長さ & 2 & INT16 & エラー時: $-$1 \\
    読み       & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{自動変換: SubsutYomi}
自動変換モード時に読みバッファ
\footnote{自動変換変換で用いられる読みがなを保存する領域．}
の内容を変更し，再度変換を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqSubstYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    SubsutYomi 	 & 1 & CARD8 & 0x13 \\
    NONE         	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 &  \\
    コンテクスト番号 & 2 & INT16 & \\
    開始オフセット	 & 2 & CARD16 & \\
    終了オフセット	 & 2 & CARD16 & \\
    読みの長さ	 & 2 & CARD16 & \\
    読み         	 & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\item 応答パケット(\repSubstYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    SubsutYomi 	   & 1 & CARD8 & 0x13 \\
    NONE       	   & 1 & CARD8 & 0x00 \\
    データ長   	   & 2 & CARD16 & \\
    文節数     	   & 2 & INT16 & エラー時: $-$1 \\
    各文節の最優先候補 & 可変長 & STRING16 & 候補@@...@@候補@@@@\\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{読みがな変更: StoreYomi}
カレント文節の読みがなを変更し，それ以降の文節を再変換する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqStoreYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    StoreYomi 	 & 1 & CARD8 & 0x14 \\
    NONE      	 & 1 & CARD8 & 0x00 \\
    データ長  	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    読み 		 & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\item 応答パケット(\repStoreYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    StoreYomi  & 1 & CARD8 & 0x14 \\
    NONE       & 1 & CARD8 & 0x00 \\
    データ長   & 2 & CARD16 & \\
    文節数 	   & 2 & INT16 & エラー時: $-$1 \\
    各文節の最優先候補リスト & 可変長 & STRING16 & 候補@@...@@候補@@@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{カレント文節のみの単文節変換: StoreRange}
カレント文節の読みがなを変更し，カレント文節のみを単文節変換する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqStoreRange)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    StoreRange 	 & 1 & CARD8 & 0x15 \\
    NONE      	 & 1 & CARD8 & 0x00 \\
    データ長  	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    読み 		 & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\item 応答パケット(\repStoreRange)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    StoreRange  		   & 1 & CARD8 & 0x15 \\
    NONE       		   & 1 & CARD8 & 0x00 \\
    データ長   	           & 2 & CARD16 & \\
    終了状態	 	   & 1 & INT8 &	正常時: 0$/$エラー時: $-$1 \\
    単文節変換した最優先候補   & 可変長 & STRING16 & 候補@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{未決文節取得: GetLastYomi}
未決文節の読みを取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetLastYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetLastYomi	 & 1 & CARD8 & 0x16 \\
    NONE       	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 4 \\
    コンテクスト番号 & 2 & INT16 & \\
    読みのバッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetLastYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetLastYomi & 1 & CARD8 & 0x16 \\
    NONE        & 1 & CARD8 & 0x00 \\
    データ長    & 2 & CARD16 &  \\
    読みの長さ  & 2 & INT16 & エラー時: $-$1 \\
    未決文節の読み & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{強制変換: FlushYomi}
未決定文節を強制的に変換する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqFlushYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    FlushYomi	 & 1 & CARD8 & 0x17 \\
    NONE		 & 1 & CARD8 & 0x00 \\
    データ長	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    モード		 & 4 & INT32 & 0 \\
    各文節のカレント候補番号 & 可変長 & LIST of INT16 & (カレント文節番号＋1) \\
\hline
\end{tabular}

\item 応答パケット(\repFlushYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    FlushYomi & 1 & CARD8 & 0x17 \\
    NONE      & 1 & CARD8 & 0x00 \\
    データ長  & 2 & CARD16 &  \\
    文節数    & 2 & INT16 & エラー時: $-$1 \\
    最優先候補リスト & 可変長 & STRING16 & 候補@@...@@候補@@@@ \\
\hline
\end{tabular}

\end{itemize}
\item 説明

未決定文節を強制的に変換する．その際，サーバ側ではカレント文節及び，
各文節のカレント候補を知らないので，RKCは，サーバに対して通知しなけれ
ばならない．
\end{enumerate}
\newpage
%
\subsection{読みバッファ削除: RemoveYomi}
先頭文節からカレント文節まで読みを読みバッファから取り除く．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqRemoveYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RemoveYomi   	 & 1 & CARD8 & 0x18 \\
    NONE         	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    モード		 & 4 & INT32 & 0なら学習しない \\
    各文節のカレント候補番号 & 可変長 & LIST of INT16 & (カレント文節番号＋1) \\
\hline
\end{tabular}

\item 応答パケット(\repRemoveYomi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RemoveYomi & 1 & CARD8 & 0x18 \\
    NONE       & 1 & CARD8 & 0x00 \\
    データ長 & 2 & CARD16 & 1 \\
    終了状態 & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwRemoveBunの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{限定候補取得: GetSimpleKanji}
指定された辞書からその辞書に含まれている候補のみを取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetSimpleKanji)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetSimpleKanji 	   & 1 & CARD8 & 0x19 \\
    NONE        	   & 1 & CARD8 & 0x00 \\
    データ長    	   & 2 & CARD16 & \\
    コンテクスト番号   & 2 & INT16 & \\
    辞書名 		   & 可変長 & STRING8 & 辞書名@ \\
    読み		   & 可変長 & STRING16 & 読み@@ \\
    読みの長さ	   & 2 & CARD16 & \\
    候補バッファサイズ & 2 & CARD16 & \\
    品詞バッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetSimpleKanji)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetSimpleKanji   & 1 & CARD8 & 0x19 \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    候補数	 	 & 2 & INT16 & エラー時: $-$1 \\
    候補文字列 	 & 可変長 & STRING16 & 候補@@...@@候補@@@@ \\
    品詞文字列	 & 可変長 & STRING16 & 品詞情報@@...@@品詞情報@@@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{区切り変更: ResizePause}
指定された文節を，指定された長さに区切り直して，再度かな漢字変換する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqResizePause)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ResizePause 	 & 1 & CARD8 & 0x1a \\
    NONE	    	 & 1 & CARD8 & 0x00 \\
    データ長    	 & 2 & CARD16 & 6 \\
    コンテクスト番号 & 2 & INT16 & \\
    文節番号 	 & 2 & INT16 & \\
    読みの長さ 	 & 2 & INT16 & \begin{minipage}[t]{45mm}
	読みの長さ(octet)$/-$2では文節縮め$/-$1では文節伸ばし
    \end{minipage} \\
\hline
\end{tabular}

\item 応答パケット(\repResizePause)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ResizePause & 1 & CARD8 & 0x1a \\
    NONE   	    & 1 & CARD8 & 0x00 \\
    データ長    & 2 & CARD16 & \\
    文節数      & 2 & INT16 & \begin{minipage}[t]{45mm}
	    正常時 : 先頭文節から最終文節までの文節数

	    エラー時: $-$1
    \end{minipage} \\
    各文節の最優先候補リスト & 可変長 & STRING16 & 候補@@...@@候補@@@@\\
\hline
\end{tabular}
\end{itemize}
\item 説明

各文節の最優先候補リストは，カレント文節から最終文節までの最優先候補を返す．
\end{enumerate}
\newpage
%
\subsection{品詞情報: GetHinshi}
カレント候補に対する品詞情報を文字列で取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetHinsi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetHinsi 	 & 1 & CARD8 & 0x1b \\
    NONE	 	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 8 \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    カレント候補番号 & 2 & INT16 & \\
    読みのバッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetHinsi)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetHinshi & 1 & CARD8 & 0x1b \\
    NONE      & 1 & CARD8 & 0x00 \\
    データ長  & 2 & CARD16 & \\
    終了状態  & 1 & INT8 & エラー時: $-1$  \\
    品詞情報文字列 & 可変長 & STRING16 & 文字列@@ \\
\hline
\end{tabular}
\end{itemize}
\item 説明

品詞情報文字列は変換エンジンにディペンドしない．
\end{enumerate}
\newpage
%
\subsection{形態素情報: GetLex}
カレント文節の形態素情報を取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetLex)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetLex 		 & 1 & CARD8 & 0x1c \\
    NONE   	 	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 6 \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    カレント候補番号 & 2 & INT16 & \\
    形態素情報のバッファサイズ & 2 & INT16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetLex)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetLex 	 & 1 & CARD8 & 0x1c \\
    NONE   	 & 1 & CARD8 & 0x00 \\
    データ長 & 2 & CARD16 & \\
    単語数   & 2 & INT16 & エラー時: $-$1  \\
    形態素情報\footnotemark  & 20 ×単語数 & LIST of INT32 & \\
\hline
\end{tabular}

\footnotetext{struct RkLexの大きさが20バイトである．}
\end{itemize}
\item 説明

RKCは RkwGetLexで指定する形態素情報のバッファサイズを，サーバに通知しなけれ
ばならない．
\end{enumerate}
\newpage
%
\subsection{解析情報:GetStatus}
カレント候補に関する解析情報を求める．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetStatus)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetStatus 	 & 1 & CARD8 & 0x1d \\
    NONE		 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & 6 \\
    コンテクスト番号 & 2 & INT16 & \\
    カレント文節番号 & 2 & INT16 & \\
    カレント候補番号 & 2 & INT16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetStatus)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetStatus  & 1 & CARD8 & 0x1d \\
    NONE	   & 1 & CARD8 & 0x00 \\
    データ長   & 2 & CARD16 & \\
    終了状態   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
    解析情報 \footnotemark & 28 & LISTofINT32 & \\
\hline
\end{tabular}

\footnotetext{struct RkStatの大きさが28バイトである．}
\end{itemize}
\end{enumerate}
\newpage
%
\subsection{locale情報セット: SetLocale}
locale情報の変更を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqSetLocale)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    SetLocale         & 1 & CARD8 & 0x1e \\
    NONE     	 & 1 & CARD8 & 0x00 \\
    データ長 	 & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    locale情報	 & 可変長 & STRING8 & 文字列@ \\
\hline
\end{tabular}

\item 応答パケット(\repSetLocale)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    SetLocale        & 1 & CARD8 & 0x1e \\
    NONE     	& 1 & CARD8 & 0x00 \\
    データ長 	& 2 & CARD16 & 1 \\
    終了状態 	& 1 & INT8 & 正常時: 0$/$エラー: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{自動変換開始: AutoConvert}
自動変換モードでかな漢字変換を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqAutoConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    AutoConvert 	 & 1 & CARD8  & 0x1f \\
    NONE         	 & 1 & CARD8  & 0x00 \\
    データ長     	 & 2 & CARD16 &  \\
    コンテクスト番号 & 2 & INT16 & \\
    バッファサイズ   & 2 & CARD16 & \\
    モード           & 4 & INT32 & \\
\hline
\end{tabular}

\item 応答パケット(\repAutoConvert)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    AutoConvert & 1 & CARD8 & 0x1f \\
    NONE   	& 1 & CARD8 & 0x00 \\
    データ長    & 2 & CARD16 & 1 \\
    終了状態    & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

自動変換を行うため，RkwBgnBunにバッファサイズを指定しなければならない
ので，BiginConvertは使用できない．

個人別頻度学習の導入により，RkwBgnBunの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{拡張プロトコル問い合わせ: QueryExtensions}
そのサーバの拡張プロトコルの問い合わせ．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqQueryExtensions)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    QueryExtensions 	   & 1 & CARD8 & 0x20 \\
    NONE           	   & 1 & CARD8 & 0x00 \\
    データ長	   & 2 & CARD16 &  \\
    リクエスト名リスト & 可変長 & STRING8 & リクエスト名@...@リクエスト名@@ \\
\hline
\end{tabular}

\item 応答パケット(\repQueryExtensions)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    QueryExtensions & 1 & CARD8 & 0x20 \\
    NONE	    & 1 & CARD8 & 0x00 \\
    データ長        & 2 & CARD16 &  1 \\
    終了状態        & 1 & INT8 & 正常時: 0$/$エラー時: $-$1  \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{アプリケーション名登録: SetApplicationName}
クライアントのアプリケーション名をそのサーバに通知し，登録する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqSetApplicationName)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    SetApplicationName   & 1 & CARD8 & 0x21 \\
    NONE		   & 1 & CARD8 & 0x00 \\
    データ長 	   & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    アプリケーション名 		 & 可変長 & STRING8 & アプリケーション名@ \\
\hline
\end{tabular}

\item 応答パケット(\repSetApplicationName)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DeleteDictionary   & 1 & CARD8 & 0x21 \\
    NONE		   & 1 & CARD8 & 0x00 \\
    データ長	   & 2 & CARD16 &  \\
    終了状態	   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{グループ名の通知: NoticeGroupName}
クライアントのグループ名をサーバに通知し、登録する。
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqNoticeGroupName)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    NoticeGroupName   & 1 & CARD8 & 0x22 \\
    NONE		   & 1 & CARD8 & 0x00 \\
    データ長 	   & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    グループ名 		 & 可変長 & STRING8 & グループ名@ \\
\hline
\end{tabular}

\item 応答パケット(\repSetApplicationName)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    NoticeGroupName  & 1 & CARD8 & 0x22 \\
    NONE		   & 1 & CARD8 & 0x00 \\
    データ長	   & 2 & CARD16 &  \\
    終了状態	   & 1 & INT8 & 正常時: 0$/$エラー時: 負の値 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\section{拡張プロトコル}
%
特にかな漢字変換処理には，必要ないがツール等で使用するプロトコルを定義する．
%
\subsection{サーバ情報取得: GetServerInfo}
サーバに接続しているクライアント数などのサーバ情報を取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetServerInfo)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetServerInfo & 1 & CARD8 & 0x01 \\
    NONE	      & 1 & CARD8 & 0x01 \\
    データ長 & 2 & CARD16 & 0 \\
\hline
\end{tabular}

\item 応答パケット(\repGetServerInfo)

\begin{tabular}{|p{45mm}|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetServerInfo & 1 & CARD8 & 0x01 \\
    NONE	      & 1 & CARD8 & 0x01 \\
    データ長 & 2 &  CARD16 & \\
    終了状態 & 1 &  CARD8 & 0 \\
    メジャーサーババージョン & 1 & CARD8 & \\
    マイナーサーババージョン & 1 & CARD8 & \\
    サーバが動作しているマシンの現在時刻 & 4 & CARD32 & ctimeの値 \\
    プロトコル数 & 2 & CARD16 & 認識できるプロトコルの数 \\
    プロトコル名リスト長 & 2 & CARD8 & \\
    プロトコル名リスト & 可変長 & STRING8 & 文字列@文字列@...@@ \\
    プロトコル使用頻度 & 可変長 & LISTofCARD32 & 4×プロトコル数 \\
    接続しているクライアント数 & 2 & CARD16 & \\
    コンテクスト数 & 2 & CARD16 & \\
    クライアント情報リスト長 & 2 & CARD16 & \\
    クライアント情報リスト & 可変長 & LISTofINT8 & (情報長$+$情報)の繰り返し \\
\hline
\end{tabular}

各クライアントの情報は以下の通りである．

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ソケット番号   & 4 & INT32 & \\
    ユーザ管理番号 & 4 & INT32 & \\
    ユーザ消費時間 & 4 & CARD32 & 秒単位 \\
    アイドル時間   & 4 & CARD32 & 秒単位 \\
    コネクト時間   & 4 & CARD32 & 秒単位 \\
    プロトコル使用頻度 & 4×プロトコル数 & LISTofCARD32 & \\
    ユーザ名長     & 2 & CARD16 & \\
    ユーザ名       & 可変長 & STRING8 \footnotemark & \\
    ホスト名長     & 2 & CARD8 & \\
    ホスト名       & 可変長 & STRING8  
          \addtocounter{footnote}{-1} \footnotemark & \\
    クライアント名       & 可変長 & STRING8 & \\
    コンテクスト管理フラグ & 可変長 & LISTofOCTET & \\
\hline
\end{tabular}

\footnotetext{2バイト境界に合うようパディングする．}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{サーバ使用許可: GetAccessControlList}
サーバの使用許可の参照および設定を行う．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetAccessControlList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetAccessControlList & 1 & CARD8 & 0x02 \\
    NONE     	     & 1 & CARD8 & 0x01 \\
    データ長 	     & 2 & CARD16 & 0 \\
\hline
\end{tabular}

\item 応答パケット(\repGetAccessControlList)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetAccessControlList & 1 & CARD8 & 0x02 \\
    NONE     	     & 1 & CARD8 & 0x01 \\
    データ長	     & 2 & CARD16 &  \\
    ホスト数	     & 2 & INT16 & エラー時: $-1$ \\
    ホスト名リスト	     & 可変長 & STRING8 & \begin{tabular}[t]{@{}l}
    ホスト名@ユーザ名@...@ユーザ名 \\
    @@ホスト名@ユーザ名@...@@ \\
\end{tabular} \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書作成: CreateDictionary}
テキスト辞書を作成し，dics.dirの内容を更新する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqCreateDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CreateDictionary & 1 & CARD8 & 0x03 \\
    NONE     	 & 1 & CARD8 & 0x01 \\
    データ長 	 & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repCreateDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CreateDictionary & 1 & CARD8 & 0x03 \\
    NONE     	 & 1 & CARD8 & 0x01 \\
    データ長 	 & 2 & CARD16 & \\
    終了状態 	 & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwCreateDicの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{辞書削除: DeleteDictionary}
テキスト辞書を削除し，dics.dirの内容を更新する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqDeleteDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DeleteDictionary   & 1 & CARD8 & 0x04 \\
    NONE		   & 1 & CARD8 & 0x01 \\
    データ長 	   & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名 		 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repDeleteDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    DeleteDictionary   & 1 & CARD8 & 0x04 \\
    NONE		   & 1 & CARD8 & 0x01 \\
    データ長	   & 2 & CARD16 &  \\
    終了状態	   & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwRemoveDicの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{辞書名変更: RenameDictionary}
ユーザ辞書の辞書名を変更する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqRenameDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RenameDictionary & 1 & CARD8 & 0x05 \\
    NONE     	 & 1 & CARD8 & 0x01 \\
    データ長 	 & 2 & CARD16 & \\
    モード 		 & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    現在の辞書名 	 & 可変長 & STRING8 & 辞書名@ \\
    新しい辞書名 	 & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repRenameDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    RenameDictionary & 1 & CARD8 & 0x05 \\
    NONE		 & 1 & CARD8 & 0x01 \\
    データ長	 & 2 & CARD16 & 1 \\
    終了状態	 & 1 & INT8 & 正常時: 0$/$エラー時: $-$1 \\
\hline
\end{tabular}

\end{itemize}
\item 説明

個人別頻度学習の導入により，RkwRenameDicの modeは 32bit必要である．
\end{enumerate}
\newpage
%
\subsection{単語情報取得: GetWordTextDictionary}
テキスト辞書の単語情報を取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqGetWordTextDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetWordTextDictionary & 1 & CARD8 & 0x06 \\
    NONE     	      & 1 & CARD8 & 0x01 \\
    データ長	      & 2 & CARD16 &  \\
    コンテクスト番号  & 2 & INT16 & \\
    ディレクトリ名    & 可変長 & STRING8 & ディレクトリ名@ \\
    辞書名	      & 可変長 & STRING8 & 辞書名@ \\
    バッファサイズ & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repGetWordTextDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    GetWordTextDictionary & 1 & CARD8 & 0x06 \\
    NONE     	      & 1 & CARD8 & 0x01 \\
    データ長	      & 2 & CARD16 &  \\
    単語情報長	      & 2 & INT16 & エラー時: $-1$ \\
    文字列リスト	      & 可変長 & STRING16 & 文字列@@\\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書テーブル取得: ListDictionary}
指定した辞書ディレクトリにある辞書テーブルを取得する．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqListDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ListDictionary   & 1 & CARD8 & 0x07 \\
    NONE	     & 1 & CARD8 & 0x01 \\
    データ長         & 2 & CARD16 &  \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書ディレクトリ名 & 可変長 & STRING8 & ディレクトリ名[:ディレクト
リ名].. \\
    バッファサイズ   & 2 & CARD16 & \\
\hline
\end{tabular}

\item 応答パケット(\repListDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ListDictionary & 1 & CARD8 & 0x07 \\
    NONE	     & 1 & CARD8 & 0x01 \\
    データ長     & 2 & CARD8 & \\
    辞書数       & 1 & INT8 & エラー時: $-1$ \\
    辞書リスト   & 可変長 & STRING8 & 辞書名@...@辞書名@@ \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{リソースの更新: Sync}
メモリ内の保持している辞書情報を辞書に書き込む．
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqSync)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    Sync      & 1 & CARD8  & 0x08 \\
    NONE      & 1 & CARD8  & 0x01 \\
    データ長  & 2 & CARD16 &  \\
    モード    & 4 & INT32  & \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名    & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repSync)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    Sync           & 1 & CARD8 & 0x08 \\
    NONE	   & 1 & CARD8 & 0x01 \\
    データ長	   & 2 & CARD16 & 1  \\
    終了状態	   & 1 & INT8 & 正常時: 0$/$エラー時: 負の値 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書のREAD$/$WRITE権の変更: ChmodDictionary}
辞書の READ/WRITE 権の変更を行う。
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqChmodDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ChmodDictionary & 1 & CARD8 & 0x09 \\
    NONE            & 1 & CARD8 & 0x01 \\
    データ長 	    & 2 & CARD16 & \\
    モード          & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    辞書名          & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repChmodDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    ChmodDictionary    & 1 & CARD8 & 0x09 \\
    NONE	       & 1 & CARD8 & 0x01 \\
    データ長	       & 2 & CARD16 & 1  \\
    終了状態	       & 1 & INT16 & 正常時: chmoddic の戻り値$/$エラー時: 負の値 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\subsection{辞書の複写: CopyDictionary}

\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqCopyDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CopyDictionary  & 1 & CARD8 & 0x0a \\
    NONE	    & 1 & CARD8 & 0x01 \\
    データ長 	    & 2 & CARD16 & \\
    モード 	    & 4 & INT32 & \\
    コンテクスト番号 & 2 & INT16 & \\
    複写元のディレクトリ名 & 可変長 & STRING8 & ディレクトリ名@ \\
    複写元の辞書名	 & 可変長 & STRING8 & 辞書名@ \\
    複写先の辞書名       & 可変長 & STRING8 & 辞書名@ \\
\hline
\end{tabular}

\item 応答パケット(\repCopyDictionary)

\begin{tabular}{|l|c|c|l|}\hline
フィールド & フィールド長(octet) & タイプ & 備考 \\\hline\hline
    CopyDictionary & 1 & CARD8 & 0x0a \\
    NONE	   & 1 & CARD8 & 0x01 \\
    データ長	   & 2 & CARD16 & 1 \\
    終了状態	   & 1 & INT8 & 正常時: 0$/$エラー時: 負の値 \\
\hline
\end{tabular}

\end{itemize}
\end{enumerate}
\newpage
%
\section{『RK』ライブラリとの対応}
以上述べたプロトコルとRKライブラリとの対応は以下の通り．

以下の表で
プロトコルバージョン 2.0 で新規に追加したものは先頭に「*」を付けて、プロ
トコルバージョン 2.1 で新規に追加したものは先頭に「**」を付けて、プロ
トコルバージョン 3.0 で新規に追加したものは先頭に「+」を付けて、プロトコ
ルバージョン 3.2 で新規に追加したものは先頭に「++」を付けて示してある。

\begin{tabular}{|c@{}l|c@{}l|l|}\hline
\multicolumn{2}{|c|}{RK関数} & \multicolumn{2}{c|}{プロトコル} &
				\multicolumn{1}{c|}{備考} \\\hline\hline
    & Rk(w)Initialize    &   & Initialize	& 初期化処理 \\
    & Rk(w)Finalize	 &   & Finalize		& 終了処理 \\	
    & Rk(w)CreateContext &   & CreateContext	& コンテクスト作成 \\
    & Rk(w)DuplicateContext &   & DuplicateContext & コンテクスト複写 \\
    & Rk(w)CloseContext &   & CloseContext	& コンテクスト削除 \\
    & Rk(w)GetDicList   &   & GetDictionaryList & 辞書テーブル一覧 \\
    & Rk(w)MountDic	&   & MountDictionary	& 辞書リスト追加 \\
    & Rk(w)GetMountList    &   & GetMountDictionaryList & 辞書リスト一覧 \\
    & Rk(w)UnmountDic      &   & UnmountDictionary & 辞書リスト削除 \\
    & Rk(w)RemountDic      &   & RemountDictionary & 辞書リスト変更 \\
    & Rk(w)BgnBun	&   & BeginConvert	& 変換開始 \\	
    & Rk(w)EndBun	&   & EndConvert	& 変換終了 \\	
    & Rk(w)GoTo		&   & $-$		& カレント文節移動 \\
    & Rk(w)Left		&   & $-$		& カレント文節移動 \\
    & Rk(w)Right	&   & $-$		& カレント文節移動 \\
    & Rk(w)Xfer		&   & GetCandidacyList	& カレント候補変更 \\
    & Rk(w)Next		&   & GetCandidacyList	& カレント候補変更 \\
    & Rk(w)Prev		&   & GetCandidacyList	& カレント候補変更 \\
    & Rk(w)Nfer		&   & GetCandidacyList	& カレント候補変更 \\
    & Rk(w)Resize	&   & ResizePause	& 区切り変更 \\ 
    & Rk(w)Enlarge	&   & ResizePause	& 区切り変更 \\ 
    & Rk(w)Shorten	&   & ResizePause	& 区切り変更 \\ 
    & Rk(w)StoreYomi	&   & StoreYomi		& 読みがな変更 \\
    & Rk(w)GetYomi	&   & GetCandidacyList or GetYomi & 読みがな取得 \\
    & Rk(w)GetKanji	&   & $-$		& RKCのバッファから取得 \\
    & Rk(w)GetKanjiList	&   & GetCandidacyList	& 候補一覧 \\
    & Rk(w)GetStat	&   & GetStatus		& 解析情報 \\
    & Rk(w)GetLex	&   & GetLex		& 形態素情報 \\
    & Rk(w)DefineDic	&   & DefineWord	& 単語登録 \\	
    & Rk(w)DeleteDic	&   & UndefineWord	& 単語削除 \\	
    \hline
\end{tabular}


\begin{tabular}{|c@{}l|c@{}l|l|}\hline
\multicolumn{2}{|c|}{RK関数} & \multicolumn{2}{c|}{プロトコル} &
				\multicolumn{1}{c|}{備考} \\\hline\hline
{*} & Rk(w)SubstYomi       & * & SubstYomi		& 自動変換 \\	
{*} & Rk(w)FlushYomi       & * & FlushYomi		& 強制変換 \\	
{*} & Rk(w)GetLastYomi     & * & GetLastYomi or SubstYomi & 未決文節読み取得 \\
{*} & Rk(w)RemoveBun       & * & RemoveYomi	& 読みバッファ削除 \\
{*} & Rk(w)GetSimpleKanji  & * & GetSimpleKanji	& 限定候補の取り出し \\
{*} & Rk(w)QueryDic	& * & QueryDictionary	& 登録可能辞書の問い合わせ \\
{*} & Rk(w)GetHinshi	& * & GetHinshi		& 品詞情報 \\
{*} & Rk(w)StoreRange	& * & StoreRange	& カレント文節のみ単文節変換 \\
{*} & Rk(w)SetLocale	& * & SetLocale		& locale情報セット \\
    & Rk(w)BgnBun	& * & AutoConvert	& 自動変換開始 \\
{+} & Rk(w)SetAppName	& + & SetApplicationName & アプリケーション名登録 \\
    \hline
    & Rk(w)CreateDic	&   & CreateDictionary	& 辞書作成 \\
    & Rk(w)ListDic	&   & ListDictionary    & 辞書テーブル一覧 \\
    & Rk(w)RemoveDic	&   & DeleteDictionary  & 辞書削除  \\
    & Rk(w)RenameDic	&   & RenameDictionary  & 辞書名変更  \\
    & Rk(w)GetWordTextDic &   & GetWordTextDictionary & 単語情報取得 \\
{++} & Rk(w)Sync	& ++ & Sync		& 辞書情報の更新 \\
{++}& Rk(w)ChmodDic	& ++ & ChmodDictionary   & 辞書のアクセス権 \\
{++}& Rk(w)CopyDic	& ++ & CopyDictionary	 & 辞書の複写 \\
    \hline		
\end{tabular}

%
\section{エラー時の処理}
\subsection{ライブラリ}
サーバとのコネクションが切れた場合には，errnoにEPIPEを設定して返す．
\footnote{サーバとのコネクションが切れた場合に SIGEPIPE が発生するので
RKCライブラリ内で，このシグナルを吸収するようにしなければならない．}

\subsection{サーバ}
以下の様な場合に，クライアントとのコネクションを切断する．
\begin{enumerate}
    \item 不正なリクエストの要求があった場合．
    \item クライアントから送られてきたデータの読み込みに失敗した場合．
    \item クライアントにデータを送れなかった場合．
\end{enumerate}
\end{document}
