knjrbfw 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. data/Gemfile +3 -1
  2. data/VERSION +1 -1
  3. data/knjrbfw.gemspec +14 -4
  4. data/lib/knj/amixer.rb +148 -0
  5. data/lib/knj/arrayext.rb +14 -5
  6. data/lib/knj/autoload.rb +63 -57
  7. data/lib/knj/autoload/backups/facets_dictionary.rb +2 -2
  8. data/lib/knj/autoload/erubis.rb +2 -0
  9. data/lib/knj/cmd_gen.rb +71 -0
  10. data/lib/knj/compiler.rb +2 -2
  11. data/lib/knj/datarow.rb +138 -38
  12. data/lib/knj/datestamp.rb +2 -2
  13. data/lib/knj/datet.rb +72 -17
  14. data/lib/knj/erb/include.rb +5 -5
  15. data/lib/knj/errors.rb +4 -1
  16. data/lib/knj/eruby.rb +25 -11
  17. data/lib/knj/event_filemod.rb +27 -26
  18. data/lib/knj/event_handler.rb +8 -8
  19. data/lib/knj/exchangerates.rb +1 -1
  20. data/lib/knj/facebook_connect.rb +37 -0
  21. data/lib/knj/gettext_threadded.rb +4 -3
  22. data/lib/knj/google_sitemap.rb +1 -1
  23. data/lib/knj/hash_methods.rb +1 -1
  24. data/lib/knj/http.rb +35 -19
  25. data/lib/knj/http2.rb +249 -0
  26. data/lib/knj/image.rb +128 -0
  27. data/lib/knj/jruby-gtk2/gtk2.rb +1 -1
  28. data/lib/knj/knj.rb +1 -1
  29. data/lib/knj/knj_controller.rb +0 -2
  30. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +3 -3
  31. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -11
  32. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +2 -2
  33. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +71 -14
  34. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +17 -14
  35. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +5 -5
  36. data/lib/knj/knjdb/libknjdb.rb +33 -16
  37. data/lib/knj/knjdb/libknjdb_row.rb +8 -8
  38. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +1 -1
  39. data/lib/knj/mount.rb +6 -6
  40. data/lib/knj/mutexcl.rb +2 -2
  41. data/lib/knj/objects.rb +286 -73
  42. data/lib/knj/opts.rb +11 -4
  43. data/lib/knj/os.rb +16 -3
  44. data/lib/knj/php.rb +73 -26
  45. data/lib/knj/php_parser/php_parser.rb +1 -77
  46. data/lib/knj/retry.rb +4 -4
  47. data/lib/knj/rhodes/rhodes.rb +106 -0
  48. data/lib/knj/sshrobot/sshrobot.rb +1 -1
  49. data/lib/knj/strings.rb +72 -0
  50. data/lib/knj/sysuser.rb +1 -1
  51. data/lib/knj/tests/test_http2.rb +18 -0
  52. data/lib/knj/thread.rb +1 -5
  53. data/lib/knj/thread2.rb +3 -3
  54. data/lib/knj/threadhandler.rb +2 -2
  55. data/lib/knj/threadpool.rb +4 -4
  56. data/lib/knj/translations.rb +2 -17
  57. data/lib/knj/unix_proc.rb +3 -3
  58. data/lib/knj/web.rb +156 -77
  59. data/lib/knj/webscripts/image.rhtml +22 -3
  60. data/lib/knj/x11vnc.rb +3 -3
  61. data/spec/amixer_spec.rb +27 -0
  62. data/spec/knjrbfw_spec.rb +70 -12
  63. data/testfiles/image.jpg +0 -0
  64. metadata +32 -14
  65. data/Gemfile.lock +0 -32
