rhodes 1.5.4 → 1.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Manifest.txt +11 -1
  2. data/Rakefile +1 -1
  3. data/lib/extensions/digest/ext/Rakefile +11 -6
  4. data/lib/extensions/digest/ext/build.bat +2 -0
  5. data/lib/extensions/uri/uri.rb +29 -0
  6. data/lib/extensions/uri/uri/common.rb +727 -0
  7. data/lib/extensions/uri/uri/ftp.rb +198 -0
  8. data/lib/extensions/uri/uri/generic.rb +1128 -0
  9. data/lib/extensions/uri/uri/http.rb +100 -0
  10. data/lib/extensions/uri/uri/https.rb +20 -0
  11. data/lib/extensions/uri/uri/ldap.rb +190 -0
  12. data/lib/extensions/uri/uri/ldaps.rb +12 -0
  13. data/lib/extensions/uri/uri/mailto.rb +266 -0
  14. data/lib/framework/rhodes.rb +2 -2
  15. data/lib/framework/rhom/rhom_db_adapter.rb +12 -26
  16. data/lib/framework/rhom/rhom_object_factory.rb +8 -1
  17. data/lib/framework/version.rb +2 -2
  18. data/lib/rhodes.rb +2 -2
  19. data/platform/android/Rhodes/AndroidManifest.xml +2 -2
  20. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +87 -42
  21. data/platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java +58 -7
  22. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java +2 -0
  23. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +35 -19
  24. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +4 -0
  25. data/platform/android/build/android.rake +30 -25
  26. data/platform/bb/build/rhodes_build.files +1 -1
  27. data/platform/bb/rhodes/rhodes.jdp +1 -1
  28. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +1 -1
  29. data/platform/bb/rhodes/src/com/rho/rubyext/Alert.java +300 -0
  30. data/platform/bb/rhodes/src/com/rho/rubyext/GeoLocation.java +42 -5
  31. data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +3 -4
  32. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +33 -107
  33. data/platform/iphone/Classes/RhoRunnerAppDelegate.m +2 -0
  34. data/platform/iphone/Info.plist +1 -1
  35. data/platform/iphone/rbuild/iphone.rake +1 -1
  36. data/platform/iphone/rhoextlib/rhoextlib.xcodeproj/project.pbxproj +4 -0
  37. data/platform/shared/common/RhoMutexLock.h +8 -1
  38. data/platform/shared/common/RhodesApp.cpp +1 -1
  39. data/platform/shared/db/DBAdapter.cpp +77 -8
  40. data/platform/shared/db/DBAdapter.h +24 -9
  41. data/platform/shared/db/DBResult.cpp +19 -0
  42. data/platform/shared/db/DBResult.h +7 -5
  43. data/platform/shared/net/HttpServer.cpp +2 -0
  44. data/platform/shared/ruby/ext/rho/rhoruby.c +55 -0
  45. data/platform/shared/ruby/ext/rho/rhoruby.h +9 -0
  46. data/platform/shared/ruby/ext/rho/rhosupport.c +13 -4
  47. data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +21 -0
  48. data/platform/shared/ruby/thread_pthread.c +4 -4
  49. data/platform/shared/ruby/thread_win32.c +4 -4
  50. data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +19 -1
  51. data/platform/shared/rubyJVM/src/com/rho/db/DBAdapter.java +57 -24
  52. data/platform/shared/rubyJVM/src/com/rho/net/NetRequest.java +6 -1
  53. data/platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java +2 -2
  54. data/platform/shared/rubyJVM/src/com/rho/sync/SyncThread.java +5 -5
  55. data/platform/shared/sync/SyncSource.cpp +1 -1
  56. data/platform/shared/sync/SyncThread.cpp +6 -9
  57. data/platform/wm/rhodes/Rhodes.cpp +4 -0
  58. data/rakefile.rb +1 -1
  59. metadata +13 -3
  60. data/platform/bb/rhodes/src/rhomobile/Alert.java +0 -65
