diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2011-04-12 21:23:29 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2011-04-12 21:23:29 +0200 |
commit | 3a2eecb5bcf35120fcf3a9dcf1637459c99a6abe (patch) | |
tree | 591d46a4a6f0bcfbc200e9c4a92508ee26974eb8 /lib/e17/eet.rb | |
parent | 131839bfb26fadebc32ce86c10784e2ca2647bbc (diff) | |
download | ffi-efl-3a2eecb5bcf35120fcf3a9dcf1637459c99a6abe.zip ffi-efl-3a2eecb5bcf35120fcf3a9dcf1637459c99a6abe.tar.gz |
rename to ffi-e17
Diffstat (limited to 'lib/e17/eet.rb')
-rw-r--r-- | lib/e17/eet.rb | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/e17/eet.rb b/lib/e17/eet.rb new file mode 100644 index 0000000..929a0f8 --- /dev/null +++ b/lib/e17/eet.rb @@ -0,0 +1,131 @@ +#! /usr/bin/env ruby +# -*- coding: UTF-8 -*- +# +require 'ffi' +# +module E17 + module EET + # + extend FFI::Library + # + ffi_lib 'eet' + [ + [ :eet_init, [], :int], + [ :eet_shutdown, [], :int], + [ :eet_clearcache, [], :void], + [ :eet_open, [:string, :int], :pointer], + [ :eet_mode_get, [:pointer], :int], + [ :eet_close, [:pointer], :int], + [ :eet_write, [:pointer, :string, :pointer, :int, :int], :int], + [ :eet_read, [:pointer, :string, :pointer], :pointer], + ].each do |func| + begin + attach_function *func + rescue Object => e + puts "Could not attach #{func} #{e.message}" + end + end + # + FILE_MODE_INVALID = -1 + FILE_MODE_READ = 0 + FILE_MODE_WRITE = 1 + FILE_MODE_READ_WRITE = 2 + # + class << self + # + alias init eet_init + alias shutdown eet_shutdown + alias clearcache eet_clearcache + # + def open path, mode=FILE_MODE_READ, &blk + if blk + f = eet_open path, mode + raise Exception.new "Unable to open file #{path}" if f.nil? + yield EETFile.new f + eet_close f + else + f = eet_open path, mode + return EETFile.new f unless f.nil? + end + end + end + # + class EETFile + # + def initialize ptr + @ptr=ptr + end + private :initialize + # + def close + EET.eet_close @ptr + @ptr=nil + end + # + def mode_get + EET.eet_mode_get @ptr + end + # + def write key, data, compress=false + EET.eet_write @ptr, key, FFI::MemoryPointer.from_string(data), data.bytesize, ( compress ? 1 : 0 ) + end + # + def read key + ptr = FFI::MemoryPointer.new(:int) + data = EET.eet_read @ptr, key, ptr + s = ptr.read_int + ptr.free + return nil if s==0 + ( data.null? ? nil : data.read_string[0..s-1] ) + end + # + end + # + class Error < Exception + ERROR_NONE=0 + ERROR_BAD_OBJECT=1 + ERROR_EMPTY=2 + ERROR_NOT_WRITABLE=3 + ERROR_OUT_OF_MEMORY=4 + ERROR_WRITE_ERROR=5 + ERROR_WRITE_ERROR_FILE_TOO_BIG=6 + ERROR_WRITE_ERROR_IO_ERROR=7 + ERROR_WRITE_ERROR_OUT_OF_SPACE=8 + ERROR_WRITE_ERROR_FILE_CLOSED=9 + ERROR_MMAP_FAILED=10 + ERROR_X509_ENCODING_FAILED=11 + ERROR_SIGNATURE_FAILED=12 + ERROR_INVALID_SIGNATURE=13 + ERROR_NOT_SIGNED=14 + ERROR_NOT_IMPLEMENTED=15 + ERROR_PRNG_NOT_SEEDED=16 + ERROR_ENCRYPT_FAILED=17 + ERROR_DECRYPT_FAILED=18 + # + MSGS = { + 0=>'No error, it\'s all fine!', + 1=>' Given object or handle is NULL or invalid', + 2=>'There was nothing to do', + 3=>'Could not write to file or fine is #FILE_MODE_READ', + 4=>'Could not allocate memory', + 5=>'Failed to write data to destination', + 6=>'Failed to write file since it is too big', + 7=>'Failed to write since generic Input/Output error', + 8=>'Failed to write due out of space', + 9=>'Failed to write because file was closed', + 10=>'Could not mmap file', + 11=>'Could not encode using X509', + 12=>'Could not validate signature', + 13=>'Signature is invalid', + 14=>'File or contents are not signed', + 15=>'Function is not implemented', + 16=>'Could not introduce random seed', + 17=>'Could not encrypt contents', + 18=>'Could not decrypt contents', + } + # + end + end +end +# +# EOF |