@@ -0,0 +1,249 @@
1
+ class Knj::Http2
2
+ attr_reader :cookies
3
+
4
+ def initialize(args)
5
+ @args = args
6
+ @cookies = {}
7
+ @debug = @args[:debug]
8
+
9
+ if !@args[:port]
10
+ if @args[:ssl]
11
+ @args[:port] = 443
12
+ else
13
+ @args[:port] = 80
14
+ end
15
+ end
16
+
17
+ if @args[:nl]
18
+ @nl = @args[:nl]
19
+ else
20
+ @nl = "\r\n"
21
+ end
22
+
23
+ if @args[:user_agent]
24
+ @uagent = @args[:user_agent]
25
+ else
26
+ @uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
27
+ end
28
+
29
+ raise "No host was given." if !@args[:host]
30
+
31
+ @sock_plain = TCPSocket.new(@args[:host], @args[:port])
32
+
33
+ if @args[:ssl]
34
+ require "openssl"
35
+
36
+ ssl_context = OpenSSL::SSL::SSLContext.new
37
+ #ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
38
+ #ssl_context.ca_file = CA_FILE
39
+
40
+ @sock_ssl = OpenSSL::SSL::SSLSocket.new(@sock_plain, ssl_context)
41
+ @sock_ssl.sync_close = true
42
+ @sock_ssl.connect
43
+
44
+ @sock = @sock_ssl
45
+ else
46
+ @sock = @sock_plain
47
+ end
48
+ end
49
+
50
+ def get(addr)
51
+ header_str = "GET /#{addr} HTTP/1.1#{@nl}"
52
+ header_str += self.header_str(
53
+ "Host" => @args[:host],
54
+ "Connection" => "Keep-Alive",
55
+ "User-Agent" => @uagent
56
+ )
57
+ header_str += "#{@nl}"
58
+
59
+ @sock.puts(header_str)
60
+ return self.read_response
61
+ end
62
+
63
+ def post(addr, pdata = {})
64
+ praw = ""
65
+ pdata.each do |key, val|
66
+ praw += "&" if praw != ""
67
+ praw += "#{Knj::Web.urlenc(key)}=#{Knj::Web.urlenc(val)}"
68
+ end
69
+
70
+ header_str = "POST /#{addr} HTTP/1.1#{@nl}"
71
+ header_str += self.header_str(
72
+ "Host" => @args[:host],
73
+ "Connection" => "Keep-Alive",
74
+ "User-Agent" => @uagent,
75
+ "Content-Length" => praw.length
76
+ )
77
+ header_str += "#{@nl}"
78
+ header_str += praw
79
+
80
+ @sock.puts(header_str)
81
+ return self.read_response
82
+ end
83
+
84
+ def header_str(headers_hash)
85
+ if @cookies.length > 0
86
+ cstr = ""
87
+
88
+ first = true
89
+ @cookies.each do |cookie_name, cookie_data|
90
+ cstr += "; " if !first
91
+ first = false if first
92
+
93
+ cstr += "#{Knj::Web.urlenc(cookie_data["name"])}=#{Knj::Web.urlenc(cookie_data["value"])}"
94
+ end
95
+
96
+ headers_hash["Cookie"] = cstr
97
+ end
98
+
99
+ headers_str = ""
100
+
101
+ headers_hash.each do |key, val|
102
+ headers_str += "#{key}: #{val}#{@nl}"
103
+ end
104
+
105
+ return headers_str
106
+ end
107
+
108
+ def read_response
109
+ @mode = "headers"
110
+ @resp = Knj::Http2::Response.new
111
+
112
+ loop do
113
+ print "Reading next line.\n" if @debug
114
+ line = @sock.gets
115
+ break if line.to_s == ""
116
+
117
+ if @mode == "headers" and line == @nl
118
+ break if @resp.header("content-length") == "0"
119
+ @mode = "body"
120
+ next
121
+ end
122
+
123
+ if @mode == "headers"
124
+ self.parse_header(line)
125
+ elsif @mode == "body"
126
+ stat = self.parse_body(line)
127
+ break if stat == "break"
128
+ next if stat == "next"
129
+ end
130
+ end
131
+
132
+ #Release variables.
133
+ resp = @resp
134
+ @resp = nil
135
+ @mode = nil
136
+
137
+ if resp.args[:code] == "302" and resp.header?("location")
138
+ uri = URI.parse(resp.header("location"))
139
+
140
+ args = {:host => uri.host}
141
+ args[:ssl] = true if uri.scheme == "https"
142
+ args[:port] = uri.port if uri.port
143
+
144
+ if !args[:host] or args[:host] == @args[:host]
145
+ return self.get(resp.header("location"))
146
+ else
147
+ http = Knj::Http2.new(args)
148
+ return http.get(uri.path)
149
+ end
150
+ else
151
+ return resp
152
+ end
153
+ end
154
+
155
+ def parse_header(line)
156
+ if match = line.match(/^(.+?):\s*(.+)#{@nl}$/)
157
+ key = match[1].to_s.downcase
158
+
159
+ if key == "set-cookie"
160
+ Knj::Web.parse_set_cookies(match[2]).each do |cookie_data|
161
+ @cookies[cookie_data["name"]] = cookie_data
162
+ end
163
+ end
164
+
165
+ @resp.headers[key] = [] if !@resp.headers.key?(key)
166
+ @resp.headers[key] << match[2]
167
+ elsif match = line.match(/^HTTP\/([\d\.]+)\s+(\d+)\s+(.+)$/)
168
+ @resp.args[:code] = match[2]
169
+ @resp.args[:http_version] = match[1]
170
+ else
171
+ raise "Could not understand header string: '#{line}'."
172
+ end
173
+ end
174
+
175
+ def parse_body(line)
176
+ if @resp.args[:http_version] = "1.1"
177
+ return "break" if @resp.header("content-length") == "0"
178
+
179
+ if @resp.header("transfer-encoding").to_s.downcase == "chunked"
180
+ len = line.strip.hex
181
+
182
+ print "Content-Length: #{@resp.header("content-length")}\n" if @debug
183
+ print "Current body length: #{@resp.args[:body].length}\n" if @debug
184
+ print "Chunk length: #{len}\n" if @debug
185
+
186
+ print "Reading chunked.\n" if @debug
187
+ if len > 0
188
+ read = @sock.read(len)
189
+ return "break" if read == "" or read == @nl
190
+ @resp.args[:body] += read
191
+ end
192
+
193
+ print "Reading trailing NL.\n" if @debug
194
+ nl = @sock.gets
195
+ if len == 0
196
+ if nl == @nl
197
+ return "break"
198
+ else
199
+ raise "Dont know what to do :'-("
200
+ end
201
+ end
202
+
203
+ #print "Test: '#{nl}'\n"
204
+ raise "Should have read newline but didnt: '#{nl}'." if nl != @nl
205
+ else
206
+ @resp.args[:body] += line.to_s
207
+ return "break" if @resp.header?("content-length") and @resp.args[:body].length >= @resp.header("content-length").to_i
208
+ end
209
+ else
210
+ raise "Dont know how to read HTTP version: '#{@resp.args[:http_version]}'."
211
+ end
212
+ end
213
+ end
214
+
215
+ class Knj::Http2::Response
216
+ attr_reader :args
217
+
218
+ def initialize(args = {})
219
+ @args = args
220
+ @args[:headers] = {} if !@args.key?(:headers)
221
+ @args[:body] = "" if !@args.key?(:body)
222
+ end
223
+
224
+ def headers
225
+ return @args[:headers]
226
+ end
227
+
228
+ def header(key)
229
+ return false if !@args[:headers].key?(key)
230
+ return @args[:headers][key].first.to_s
231
+ end
232
+
233
+ def header?(key)
234
+ return true if @args[:headers].key?(key) and @args[:headers][key].first.to_s.length > 0
235
+ return false
236
+ end
237
+
238
+ def code
239
+ return @args[:code]
240
+ end
241
+
242
+ def http_version
243
+ return @args[:http_version]
244
+ end
245
+
246
+ def body
247
+ return @args[:body]
248
+ end
249
+ end
@@ -0,0 +1,128 @@
1
+ class Knj::Image
2
+ #This function can make rounded transparent corners on an image with a given radius. Further more it can also draw borders around the entire image in a given color and take the border into account.
3
+ def self.rounded_corners(args)
4
+ raise "No or invalid ':img' given." if !args[:img]
5
+ raise "No or invalid ':radius' given." if args[:radius].to_i <= 0
6
+
7
+ pic = args[:img]
8
+
9
+ r = args[:radius].to_i
10
+ r_half = r / 2
11
+ r2 = r * r
12
+ d = r * 2
13
+
14
+ center_x = r - 1
15
+ center_y = 1
16
+
17
+ coords = {}
18
+ 0.upto(r) do |x|
19
+ y = center_y + Math.sqrt(r2 - ((x - center_x) * (x - center_x)))
20
+ coords[x] = y.to_i
21
+ end
22
+
23
+ if args[:border]
24
+ draw = Magick::Draw.new
25
+ draw.stroke(args[:border_color])
26
+ draw.stroke_width(1)
27
+
28
+ 0.upto(args[:border] - 1) do |x|
29
+ draw.line(x, 0, x, pic.rows)
30
+ draw.line(pic.columns-x-1, 0, pic.columns-x-1, pic.rows)
31
+
32
+ draw.line(0, x, pic.columns, x)
33
+ draw.line(0, pic.rows-x-1, pic.columns, pic.rows-x-1)
34
+ end
35
+
36
+ draw.draw(pic)
37
+ end
38
+
39
+ borders = [] if args[:border]
40
+
41
+ 1.upto(4) do |count|
42
+ r.times do |x|
43
+ border_from = nil
44
+ border_to = nil
45
+ border_mode = nil
46
+
47
+ case count
48
+ when 1
49
+ x_from = x
50
+
51
+ y_from = 0
52
+ y_to = r - coords[x]
53
+
54
+ if borders and x > 0 and x < r_half
55
+ border_from = y_to
56
+ border_to = r - coords[x - 1]
57
+ border_to = 1 if border_to < 1
58
+
59
+ #top left
60
+ borders << {:x => x_from, :yf => border_from, :yt => border_to}
61
+ borders << {:y => x_from, :xf => border_from, :xt => border_to}
62
+
63
+ #top right
64
+ borders << {:x => pic.columns - x - 1, :yf => border_from, :yt => border_to}
65
+ borders << {:y => x_from, :xf => pic.columns - border_to, :xt => pic.columns - border_from}
66
+
67
+ #bottom left
68
+ borders << {:x => x_from, :yf => pic.rows - border_to, :yt => pic.rows - border_from}
69
+ borders << {:y => pic.rows - x - 1, :xf => border_from, :xt => border_to}
70
+
71
+ #bottom right
72
+ borders << {:x => pic.columns - x - 1, :yf => pic.rows - border_to, :yt => pic.rows - border_from}
73
+ borders << {:y => pic.rows - x - 1, :xf => pic.columns - border_to, :xt => pic.columns - border_from}
74
+ end
75
+ when 2
76
+ x_from = pic.columns - r + x
77
+
78
+ y_from = 0
79
+ y_to = r - coords[r - x - 1]
80
+ when 3
81
+ x_from = x
82
+
83
+ y_from = pic.rows - r + coords[x]
84
+ y_to = pic.rows - y_from
85
+ when 4
86
+ x_from = pic.columns - r + x
87
+
88
+ y_from = pic.rows - r + coords[r - x - 1]
89
+ y_to = pic.rows - y_from
90
+ end
91
+
92
+ next if y_to <= 0
93
+
94
+ #Make corners transparent.
95
+ pixels = pic.get_pixels(x_from, y_from, 1, y_to)
96
+ pixels.each do |pixel|
97
+ pixel.opacity = Magick::TransparentOpacity
98
+ end
99
+
100
+ pic.store_pixels(x_from, y_from, 1, y_to, pixels)
101
+ end
102
+ end
103
+
104
+ if borders
105
+ borders.each do |border|
106
+ if border.key?(:x)
107
+ count_from = border[:yf]
108
+ count_to = border[:yt]
109
+ elsif border.key?(:y)
110
+ count_from = border[:xf]
111
+ count_to = border[:xt]
112
+ end
113
+
114
+ count_from.upto(count_to - 1) do |coord|
115
+ pixel = Magick::Pixel.from_color(args[:border_color])
116
+
117
+ if border.key?(:x)
118
+ pic.pixel_color(border[:x], coord, pixel)
119
+ elsif border.key?(:y)
120
+ pic.pixel_color(coord, border[:y], pixel)
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ pic.matte = true
127
+ end
128
+ end
@@ -44,7 +44,7 @@ module Gtk
44
44
  "org.gnome.gtk.Window" => org.gnome.gtk.Window
45
45
  }
