rhodes 1.5.4 → 1.5.5
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.
- data/Manifest.txt +11 -1
- data/Rakefile +1 -1
- data/lib/extensions/digest/ext/Rakefile +11 -6
- data/lib/extensions/digest/ext/build.bat +2 -0
- data/lib/extensions/uri/uri.rb +29 -0
- data/lib/extensions/uri/uri/common.rb +727 -0
- data/lib/extensions/uri/uri/ftp.rb +198 -0
- data/lib/extensions/uri/uri/generic.rb +1128 -0
- data/lib/extensions/uri/uri/http.rb +100 -0
- data/lib/extensions/uri/uri/https.rb +20 -0
- data/lib/extensions/uri/uri/ldap.rb +190 -0
- data/lib/extensions/uri/uri/ldaps.rb +12 -0
- data/lib/extensions/uri/uri/mailto.rb +266 -0
- data/lib/framework/rhodes.rb +2 -2
- data/lib/framework/rhom/rhom_db_adapter.rb +12 -26
- data/lib/framework/rhom/rhom_object_factory.rb +8 -1
- data/lib/framework/version.rb +2 -2
- data/lib/rhodes.rb +2 -2
- data/platform/android/Rhodes/AndroidManifest.xml +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +87 -42
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java +58 -7
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java +2 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +35 -19
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +4 -0
- data/platform/android/build/android.rake +30 -25
- data/platform/bb/build/rhodes_build.files +1 -1
- data/platform/bb/rhodes/rhodes.jdp +1 -1
- data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +1 -1
- data/platform/bb/rhodes/src/com/rho/rubyext/Alert.java +300 -0
- data/platform/bb/rhodes/src/com/rho/rubyext/GeoLocation.java +42 -5
- data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +3 -4
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +33 -107
- data/platform/iphone/Classes/RhoRunnerAppDelegate.m +2 -0
- data/platform/iphone/Info.plist +1 -1
- data/platform/iphone/rbuild/iphone.rake +1 -1
- data/platform/iphone/rhoextlib/rhoextlib.xcodeproj/project.pbxproj +4 -0
- data/platform/shared/common/RhoMutexLock.h +8 -1
- data/platform/shared/common/RhodesApp.cpp +1 -1
- data/platform/shared/db/DBAdapter.cpp +77 -8
- data/platform/shared/db/DBAdapter.h +24 -9
- data/platform/shared/db/DBResult.cpp +19 -0
- data/platform/shared/db/DBResult.h +7 -5
- data/platform/shared/net/HttpServer.cpp +2 -0
- data/platform/shared/ruby/ext/rho/rhoruby.c +55 -0
- data/platform/shared/ruby/ext/rho/rhoruby.h +9 -0
- data/platform/shared/ruby/ext/rho/rhosupport.c +13 -4
- data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +21 -0
- data/platform/shared/ruby/thread_pthread.c +4 -4
- data/platform/shared/ruby/thread_win32.c +4 -4
- data/platform/shared/rubyJVM/src/com/rho/RhodesApp.java +19 -1
- data/platform/shared/rubyJVM/src/com/rho/db/DBAdapter.java +57 -24
- data/platform/shared/rubyJVM/src/com/rho/net/NetRequest.java +6 -1
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java +2 -2
- data/platform/shared/rubyJVM/src/com/rho/sync/SyncThread.java +5 -5
- data/platform/shared/sync/SyncSource.cpp +1 -1
- data/platform/shared/sync/SyncThread.cpp +6 -9
- data/platform/wm/rhodes/Rhodes.cpp +4 -0
- data/rakefile.rb +1 -1
- metadata +13 -3
- 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
|