class CTI::Session
- Version
-
$Id: Session.rb 1617 2022-01-24 07:26:44Z miyabe $
ドキュメント変換サーバーへの接続オブジェクトです。
end¶ ↑
Public Class Methods
セッションを構築します。このメソッドを直接呼び出す必要はありません。
CTI#get_session
メソッドを使用してください。
- io
-
サーバーと通信するための IO オブジェクト
- opts
-
接続オプション(ハッシュ型で、‘encoding’, ‘user’, ‘password’というキーで文字コード、ユーザー名、パスワードを設定することができます。)
- 返り値
-
サーバー情報のデータ文字列(XML)
end¶ ↑
# File CTI/Session.rb 27 def initialize(io, opts) 28 self.reset 29 @io = io 30 31 io.extend CTIP2 32 33 opts.default = 'UTF-8' 34 @encoding = opts['encoding'] 35 opts.default = '' 36 user = opts['user'] 37 password = opts['password'] 38 39 io.cti_connect(@encoding) 40 data = "PLAIN: #{user} #{password}\n" 41 io.write(data) 42 res = io.read(4) 43 raise "Authentication failure." if res != "OK \n" 44 end
Public Instance Methods
# File CTI/Session.rb 375 def build_next 376 res = @io.res_next 377 case res['type'] 378 when CTIP2::RES_START_DATA 379 if @builder 380 @builder.finish 381 @builder.dispose 382 end 383 @builder = @results.next_builder(res) 384 385 when CTIP2::RES_BLOCK_DATA 386 @builder.write(res['block_id'], res['bytes']) 387 388 when CTIP2::RES_ADD_BLOCK 389 @builder.add_block 390 391 when CTIP2::RES_INSERT_BLOCK 392 @builder.insert_block_before(res['block_id']) 393 394 when CTIP2::RES_CLOSE_BLOCK 395 @builder.close_block(res['block_id']) 396 397 when CTIP2::RES_DATA 398 @builder.serial_write(res['bytes']) 399 400 when CTIP2::RES_MESSAGE 401 @messageFunc.call(res['code'], res['message'], res['args']) if @messageFunc 402 403 when CTIP2::RES_MAIN_LENGTH 404 @mainLength = res['length'] 405 @progressFunc.call(@mainLength, @mainRead) if @progressFunc 406 407 when CTIP2::RES_MAIN_READ 408 @mainRead = res['length'] 409 @progressFunc.call(@mainLength, @mainRead) if @progressFunc 410 411 when CTIP2::RES_RESOURCE_REQUEST 412 uri = res['uri'] 413 r = Resource.new(@io, uri) 414 @resolverFunc.call(uri, r) if @resolverFunc 415 r.finish 416 @io.req_missing_resource(uri) if r.missing 417 418 when CTIP2::RES_ABORT 419 if @builder 420 @builder.finish if res['mode'] == 0 421 @builder.dispose 422 @builder = nil 423 end 424 @mainLength = nil 425 @mainRead = nil 426 @state = 1 427 return false 428 429 when CTIP2::RES_EOF 430 @builder.finish 431 @builder.dispose 432 @builder = nil 433 @mainLength = nil 434 @mainRead = nil 435 @state = 1 436 return false 437 438 when CTIP2::RES_NEXT 439 @state = 1 440 return false 441 end 442 return true 443 end
サーバー情報を返します。 詳細はオンラインのドキュメントをご覧下さい。
- uri
-
サーバー情報のURI
- 返り値
-
サーバー情報のデータ文字列(XML)
end¶ ↑
# File CTI/Session.rb 55 def get_server_info(uri) 56 @io.req_server_info(uri) 57 data = '' 58 while true 59 res = @io.res_next 60 break if res['type'] == CTIP2::RES_EOF 61 data += res['bytes'] 62 end 63 return data 64 end
結果を結合します。
先に CTI::Session#set_continuous
を呼び出しておく必要があります。
end¶ ↑
# File CTI/Session.rb 357 def join 358 raise "join: The session is already closed." if @state >= 3 359 @io.req_join 360 @state = 2 361 while build_next 362 end 363 end
エラーメッセージ受信のためのブロックを設定します。
CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。 ブロックの引数は、エラーコード(int)、メッセージ(string)、付属データ(array)です。
- &messageFunc
-
ブロック
例:
session.receive_message do |code, message, args| printf("%X %s\n", code, message) p args end
end¶ ↑
# File CTI/Session.rb 139 def receive_message(&messageFunc) 140 raise "receive_message: Main content is already sent." if @state >= 2 141 @messageFunc = messageFunc; 142 end
進行状況受信のためのブロックを設定します。
CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。 ブロックの引数は、全体のバイト数(int)、読み込み済みバイト数(int)です。
- &progressFunc
-
ブロック
例:
session.receive_progress do |length, read| puts "#{read} / #{length}" end
end¶ ↑
# File CTI/Session.rb 158 def receive_progress(&progressFunc) 159 raise "receive_progress: Main content is already sent." if @state >= 2 160 @progressFunc = progressFunc; 161 end
全ての状態をリセットします。
end¶ ↑
# File CTI/Session.rb 335 def reset 336 raise "reset: The session is already closed." if @state && @state >= 3 337 if @io 338 @io.req_reset 339 end 340 @progressFunc = nil 341 @messageFunc = nil 342 @resolverFunc = nil 343 @results = SingleResult.new(StreamBuilder.new(STDOUT) do |length| 344 print "Content-Length: #{length}\r\n\r\n" 345 end) do |opts| 346 print "Content-Type: #{opts['mime_type']}\r\n" 347 end 348 @state = 1 349 end
リソース解決のためのブロックを設定します。
CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。 ブロックの引数は、URI(string)、リソース出力クラス( CTI::Resource
)です。
- &resolverFunc
-
ブロック
URIに対応するリソースが見つかった場合、 CTI::Resource#found
メソッドを呼び出してください。 foundの呼び出しがない場合、リソースは見つからなかったものと扱われます。
例:
session.resolver do |uri, r| if File.exist?(uri) r.found do |out| copy_stream(File.open(uri), out) end end end
end¶ ↑
# File CTI/Session.rb 184 def resolver(&resolverFunc) 185 raise "resolver: Main content is already sent." if @state >= 2 186 @resolverFunc = resolverFunc; 187 @io.req_client_resource(resolverFunc ? 1 : 0) 188 end
リソース送信処理を行います。 CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。
- uri
-
仮想URI
- opts
-
リソースオプション(ハッシュ型で、‘mime_type’, ‘encoding’, ‘length’というキーでデータ型、文字コード、長さを設定することができます。)
- &block
-
リソースを送信するためのブロックで、引数としてリソースの出力先ストリームが渡されます。
- 戻り値
-
&blockがない場合はリソースの出力先ストリームが返されます。
例:
session.resource('test.css', {'mime_type' => 'test/css'}) do |out| copy_stream(File.open('data/test.css'), out) end
end¶ ↑
# File CTI/Session.rb 235 def resource(uri, opts = {}, &block) 236 raise "resource: Main content is already sent." if @state >= 2 237 opts.default = 'text/css' 238 mime_type = opts['mime_type'] 239 opts.default = '' 240 encoding = opts['encoding'] 241 opts.default = -1 242 length = opts['length'] 243 @io.req_resource(uri, mime_type, encoding, length) 244 245 out = ResourceOut.new(@io) 246 if block 247 begin 248 block.call(out) 249 ensure 250 out.close 251 end 252 else 253 return out 254 end 255 end
複数の結果を結合するモードを切り替えます。 モードが有効な場合、 CTI::Session#join
の呼び出しで複数の結果を結合して返します。
CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。
- continuous
-
有効にするにはtrue
end¶ ↑
# File CTI/Session.rb 199 def set_continuous(continuous) 200 raise "set_continuous: Main content is already sent." if @state >= 2 201 @io.req_continuous(continuous ? 1 : 0) 202 end
変換結果の出力先ディレクトリ名を指定します。
CTI::Session#set_results
の簡易版です。 こちらは、複数の結果をファイルとして出力するディレクトリ名を直接設定することができます。 ファイル名は prefix ページ番号 suffix をつなげたものです。
- dir
-
出力先ディレクトリ名
- prefix
-
出力するファイルの名前の前に付ける文字列
- suffix
-
出力するファイルの名前の後に付ける文字列
end¶ ↑
# File CTI/Session.rb 107 def set_output_as_directory(dir, prefix = '', suffix = '') 108 set_results(DirectoryResults.new(dir, prefix, suffix)) 109 end
変換結果の出力先ファイル名を指定します。
CTI::Session#set_results
の簡易版です。 こちらは、1つだけ結果を出力するファイル名を直接設定することができます。
- file
-
出力先ファイル名
end¶ ↑
# File CTI/Session.rb 91 def set_output_as_file(file) 92 set_results(SingleResult.new(FileBuilder.new(file))) 93 end
変換結果の出力先リソースを指定します。
CTI::Session#set_results
の簡易版です。 こちらは、1つだけの結果出力先を直接設定することができます。
- out
-
出力先 IO オブジェクト
end¶ ↑
# File CTI/Session.rb 120 def set_output_as_stream(out) 121 set_results(SingleResult.new(StreamBuilder.new(out))) 122 end
変換結果の出力先を指定します。
CTI::Session#transcode
および CTI::Session#transcode_server
の前に呼び出してください。 この関数を呼び出さないデフォルトの状態では、出力先は標準出力( STDOUT )になります。
また、デフォルトの状態では、自動的にContent-Type, Content-Lengthヘッダが送出されます。
- results
-
出力先の
CTI::Results
オブジェクト
end¶ ↑
# File CTI/Session.rb 77 def set_results(results) 78 raise "set_results: Main content is already sent." if @state >= 2 79 @results = results 80 end
変換対象の文書リソースを送信し、変換処理を行います。
- uri
-
仮想URI
- opts
-
リソースオプション(ハッシュ型で、‘mime_type’, ‘encoding’, ‘length’というキーでデータ型、文字コード、長さを設定することができます。)
- &block
-
リソースを送信するためのブロックで、引数としてリソースの出力先ストリームが渡されます。
- 戻り値
-
&blockがない場合はリソースの出力先ストリームが返されます。
例:
session.transcode('.', {'mime_type' => 'text/html'}) do |out| copy_stream(File.open('data/test.html'), out) end
end¶ ↑
# File CTI/Session.rb 272 def transcode(uri = '.', opts = {}, &block) 273 raise "transcode: Main content is already sent." if @state >= 2 274 opts.default = 'text/css' 275 mime_type = opts['mime_type'] 276 opts.default = '' 277 encoding = opts['encoding'] 278 opts.default = -1 279 length = opts['length'] 280 state = 2 281 @io.req_start_main(uri, mime_type, encoding, length) 282 283 out = MainOut.new(@io, self) 284 if block 285 begin 286 block.call(out) 287 ensure 288 out.close 289 end 290 else 291 return out 292 end 293 end