46
46
  def self.evalob(evalobstr)
47
- if !@evalobs.has_key?(evalobstr)
47
+ if !@evalobs.key?(evalobstr)
48
48
  print "Not statically written: #{evalobstr}\n"
49
49
  @evalobs[evalobstr] = eval(evalobstr)
50
50
  end
@@ -4,7 +4,7 @@ else
4
4
  autoload_path = "#{File.dirname(__FILE__)}/autoload.rb"
5
5
  end
6
6
 
7
- require autoload_path
7
+ require autoload_path if $knjautoload != false
8
8
 
9
9
  module Knj
10
10
  def self.appserver_cli(filename)
@@ -1,7 +1,5 @@
1
1
  #This files makes the framework able to receive calls from the Rhodes framework from RhoMobile.
2
2
  class KnjController < Rho::RhoController
3
- include BrowserHelper
4
-
5
3
  #GET /Server
6
4
  def index
7
5
  render
@@ -12,7 +12,7 @@ class KnjDB_mysql
12
12
  @esc_col = "`"
13
13
  @mutex = Mutex.new
14
14
 
15
- if @knjdb.opts.has_key?(:port)
15
+ if @knjdb.opts.key?(:port)
16
16
  @port = @knjdb.opts[:port].to_i
17
17
  else
18
18
  @port = 3306
