class CTI::Session

Version

$Id: Session.rb 1617 2022-01-24 07:26:44Z miyabe $

ドキュメント変換サーバーへの接続オブジェクトです。

end

Public Class Methods

new(io, opts) click to toggle source

セッションを構築します。このメソッドを直接呼び出す必要はありません。

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

abort(mode) click to toggle source

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

mode

中断モード 0=生成済みのデータを出力して中断, 1=即時中断

end

    # File CTI/Session.rb
326 def abort(mode)
327   raise "abort: The session is already closed."  if @state >= 3
328   @io.req_abort(mode)
329 end
build_next() click to toggle source
    # 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
close() click to toggle source

セッションを閉じます。

end

    # File CTI/Session.rb
369 def close
370   raise "close: The session is already closed."  if @state >= 3
371   @io.req_close;
372   @state = 3
373 end
get_server_info(uri) click to toggle source

サーバー情報を返します。 詳細はオンラインのドキュメントをご覧下さい。

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

結果を結合します。

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

プロパティを設定します。

セッションを作成した直後に呼び出してください。 利用可能なプロパティの一覧は資料集を参照してください。

name

名前

value

end

    # File CTI/Session.rb
214 def property(name, value)
215   raise "property: Main content is already sent." if @state >= 2
216   @io.req_property(name, value)
217 end
receive_message(&messageFunc) click to toggle source

エラーメッセージ受信のためのブロックを設定します。

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
receive_progress(&progressFunc) click to toggle source

進行状況受信のためのブロックを設定します。

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

全ての状態をリセットします。

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
resolver(&resolverFunc) click to toggle source

リソース解決のためのブロックを設定します。

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
resource(uri, opts = {}, &block) click to toggle source

リソース送信処理を行います。 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
set_continuous(continuous) click to toggle source

複数の結果を結合するモードを切り替えます。 モードが有効な場合、 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
set_output_as_directory(dir, prefix = '', suffix = '') click to toggle source

変換結果の出力先ディレクトリ名を指定します。

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

変換結果の出力先ファイル名を指定します。

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

変換結果の出力先リソースを指定します。

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

変換結果の出力先を指定します。

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
transcode(uri = '.', opts = {}, &block) click to toggle source

変換対象の文書リソースを送信し、変換処理を行います。

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

DEPRECATED: {#transcode_server} を使って下さい。

サーバー側リソースを変換します。

uri

URI

end

    # File CTI/Session.rb
316 def transcodeServer(uri)
317   transcode_server(uri)
318 end
transcode_server(uri) click to toggle source

サーバー側リソースを変換します。

uri

URI

end

    # File CTI/Session.rb
301 def transcode_server(uri)
302   raise "transcode_server: Main content is already sent." if @state >= 2
303   @io.req_server_main(uri)
304   @state = 2
305   while build_next
306   end
307 end