viewpoint 1.0.0.beta.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +16 -11
  3. data/lib/ews/connection.rb +15 -6
  4. data/lib/ews/convert_accessors.rb +56 -0
  5. data/lib/ews/errors.rb +56 -0
  6. data/lib/ews/ews_client.rb +33 -3
  7. data/lib/ews/exceptions/exceptions.rb +2 -0
  8. data/lib/ews/folder_accessors.rb +66 -1
  9. data/lib/ews/impersonation.rb +30 -0
  10. data/lib/ews/item_accessors.rb +77 -3
  11. data/lib/ews/mailbox_accessors.rb +6 -1
  12. data/lib/ews/message_accessors.rb +9 -2
  13. data/lib/ews/room_accessors.rb +48 -0
  14. data/lib/ews/roomlist_accessors.rb +47 -0
  15. data/lib/ews/soap.rb +1 -0
  16. data/lib/ews/soap/builders/ews_builder.rb +303 -48
  17. data/lib/ews/soap/ews_response.rb +2 -1
  18. data/lib/ews/soap/ews_soap_free_busy_response.rb +13 -3
  19. data/lib/ews/soap/ews_soap_response.rb +1 -1
  20. data/lib/ews/soap/ews_soap_room_response.rb +53 -0
  21. data/lib/ews/soap/ews_soap_roomlist_response.rb +54 -0
  22. data/lib/ews/soap/exchange_data_services.rb +49 -11
  23. data/lib/ews/soap/exchange_synchronization.rb +93 -0
  24. data/lib/ews/soap/exchange_time_zones.rb +56 -0
  25. data/lib/ews/soap/exchange_web_service.rb +36 -66
  26. data/lib/ews/soap/parsers/ews_sax_document.rb +8 -4
  27. data/lib/ews/soap/response_message.rb +3 -1
  28. data/lib/ews/soap/responses/create_attachment_response_message.rb +2 -1
  29. data/lib/ews/soap/responses/send_notification_response_message.rb +2 -1
  30. data/lib/{extensions/string.rb → ews/soap/responses/sync_folder_hierarchy_response_message.rb} +18 -17
  31. data/lib/ews/soap/responses/sync_folder_items_response_message.rb +36 -0
  32. data/lib/ews/templates/calendar_item.rb +78 -0
  33. data/lib/ews/templates/message.rb +8 -1
  34. data/lib/ews/templates/task.rb +74 -0
  35. data/lib/ews/types.rb +59 -11
  36. data/lib/ews/types/calendar_folder.rb +42 -0
  37. data/lib/ews/types/calendar_item.rb +93 -1
  38. data/lib/ews/types/export_items_response_message.rb +52 -0
  39. data/lib/ews/types/generic_folder.rb +70 -2
  40. data/lib/ews/types/item.rb +64 -4
  41. data/lib/ews/types/item_attachment.rb +41 -3
  42. data/lib/ews/types/item_field_uri_map.rb +1 -1
  43. data/lib/ews/types/task.rb +30 -0
  44. data/lib/ews/types/tasks_folder.rb +19 -0
  45. data/lib/viewpoint.rb +14 -14
  46. data/lib/viewpoint/logging.rb +27 -0
  47. data/lib/viewpoint/logging/config.rb +24 -0
  48. data/lib/viewpoint/string_utils.rb +76 -0
  49. metadata +82 -76
@@ -20,6 +20,7 @@ module Viewpoint::EWS::SOAP
20
20
 
21
21
  # A Generic Class for SOAP returns.
22
22
  class EwsResponse
23
+ include Viewpoint::StringUtils
23
24
 
24
25
  def initialize(sax_hash)
25
26
  @resp = sax_hash
@@ -70,7 +71,7 @@ module Viewpoint::EWS::SOAP
70
71
  def class_by_name(cname)
71
72
  begin
72
73
  if(cname.instance_of? Symbol)
73
- cname = cname.to_s.camel_case
74
+ cname = camel_case(cname)
74
75
  end