@@ -43,7 +43,7 @@ class KnjDB_mysql
43
43
 
44
44
  pos_args = [:as, :async, :cast_booleans, :database_timezone, :application_timezone, :cache_rows, :connect_flags, :cast]
45
45
  pos_args.each do |key|
46
- args[key] = @knjdb.opts[key] if @knjdb.opts.has_key?(key)
46
+ args[key] = @knjdb.opts[key] if @knjdb.opts.key?(key)
47
47
  end
48
48
 
49
49
  @conn = Mysql2::Client.new(args)
@@ -175,7 +175,7 @@ class KnjDB_mysql
175
175
  end
176
176
  else
177
177
  data = self.query("SELECT LAST_INSERT_ID() AS id").fetch
178
- return data[:id] if data.has_key?(:id)
178
+ return data[:id] if data.key?(:id)
179
179
  raise "Could not figure out last inserted ID."
180
180
  end
181
181
  end
@@ -10,7 +10,7 @@ class KnjDB_mysql::Columns
10
10
  def data_sql(data)
11
11
  raise "No type given." if !data["type"]
12
12
 
13
- data["maxlength"] = 255 if data["type"] == "varchar" and !data.has_key?("maxlength")
13
+ data["maxlength"] = 255 if data["type"] == "varchar" and !data.key?("maxlength")
14
14
 
