viewpoint 0.1.27 → 1.0.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +196 -0
- data/lib/ews/calendar_accessors.rb +34 -0
- data/lib/ews/connection.rb +117 -0
- data/lib/ews/connection_helper.rb +35 -0
- data/lib/ews/ews_client.rb +71 -0
- data/lib/ews/exceptions/exceptions.rb +59 -0
- data/lib/ews/folder_accessors.rb +199 -0
- data/lib/ews/item_accessors.rb +157 -0
- data/lib/ews/mailbox_accessors.rb +87 -0
- data/lib/ews/message_accessors.rb +86 -0
- data/lib/ews/push_subscription_accessors.rb +33 -0
- data/lib/ews/soap.rb +63 -0
- data/lib/ews/soap/builders/ews_builder.rb +1011 -0
- data/lib/ews/soap/ews_response.rb +83 -0
- data/lib/ews/soap/ews_soap_availability_response.rb +58 -0
- data/lib/ews/soap/ews_soap_free_busy_response.rb +109 -0
- data/lib/ews/soap/ews_soap_response.rb +103 -0
- data/lib/ews/soap/exchange_availability.rb +61 -0
- data/lib/ews/soap/exchange_data_services.rb +742 -0
- data/lib/ews/soap/exchange_notification.rb +146 -0
- data/lib/ews/soap/exchange_user_configuration.rb +33 -0
- data/lib/ews/soap/exchange_web_service.rb +294 -0
- data/lib/{model/attendee.rb → ews/soap/parsers/ews_parser.rb} +20 -14
- data/lib/ews/soap/parsers/ews_sax_document.rb +66 -0
- data/lib/ews/soap/response_message.rb +78 -0
- data/lib/ews/soap/responses/create_attachment_response_message.rb +46 -0
- data/lib/{model/meeting_message.rb → ews/soap/responses/create_item_response_message.rb} +7 -10
- data/lib/ews/soap/responses/find_item_response_message.rb +80 -0
- data/lib/ews/soap/responses/get_events_response_message.rb +53 -0
- data/lib/ews/soap/responses/send_notification_response_message.rb +58 -0
- data/lib/{model/attachment.rb → ews/soap/responses/subscribe_response_message.rb} +17 -13
- data/lib/ews/templates/forward_item.rb +24 -0
- data/lib/ews/templates/message.rb +66 -0
- data/lib/ews/templates/reply_to_item.rb +25 -0
- data/lib/ews/types.rb +146 -0
- data/lib/ews/types/attachment.rb +77 -0
- data/lib/{model/meeting_cancellation.rb → ews/types/attendee.rb} +9 -8
- data/lib/ews/types/calendar_folder.rb +8 -0
- data/lib/ews/types/calendar_item.rb +37 -0
- data/lib/ews/types/contact.rb +7 -0
- data/lib/ews/types/contacts_folder.rb +8 -0
- data/lib/ews/types/copied_event.rb +51 -0
- data/lib/{soap/handsoap/builder.rb → ews/types/created_event.rb} +5 -2
- data/lib/{model/meeting_response.rb → ews/types/deleted_event.rb} +6 -6
- data/lib/ews/types/distribution_list.rb +7 -0
- data/lib/ews/types/event.rb +62 -0
- data/lib/ews/types/file_attachment.rb +65 -0
- data/lib/ews/types/folder.rb +60 -0
- data/lib/{model/distribution_list.rb → ews/types/free_busy_changed_event.rb} +6 -6
- data/lib/ews/types/generic_folder.rb +352 -0
- data/lib/ews/types/item.rb +381 -0
- data/lib/ews/types/item_attachment.rb +46 -0
- data/lib/{model → ews/types}/item_field_uri_map.rb +2 -2
- data/lib/ews/types/mailbox_user.rb +156 -0
- data/lib/ews/types/meeting_cancellation.rb +7 -0
- data/lib/ews/types/meeting_message.rb +7 -0
- data/lib/ews/types/meeting_request.rb +7 -0
- data/lib/ews/types/meeting_response.rb +7 -0
- data/lib/ews/types/message.rb +7 -0
- data/lib/ews/types/modified_event.rb +48 -0
- data/lib/{model/item_attachment.rb → ews/types/moved_event.rb} +33 -15
- data/lib/ews/types/new_mail_event.rb +24 -0
- data/lib/ews/types/out_of_office.rb +147 -0
- data/lib/ews/types/search_folder.rb +8 -0
- data/lib/ews/types/status_event.rb +39 -0
- data/lib/ews/types/task.rb +7 -0
- data/lib/ews/types/tasks_folder.rb +8 -0
- data/lib/viewpoint.rb +82 -106
- metadata +99 -67
- data/README +0 -114
- data/lib/exceptions/exceptions.rb +0 -46
- data/lib/model/calendar_folder.rb +0 -67
- data/lib/model/calendar_item.rb +0 -267
- data/lib/model/contact.rb +0 -238
- data/lib/model/contacts_folder.rb +0 -46
- data/lib/model/event.rb +0 -116
- data/lib/model/file_attachment.rb +0 -53
- data/lib/model/folder.rb +0 -47
- data/lib/model/generic_folder.rb +0 -471
- data/lib/model/item.rb +0 -313
- data/lib/model/mailbox_user.rb +0 -146
- data/lib/model/meeting_request.rb +0 -39
- data/lib/model/message.rb +0 -142
- data/lib/model/model.rb +0 -269
- data/lib/model/search_folder.rb +0 -48
- data/lib/model/task.rb +0 -121
- data/lib/model/tasks_folder.rb +0 -44
- data/lib/soap/handsoap/builders/ews_build_helpers.rb +0 -383
- data/lib/soap/handsoap/builders/ews_builder.rb +0 -146
- data/lib/soap/handsoap/ews_service.rb +0 -813
- data/lib/soap/handsoap/parser.rb +0 -104
- data/lib/soap/handsoap/parsers/ews_parser.rb +0 -246
- data/lib/soap/soap_provider.rb +0 -64
@@ -0,0 +1,381 @@
|
|
1
|
+
module Viewpoint::EWS::Types
|
2
|
+
module Item
|
3
|
+
include Viewpoint::EWS
|
4
|
+
include Viewpoint::EWS::Types
|
5
|
+
include ItemFieldUriMap
|
6
|
+
|
7
|
+
ITEM_KEY_PATHS = {
|
8
|
+
id: [:item_id, :attribs, :id],
|
9
|
+
change_key: [:item_id, :attribs, :change_key],
|
10
|
+
subject: [:subject, :text],
|
11
|
+
sensitivity: [:sensitivity, :text],
|
12
|
+
size: [:size, :text],
|
13
|
+
date_time_sent: [:date_time_sent, :text],
|
14
|
+
date_time_created: [:date_time_created, :text],
|
15
|
+
has_attachments?:[:has_attachments, :text],
|
16
|
+
is_associated?: [:is_associated, :text],
|
17
|
+
is_read?: [:is_read, :text],
|
18
|
+
is_draft?: [:is_draft, :text],
|
19
|
+
is_submitted?: [:is_submitted, :text],
|
20
|
+
conversation_id:[:conversation_id, :attribs, :id],
|
21
|
+
categories: [:categories, :elems],
|
22
|
+
internet_message_id:[:internet_message_id, :text],
|
23
|
+
internet_message_headers:[:internet_message_headers, :elems],
|
24
|
+
sender: [:sender, :elems, 0, :mailbox, :elems],
|
25
|
+
from: [:from, :elems, 0, :mailbox, :elems],
|
26
|
+
to_recipients: [:to_recipients, :elems],
|
27
|
+
attachments: [:attachments, :elems],
|
28
|
+
importance: [:importance, :text],
|
29
|
+
conversation_index: [:conversation_index, :text],
|
30
|
+
conversation_topic: [:conversation_topic, :text],
|
31
|
+
body_type: [:body, :attribs, :body_type],
|
32
|
+
body: [:body, :text]
|
33
|
+
}
|
34
|
+
|
35
|
+
ITEM_KEY_TYPES = {
|
36
|
+
size: ->(str){str.to_i},
|
37
|
+
date_time_sent: ->(str){DateTime.parse(str)},
|
38
|
+
date_time_created: ->(str){DateTime.parse(str)},
|
39
|
+
has_attachments?: ->(str){str.downcase == 'true'},
|
40
|
+
is_associated?: ->(str){str.downcase == 'true'},
|
41
|
+
is_read?: ->(str){str.downcase == 'true'},
|
42
|
+
is_draft?: ->(str){str.downcase == 'true'},
|
43
|
+
is_submitted?: ->(str){str.downcase == 'true'},
|
44
|
+
categories: ->(obj){obj.collect{|s| s[:string][:text]}},
|
45
|
+
internet_message_headers: ->(obj){obj.collect{|h|
|
46
|
+
{h[:internet_message_header][:attribs][:header_name] =>
|
47
|
+
h[:internet_message_header][:text]} } },
|
48
|
+
sender: :build_mailbox_user,
|
49
|
+
from: :build_mailbox_user,
|
50
|
+
attachments: :build_attachments,
|
51
|
+
}
|
52
|
+
|
53
|
+
ITEM_KEY_ALIAS = {
|
54
|
+
:read? => :is_read?,
|
55
|
+
:draft? => :is_draft?,
|
56
|
+
:submitted? => :is_submitted?,
|
57
|
+
:associated? => :is_associated?,
|
58
|
+
}
|
59
|
+
|
60
|
+
attr_reader :ews_item, :parent
|
61
|
+
|
62
|
+
# @param ews [SOAP::ExchangeWebService] the EWS reference
|
63
|
+
# @param ews_item [Hash] the EWS parsed response document
|
64
|
+
# @param parent [GenericFolder] an optional parent object
|
65
|
+
def initialize(ews, ews_item, parent = nil)
|
66
|
+
super(ews, ews_item)
|
67
|
+
@parent = parent
|
68
|
+
@body_type = false
|
69
|
+
simplify!
|
70
|
+
@new_file_attachments = []
|
71
|
+
@new_item_attachments = []
|
72
|
+
end
|
73
|
+
|
74
|
+
# Specify a body_type to fetch this item with if it hasn't already been fetched.
|
75
|
+
# @param body_type [String, Symbol, FalseClass] must be :best, :text, or
|
76
|
+
# :html. You can also set it to false to make it use the default.
|
77
|
+
def default_body_type=(body_type)
|
78
|
+
@body_type = body_type
|
79
|
+
end
|
80
|
+
|
81
|
+
def delete!(deltype = :hard)
|
82
|
+
opts = {
|
83
|
+
:delete_type => delete_type(deltype),
|
84
|
+
:item_ids => [{:item_id => {:id => id}}]
|
85
|
+
}
|
86
|
+
resp = @ews.delete_item(opts)
|
87
|
+
rmsg = resp.response_messages[0]
|
88
|
+
unless rmsg.success?
|
89
|
+
raise EwsError, "Could not delete #{self.class}. #{rmsg.response_code}: #{rmsg.message_text}"
|
90
|
+
end
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
def recycle!
|
95
|
+
delete! :recycle
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_all_properties!
|
99
|
+
@ews_item = get_item(base_shape: 'AllProperties')
|
100
|
+
simplify!
|
101
|
+
end
|
102
|
+
|
103
|
+
# Mark an item as read or if you pass false, unread
|
104
|
+
# @param [Boolean] read mark read if true, unread if not.
|
105
|
+
def mark_read!(read = true)
|
106
|
+
resp = update_is_read_status read
|
107
|
+
end
|
108
|
+
|
109
|
+
# Move this item to a new folder
|
110
|
+
# @param [String,Symbol,GenericFolder] new_folder The new folder to move it to. This should
|
111
|
+
# be a subclass of GenericFolder, a DistinguishedFolderId (must me a Symbol) or a FolderId (String)
|
112
|
+
# @return [String] the new Id of the moved item
|
113
|
+
def move!(new_folder)
|
114
|
+
new_folder = new_folder.id if new_folder.kind_of?(GenericFolder)
|
115
|
+
move_opts = {
|
116
|
+
:to_folder_id => {:id => new_folder},
|
117
|
+
:item_ids => [{:item_id => {:id => self.id}}]
|
118
|
+
}
|
119
|
+
resp = @ews.move_item(move_opts)
|
120
|
+
rmsg = resp.response_messages[0]
|
121
|
+
|
122
|
+
if rmsg.success?
|
123
|
+
obj = rmsg.items.first
|
124
|
+
itype = obj.keys.first
|
125
|
+
obj[itype][:elems][0][:item_id][:attribs][:id]
|
126
|
+
else
|
127
|
+
raise EwsError, "Could not move item. #{resp.code}: #{resp.message}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Copy this item to a new folder
|
132
|
+
# @param [String,Symbol,GenericFolder] new_folder The new folder to move it to. This should
|
133
|
+
# be a subclass of GenericFolder, a DistinguishedFolderId (must me a Symbol) or a FolderId (String)
|
134
|
+
# @return [String] the new Id of the copied item
|
135
|
+
def copy(new_folder)
|
136
|
+
new_folder = new_folder.id if new_folder.kind_of?(GenericFolder)
|
137
|
+
copy_opts = {
|
138
|
+
:to_folder_id => {:id => new_folder},
|
139
|
+
:item_ids => [{:item_id => {:id => self.id}}]
|
140
|
+
}
|
141
|
+
resp = @ews.copy_item(copy_opts)
|
142
|
+
rmsg = resp.response_messages[0]
|
143
|
+
|
144
|
+
if rmsg.success?
|
145
|
+
obj = rmsg.items.first
|
146
|
+
itype = obj.keys.first
|
147
|
+
obj[itype][:elems][0][:item_id][:attribs][:id]
|
148
|
+
else
|
149
|
+
raise EwsError, "Could not copy item. #{rmsg.response_code}: #{rmsg.message_text}"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def add_file_attachment(file)
|
154
|
+
fa = OpenStruct.new
|
155
|
+
fa.name = File.basename(file.path)
|
156
|
+
fa.content = Base64.encode64(file.read)
|
157
|
+
@new_file_attachments << fa
|
158
|
+
end
|
159
|
+
|
160
|
+
def add_item_attachment(other_item, name = nil)
|
161
|
+
ia = OpenStruct.new
|
162
|
+
ia.name = (name ? name : other_item.subject)
|
163
|
+
ia.item = {id: other_item.id, change_key: other_item.change_key}
|
164
|
+
@new_item_attachments << ia
|
165
|
+
end
|
166
|
+
|
167
|
+
def submit!
|
168
|
+
if draft?
|
169
|
+
submit_attachments!
|
170
|
+
resp = ews.send_item(item_ids: [{item_id: {id: self.id, change_key: self.change_key}}])
|
171
|
+
rm = resp.response_messages[0]
|
172
|
+
if rm.success?
|
173
|
+
true
|
174
|
+
else
|
175
|
+
raise EwsSendItemError, "#{rm.code}: #{rm.message_text}"
|
176
|
+
end
|
177
|
+
else
|
178
|
+
false
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def submit_attachments!
|
183
|
+
return false unless draft? && !(@new_file_attachments.empty? && @new_item_attachments.empty?)
|
184
|
+
|
185
|
+
opts = {
|
186
|
+
parent_id: {id: self.id, change_key: self.change_key},
|
187
|
+
files: @new_file_attachments,
|
188
|
+
items: @new_item_attachments
|
189
|
+
}
|
190
|
+
resp = ews.create_attachment(opts)
|
191
|
+
set_change_key resp.response_messages[0].attachments[0].parent_change_key
|
192
|
+
@new_file_attachments = []
|
193
|
+
@new_item_attachments = []
|
194
|
+
end
|
195
|
+
|
196
|
+
# If you want to add to the body set #new_body_content. If you set #body
|
197
|
+
# it will override the body that is there.
|
198
|
+
# @see MessageAccessors#send_message for options
|
199
|
+
# additional options:
|
200
|
+
# :new_body_content, :new_body_type
|
201
|
+
# @example
|
202
|
+
# item.forward do |i|
|
203
|
+
# i.new_body_content = "Add this to the top"
|
204
|
+
# i.to_recipients << 'test@example.com'
|
205
|
+
# end
|
206
|
+
def forward(opts = {})
|
207
|
+
msg = Template::ForwardItem.new opts.clone
|
208
|
+
yield msg if block_given?
|
209
|
+
msg.reference_item_id = {id: self.id, change_key: self.change_key}
|
210
|
+
dispatch_create_item! msg
|
211
|
+
end
|
212
|
+
|
213
|
+
def reply_to(opts = {})
|
214
|
+
msg = Template::ReplyToItem.new opts.clone
|
215
|
+
yield msg if block_given?
|
216
|
+
msg.reference_item_id = {id: self.id, change_key: self.change_key}
|
217
|
+
dispatch_create_item! msg
|
218
|
+
end
|
219
|
+
|
220
|
+
def reply_to_all(opts = {})
|
221
|
+
msg = Template::ReplyToItem.new opts.clone
|
222
|
+
yield msg if block_given?
|
223
|
+
msg.reference_item_id = {id: self.id, change_key: self.change_key}
|
224
|
+
msg.ews_type = :reply_all_to_item
|
225
|
+
dispatch_create_item! msg
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
private
|
230
|
+
|
231
|
+
def key_paths
|
232
|
+
super.merge(ITEM_KEY_PATHS)
|
233
|
+
end
|
234
|
+
|
235
|
+
def key_types
|
236
|
+
super.merge(ITEM_KEY_TYPES)
|
237
|
+
end
|
238
|
+
|
239
|
+
def key_alias
|
240
|
+
super.merge(ITEM_KEY_ALIAS)
|
241
|
+
end
|
242
|
+
|
243
|
+
def update_is_read_status(read)
|
244
|
+
field = :is_read
|
245
|
+
opts = {item_changes:
|
246
|
+
[
|
247
|
+
{ item_id: {id: id, change_key: change_key},
|
248
|
+
updates: [
|
249
|
+
{set_item_field: {field_uRI: {field_uRI: FIELD_URIS[field][:text]},
|
250
|
+
message: {sub_elements: [{field => {text: read}}]}}}
|
251
|
+
]
|
252
|
+
}
|
253
|
+
]
|
254
|
+
}
|
255
|
+
resp = ews.update_item({conflict_resolution: 'AutoResolve'}.merge(opts))
|
256
|
+
rmsg = resp.response_messages[0]
|
257
|
+
unless rmsg.success?
|
258
|
+
raise EwsError, "#{rmsg.response_code}: #{rmsg.message_text}"
|
259
|
+
end
|
260
|
+
true
|
261
|
+
end
|
262
|
+
|
263
|
+
def simplify!
|
264
|
+
@ews_item = @ews_item[:elems].inject({}) do |o,i|
|
265
|
+
key = i.keys.first
|
266
|
+
if o.has_key?(key)
|
267
|
+
if o[key].is_a?(Array)
|
268
|
+
o[key] << i[key]
|
269
|
+
else
|
270
|
+
o[key] = [o.delete(key), i[key]]
|
271
|
+
end
|
272
|
+
else
|
273
|
+
o[key] = i[key]
|
274
|
+
end
|
275
|
+
o
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
# Get a specific item by its ID.
|
280
|
+
# @param [Hash] opts Misc options to control request
|
281
|
+
# @option opts [String] :base_shape IdOnly/Default/AllProperties
|
282
|
+
# @raise [EwsError] raised when the backend SOAP method returns an error.
|
283
|
+
def get_item(opts = {})
|
284
|
+
args = get_item_args(opts)
|
285
|
+
resp = ews.get_item(args)
|
286
|
+
get_item_parser(resp)
|
287
|
+
end
|
288
|
+
|
289
|
+
# Build up the arguements for #get_item
|
290
|
+
# @todo: should we really pass the ChangeKey or do we want the freshest obj?
|
291
|
+
def get_item_args(opts)
|
292
|
+
opts[:base_shape] ||= 'Default'
|
293
|
+
default_args = {
|
294
|
+
item_shape: {base_shape: opts[:base_shape]},
|
295
|
+
item_ids: [{item_id:{id: id, change_key: change_key}}]
|
296
|
+
}
|
297
|
+
default_args[:item_shape][:body_type] = @body_type if @body_type
|
298
|
+
default_args
|
299
|
+
end
|
300
|
+
|
301
|
+
def get_item_parser(resp)
|
302
|
+
rm = resp.response_messages[0]
|
303
|
+
if(rm.status == 'Success')
|
304
|
+
rm.items[0].values.first
|
305
|
+
else
|
306
|
+
raise EwsError, "Could not retrieve #{self.class}. #{rm.code}: #{rm.message_text}"
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Map a delete type to what EWS expects
|
311
|
+
# @param [Symbol] type. Must be :hard, :soft, or :recycle
|
312
|
+
def delete_type(type)
|
313
|
+
case type
|
314
|
+
when :hard then 'HardDelete'
|
315
|
+
when :soft then 'SoftDelete'
|
316
|
+
when :recycle then 'MoveToDeletedItems'
|
317
|
+
else 'MoveToDeletedItems'
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def build_mailbox_user(mbox_ews)
|
322
|
+
MailboxUser.new(ews, mbox_ews)
|
323
|
+
end
|
324
|
+
|
325
|
+
def build_attachments(attachments)
|
326
|
+
attachments.collect do |att|
|
327
|
+
key = att.keys.first
|
328
|
+
class_by_name(key).new(self, att[key])
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def set_change_key(ck)
|
333
|
+
p = resolve_key_path(ews_item, key_paths[:change_key][0..-2])
|
334
|
+
p[:change_key] = ck
|
335
|
+
end
|
336
|
+
|
337
|
+
# Handles the CreateItem call for Forward, ReplyTo, and ReplyAllTo
|
338
|
+
# It will handle the neccessary actions for adding attachments.
|
339
|
+
def dispatch_create_item!(msg)
|
340
|
+
if msg.has_attachments?
|
341
|
+
draft = msg.draft
|
342
|
+
msg.draft = true
|
343
|
+
resp = validate_created_item(ews.create_item(msg.to_ews))
|
344
|
+
msg.file_attachments.each do |f|
|
345
|
+
next unless f.kind_of?(File)
|
346
|
+
resp.add_file_attachment(f)
|
347
|
+
end
|
348
|
+
if draft
|
349
|
+
resp.submit_attachments!
|
350
|
+
resp
|
351
|
+
else
|
352
|
+
resp.submit!
|
353
|
+
end
|
354
|
+
else
|
355
|
+
resp = ews.create_item(msg.to_ews)
|
356
|
+
validate_created_item resp
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
# validate the CreateItem response.
|
361
|
+
# @return [Boolean, Item] returns true if items is empty and status is
|
362
|
+
# "Success" if items is not empty it will return the first Item since
|
363
|
+
# we are only dealing with single items here.
|
364
|
+
# @raise EwsCreateItemError on failure
|
365
|
+
def validate_created_item(response)
|
366
|
+
msg = response.response_messages[0]
|
367
|
+
|
368
|
+
if(msg.status == 'Success')
|
369
|
+
msg.items.empty? ? true : parse_created_item(msg.items.first)
|
370
|
+
else
|
371
|
+
raise EwsCreateItemError, "#{msg.code}: #{msg.message_text}"
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def parse_created_item(msg)
|
376
|
+
mtype = msg.keys.first
|
377
|
+
message = class_by_name(mtype).new(ews, msg[mtype])
|
378
|
+
end
|
379
|
+
|
380
|
+
end
|
381
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
=begin
|
2
|
+
This file is part of Viewpoint; the Ruby library for Microsoft Exchange Web Services.
|
3
|
+
|
4
|
+
Copyright © 2011 Dan Wanek <dan.wanek@gmail.com>
|
5
|
+
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
you may not use this file except in compliance with the License.
|
8
|
+
You may obtain a copy of the License at
|
9
|
+
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
See the License for the specific language governing permissions and
|
16
|
+
limitations under the License.
|
17
|
+
=end
|
18
|
+
|
19
|
+
module Viewpoint::EWS::Types
|
20
|
+
class ItemAttachment < Attachment
|
21
|
+
|
22
|
+
ITEM_ATTACH_KEY_PATHS = { }
|
23
|
+
|
24
|
+
ITEM_ATTACH_KEY_TYPES = { }
|
25
|
+
|
26
|
+
ITEM_ATTACH_KEY_ALIAS = { }
|
27
|
+
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
|
32
|
+
def key_paths
|
33
|
+
super.merge(ITEM_ATTACH_KEY_PATHS)
|
34
|
+
end
|
35
|
+
|
36
|
+
def key_types
|
37
|
+
super.merge(ITEM_ATTACH_KEY_TYPES)
|
38
|
+
end
|
39
|
+
|
40
|
+
def key_alias
|
41
|
+
super.merge(ITEM_ATTACH_KEY_ALIAS)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -20,7 +20,8 @@ module Viewpoint
|
|
20
20
|
module EWS
|
21
21
|
module ItemFieldUriMap
|
22
22
|
|
23
|
-
FIELD_URIS= {
|
23
|
+
FIELD_URIS= {
|
24
|
+
:folder_id => {:text => 'older:FolderId', :writable => true},
|
24
25
|
:parent_folder_id => {:text => 'folder:ParentFolderId', :writable => true},
|
25
26
|
:display_name => {:text => 'folder:DisplayName', :writable => true},
|
26
27
|
:unread_count => {:text => 'folder:UnreadCount', :writable => true},
|
@@ -218,7 +219,6 @@ module Viewpoint
|
|
218
219
|
:item_ids => {:text => 'conversation:ItemIds', :writable => true},
|
219
220
|
:global_item_ids => {:text => 'conversation:GlobalItemIds', :writable => true}
|
220
221
|
}
|
221
|
-
|
222
222
|
end
|
223
223
|
end
|
224
224
|
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
=begin
|
2
|
+
This file is part of Viewpoint; the Ruby library for Microsoft Exchange Web Services.
|
3
|
+
|
4
|
+
Copyright © 2011 Dan Wanek <dan.wanek@gmail.com>
|
5
|
+
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
you may not use this file except in compliance with the License.
|
8
|
+
You may obtain a copy of the License at
|
9
|
+
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
See the License for the specific language governing permissions and
|
16
|
+
limitations under the License.
|
17
|
+
=end
|
18
|
+
|
19
|
+
module Viewpoint::EWS::Types
|
20
|
+
|
21
|
+
# This represents a Mailbox object in the Exchange data store
|
22
|
+
# @see http://msdn.microsoft.com/en-us/library/aa565036.aspx MSDN docs
|
23
|
+
# @todo Design a Class method that resolves to an Array of MailboxUsers
|
24
|
+
class MailboxUser
|
25
|
+
include Viewpoint::EWS
|
26
|
+
include Viewpoint::EWS::Types
|
27
|
+
|
28
|
+
MAILBOX_KEY_PATHS = {
|
29
|
+
name: [:name],
|
30
|
+
email_address: [:email_address],
|
31
|
+
}
|
32
|
+
MAILBOX_KEY_TYPES = {}
|
33
|
+
MAILBOX_KEY_ALIAS = {
|
34
|
+
email: :email_address,
|
35
|
+
}
|
36
|
+
|
37
|
+
def initialize(ews, mbox_user)
|
38
|
+
@ews = ews
|
39
|
+
@ews_item = mbox_user
|
40
|
+
simplify!
|
41
|
+
end
|
42
|
+
|
43
|
+
def out_of_office_settings
|
44
|
+
mailbox = {:address => self.email_address}
|
45
|
+
resp = @ews.get_user_oof_settings(mailbox)
|
46
|
+
ewsi = resp.response.clone
|
47
|
+
ewsi.delete(:response_message)
|
48
|
+
return OutOfOffice.new(self,ewsi)
|
49
|
+
s = resp[:oof_settings]
|
50
|
+
@oof_state = s[:oof_state][:text]
|
51
|
+
@oof_ext_audience = s[:external_audience][:text]
|
52
|
+
@oof_start = DateTime.parse(s[:duration][:start_time][:text])
|
53
|
+
@oof_end = DateTime.parse(s[:duration][:end_time][:text])
|
54
|
+
@oof_internal_reply = s[:internal_reply][:message][:text]
|
55
|
+
@oof_external_reply = s[:internal_reply][:message][:text]
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
# Get information about when the user with the given email address is available.
|
60
|
+
# @param [String] email_address The email address of the person to find availability for.
|
61
|
+
# @param [DateTime] start_time The start of the time range to check as an xs:dateTime.
|
62
|
+
# @param [DateTime] end_time The end of the time range to check as an xs:dateTime.
|
63
|
+
# @see http://msdn.microsoft.com/en-us/library/aa563800(v=exchg.140)
|
64
|
+
def get_user_availability(email_address, start_time, end_time)
|
65
|
+
opts = {
|
66
|
+
mailbox_data: [ :email =>{:address => email_address} ],
|
67
|
+
free_busy_view_options: {
|
68
|
+
time_window: {start_time: start_time, end_time: end_time},
|
69
|
+
}
|
70
|
+
}
|
71
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.get_user_availability(opts)
|
72
|
+
if(resp.status == 'Success')
|
73
|
+
return resp.items
|
74
|
+
else
|
75
|
+
raise EwsError, "GetUserAvailability produced an error: #{resp.code}: #{resp.message}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Adds one or more delegates to a principal's mailbox and sets specific access permissions
|
80
|
+
# @see http://msdn.microsoft.com/en-us/library/bb856527.aspx
|
81
|
+
#
|
82
|
+
# @param [String,MailboxUser] delegate_email The user you would like to give delegate access to.
|
83
|
+
# This can either be a simple String e-mail address or you can pass in a MailboxUser object.
|
84
|
+
# @param [Hash] permissions A hash of folder type keys and permission type values. An example
|
85
|
+
# would be {:calendar_folder_permission_level => 'Editor'}. Possible keys are:
|
86
|
+
# :calendar_folder_permission_level, :tasks_folder_permission_level, :inbox_folder_permission_level
|
87
|
+
# :contacts_folder_permission_level, :notes_folder_permission_level, :journal_folder_permission_level
|
88
|
+
# and possible values are: None/Editor/Reviewer/Author/Custom
|
89
|
+
# @return [true] This method either returns true or raises an error with the message
|
90
|
+
# as to why this operation did not succeed.
|
91
|
+
def add_delegate!(delegate_email, permissions)
|
92
|
+
# Use a new hash so the passed hash is not modified in case we are in a loop.
|
93
|
+
# Thanks to Markus Roberts for pointing this out.
|
94
|
+
formatted_perms = {}
|
95
|
+
# Modify permissions so we can pass it to the builders
|
96
|
+
permissions.each_pair do |k,v|
|
97
|
+
formatted_perms[k] = {:text => v}
|
98
|
+
end
|
99
|
+
|
100
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.add_delegate(self.email_address, delegate_email, formatted_perms)
|
101
|
+
if(resp.status == 'Success')
|
102
|
+
return true
|
103
|
+
else
|
104
|
+
raise EwsError, "Could not add delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def update_delegate!(delegate_email, permissions)
|
109
|
+
# Modify permissions so we can pass it to the builders
|
110
|
+
formatted_perms = {}
|
111
|
+
permissions.each_pair do |k,v|
|
112
|
+
formatted_perms[k] = {:text => v}
|
113
|
+
end
|
114
|
+
|
115
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.update_delegate(self.email_address, delegate_email, formatted_perms)
|
116
|
+
if(resp.status == 'Success')
|
117
|
+
return true
|
118
|
+
else
|
119
|
+
raise EwsError, "Could not update delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def get_delegate_info()
|
124
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.get_delegate(self.email_address)
|
125
|
+
# if(resp.status == 'Success')
|
126
|
+
# return true
|
127
|
+
# else
|
128
|
+
# raise EwsError, "Could not update delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
|
129
|
+
# end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
|
136
|
+
def simplify!
|
137
|
+
@ews_item = @ews_item.inject({}){|m,o|
|
138
|
+
m[o.keys.first] = o.values.first[:text];
|
139
|
+
m
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
def key_paths
|
144
|
+
@key_paths ||= super.merge(MAILBOX_KEY_PATHS)
|
145
|
+
end
|
146
|
+
|
147
|
+
def key_types
|
148
|
+
@key_types ||= super.merge(MAILBOX_KEY_TYPES)
|
149
|
+
end
|
150
|
+
|
151
|
+
def key_alias
|
152
|
+
@key_alias ||= super.merge(MAILBOX_KEY_ALIAS)
|
153
|
+
end
|
154
|
+
|
155
|
+
end # MailboxUser
|
156
|
+
end # Viewpoint::EWS::Types
|