viewpoint 0.1.26 → 0.1.27
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/model/generic_folder.rb +13 -3
- data/lib/model/item.rb +3 -2
- data/lib/model/model.rb +2 -2
- data/lib/soap/handsoap/ews_service.rb +28 -5
- data/lib/soap/handsoap/parsers/ews_parser.rb +3 -2
- metadata +68 -74
data/lib/model/generic_folder.rb
CHANGED
@@ -93,7 +93,7 @@ module Viewpoint
|
|
93
93
|
# @return [Array<String>] Return an Array of folder names.
|
94
94
|
# @raise [EwsError] raised when the backend SOAP method returns an error.
|
95
95
|
def self.folder_names(root = :msgfolderroot)
|
96
|
-
resp = (Viewpoint::EWS::EWS.instance).ews.find_folder([
|
96
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.find_folder([root], 'Shallow')
|
97
97
|
if(resp.status == 'Success')
|
98
98
|
flds = []
|
99
99
|
resp.items.each do |f|
|
@@ -249,6 +249,7 @@ module Viewpoint
|
|
249
249
|
def find_items(opts = {})
|
250
250
|
opts = opts.clone # clone the passed in object so we don't modify it in case it's being used in a loop
|
251
251
|
item_shape = opts.has_key?(:item_shape) ? opts.delete(:item_shape) : {:base_shape => 'Default'}
|
252
|
+
shallow = item_shape[:base_shape] != 'AllProperties'
|
252
253
|
unless item_shape.has_key?(:additional_properties) # Don't overwrite if specified by caller
|
253
254
|
item_shape[:additional_properties] = {:field_uRI => ['item:ParentFolderId']}
|
254
255
|
end
|
@@ -258,7 +259,7 @@ module Viewpoint
|
|
258
259
|
items = []
|
259
260
|
resp.items.each do |i|
|
260
261
|
i_type = i.keys.first
|
261
|
-
items << (eval "#{i_type.to_s.camel_case}.new(i[i_type])")
|
262
|
+
items << (eval "#{i_type.to_s.camel_case}.new(i[i_type], :shallow => #{shallow})")
|
262
263
|
end
|
263
264
|
return items
|
264
265
|
else
|
@@ -383,6 +384,7 @@ module Viewpoint
|
|
383
384
|
# See: http://msdn.microsoft.com/en-us/library/aa565609.aspx
|
384
385
|
def sync_items!(sync_amount = 256, sync_all = false, opts = {})
|
385
386
|
item_shape = opts.has_key?(:item_shape) ? opts.delete(:item_shape) : {:base_shape => 'Default'}
|
387
|
+
shallow = item_shape[:base_shape] != 'AllProperties'
|
386
388
|
resp = (Viewpoint::EWS::EWS.instance).ews.sync_folder_items(@folder_id, @sync_state, sync_amount, item_shape)
|
387
389
|
parms = resp.items.shift
|
388
390
|
@sync_state = parms[:sync_state]
|
@@ -395,12 +397,20 @@ module Viewpoint
|
|
395
397
|
items[key] << i[key][:item_id]
|
396
398
|
else
|
397
399
|
i_type = i[key].keys.first
|
398
|
-
|
400
|
+
next if !i_type
|
401
|
+
items[key] << (eval "#{i_type.to_s.camel_case}.new(i[key][i_type], :shallow => #{shallow})")
|
399
402
|
end
|
400
403
|
end
|
401
404
|
items
|
402
405
|
end
|
403
406
|
|
407
|
+
# Fetch current synced state (comes from synchronizing elements).
|
408
|
+
# @return [Boolean] Current synchronization state, i.e. whether sync_items! needs to be called
|
409
|
+
# again to finish the pending rounds of synchronization requests.
|
410
|
+
def synced
|
411
|
+
@synced
|
412
|
+
end
|
413
|
+
|
404
414
|
# This is basically a work-around for Microsoft's BPOS hosted Exchange, which does not support
|
405
415
|
# subscriptions at the time of this writing. This is the best way I could think of to get
|
406
416
|
# items from a specific period of time and track changes.
|
data/lib/model/item.rb
CHANGED
@@ -32,12 +32,13 @@ module Viewpoint
|
|
32
32
|
# @return [Item] Returns an Item or subclass of Item
|
33
33
|
# @todo Add support to fetch an item with a ChangeKey
|
34
34
|
def self.get_item(item_id, shape = :default)
|
35
|
-
item_shape = {:base_shape => shape.to_s.
|
35
|
+
item_shape = {:base_shape => shape.to_s.camel_case}
|
36
|
+
shallow = item_shape[:base_shape] != 'AllProperties'
|
36
37
|
resp = (Viewpoint::EWS::EWS.instance).ews.get_item([item_id], item_shape)
|
37
38
|
if(resp.status == 'Success')
|
38
39
|
item = resp.items.shift
|
39
40
|
type = item.keys.first
|
40
|
-
eval "#{type.to_s.camel_case}.new(item[type])"
|
41
|
+
eval "#{type.to_s.camel_case}.new(item[type], :shallow => #{shallow})"
|
41
42
|
else
|
42
43
|
raise EwsError, "Could not retrieve item. #{resp.code}: #{resp.message}"
|
43
44
|
end
|
data/lib/model/model.rb
CHANGED
@@ -187,7 +187,7 @@ module Viewpoint
|
|
187
187
|
self.instance_eval <<-EOF
|
188
188
|
def #{var}
|
189
189
|
return @#{var} if defined?(@#{var})
|
190
|
-
deepen!
|
190
|
+
deepen! if !@ews_item[:#{var}]
|
191
191
|
if( (@ews_item[:#{var}][:mailbox]).is_a?(Hash) )
|
192
192
|
@#{var} = [MailboxUser.new(@ews_item[:#{var}][:mailbox])]
|
193
193
|
elsif( (@ews_item[:#{var}][:mailbox]).is_a?(Array) )
|
@@ -214,7 +214,7 @@ module Viewpoint
|
|
214
214
|
@ews_methods << var
|
215
215
|
self.instance_eval <<-EOF
|
216
216
|
def #{var}
|
217
|
-
deepen!
|
217
|
+
deepen! if !@ews_item[:#{var}]
|
218
218
|
@#{var} ||= MailboxUser.new(@ews_item[:#{var}][:mailbox])
|
219
219
|
end
|
220
220
|
EOF
|
@@ -90,7 +90,14 @@ module Viewpoint
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def on_http_error(response)
|
93
|
-
|
93
|
+
case response.status
|
94
|
+
when 401
|
95
|
+
raise EwsLoginError, "Failed to login to EWS at #{uri}. Please check your credentials."
|
96
|
+
when 404
|
97
|
+
raise EwsError, "File not found (404): #{uri} Please check the endpoint URL. Body: #{response.body}"
|
98
|
+
else
|
99
|
+
raise EwsError, "Unknown error (#{response.status}): #{uri} : Body: #{response.body}"
|
100
|
+
end
|
94
101
|
end
|
95
102
|
|
96
103
|
# ********** End Hooks **********
|
@@ -227,12 +234,28 @@ module Viewpoint
|
|
227
234
|
parse!(resp)
|
228
235
|
end
|
229
236
|
|
230
|
-
|
237
|
+
# Converts item and folder identifiers between formats that are accepted by Microsoft Exchange
|
238
|
+
# @see http://msdn.microsoft.com/en-us/library/bb799665.aspx
|
239
|
+
#
|
240
|
+
# @param [String] id identifier to convert
|
241
|
+
# @param [String] mailbox mailbox where is located the item
|
242
|
+
# @param [String] alternate_id_format Format of the identifier to be converted, by default Exchange Web Services identifier
|
243
|
+
# @param [String] destination_format Destination format, by default Outlook identifier
|
244
|
+
def convert_id(id, mailbox, alternate_id_format = 'EwsId', destination_format = 'HexEntryId')
|
231
245
|
action = "#{SOAP_ACTION_PREFIX}/ConvertId"
|
232
|
-
resp = invoke("#{NS_EWS_MESSAGES}:ConvertId", action) do |
|
233
|
-
|
246
|
+
resp = invoke("#{NS_EWS_MESSAGES}:ConvertId", action) do |root|
|
247
|
+
build!(root) do
|
248
|
+
root.set_attr('DestinationFormat', destination_format)
|
249
|
+
root.add("#{NS_EWS_MESSAGES}:SourceIds") do |source_ids|
|
250
|
+
source_ids.add("#{NS_EWS_TYPES}:AlternateId") do |alternate_id|
|
251
|
+
alternate_id.set_attr('Format', alternate_id_format)
|
252
|
+
alternate_id.set_attr('Id', id)
|
253
|
+
alternate_id.set_attr('Mailbox', mailbox)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
234
257
|
end
|
235
|
-
|
258
|
+
parse!(resp)
|
236
259
|
end
|
237
260
|
|
238
261
|
# Creates folders, calendar folders, contacts folders, tasks folders, and search folders.
|
@@ -225,8 +225,9 @@ module Viewpoint
|
|
225
225
|
resolution_set = []
|
226
226
|
(@response/"//#{NS_EWS_MESSAGES}:ResolutionSet/*").each do |r|
|
227
227
|
mbox_hash = mailbox((r/"#{NS_EWS_TYPES}:Mailbox").first)
|
228
|
-
|
229
|
-
|
228
|
+
contact_xml = (r/"#{NS_EWS_TYPES}:Contact").first
|
229
|
+
next if !contact_xml
|
230
|
+
resolution_set << mbox_hash.merge(contact(contact_xml))
|
230
231
|
end
|
231
232
|
resolution_set
|
232
233
|
end
|
metadata
CHANGED
@@ -1,92 +1,90 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: viewpoint
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.27
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.26
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Dan Wanek
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-07-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: handsoap
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &7373740 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: nokogiri
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *7373740
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: nokogiri
|
27
|
+
requirement: &7373180 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
35
33
|
type: :runtime
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: httpclient
|
39
34
|
prerelease: false
|
40
|
-
|
35
|
+
version_requirements: *7373180
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: httpclient
|
38
|
+
requirement: &7372740 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
46
44
|
type: :runtime
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rubyntlm
|
50
45
|
prerelease: false
|
51
|
-
|
46
|
+
version_requirements: *7372740
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rubyntlm
|
49
|
+
requirement: &7372240 !ruby/object:Gem::Requirement
|
52
50
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
57
55
|
type: :runtime
|
58
|
-
version_requirements: *id004
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: icalendar
|
61
56
|
prerelease: false
|
62
|
-
|
57
|
+
version_requirements: *7372240
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: icalendar
|
60
|
+
requirement: &7371700 !ruby/object:Gem::Requirement
|
63
61
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
67
65
|
version: 1.1.5
|
68
66
|
type: :runtime
|
69
|
-
version_requirements: *id005
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: mail
|
72
67
|
prerelease: false
|
73
|
-
|
68
|
+
version_requirements: *7371700
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mail
|
71
|
+
requirement: &7371180 !ruby/object:Gem::Requirement
|
74
72
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
78
76
|
version: 2.2.5
|
79
77
|
type: :runtime
|
80
|
-
|
81
|
-
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *7371180
|
80
|
+
description: ! 'A Ruby client access library for Microsoft Exchange Web Services (EWS). Examples
|
81
|
+
can be found here: http://distributed-frostbite.blogspot.com'
|
82
82
|
email: dan.wanek@gmail.com
|
83
83
|
executables: []
|
84
|
-
|
85
84
|
extensions: []
|
86
|
-
|
87
|
-
extra_rdoc_files:
|
85
|
+
extra_rdoc_files:
|
88
86
|
- README
|
89
|
-
files:
|
87
|
+
files:
|
90
88
|
- Changelog.txt
|
91
89
|
- README
|
92
90
|
- TODO
|
@@ -126,34 +124,30 @@ files:
|
|
126
124
|
- lib/extensions/string.rb
|
127
125
|
homepage: http://github.com/zenchild/Viewpoint
|
128
126
|
licenses: []
|
129
|
-
|
130
127
|
post_install_message:
|
131
|
-
rdoc_options:
|
128
|
+
rdoc_options:
|
132
129
|
- -x
|
133
130
|
- test/
|
134
131
|
- -x
|
135
132
|
- examples/
|
136
|
-
require_paths:
|
133
|
+
require_paths:
|
137
134
|
- lib
|
138
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
136
|
none: false
|
140
|
-
requirements:
|
141
|
-
- -
|
142
|
-
- !ruby/object:Gem::Version
|
137
|
+
requirements:
|
138
|
+
- - ! '>='
|
139
|
+
- !ruby/object:Gem::Version
|
143
140
|
version: 1.8.7
|
144
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
142
|
none: false
|
146
|
-
requirements:
|
147
|
-
- -
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version:
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
150
147
|
requirements: []
|
151
|
-
|
152
148
|
rubyforge_project:
|
153
|
-
rubygems_version: 1.8.
|
149
|
+
rubygems_version: 1.8.17
|
154
150
|
signing_key:
|
155
151
|
specification_version: 3
|
156
152
|
summary: A Ruby client access library for Microsoft Exchange Web Services (EWS)
|
157
153
|
test_files: []
|
158
|
-
|
159
|
-
has_rdoc:
|