module CTI::CTIP2

Version

$Id: CTIP2.rb 902 2013-04-23 05:07:04Z miyabe $

通信プロトコルに関連する各操作です。

このモジュールに所属するメソッドは、 IO に対するものです。

Constants

CTI_BUFFER_SIZE

パケットの送信に使うバッファのサイズです。

FRG_MEM_SIZE

メモリ上のフラグメントの最大サイズです。

フラグメントがこの大きさを超えるとディスクに書き込みます。

ON_MEMORY

メモリ上に置かれるデータの最大サイズです。

メモリ上のデータがこのサイズを超えると、 FRG_MEM_SIZEとは無関係にディスクに書き込まれます。

REQ_ABORT
REQ_CLIENT_RESOURCE
REQ_CLOSE
REQ_CONTINUOUS
REQ_DATA
REQ_EOF
REQ_JOIN
REQ_MISSING_RESOURCE
REQ_PROPERTY
REQ_RESET
REQ_SERVER_INFO
REQ_SERVER_MAIN
REQ_START_MAIN
REQ_START_RESOURCE
RES_ABORT
RES_ADD_BLOCK
RES_BLOCK_DATA
RES_CLOSE_BLOCK
RES_DATA
RES_EOF
RES_INSERT_BLOCK
RES_MAIN_LENGTH
RES_MAIN_READ
RES_MESSAGE
RES_NEXT
RES_RESOURCE_REQUEST
RES_START_DATA
SEGMENT_SIZE

一時ファイルのセグメントサイズです。

Public Instance Methods

cti_connect(encoding) click to toggle source

セッションを開始します。

encoding

通信に用いるエンコーディング

# File CTI/CTIP2/CTIP2.rb, line 71
def cti_connect(encoding)
  self.write("CTIP/2.0 #{encoding}\n")
end
read_byte() click to toggle source

8ビット数値を読み込みます。

戻り値

数値、エラーであればfalse

# File CTI/CTIP2/Utils.rb, line 99
def read_byte
  b = self.read(1)
  b = b.unpack('C')
  return b[0]
end
read_bytes() click to toggle source

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
read_int() click to toggle source

32ビットビッグインディアン数値を読み込みます。

戻り値

数値、エラーであればfalse

# File CTI/CTIP2/Utils.rb, line 65
def read_int
  b = self.read(4)
  a = b.unpack('N')
  return a[0]
end
read_long() click to toggle source

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
read_short() click to toggle source

16ビットビッグインディアン数値を読み込みます。

戻り値

数値、エラーであればfalse

# File CTI/CTIP2/Utils.rb, line 53
def read_short
  b = self.read(2)
  a = b.unpack('n')
  return a[0]
end
req_abort(mode) click to toggle source

変換処理の中断を要求します。

mode

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
req_client_resource(mode) click to toggle source

サーバーからクライアントのリソースを要求するモードを切り替えます。

mode

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
req_close() click to toggle source

通信を終了します。

# 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
req_continuous(mode) click to toggle source

複数の結果を結合するモードを切り替えます。

mode

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
req_eof() click to toggle source

終了を通知します。

# 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
req_join() click to toggle source

変換結果を結合します。

# 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
req_missing_resource(uri) click to toggle source

リソースの不存在を通知します。

uri

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
req_property(name, value) click to toggle source

プロパティを送ります。

name

名前

value

# 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
req_reset() click to toggle source

状態のリセットを要求します。

# 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
req_resource(uri, mime_type = 'text/css', encoding = '', length = -1) click to toggle source

リソースの開始を通知します。

uri

URI

mime_type

MIME型

encoding

エンコーディング

length

長さ

# 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
req_server_info(uri) click to toggle source

サーバー情報を要求します。

uri

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
req_server_main(uri) click to toggle source

サーバー側データの変換を要求します。

uri

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
req_start_main(uri, mime_type = 'text/html', encoding = '', length = -1) click to toggle source

本体の開始を通知します。

uri

URI

mime_type

MIME型

encoding

エンコーディング

length

長さ

# 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
req_write(b) click to toggle source

データを送ります。

b

データ

# 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
res_next() click to toggle source

次のレスポンスを取得します。

結果ハッシュには次のデータが含まれます。

  • ‘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
write_byte(b) click to toggle source

8ビット数値を書き出します。

a

数値

戻り値

書き込んだバイト数

# File CTI/CTIP2/Utils.rb, line 31
def write_byte(b)
  self.write([b].pack('C'))
end
write_bytes(b) click to toggle source

バイト数を16ビットビッグインディアンで書き出した後、バイト列を書き出します。

b

バイト列

戻り値

書き込んだバイト数

# File CTI/CTIP2/Utils.rb, line 42
def write_bytes(b)
  self.write([b.bytesize].pack('n'))
  self.write(b)
end
write_int(a) click to toggle source

32ビット数値をビッグインディアンで書き出します。

a

数値

戻り値

書き込んだバイト数

# File CTI/CTIP2/Utils.rb, line 9
def write_int(a)
  self.write([a].pack('N'))
end
write_long(a) click to toggle source

64ビット数値をビッグインディアンで書き出します。

a

数値

戻り値

書き込んだバイト数

# File CTI/CTIP2/Utils.rb, line 20
def write_long(a)
  self.write([a >> 32, a & 0xFFFFFFFF].pack('NN'))
end