% 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. 
%
% 改版履歴
% 92/06/23      初版
% 93/02/01	ちょっとてを入れた。
% 93/03/12	ずいぶん手を入れた．
% 93/03/17	いろいろ間違っていたので直した．
% 94/04/13	R9.1での追加プロトコルとタイプの修正を行った。
% 94/11/16      R10.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\reqtypeqdic{Type 19}
\def\reqtypethrough{Type 20}
\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{\reqtypeqdic}
\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\reqKillServer{\reqtypefin}

\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\repKillServer{\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.3

\end{center}
\vfill
\begin{center}

大森~~~~~浩充

NEC

舩橋~~~~~一司

NECソフトウェア神戸

Canna Project

\end{center}
\vfill
\newpage

\tableofcontents

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

本仕様書では、『かんな』バージョン2で追加されたワイドキャラプロトコルについてのみ記述する。
バージョン1のプロトコルは『かんな』バージョン3.7で廃止された。

%
\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
3.3 & 3.3 & KillServerの追加 \\  \hline
3.6p4 & 同上 & QueryExtensionsの仕様を明確化、拡張 \\  \hline
\end{tabular}

%
%
\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{例外的なリクエストもある．}
  
応答は、リクエストと同じ型のヘッダを持っている。

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

\subsection{拡張プロトコル}
%
拡張プロトコルは、リクエスト名で識別され、サーバによって異なるリクエスト
番号を持つ。リクエスト番号はQueryExtensionsプロトコルによって取得される。

複数のリクエストを集めて、1つの拡張としてもよい。この場合、クライアントは、
リクエスト番号を個別に問い合わせることなく、1回のQueryExtensionsで全部の
番号を取得できる。そのかわり、サーバはこれらに一連の番号を与えなければ
ならない。

ただし、本仕様書で規定されているGetServerInfo(番号0x01)からCopyDictionary
(番号0x0a)までの拡張プロトコルは特別であり、必ずこの番号、この順序でなければ
ならない。また、0x00はリクエスト番号として使用できない。

なお、以上はCanna 3.6p4で決めた仕様であり、それまでは「QueryExtensions
リクエストには成功なら0、失敗なら$-$1を返す」という仕様であった。
成功の意味が明確でなく、またプロトコルの拡張の役に立たないため、
プロトコルを再定義した。この再定義によって互換性は保たれている。
%
\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{プロトコルのタイプ分け}

全部で33のプロトコルに関して、リクエストとリプライそれぞれ、22、11 の
タイプに分けることができる。リクエストの22のタイプおよびリプライの 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&&& \\
\reqtypeqdic   & QueryDictionary   & C8 & C8 & C16& I32& I16& S8 & S8&& \\
\reqtypethrough& Through           & C8 & C8 & C16& I16& I32& I32& S8&& \\
\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}

※リクエストType16とType19、リプライType3とType7は、同じような気がしますが.....

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

クライアントがサーバに発行するリクエストは以下の通りである。バージョン
ごとに新規に追加したものに関しては、先頭に記号を付けて示している。
(記号とバージョンの対応は表の最後に記述)

\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 \\

  {+++} & KillServer    	& サーバを終了させる       & 0x24 &
\reqKillServer & \repKillServer \\
\hline
\end{tabular}

※要求番号 0x23は、debug用関数 RkThrough()のために 追加された protocol

\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}
\\
\begin{itemize}
\item  プロトコルバージョン 2.0 で新規に追加 … 先頭に「*」マーク
\item  プロトコルバージョン 2.1 で新規に追加 … 先頭に「**」マーク
\item  プロトコルバージョン 3.0 で新規に追加 … 先頭に「+」マーク
\item  プロトコルバージョン 3.2 で新規に追加 … 先頭に「++」マーク
\item  プロトコルバージョン 3.3 で新規に追加 … 先頭に「+++」マーク
\end{itemize}

\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 & ユーザ名@ \\
    辞書名 		 & 可変長 & 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 \\
    文節数\footnotemark & 1 & INT8 & エラー時: $-$1 \\
\hline
\end{tabular}

\footnotetext{他のプロトコルでは文節数にはINT16を用いているが、ここではINT8を用いる。}
\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 & 1 & INT8 & エラー時: $-$1  \\
\hline
\end{tabular}

\end{itemize}
\item 説明

リクエスト名リストには、1つの拡張をなす一連のリクエストの名前を指定する。
サーバから返される値は、その拡張の最初のリクエストの番号から1を減じた
ものである。拡張プロトコルが見つからない場合、$-$1が返される。

なお、Canna 3.6p3までのサーバでは、リクエスト名リストにはGetServerInfo
からCopyDictionaryまでを順に指定する必要があった。
%
\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
%
\subsection{サーバを終了させる: KillServer}
サーバに終了要求を通知し、サーバを終了させる。
\begin{enumerate}
\item パケット
\begin{itemize}
\item 要求パケット(\reqKillServer)

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

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

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

\end{itemize}
\item 説明

本プロトコルは、サーバのプロトコルバージョンが 3.3 以降の場合、
用いることができる。

現在、エラー時の値として定義されているのは、以下の通りである。

\begin{tabular}{l|l} 
値       & エラー内容 \\ \hline
OLDSRV   & 『かんな』Version 3.2以前のサーバにプロトコルを送った場合 \\
NOTUXSRV & サーバを起動しているマシンからプロトコルが送られていない場合 \\
NOTOWSRV & サーバを起動したユーザ名と一致していない場合 \\
\end{tabular}
\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ライブラリとの対応は以下の通りである。
バージョンごとに新規に追加したものに関しては、先頭に記号を付けて示している。
(記号とバージョンの対応は表の最後に記述)

\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 & アプリケーション名登録 \\
{+++}& Rk(w)KillServer	&+++& Killserver	 & サーバの終了 \\
\hline\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}
\\
\begin{itemize}
\item  プロトコルバージョン 2.0 で新規に追加 … 先頭に「*」マーク
\item  プロトコルバージョン 2.1 で新規に追加 … 先頭に「**」マーク
\item  プロトコルバージョン 3.0 で新規に追加 … 先頭に「+」マーク
\item  プロトコルバージョン 3.2 で新規に追加 … 先頭に「++」マーク
\item  プロトコルバージョン 3.3 で新規に追加 … 先頭に「+++」マーク
\end{itemize}

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

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