75
76
  Viewpoint::EWS::SOAP.const_get(cname)
76
77
  rescue NameError => e
@@ -46,7 +46,8 @@ module Viewpoint::EWS::SOAP
46
46
  end
47
47
 
48
48
  def calendar_event_array
49
- get_user_availability_response[1][:free_busy_view][:elems][1][:calendar_event_array][:elems]
49
+ result = find_in_hash_list(get_user_availability_response[1][:free_busy_view][:elems], :calendar_event_array)
50
+ result ? result[:elems] : []
50
51
  end
51
52
 
52
53
  def working_hours
@@ -54,7 +55,7 @@ module Viewpoint::EWS::SOAP
54
55
  end
55
56
 
56
57
  def response_message
57
- get_user_availability_response.first[:response_message]
58
+ find_in_hash_list(get_user_availability_response, :response_message)
58
59
  end
59
60
 
60
61
  def response_class
@@ -63,7 +64,8 @@ module Viewpoint::EWS::SOAP
63
64
  alias :status :response_class
64
65
 
65
66
  def response_code
66
- response_message[:elems].first[:response_code][:text]
67
+ result = find_in_hash_list(response_message[:elems], :response_code)
68
+ result ? result[:text] : nil
67
69
  end
68
70
  alias :code :response_code
69
71
 
@@ -103,6 +105,14 @@ module Viewpoint::EWS::SOAP
103
105
  end
104
106
  end
105
107
 
108
+ # Find the first element in a list of hashes or return nil
109
+ # Example:
110
+ # find_in_hash_list([{:foo => :bar}, {:bar => :baz}], :foo)
111
+ # => :bar
112
+ def find_in_hash_list(collection, key)
113
+ result = collection.find { |hsh| hsh.keys.include?(key) }
114
+ result ? result[key] : nil
115
+ end
106
116
 
107
117
  end # EwsSoapFreeBusyResponse
108
118
 
@@ -45,7 +45,7 @@ module Viewpoint::EWS::SOAP
45
45
 
46
46
  def response_messages
47
47
  key = response.keys.first
48
- response[key][:elems][0][:response_messages][:elems]
48
+ response[key][:elems].find{|e| e.keys.include? :response_messages }[:response_messages][:elems]
49
49
  end
50
50
 
51
51
  def response_message
@@ -0,0 +1,53 @@
1
+ =begin
2
+ This file is a contribution to Viewpoint; the Ruby library for Microsoft Exchange Web Services.
3
+
4
+ Copyright © 2013 Camille Baldock <viewpoint@camillebaldock.co.uk>
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::SOAP
20
+
21
+ # A class for roomlists SOAP returns.
22
+ # @attr_reader [String] :message The text from the EWS element <m:ResponseCode>
23
+ class EwsSoapRoomResponse < EwsSoapResponse
24
+
25
+ def response_messages
26
+ key = response.keys.first
27
+ subresponse = response[key][:elems][1]
28
+ response_class = subresponse.keys.first
29
+ subresponse[response_class][:elems]
30
+ end
31
+
32
+ def roomsArray
33
+ response[:get_rooms_response][:elems][1][:rooms][:elems]
34
+ end
35
+
36
+ def success?
37
+ response.first[1][:attribs][:response_class] == "Success"
38
+ end
39
+
40
+ private
41
+
42
+ def simplify!
43
+ if response_messages
44
+ response_messages.each do |rm|
45
+ key = rm.keys.first
46
+ rm[key][:elems] = rm[key][:elems].inject(&:merge)
47
+ end
48
+ end
49
+ end
50
+
51
+ end # EwsSoapRoomResponse
52
+
53
+ end # Viewpoint::EWS::SOAP
@@ -0,0 +1,54 @@
1
+ =begin
2
+ This file is a contribution to Viewpoint; the Ruby library for Microsoft Exchange Web Services.
3
+
4
+ Copyright © 2013 Camille Baldock <viewpoint@camillebaldock.co.uk>
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::SOAP
20
+
21
+ # A class for roomlists SOAP returns.
22
+ # @attr_reader [String] :message The text from the EWS element <m:ResponseCode>
23
+ class EwsSoapRoomlistResponse < EwsSoapResponse
24
+
25
+ def response_messages
26
+ key = response.keys.first
27
+ subresponse = response[key][:elems][1]
28
+ response_class = subresponse.keys.first
29
+ subresponse[response_class][:elems]
30
+ end
31
+
32
+ def roomListsArray
33
+ response[:get_room_lists_response][:elems][1][:room_lists][:elems]
34
+ end
35
+
36
+ def success?
37
+ response.first[1][:attribs][:response_class] == "Success"
38
+ end
39
+
40
+ private
41
+
42
+
43
+ def simplify!
44
+ if response_messages
45
+ response_messages.each do |rm|
46
+ key = rm.keys.first
47
+ rm[key][:elems] = rm[key][:elems].inject(&:merge)
48
+ end
49
+ end
50
+ end
51
+
52
+ end # EwsSoapRoomlistResponse
53
+
54
+ end # Viewpoint::EWS::SOAP
@@ -37,9 +37,10 @@ module Viewpoint::EWS::SOAP
37
37
  req = build_soap! do |type, builder|