@@ -0,0 +1,100 @@
1
+ #
2
+ # = uri/http.rb
3
+ #
4
+ # Author:: Akira Yamada <akira@ruby-lang.org>
5
+ # License:: You can redistribute it and/or modify it under the same term as Ruby.
6
+ # Revision:: $Id: http.rb 11708 2007-02-12 23:01:19Z shyouhei $
7
+ #
8
+
9
+ require 'uri/generic'
10
+
11
+ module URI
12
+
13
+ #
14
+ # The syntax of HTTP URIs is defined in RFC1738 section 3.3.
15
+ #
16
+ # Note that the Ruby URI library allows HTTP URLs containing usernames and
17
+ # passwords. This is not legal as per the RFC, but used to be
18
+ # supported in Internet Explorer 5 and 6, before the MS04-004 security
19
+ # update. See <URL:http://support.microsoft.com/kb/834489>.
20
+ #
21
+ class HTTP < Generic
22
+ DEFAULT_PORT = 80
23
+
24
+ COMPONENT = [
25
+ :scheme,
26
+ :userinfo, :host, :port,
27
+ :path,
28
+ :query,
29
+ :fragment
30
+ ].freeze
31
+
32
+ #
33
+ # == Description
34
+ #
35
+ # Create a new URI::HTTP object from components, with syntax checking.
36
+ #
37
+ # The components accepted are userinfo, host, port, path, query and
38
+ # fragment.
39
+ #
40
+ # The components should be provided either as an Array, or as a Hash
41
+ # with keys formed by preceding the component names with a colon.
42
+ #
43
+ # If an Array is used, the components must be passed in the order
44
+ # [userinfo, host, port, path, query, fragment].
45
+ #
46
+ # Example:
47
+ #
48
+ # newuri = URI::HTTP.build({:host => 'www.example.com',
49
+ # :path> => '/foo/bar'})
50
+ #
51
+ # newuri = URI::HTTP.build([nil, "www.example.com", nil, "/path",
52
+ # "query", 'fragment'])
53
+ #
54
+ # Currently, if passed userinfo components this method generates
55
+ # invalid HTTP URIs as per RFC 1738.
56
+ #
57
+ def self.build(args)
58
+ tmp = Util::make_components_hash(self, args)
59
+ return super(tmp)
60
+ end
61
+
62
+ #
63
+ # == Description
64
+ #
65
+ # Create a new URI::HTTP object from generic URI components as per
66
+ # RFC 2396. No HTTP-specific syntax checking (as per RFC 1738) is
67
+ # performed.
68
+ #
69
+ # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
70
+ # +opaque+, +query+ and +fragment+, in that order.
71
+ #
72
+ # Example:
73
+ #
74
+ # uri = URI::HTTP.new(['http', nil, "www.example.com", nil, "/path",
75
+ # "query", 'fragment'])
76
+ #
77
+ def initialize(*arg)
78
+ super(*arg)
79
+ end
80
+
81
+ #
82
+ # == Description
83
+ #
84
+ # Returns the full path for an HTTP request, as required by Net::HTTP::Get.
85
+ #
86
+ # If the URI contains a query, the full path is URI#path + '?' + URI#query.
87
+ # Otherwise, the path is simply URI#path.
88
+ #
89
+ def request_uri
90
+ r = path_query
91
+ if r[0] != ?/
92
+ r = '/' + r
93
+ end
94
+
95
+ r
96
+ end
97
+ end
98
+
99
+ @@schemes['HTTP'] = HTTP
100
+ end
@@ -0,0 +1,20 @@
1
+ #
2
+ # = uri/https.rb
3
+ #
4
+ # Author:: Akira Yamada <akira@ruby-lang.org>
5
+ # License:: You can redistribute it and/or modify it under the same term as Ruby.
6
+ # Revision:: $Id: https.rb 11708 2007-02-12 23:01:19Z shyouhei $
7
+ #
8
+
9
+ require 'uri/http'
10
+
11
+ module URI
12
+
13
+ # The default port for HTTPS URIs is 443, and the scheme is 'https:' rather
14
+ # than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs;
15
+ # see URI::HTTP.
16
+ class HTTPS < HTTP
17
+ DEFAULT_PORT = 443
18
+ end
19
+ @@schemes['HTTPS'] = HTTPS
20
+ end
@@ -0,0 +1,190 @@
1
+ #
2
+ # = uri/ldap.rb
3
+ #
4
+ # Author::
5
+ # Takaaki Tateishi <ttate@jaist.ac.jp>
6
+ # Akira Yamada <akira@ruby-lang.org>
7
+ # License::
8
+ # URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada.
9
+ # You can redistribute it and/or modify it under the same term as Ruby.
10
+ # Revision:: $Id: ldap.rb 11708 2007-02-12 23:01:19Z shyouhei $
11
+ #
12
+
13
+ require 'uri/generic'
14
+
15
+ module URI
16
+
17
+ #
18
+ # LDAP URI SCHEMA (described in RFC2255)
19
+ # ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
20
+ #
21
+ class LDAP < Generic
22
+
23
+ DEFAULT_PORT = 389
24
+
25
+ COMPONENT = [
26
+ :scheme,
27
+ :host, :port,
28
+ :dn,
29
+ :attributes,
30
+ :scope,
31
+ :filter,
32
+ :extensions,
33
+ ].freeze
34
+
35
+ SCOPE = [
36
+ SCOPE_ONE = 'one',
37
+ SCOPE_SUB = 'sub',
38
+ SCOPE_BASE = 'base',
39
+ ].freeze
40
+
41
+ def self.build(args)
42
+ tmp = Util::make_components_hash(self, args)
43
+
44
+ if tmp[:dn]
45
+ tmp[:path] = tmp[:dn]
46
+ end
47
+
48
+ query = []
49
+ [:extensions, :filter, :scope, :attributes].collect do |x|
50
+ next if !tmp[x] && query.size == 0
51
+ query.unshift(tmp[x])
52
+ end
53
+
54
+ tmp[:query] = query.join('?')
55
+
56
+ return super(tmp)
57
+ end
58
+
59
+ def initialize(*arg)
60
+ super(*arg)
61
+
62
+ if @fragment
63
+ raise InvalidURIError, 'bad LDAP URL'
64
+ end
65
+
66
+ parse_dn
67
+ parse_query
68
+ end
69
+
70
+ def parse_dn
71
+ @dn = @path[1..-1]
72
+ end
73
+ private :parse_dn
74
+
75
+ def parse_query
76
+ @attributes = nil
77
+ @scope = nil
78
+ @filter = nil
79
+ @extensions = nil
80
+
81
+ if @query
82
+ attrs, scope, filter, extensions = @query.split('?')
83
+
84
+ @attributes = attrs if attrs && attrs.size > 0
85
+ @scope = scope if scope && scope.size > 0
86
+ @filter = filter if filter && filter.size > 0
87
+ @extensions = extensions if extensions && extensions.size > 0
88
+ end
89
+ end
90
+ private :parse_query
91
+
92
+ def build_path_query
93
+ @path = '/' + @dn
94
+
95
+ query = []
96
+ [@extensions, @filter, @scope, @attributes].each do |x|
97
+ next if !x && query.size == 0
98
+ query.unshift(x)
99
+ end
100
+ @query = query.join('?')
101
+ end
102
+ private :build_path_query
103
+
104
+ def dn
105
+ @dn
106
+ end
107
+
108
+ def set_dn(val)
109
+ @dn = val
110
+ build_path_query
111
+ @dn
112
+ end
113
+ protected :set_dn
114
+
115
+ def dn=(val)
116
+ set_dn(val)
117
+ val
118
+ end
119
+
120
+ def attributes
121
+ @attributes
122
+ end
123
+
124
+ def set_attributes(val)
125
+ @attributes = val
126
+ build_path_query
127
+ @attributes
128
+ end
129
+ protected :set_attributes
130
+
131
+ def attributes=(val)
132
+ set_attributes(val)
133
+ val
134
+ end
135
+
136
+ def scope
137
+ @scope
138
+ end
139
+
140
+ def set_scope(val)
141
+ @scope = val
142
+ build_path_query
143
+ @scope
144
+ end
145
+ protected :set_scope
146
+
147
+ def scope=(val)
148
+ set_scope(val)
149
+ val
150
+ end
151
+
152
+ def filter
153
+ @filter
154
+ end
155
+
156
+ def set_filter(val)
157
+ @filter = val
158
+ build_path_query
159
+ @filter
160
+ end
161
+ protected :set_filter
162
+
163
+ def filter=(val)
164
+ set_filter(val)
165
+ val
166
+ end
167
+
168
+ def extensions
169
+ @extensions
170
+ end
171
+
172
+ def set_extensions(val)
173
+ @extensions = val
174
+ build_path_query
175
+ @extensions
176
+ end
177
+ protected :set_extensions
178
+
179
+ def extensions=(val)
180
+ set_extensions(val)
181
+ val
182
+ end
183
+
184
+ def hierarchical?
185
+ false
186
+ end
187
+ end
188
+
189
+ @@schemes['LDAP'] = LDAP
190
+ end
@@ -0,0 +1,12 @@
1
+ require 'uri/ldap'
2
+
3
+ module URI
4
+
5
+ # The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather
6
+ # than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs;
7
+ # see URI::LDAP.
8
+ class LDAPS < LDAP
9
+ DEFAULT_PORT = 636
10
+ end
11
+ @@schemes['LDAPS'] = LDAPS
12
+ end
@@ -0,0 +1,266 @@
1
+ #
2
+ # = uri/mailto.rb
3
+ #
4
+ # Author:: Akira Yamada <akira@ruby-lang.org>
5
+ # License:: You can redistribute it and/or modify it under the same term as Ruby.
6
+ # Revision:: $Id: mailto.rb 19495 2008-09-23 18:16:08Z drbrain $
7
+ #
8
+
9
+ require 'uri/generic'
10
+
11
+ module URI
12
+
13
+ #
14
+ # RFC2368, The mailto URL scheme
15
+ #
16
+ class MailTo < Generic
17
+ include REGEXP
18
+
19
+ DEFAULT_PORT = nil
20
+
21
+ COMPONENT = [ :scheme, :to, :headers ].freeze
22
+
23
+ # :stopdoc:
24
+ # "hname" and "hvalue" are encodings of an RFC 822 header name and
25
+ # value, respectively. As with "to", all URL reserved characters must
26
+ # be encoded.
27
+ #
28
+ # "#mailbox" is as specified in RFC 822 [RFC822]. This means that it
29
+ # consists of zero or more comma-separated mail addresses, possibly
30
+ # including "phrase" and "comment" components. Note that all URL
31
+ # reserved characters in "to" must be encoded: in particular,
32
+ # parentheses, commas, and the percent sign ("%"), which commonly occur
33
+ # in the "mailbox" syntax.
34
+ #
35
+ # Within mailto URLs, the characters "?", "=", "&" are reserved.
36
+
37
+ # hname = *urlc
38
+ # hvalue = *urlc
39
+ # header = hname "=" hvalue
40
+ HEADER_PATTERN = "(?:[^?=&]*=[^?=&]*)".freeze
41
+ HEADER_REGEXP = Regexp.new(HEADER_PATTERN, 'N').freeze
42
+ # headers = "?" header *( "&" header )
43
+ # to = #mailbox
44
+ # mailtoURL = "mailto:" [ to ] [ headers ]
45
+ MAILBOX_PATTERN = "(?:#{PATTERN::ESCAPED}|[^(),%?=&])".freeze
46
+ MAILTO_REGEXP = Regexp.new(" # :nodoc:
47
+ \\A
48
+ (#{MAILBOX_PATTERN}*?) (?# 1: to)
49
+ (?:
50
+ \\?
51
+ (#{HEADER_PATTERN}(?:\\&#{HEADER_PATTERN})*) (?# 2: headers)
52
+ )?
53
+ (?:
54
+ \\#
55
+ (#{PATTERN::FRAGMENT}) (?# 3: fragment)
56
+ )?
57
+ \\z
58
+ ", Regexp::EXTENDED).freeze
59
+ # :startdoc:
60
+
61
+ #
62
+ # == Description
63
+ #
64
+ # Creates a new URI::MailTo object from components, with syntax checking.
65
+ #
66
+ # Components can be provided as an Array or Hash. If an Array is used,
67
+ # the components must be supplied as [to, headers].
68
+ #
69
+ # If a Hash is used, the keys are the component names preceded by colons.
70
+ #
71
+ # The headers can be supplied as a pre-encoded string, such as
72
+ # "subject=subscribe&cc=address", or as an Array of Arrays like
73
+ # [['subject', 'subscribe'], ['cc', 'address']]
74
+ #
75
+ # Examples:
76
+ #
77
+ # require 'uri'
78
+ #
79
+ # m1 = URI::MailTo.build(['joe@example.com', 'subject=Ruby'])
80
+ # puts m1.to_s -> mailto:joe@example.com?subject=Ruby
81
+ #
82
+ # m2 = URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]])
83
+ # puts m2.to_s -> mailto:john@example.com?Subject=Ruby&Cc=jack@example.com
84
+ #
85
+ # m3 = URI::MailTo.build({:to => 'listman@example.com', :headers => [['subject', 'subscribe']]})
86
+ # puts m3.to_s -> mailto:listman@example.com?subject=subscribe
87
+ #
88
+ def self.build(args)
89
+ tmp = Util::make_components_hash(self, args)
90
+
91
+ if tmp[:to]
92
+ tmp[:opaque] = tmp[:to]
93
+ else
94
+ tmp[:opaque] = ''
95
+ end
96
+
97
+ if tmp[:headers]
98
+ tmp[:opaque] << '?'
99
+
100
+ if tmp[:headers].kind_of?(Array)
101
+ tmp[:opaque] << tmp[:headers].collect { |x|
102
+ if x.kind_of?(Array)
103
+ x[0] + '=' + x[1..-1].to_s
104
+ else
105
+ x.to_s
106
+ end
107
+ }.join('&')
108
+
109
+ elsif tmp[:headers].kind_of?(Hash)
110
+ tmp[:opaque] << tmp[:headers].collect { |h,v|
111
+ h + '=' + v
112
+ }.join('&')
113
+
114
+ else
115
+ tmp[:opaque] << tmp[:headers].to_s
116
+ end
117
+ end
118
+
119
+ return super(tmp)
120
+ end
121
+
122
+ #
123
+ # == Description
124
+ #
125
+ # Creates a new URI::MailTo object from generic URL components with
126
+ # no syntax checking.
127
+ #
128
+ # This method is usually called from URI::parse, which checks
129
+ # the validity of each component.
130
+ #
131
+ def initialize(*arg)
132
+ super(*arg)
133
+
134
+ @to = nil
135
+ @headers = []
136
+
137
+ if MAILTO_REGEXP =~ @opaque
138
+ if arg[-1]
139
+ self.to = $1
140
+ self.headers = $2
141
+ else
142
+ set_to($1)
143
+ set_headers($2)
144
+ end
145
+
146
+ else
147
+ raise InvalidComponentError,
148
+ "unrecognised opaque part for mailtoURL: #{@opaque}"
149
+ end
150
+ end
151
+
152
+ # The primary e-mail address of the URL, as a String
153
+ attr_reader :to
154
+
155
+ # E-mail headers set by the URL, as an Array of Arrays
156
+ attr_reader :headers
157
+
158
+ def check_to(v)
159
+ return true unless v
160
+ return true if v.size == 0
161
+
162
+ if @parser.regexp[:OPAQUE] !~ v || /\A#{MAILBOX_PATTERN}*\z/o !~ v
163
+ raise InvalidComponentError,
164
+ "bad component(expected opaque component): #{v}"
165
+ end
166
+
167
+ return true
168
+ end
169
+ private :check_to
170
+
171
+ def set_to(v)
172
+ @to = v
173
+ end
174
+ protected :set_to
175
+
176
+ def to=(v)
177
+ check_to(v)
178
+ set_to(v)
179
+ v
180
+ end
181
+
182
+ def check_headers(v)
183
+ return true unless v
184
+ return true if v.size == 0
185
+
186
+ if @parser.regexp[:OPAQUE] !~ v ||
187
+ /\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v
188
+ raise InvalidComponentError,
189
+ "bad component(expected opaque component): #{v}"
190
+ end
191
+
192
+ return true
193
+ end
194
+ private :check_headers
195
+
196
+ def set_headers(v)
197
+ @headers = []
198
+ if v
199
+ v.scan(HEADER_REGEXP) do |x|
200
+ @headers << x.split(/=/o, 2)
201
+ end
202
+ end
203
+ end
204
+ protected :set_headers
205
+
206
+ def headers=(v)
207
+ check_headers(v)
208
+ set_headers(v)
209
+ v
210
+ end
211
+
212
+ def to_s
213
+ @scheme + ':' +
214
+ if @to
215
+ @to
216
+ else
217
+ ''
218
+ end +
219
+ if @headers.size > 0
220
+ '?' + @headers.collect{|x| x.join('=')}.join('&')
221
+ else
222
+ ''
223
+ end +
224
+ if @fragment
225
+ '#' + @fragment
226
+ else
227
+ ''
228
+ end
229
+ end
230
+
231
+ # Returns the RFC822 e-mail text equivalent of the URL, as a String.
232
+ #
233
+ # Example:
234
+ #
235
+ # require 'uri'
236
+ #
237
+ # uri = URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr")
238
+ # uri.to_mailtext
239
+ # # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n"
240
+ #
241
+ def to_mailtext
242
+ to = @parser.unescape(@to)
243
+ head = ''
244
+ body = ''
245
+ @headers.each do |x|
246
+ case x[0]
247
+ when 'body'
248
+ body = @parser.unescape(x[1])
249
+ when 'to'
250
+ to << ', ' + @parser.unescape(x[1])
251
+ else
252
+ head << @parser.unescape(x[0]).capitalize + ': ' +
253
+ @parser.unescape(x[1]) + "\n"
254
+ end
255
+ end
256
+
257
+ return "To: #{to}
258
+ #{head}
259
+ #{body}
260
+ "
261
+ end
262
+ alias to_rfc822text to_mailtext
263
+ end
264
+
265
+ @@schemes['MAILTO'] = MailTo
266
+ end