Module: Tem::Apdus::Buffers
- Included in:
- Session
- Defined in:
- lib/tem/apdus/buffers.rb
Instance Method Summary collapse
- #alloc_buffer(length) ⇒ Object
- #flush_buffers ⇒ Object
- #get_buffer_length(buffer_id) ⇒ Object
- #guess_buffer_chunk_size ⇒ Object
- #guess_buffer_chunk_size! ⇒ Object
- #post_buffer(data) ⇒ Object
- #read_buffer(buffer_id) ⇒ Object
- #release_buffer(buffer_id) ⇒ Object
- #stat_buffers ⇒ Object
- #write_buffer(buffer_id, data) ⇒ Object
Instance Method Details
#alloc_buffer(length) ⇒ Object
5 6 7 8 9 |
# File 'lib/tem/apdus/buffers.rb', line 5 def alloc_buffer(length) response = @transport.applet_apdu! :ins => 0x20, :p12 => to_tem_short(length) return read_tem_byte(response, 0) end |
#flush_buffers ⇒ Object
15 16 17 |
# File 'lib/tem/apdus/buffers.rb', line 15 def flush_buffers @transport.applet_apdu! :ins => 0x26 end |
#get_buffer_length(buffer_id) ⇒ Object
19 20 21 22 |
# File 'lib/tem/apdus/buffers.rb', line 19 def get_buffer_length(buffer_id) response = @transport.applet_apdu! :ins => 0x22, :p1 => buffer_id return read_tem_short(response, 0) end |
#guess_buffer_chunk_size ⇒ Object
52 53 54 |
# File 'lib/tem/apdus/buffers.rb', line 52 def guess_buffer_chunk_size @buffer_chunk_size ||= guess_buffer_chunk_size! end |
#guess_buffer_chunk_size! ⇒ Object
56 57 58 59 |
# File 'lib/tem/apdus/buffers.rb', line 56 def guess_buffer_chunk_size! response = @transport.applet_apdu! :ins => 0x25 return read_tem_short(response, 0) end |
#post_buffer(data) ⇒ Object
82 83 84 85 86 |
# File 'lib/tem/apdus/buffers.rb', line 82 def post_buffer(data) buffer_id = alloc_buffer data.length write_buffer buffer_id, data return buffer_id end |
#read_buffer(buffer_id) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/tem/apdus/buffers.rb', line 24 def read_buffer(buffer_id) guess_buffer_chunk_size buffer = [] chunk_id = 0 while true do response = @transport.applet_apdu! :ins => 0x23, :p1 => buffer_id, :p2 => chunk_id buffer += response break if response.length != @buffer_chunk_size chunk_id += 1 end return buffer end |
#release_buffer(buffer_id) ⇒ Object
11 12 13 |
# File 'lib/tem/apdus/buffers.rb', line 11 def release_buffer(buffer_id) @transport.applet_apdu! :ins => 0x21, :p1 => buffer_id end |
#stat_buffers ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/tem/apdus/buffers.rb', line 61 def stat_buffers response = @transport.applet_apdu! :ins => 0x27 memory_types = [:persistent, :clear_on_reset, :clear_on_deselect] stat = {:free => {}, :buffers => []} memory_types.each_with_index { |mt, i| stat[:free][mt] = read_tem_short(response, i * 2) } offset = 6 i = 0 while offset < response.length do stat[:buffers][i] = {:type => memory_types[read_tem_ubyte(response, offset) & 0x3f], :pinned => (read_tem_ubyte(response, offset) & 0x80) != 0, :free => (read_tem_ubyte(response, offset) & 0x40) == 0, :length => read_tem_ushort(response, offset + 1), :xlength => read_tem_ushort(response, offset + 3)} offset += 5 i += 1 end return stat end |
#write_buffer(buffer_id, data) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/tem/apdus/buffers.rb', line 39 def write_buffer(buffer_id, data) guess_buffer_chunk_size chunk_id, offset = 0, 0 while offset < data.length do write_size = [data.length - offset, @buffer_chunk_size].min @transport.applet_apdu! :ins => 0x24, :p1 => buffer_id, :p2 => chunk_id, :data => data[offset, write_size] chunk_id += 1 offset += write_size end end |