38
38
  if(type == :header)
39
39
  else
40
- builder.nbuild.FindItem(:Traversal => opts[:traversal].to_s.camel_case) {
40
+ builder.nbuild.FindItem(:Traversal => camel_case(opts[:traversal])) {
41
41
  builder.nbuild.parent.default_namespace = @default_ns
42
42
  builder.item_shape!(opts[:item_shape])
43
+ builder.indexed_page_item_view!(opts[:indexed_page_item_view]) if opts[:indexed_page_item_view]
43
44
  # @todo add FractionalPageFolderView
44
45
  builder.calendar_view!(opts[:calendar_view]) if opts[:calendar_view]
45
46
  builder.contacts_view!(opts[:contacts_view]) if opts[:contacts_view]
@@ -137,11 +138,11 @@ module Viewpoint::EWS::SOAP
137
138
  builder.saved_item_folder_id!(opts[:saved_item_folder_id]) if opts[:saved_item_folder_id]
138
139
  builder.nbuild.Items {
139
140
  opts[:items].each {|i|
140
- # The key can be any number of item types like :message,
141
- # :calendar, etc
142
- ikey = i.keys.first
143
- builder.send("#{ikey}!",i[ikey])
144
- }
141
+ # The key can be any number of item types like :message,
142
+ # :calendar, etc
143
+ ikey = i.keys.first
144
+ builder.send("#{ikey}!",i[ikey])
145
+ }
145
146
  }
146
147
  }
147
148
  end
@@ -364,6 +365,26 @@ module Viewpoint::EWS::SOAP
364
365
  do_soap_request(req, response_class: EwsResponse)
365
366
  end
366
367
 
368
+ # Export items as a base64 string
369
+ # @see http://msdn.microsoft.com/en-us/library/ff709503(v=exchg.140).aspx
370
+ #
371
+ # (Requires Exchange version equal or newer than VERSION 2010 SP 1)
372
+ #
373
+ # @param ids [Array] array of item ids. Can also be a single id value
374
+ def export_items(ids)
375
+ validate_version(VERSION_2010_SP1)
376
+ ids = ids.clone
377
+ [:item_ids].each do |k|
378
+ validate_param(ids, k, true)
379
+ end
380
+ req = build_soap! do |type, builder|
381
+ if(type == :header)
382
+ else
383
+ builder.export_item_ids!(ids[:item_ids])
384
+ end
385
+ end
386
+ do_soap_request(req, response_class: EwsResponse)
387
+ end
367
388
 
368
389
  # ------------- Folder Operations ------------
369
390
 
@@ -471,7 +492,7 @@ module Viewpoint::EWS::SOAP
471
492
  req = build_soap! do |type, builder|
472
493
  if(type == :header)
473
494
  else
