$Id: CTIP2.rb 902 2013-04-23 05:07:04Z miyabe $
通信プロトコルに関連する各操作です。
このモジュールに所属するメソッドは、 IO に対するものです。
パケットの送信に使うバッファのサイズです。
メモリ上のフラグメントの最大サイズです。
フラグメントがこの大きさを超えるとディスクに書き込みます。
メモリ上に置かれるデータの最大サイズです。
メモリ上のデータがこのサイズを超えると、 FRG_MEM_SIZEとは無関係にディスクに書き込まれます。
一時ファイルのセグメントサイズです。
セッションを開始します。
通信に用いるエンコーディング
# File CTI/CTIP2/CTIP2.rb, line 71 def cti_connect(encoding) self.write("CTIP/2.0 #{encoding}\n") end
8ビット数値を読み込みます。
数値、エラーであればfalse
# File CTI/CTIP2/Utils.rb, line 99 def read_byte b = self.read(1) b = b.unpack('C') return b[0] end
16ビットビッグインディアン数値を読み込み、そのバイト数だけバイト列を読み込みます。
バイト列、エラーであればfalse
# File CTI/CTIP2/Utils.rb, line 111 def read_bytes b = self.read(2) a = b.unpack('n') len = a[0] b = self.read(len); return b; end
32ビットビッグインディアン数値を読み込みます。
数値、エラーであればfalse
# File CTI/CTIP2/Utils.rb, line 65 def read_int b = self.read(4) a = b.unpack('N') return a[0] end
64ビットビッグインディアン数値を読み込みます。
数値、エラーであればfalse
# File CTI/CTIP2/Utils.rb, line 77 def read_long b = self.read(8) a = b.unpack('NN') h = a[0] l = a[1] if h >> 31 != 0 then h ^= 0xFFFFFFFF l ^= 0xFFFFFFFF b = (h << 32) | l b = -(b + 1) else b = (h << 32) | l end return b; end
16ビットビッグインディアン数値を読み込みます。
数値、エラーであればfalse
# File CTI/CTIP2/Utils.rb, line 53 def read_short b = self.read(2) a = b.unpack('n') return a[0] end
変換処理の中断を要求します。
0=生成済みのデータを出力して中断, 1=即時中断
# File CTI/CTIP2/CTIP2.rb, line 148 def req_abort(mode) payload = 2 self.write_int(payload) self.write_byte(CTIP2::REQ_ABORT) self.write_byte(mode) self.flush end
サーバーからクライアントのリソースを要求するモードを切り替えます。
0=off, 1=on
# File CTI/CTIP2/CTIP2.rb, line 95 def req_client_resource(mode) payload = 2 self.write_int(payload) self.write_byte(CTIP2::REQ_CLIENT_RESOURCE) self.write_byte(mode) self.flush end
通信を終了します。
# File CTI/CTIP2/CTIP2.rb, line 266 def req_close payload = 1 self.write_int(payload) self.write_byte(CTIP2::REQ_CLOSE) self.flush end
複数の結果を結合するモードを切り替えます。
0=off, 1=on
# File CTI/CTIP2/CTIP2.rb, line 109 def req_continuous(mode) payload = 2 self.write_int(payload) self.write_byte(CTIP2::REQ_CONTINUOUS) self.write_byte(mode) self.flush end
終了を通知します。
# File CTI/CTIP2/CTIP2.rb, line 171 def req_eof payload = 1 self.write_int(payload) self.write_byte(CTIP2::REQ_EOF) self.flush end
変換結果を結合します。
# File CTI/CTIP2/CTIP2.rb, line 160 def req_join payload = 1 self.write_int(payload) self.write_byte(CTIP2::REQ_JOIN) self.flush end
リソースの不存在を通知します。
URI
# File CTI/CTIP2/CTIP2.rb, line 123 def req_missing_resource(uri) payload = 1 + 2 + uri.bytesize self.write_int(payload) self.write_byte(CTIP2::REQ_MISSING_RESOURCE) self.write_bytes(uri) self.flush end
プロパティを送ります。
名前
値
# File CTI/CTIP2/CTIP2.rb, line 185 def req_property(name, value) payload = name.bytesize + value.bytesize + 5 self.write_int(payload) self.write_byte(CTIP2::REQ_PROPERTY) self.write_bytes(name) self.write_bytes(value) self.flush end
状態のリセットを要求します。
# File CTI/CTIP2/CTIP2.rb, line 135 def req_reset payload = 1 self.write_int(payload) self.write_byte(CTIP2::REQ_RESET) self.flush end
リソースの開始を通知します。
URI
MIME型
エンコーディング
長さ
# File CTI/CTIP2/CTIP2.rb, line 217 def req_resource(uri, mime_type = 'text/css', encoding = '', length = -1) payload = uri.bytesize + mime_type.bytesize + encoding.bytesize + 7 + 8 self.write_int(payload) self.write_byte(CTIP2::REQ_START_RESOURCE) self.write_bytes(uri) self.write_bytes(mime_type) self.write_bytes(encoding) self.write_long(length) self.flush end
サーバー情報を要求します。
URI
# File CTI/CTIP2/CTIP2.rb, line 81 def req_server_info(uri) payload = 1 + 2 + uri.bytesize self.write_int(payload) self.write_byte(CTIP2::REQ_SERVER_INFO) self.write_bytes(uri) self.flush end
サーバー側データの変換を要求します。
URI
# File CTI/CTIP2/CTIP2.rb, line 200 def req_server_main(uri) payload = uri.bytesize + 3 self.write_int(payload) self.write_byte(CTIP2::REQ_SERVER_MAIN) self.write_bytes(uri) self.flush end
本体の開始を通知します。
URI
MIME型
エンコーディング
長さ
# File CTI/CTIP2/CTIP2.rb, line 237 def req_start_main(uri, mime_type = 'text/html', encoding = '', length = -1) payload = uri.bytesize + mime_type.bytesize + encoding.bytesize + 7 + 8 self.write_int(payload) self.write_byte(CTIP2::REQ_START_MAIN) self.write_bytes(uri) self.write_bytes(mime_type) self.write_bytes(encoding) self.write_long(length) self.flush end
データを送ります。
データ
# File CTI/CTIP2/CTIP2.rb, line 254 def req_write(b) payload = b.bytesize + 1 self.write_int(payload) self.write_byte(CTIP2::REQ_DATA) self.write(b) self.flush end
次のレスポンスを取得します。
結果ハッシュには次のデータが含まれます。
‘type’ レスポンスタイプ
‘anchorId’ 挿入する場所の直後のフラグメントID
‘level’ エラーレベル
‘error’ エラーメッセージ
‘id’ 断片ID
‘progress’ 処理済バイト数
‘bytes’ データのバイト列
レスポンス
# File CTI/CTIP2/CTIP2.rb, line 289 def res_next payload = self.read_int type = self.read_byte case type when CTIP2::RES_ADD_BLOCK, CTIP2::RES_EOF, CTIP2::RES_NEXT return { 'type' => type, } when CTIP2::RES_START_DATA uri = self.read_bytes mime_type = self.read_bytes encoding = self.read_bytes length = self.read_long return { 'type' => type, 'uri' => uri, 'mime_type' => mime_type, 'encoding' => encoding, 'length' => length } when CTIP2::RES_MAIN_LENGTH, CTIP2::RES_MAIN_READ length = self.read_long return { 'type' => type, 'length' => length } when CTIP2::RES_INSERT_BLOCK, CTIP2::RES_CLOSE_BLOCK block_id = self.read_int return { 'type' => type, 'block_id' => block_id } when CTIP2::RES_MESSAGE code = self.read_short payload -= 1 + 2 message = self.read_bytes payload -= 2 + message.bytesize args = [] while payload > 0 arg = self.read_bytes payload -= 2 + arg.bytesize args << arg end return { 'type' => type, 'code' => code, 'message' => message, 'args' => args } when CTIP2::RES_BLOCK_DATA length = payload - 5 block_id = self.read_int bytes = self.read(length) return { 'type' => type, 'block_id' => block_id, 'bytes' => bytes, 'length' => length } when CTIP2::RES_DATA length = payload - 1 bytes = self.read(length) return { 'type' => type, 'bytes' => bytes, 'length' => length } when CTIP2::RES_RESOURCE_REQUEST uri = self.read_bytes return { 'type' => type, 'uri' => uri } when CTIP2::RES_ABORT mode = self.read_byte code = self.read_short payload -= 1 + 1 + 2 message = self.read_bytes payload -= 2 + message.bytesize args = [] while payload > 0 arg = self.read_bytes payload -= 2 + arg.bytesize args << arg end return { 'type' => type, 'mode' => mode, 'code' => code, 'message' => message, 'args' => args } else raise "Bad response type:#{type}" end end
8ビット数値を書き出します。
数値
書き込んだバイト数
# File CTI/CTIP2/Utils.rb, line 31 def write_byte(b) self.write([b].pack('C')) end
バイト数を16ビットビッグインディアンで書き出した後、バイト列を書き出します。
バイト列
書き込んだバイト数
# File CTI/CTIP2/Utils.rb, line 42 def write_bytes(b) self.write([b.bytesize].pack('n')) self.write(b) end
32ビット数値をビッグインディアンで書き出します。
数値
書き込んだバイト数
# File CTI/CTIP2/Utils.rb, line 9 def write_int(a) self.write([a].pack('N')) end
64ビット数値をビッグインディアンで書き出します。
数値
書き込んだバイト数
# File CTI/CTIP2/Utils.rb, line 20 def write_long(a) self.write([a >> 32, a & 0xFFFFFFFF].pack('NN')) end