15
15
  sql = "`#{data["name"]}` #{data["type"]}"
16
16
  sql += "(#{data["maxlength"]})" if data["maxlength"]
@@ -18,13 +18,13 @@ class KnjDB_mysql::Columns
18
18
  sql += " AUTO_INCREMENT" if data["autoincr"]
19
19
  sql += " NOT NULL" if !data["null"]
20
20
 
21
- if data.has_key?("default_func")
21
+ if data.key?("default_func")
22
22
  sql += " DEFAULT #{data["default_func"]}"
23
- elsif data.has_key?("default") and data["default"] != false
23
+ elsif data.key?("default") and data["default"] != false
24
24
  sql += " DEFAULT '#{@db.escape(data["default"])}'"
25
25
  end
26
26
 
27
- sql += " COMMENT '#{@db.escape(data["comment"])}'" if data.has_key?("comment")
27
+ sql += " COMMENT '#{@db.escape(data["comment"])}'" if data.key?("comment")
28
28
  sql += " AFTER `#{@db.esc_col(data["after"])}`" if data["after"] and !data["first"]
29
29
  sql += " FIRST" if data["first"]
30
30
 
@@ -116,15 +116,15 @@ class KnjDB_mysql::Columns::Column
116
116
  table_escape = "#{@args[:driver].escape_table}#{@args[:driver].esc_table(@args[:table].name)}#{@args[:driver].escape_table}"
117
117
  newdata = data.clone
118
118
 
119
- newdata["name"] = self.name if !newdata.has_key?("name")
120
- newdata["type"] = self.type if !newdata.has_key?("type")
121
- newdata["maxlength"] = self.maxlength if !newdata.has_key?("maxlength") and self.maxlength
122
- newdata["null"] = self.null? if !newdata.has_key?("null")
123
- newdata["default"] = self.default if !newdata.has_key?("default")
124
- newdata.delete("primarykey") if newdata.has_key?("primarykey")
119
+ newdata["name"] = self.name if !newdata.key?("name")
120
+ newdata["type"] = self.type if !newdata.key?("type")
121
+ newdata["maxlength"] = self.maxlength if !newdata.key?("maxlength") and self.maxlength
122
+ newdata["null"] = self.null? if !newdata.key?("null")
123
+ newdata["default"] = self.default if !newdata.key?("default")
124
+ newdata.delete("primarykey") if newdata.key?("primarykey")
125
125
 
126
126
  type_s = newdata["type"].to_s
127
127
  @db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.cols.data_sql(newdata)}")
128
- @args[:table].list = nil if data.has_key?("name") and data["name"] != self.name
128
+ @args[:table].list = nil if data.key?("name") and data["name"] != self.name
129
129
  end
130
130
  end