474
- builder.nbuild.FindFolder(:Traversal => opts[:traversal].to_s.camel_case) {
495
+ builder.nbuild.FindFolder(:Traversal => camel_case(opts[:traversal])) {
475
496
  builder.nbuild.parent.default_namespace = @default_ns
476
497
  builder.folder_shape!(opts[:folder_shape])
477
498
  builder.restriction!(opts[:restriction]) if opts[:restriction]
@@ -580,7 +601,7 @@ module Viewpoint::EWS::SOAP
580
601
  validate_version(VERSION_2010_SP1)
581
602
  ef_opts = {}
582
603
  [:delete_type, :delete_sub_folders].each do |k|
583
- ef_opts[k.to_s.camel_case] = validate_param(opts, k, true)
604
+ ef_opts[camel_case(k)] = validate_param(opts, k, true)
584
605
  end
585
606
  fids = validate_param opts, :folder_ids, true
586
607
 
@@ -654,6 +675,9 @@ module Viewpoint::EWS::SOAP
654
675
  opts[:items].each do |ia|
655
676
  builder.item_attachment!(ia)
656
677
  end
678
+ opts[:inline_files].each do |fi|
679
+ builder.inline_attachment!(fi)
680
+ end
657
681
  }
658
682
  }
659
683
  end
@@ -728,14 +752,28 @@ module Viewpoint::EWS::SOAP
728
752
  # @todo Needs to be finished
729
753
  def convert_id(opts)
730
754
  opts = opts.clone
755
+
756
+ [:id, :format, :destination_format, :mailbox ].each do |k|
757
+ validate_param(opts, k, true)
758
+ end
759
+
731
760
  req = build_soap! do |type, builder|
732
761
  if(type == :header)
733
762
  else
734
- builder.nbuild.ConvertId {|x|
735
- }
763
+ builder.nbuild.ConvertId {|x|
764
+ builder.nbuild.parent.default_namespace = @default_ns
765
+ x.parent['DestinationFormat'] = opts[:destination_format].to_s.camel_case
766
+ x.SourceIds { |x|
767
+ x[NS_EWS_TYPES].AlternateId { |x|
768
+ x.parent['Format'] = opts[:format].to_s.camel_case
769
+ x.parent['Id'] = opts[:id]
770
+ x.parent['Mailbox'] = opts[:mailbox]
771
+ }
772
+ }
773
+ }
736
774
  end
737
775
  end
738
- do_soap_request(req)
776
+ do_soap_request(req, response_class: EwsResponse)
739
777
  end
740
778
 
741
779
  end #ExchangeDataServices
@@ -0,0 +1,93 @@
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::SOAP
20
+
21
+ # Exchange Synchronization operations as listed in the EWS Documentation.
22
+ # @see http://msdn.microsoft.com/en-us/library/bb409286.aspx
23
+ module ExchangeSynchronization
24
+ include Viewpoint::EWS::SOAP
25
+
26
+ # Defines a request to synchronize a folder hierarchy on a client
27
+ # @see http://msdn.microsoft.com/en-us/library/aa580990.aspx
28
+ # @param [Hash] opts
29
+ # @option opts [Hash] :folder_shape The folder shape properties
30
+ # Ex: {:base_shape => 'Default', :additional_properties => 'bla bla bla'}
31
+ # @option opts [Hash] :sync_folder_id An optional Hash that represents a FolderId or
32
+ # DistinguishedFolderId.
33
+ # Ex: {:id => :inbox}
34
+ # @option opts [Hash] :sync_state The Base64 sync state id. If this is the
35
+ # first time syncing this does not need to be passed.
36
+ def sync_folder_hierarchy(opts)
37
+ opts = opts.clone
38
+ req = build_soap! do |type, builder|
39
+ if(type == :header)
40
+ else
41
+ builder.nbuild.SyncFolderHierarchy {
42
+ builder.nbuild.parent.default_namespace = @default_ns
43
+ builder.folder_shape!(opts[:folder_shape])
44
+ builder.sync_folder_id!(opts[:sync_folder_id]) if opts[:sync_folder_id]
45
+ builder.sync_state!(opts[:sync_state]) if opts[:sync_state]
46
+ }
47
+ end
48
+ end
49
+ do_soap_request(req, response_class: EwsResponse)
50
+ end
51
+
52
+ # Synchronizes items between the Exchange server and the client
53
+ # @see http://msdn.microsoft.com/en-us/library/aa563967(v=EXCHG.140).aspx
54
+ # @param [Hash] opts
55
+ # @option opts [Hash] :item_shape The item shape properties
56
+ # Ex: {:base_shape => 'Default', :additional_properties => 'bla bla bla'}
57
+ # @option opts [Hash] :sync_folder_id A Hash that represents a FolderId or
58
+ # DistinguishedFolderId. [ Ex: {:id => :inbox} ] OPTIONAL
59
+ # @option opts [String] :sync_state The Base64 sync state id. If this is the
60
+ # first time syncing this does not need to be passed. OPTIONAL on first call
61
+ # @option opts [Array <String>] :ignore An Array of ItemIds for items to ignore
62
+ # during the sync process. Ex: [{:id => 'id1', :change_key => 'ck'}, {:id => 'id2'}]
63
+ # OPTIONAL
64
+ # @option opts [Integer] :max_changes_returned ('required') The amount of items to sync per call.
65
+ # @option opts [String] :sync_scope specifies whether just items or items and folder associated
66
+ # information are returned. OPTIONAL
67
+ # options: 'NormalItems' or 'NormalAndAssociatedItems'
68
+ # @example
69
+ # { :item_shape => {:base_shape => 'Default'},
70
+ # :sync_folder_id => {:id => :inbox},
71
+ # :sync_state => myBase64id,
72
+ # :max_changes_returned => 256 }
73
+ def sync_folder_items(opts)
74
+ opts = opts.clone
75
+ req = build_soap! do |type, builder|
76
+ if(type == :header)
77
+ else
78
+ builder.nbuild.SyncFolderItems {
79
+ builder.nbuild.parent.default_namespace = @default_ns
80
+ builder.item_shape!(opts[:item_shape])
81
+ builder.sync_folder_id!(opts[:sync_folder_id]) if opts[:sync_folder_id]
82
+ builder.sync_state!(opts[:sync_state]) if opts[:sync_state]
83
+ builder.ignore!(opts[:ignore]) if opts[:ignore]
84
+ builder.max_changes_returned!(opts[:max_changes_returned])
85
+ builder.sync_scope!(opts[:sync_scope]) if opts[:sync_scope]
86
+ }
87
+ end
88
+ end
89
+ do_soap_request(req, response_class: EwsResponse)
90
+ end
91
+
92
+ end #ExchangeSynchronization
93
+ end
@@ -0,0 +1,56 @@
1
+ module Viewpoint::EWS::SOAP
2
+
3
+ module ExchangeTimeZones
4
+ include Viewpoint::EWS::SOAP
5
+
6
+ # Request list of server known time zones
7
+ # @param full [Boolean] Request full time zone definition? Returns only name and id if false.
8
+ # @param ids [Array] Returns only the specified time zones instead of all if present
9
+ # @return [Array] Array of Objects responding to #id() and #name()
10
+ # @example Retrieving server zime zones
11
+ # ews_client = Viewpoint::EWSClient.new # ...
12
+ # zones = ews_client.ews.get_time_zones
13
+ # @todo Implement TimeZoneDefinition with sub elements Periods, TransitionsGroups and Transitions
14
+ def get_time_zones(full = false, ids = nil)
15
+ req = build_soap! do |type, builder|
16
+ unless type == :header
17
+ builder.get_server_time_zones!(full: full, ids: ids)
18
+ end
19
+ end
20
+ result = do_soap_request req, response_class: EwsSoapResponse
21
+
22
+ if result.success?
23
+ zones = []
24
+ result.response_messages.each do |message|
25
+ elements = message[:get_server_time_zones_response_message][:elems][:time_zone_definitions][:elems]
26
+ elements.each do |definition|
27
+ data = {
28
+ id: definition[:time_zone_definition][:attribs][:id],
29
+ name: definition[:time_zone_definition][:attribs][:name]
30
+ }
31
+ zones << OpenStruct.new(data)
32
+ end
33
+ end
34
+ zones
35
+ else
36
+ raise EwsError, "Could not get time zones"
37
+ end
38
+ end
39
+
40
+ # Sets the time zone context header
41
+ # @param id [String] Identifier of a Microsoft well known time zone
42
+ # @example Set time zone context for connection
43
+ # ews_client = Viewpoint::EWSClient.new # ...
44
+ # ews_client.set_time_zone 'AUS Central Standard Time'
45
+ # # subsequent request will send the TimeZoneContext header
46
+ # @see EWSClient#set_time_zone
47
+ def set_time_zone_context(id)
48
+ if id
49
+ @time_zone_context = {id: id}
50
+ else
51
+ @time_zone_context = nil
52
+ end
53
+ end
54
+
55
+ end
56
+ end
@@ -20,12 +20,15 @@ module Viewpoint::EWS::SOAP
20
20
  class ExchangeWebService
21
21
  include Viewpoint::EWS
22
22
  include Viewpoint::EWS::SOAP
23
+ include Viewpoint::StringUtils
23
24
  include ExchangeDataServices
24
25
  include ExchangeNotification
25
26
  include ExchangeAvailability
26
27
  include ExchangeUserConfiguration
28
+ include ExchangeSynchronization
29
+ include ExchangeTimeZones
27
30
 
28
- attr_accessor :server_version, :auto_deepen, :connection
31
+ attr_accessor :server_version, :auto_deepen, :no_auto_deepen_behavior, :connection, :impersonation_type, :impersonation_address
29
32
 
30
33
  # @param [Viewpoint::EWS::Connection] connection the connection object
31
34
  # @param [Hash] opts additional options to the web service
@@ -38,70 +41,9 @@ module Viewpoint::EWS::SOAP
38
41
  @connection = connection
39
42
  @server_version = opts[:server_version] ? opts[:server_version] : VERSION_2010
40
43
  @auto_deepen = true
41
- end
42
-
43
- # Defines a request to synchronize a folder hierarchy on a client
44
- # @see http://msdn.microsoft.com/en-us/library/aa580990.aspx
45
- # @param [Hash] opts
46
- # @option opts [Hash] :folder_shape The folder shape properties
47
- # Ex: {:base_shape => 'Default', :additional_properties => 'bla bla bla'}
48
- # @option opts [Hash] :sync_folder_id An optional Hash that represents a FolderId or
49
- # DistinguishedFolderId.
50
- # Ex: {:id => :inbox}
51
- # @option opts [Hash] :sync_state The Base64 sync state id. If this is the
52
- # first time syncing this does not need to be passed.
53
- def sync_folder_hierarchy(opts)
54
- req = build_soap! do |type, builder|
55
- if(type == :header)
56
- else
57
- builder.nbuild.SyncFolderHierarchy {
58
- builder.nbuild.parent.default_namespace = @default_ns
59
- builder.folder_shape!(opts[:folder_shape])
60
- builder.sync_folder_id!(opts[:sync_folder_id]) if opts[:sync_folder_id]
61
- builder.sync_state!(opts[:sync_state]) if opts[:sync_state]
62
- }
63
- end
64
- end
65
- do_soap_request(req)
66
- end
67
-
68
- # Synchronizes items between the Exchange server and the client
69
- # @see http://msdn.microsoft.com/en-us/library/aa563967(v=EXCHG.140).aspx
70
- # @param [Hash] opts
71
- # @option opts [Hash] :item_shape The item shape properties
72
- # Ex: {:base_shape => 'Default', :additional_properties => 'bla bla bla'}
73
- # @option opts [Hash] :sync_folder_id A Hash that represents a FolderId or
74
- # DistinguishedFolderId. [ Ex: {:id => :inbox} ] OPTIONAL
75
- # @option opts [String] :sync_state The Base64 sync state id. If this is the
76
- # first time syncing this does not need to be passed. OPTIONAL on first call
77
- # @option opts [Array <String>] :ignore An Array of ItemIds for items to ignore
78
- # during the sync process. Ex: [{:id => 'id1', :change_key => 'ck'}, {:id => 'id2'}]
79
- # OPTIONAL
80
- # @option opts [Integer] :max_changes_returned ('required') The amount of items to sync per call.
81
- # @option opts [String] :sync_scope specifies whether just items or items and folder associated
82
- # information are returned. OPTIONAL
83
- # options: 'NormalItems' or 'NormalAndAssociatedItems'
84
- # @example
85
- # { :item_shape => {:base_shape => 'Default'},
86
- # :sync_folder_id => {:id => :inbox},
87
- # :sync_state => myBase64id,
88
- # :max_changes_returned => 256 }
89
- def sync_folder_items(opts)
90
- req = build_soap! do |type, builder|
91
- if(type == :header)
92
- else
93
- builder.nbuild.SyncFolderItems {
94
- builder.nbuild.parent.default_namespace = @default_ns
95
- builder.item_shape!(opts[:item_shape])
96
- builder.sync_folder_id!(opts[:sync_folder_id]) if opts[:sync_folder_id]
97
- builder.sync_state!(opts[:sync_state]) if opts[:sync_state]
98
- builder.ignore!(opts[:ignore]) if opts[:ignore]
99
- builder.max_changes_returned!(opts[:max_changes_returned])
100
- builder.sync_scope!(opts[:sync_scope]) if opts[:sync_scope]
101
- }
102
- end
103
- end
104
- do_soap_request(req)
44
+ @no_auto_deepen_behavior = :raise
45
+ @impersonation_type = ""
46
+ @impersonation_address = ""
105
47
  end
106
48
 
107
49
  def delete_attachment
@@ -226,6 +168,33 @@ module Viewpoint::EWS::SOAP
226
168
  do_soap_request(req, response_class: EwsSoapFreeBusyResponse)
227
169
  end
228
170
 
171
+ # Gets the rooms that are in the specified room distribution list
172
+ # @see http://msdn.microsoft.com/en-us/library/aa563465.aspx
173
+ # @param [string] roomDistributionList
174
+ def get_rooms(roomDistributionList)
175
+ req = build_soap! do |type, builder|
176
+ if(type == :header)
177
+ else
178
+ builder.nbuild.GetRooms {|x|
179
+ x.parent.default_namespace = @default_ns
180
+ builder.room_list!(roomDistributionList)
181
+ }
182
+ end
183
+ end
184
+ do_soap_request(req, response_class: EwsSoapRoomResponse)
185
+ end
186
+
187
+ # Gets the room lists that are available within the Exchange organization.
188
+ # @see http://msdn.microsoft.com/en-us/library/aa563465.aspx
189
+ def get_room_lists
190
+ req = build_soap! do |type, builder|
191
+ if(type == :header)
192
+ else
193
+ builder.room_lists!
194
+ end
195
+ end
196
+ do_soap_request(req, response_class: EwsSoapRoomlistResponse)
197
+ end
229
198
 
230
199
  # Send the SOAP request to the endpoint and parse it.
231
200
  # @param [String] soapmsg an XML formatted string
@@ -286,7 +255,8 @@ module Viewpoint::EWS::SOAP
286
255
 
287
256
  # Build the common elements in the SOAP message and yield to any custom elements.
288
257
  def build_soap!(&block)
289
- opts = { :server_version => server_version }
258
+ opts = { :server_version => server_version, :impersonation_type => impersonation_type, :impersonation_mail => impersonation_address }
259
+ opts[:time_zone_context] = @time_zone_context if @time_zone_context
290
260
  EwsBuilder.new.build!(opts, &block)
291
261
  end
292
262