viewpoint 0.1.26 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +203 -0
  3. data/lib/ews/calendar_accessors.rb +34 -0
  4. data/lib/ews/connection.rb +140 -0
  5. data/lib/ews/connection_helper.rb +35 -0
  6. data/lib/ews/convert_accessors.rb +56 -0
  7. data/lib/{exceptions/exceptions.rb → ews/errors.rb} +29 -19
  8. data/lib/ews/ews_client.rb +105 -0
  9. data/lib/ews/exceptions/exceptions.rb +61 -0
  10. data/lib/ews/folder_accessors.rb +264 -0
  11. data/lib/ews/impersonation.rb +30 -0
  12. data/lib/ews/item_accessors.rb +242 -0
  13. data/lib/ews/mailbox_accessors.rb +92 -0
  14. data/lib/ews/meeting_accessors.rb +39 -0
  15. data/lib/ews/message_accessors.rb +93 -0
  16. data/lib/ews/push_subscription_accessors.rb +33 -0
  17. data/lib/ews/room_accessors.rb +48 -0
  18. data/lib/ews/roomlist_accessors.rb +47 -0
  19. data/lib/ews/soap.rb +64 -0
  20. data/lib/ews/soap/builders/ews_builder.rb +1384 -0
  21. data/lib/ews/soap/ews_response.rb +84 -0
  22. data/lib/ews/soap/ews_soap_availability_response.rb +58 -0
  23. data/lib/ews/soap/ews_soap_free_busy_response.rb +119 -0
  24. data/lib/ews/soap/ews_soap_response.rb +103 -0
  25. data/lib/ews/soap/ews_soap_room_response.rb +53 -0
  26. data/lib/ews/soap/ews_soap_roomlist_response.rb +54 -0
  27. data/lib/ews/soap/exchange_availability.rb +61 -0
  28. data/lib/ews/soap/exchange_data_services.rb +780 -0
  29. data/lib/ews/soap/exchange_notification.rb +146 -0
  30. data/lib/ews/soap/exchange_synchronization.rb +93 -0
  31. data/lib/ews/soap/exchange_time_zones.rb +56 -0
  32. data/lib/ews/soap/exchange_user_configuration.rb +33 -0
  33. data/lib/ews/soap/exchange_web_service.rb +264 -0
  34. data/lib/{model/item_attachment.rb → ews/soap/parsers/ews_parser.rb} +24 -14
  35. data/lib/ews/soap/parsers/ews_sax_document.rb +70 -0
  36. data/lib/ews/soap/response_message.rb +80 -0
  37. data/lib/ews/soap/responses/create_attachment_response_message.rb +47 -0
  38. data/lib/{model/meeting_message.rb → ews/soap/responses/create_item_response_message.rb} +7 -10
  39. data/lib/ews/soap/responses/find_item_response_message.rb +80 -0
  40. data/lib/ews/soap/responses/get_events_response_message.rb +53 -0
  41. data/lib/ews/soap/responses/send_notification_response_message.rb +59 -0
  42. data/lib/{model/attachment.rb → ews/soap/responses/subscribe_response_message.rb} +17 -13
  43. data/lib/{model/attendee.rb → ews/soap/responses/sync_folder_hierarchy_response_message.rb} +14 -15
  44. data/lib/ews/soap/responses/sync_folder_items_response_message.rb +36 -0
  45. data/lib/ews/templates/calendar_item.rb +79 -0
  46. data/lib/ews/templates/forward_item.rb +24 -0
  47. data/lib/ews/templates/message.rb +85 -0
  48. data/lib/ews/templates/reply_to_item.rb +25 -0
  49. data/lib/ews/templates/task.rb +74 -0
  50. data/lib/ews/types.rb +194 -0
  51. data/lib/ews/types/attachment.rb +77 -0
  52. data/lib/{model/meeting_cancellation.rb → ews/types/attendee.rb} +9 -8
  53. data/lib/ews/types/calendar_folder.rb +50 -0
  54. data/lib/ews/types/calendar_item.rb +130 -0
  55. data/lib/ews/types/contact.rb +7 -0
  56. data/lib/ews/types/contacts_folder.rb +8 -0
  57. data/lib/ews/types/copied_event.rb +51 -0
  58. data/lib/{soap/handsoap/builder.rb → ews/types/created_event.rb} +5 -2
  59. data/lib/ews/types/deleted_event.rb +24 -0
  60. data/lib/ews/types/distribution_list.rb +7 -0
  61. data/lib/ews/types/event.rb +62 -0
  62. data/lib/ews/types/export_items_response_message.rb +52 -0
  63. data/lib/ews/types/file_attachment.rb +65 -0
  64. data/lib/ews/types/folder.rb +60 -0
  65. data/lib/ews/types/free_busy_changed_event.rb +24 -0
  66. data/lib/ews/types/generic_folder.rb +418 -0
  67. data/lib/ews/types/item.rb +447 -0
  68. data/lib/ews/types/item_attachment.rb +84 -0
  69. data/lib/{model → ews/types}/item_field_uri_map.rb +2 -18
  70. data/lib/ews/types/mailbox_user.rb +156 -0
  71. data/lib/ews/types/meeting_cancellation.rb +7 -0
  72. data/lib/ews/types/meeting_message.rb +7 -0
  73. data/lib/ews/types/meeting_request.rb +7 -0
  74. data/lib/ews/types/meeting_response.rb +7 -0
  75. data/lib/ews/types/message.rb +7 -0
  76. data/lib/ews/types/modified_event.rb +48 -0
  77. data/lib/{extensions/string.rb → ews/types/moved_event.rb} +31 -15
  78. data/lib/ews/types/new_mail_event.rb +24 -0
  79. data/lib/ews/types/out_of_office.rb +147 -0
  80. data/lib/ews/types/post_item.rb +7 -0
  81. data/lib/ews/types/search_folder.rb +8 -0
  82. data/lib/ews/types/status_event.rb +39 -0
  83. data/lib/ews/types/task.rb +41 -0
  84. data/lib/ews/types/tasks_folder.rb +27 -0
  85. data/lib/viewpoint.rb +85 -108
  86. data/lib/{model/distribution_list.rb → viewpoint/logging.rb} +6 -3
  87. data/lib/{model/meeting_response.rb → viewpoint/logging/config.rb} +3 -3
  88. data/lib/viewpoint/string_utils.rb +76 -0
  89. metadata +156 -123
  90. data/README +0 -114
  91. data/lib/model/calendar_folder.rb +0 -67
  92. data/lib/model/calendar_item.rb +0 -267
  93. data/lib/model/contact.rb +0 -238
  94. data/lib/model/contacts_folder.rb +0 -46
  95. data/lib/model/event.rb +0 -116
  96. data/lib/model/file_attachment.rb +0 -53
  97. data/lib/model/folder.rb +0 -47
  98. data/lib/model/generic_folder.rb +0 -461
  99. data/lib/model/item.rb +0 -312
  100. data/lib/model/mailbox_user.rb +0 -146
  101. data/lib/model/meeting_request.rb +0 -39
  102. data/lib/model/message.rb +0 -142
  103. data/lib/model/model.rb +0 -269
  104. data/lib/model/search_folder.rb +0 -48
  105. data/lib/model/task.rb +0 -121
  106. data/lib/model/tasks_folder.rb +0 -44
  107. data/lib/soap/handsoap/builders/ews_build_helpers.rb +0 -383
  108. data/lib/soap/handsoap/builders/ews_builder.rb +0 -146
  109. data/lib/soap/handsoap/ews_service.rb +0 -790
  110. data/lib/soap/handsoap/parser.rb +0 -104
  111. data/lib/soap/handsoap/parsers/ews_parser.rb +0 -245
  112. data/lib/soap/soap_provider.rb +0 -64
data/lib/model/contact.rb DELETED
@@ -1,238 +0,0 @@
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
20
- module EWS
21
- # Represents a Contact Item in the Exchange datastore.
22
- class Contact < Item
23
-
24
- # This is a class method that creates a new Contact in the Exchange Data Store.
25
- # @param [Hash] item A Hash of values based on values found here:
26
- # http://msdn.microsoft.com/en-us/library/aa581315.aspx
27
- # @param [String, Symbol] folder_id The folder to create this item in. Either a
28
- # DistinguishedFolderId (must me a Symbol) or a FolderId (String)
29
- # @param [String] send_invites "SendToNone/SendOnlyToAll/SendToAllAndSaveCopy"
30
- # See: http://msdn.microsoft.com/en-us/library/aa565209.aspx
31
- # @example Typical Usage
32
- # item = {
33
- # :file_as => {:text => 'Dan Wanek'},
34
- # :given_name => {:text => 'Dan Wanek'},
35
- # :company_name => {:text => 'Test Company'},
36
- # :email_addresses => [
37
- # {:entry => {:key => 'EmailAddress1', :text => 'myemail@work.com'}},
38
- # {:entry => {:key => 'EmailAddress2', :text => 'myemail@home.com'}}
39
- # ],
40
- # :physical_addresses => [
41
- # {:entry => {:key => 'Business', :sub_elements => {:street => {:text => '6343 N Baltimore'}, :city => {:text => 'Bismarck'}, :state => {:text => 'ND'} }}}
42
- # ],
43
- # :phone_numbers => [
44
- # {:entry => {:key => 'BusinessPhone', :text => '7012220000'}}
45
- # ],
46
- # :job_title => {:text => 'Systems Architect'}
47
- # }
48
- # @example Minimal Usage
49
- def self.create_item_from_hash(item, folder_id = :contacts)
50
- conn = Viewpoint::EWS::EWS.instance
51
- resp = conn.ews.create_contact_item(folder_id, item)
52
- if(resp.status == 'Success')
53
- resp = resp.items.shift
54
- self.new(resp[resp.keys.first])
55
- else
56
- raise EwsError, "Could not create Contact. #{resp.code}: #{resp.message}"
57
- end
58
- end
59
-
60
- # Create a Contact in the Exchange Data Store
61
- def self.add_contact()
62
- item = {}
63
-
64
- conn = Viewpoint::EWS::EWS.instance
65
- resp = conn.ews.create_contact_item()
66
-
67
- if(resp.status == 'Success')
68
- resp = resp.items.shift
69
- self.new(resp[resp.keys.first])
70
- else
71
- raise EwsError, "Could not add contact. #{resp.code}: #{resp.message}"
72
- end
73
- end
74
-
75
- # Initialize an Exchange Web Services item of type Contact
76
- def initialize(ews_item, opts={})
77
- super(ews_item, opts)
78
- end
79
-
80
- def set_email_addresses(email1, email2=nil, email3=nil)
81
- changes = []
82
- type = self.class.name.split(/::/).last.ruby_case.to_sym
83
- k = :email_addresses
84
- v = 'EmailAddress1'
85
- changes << {:set_item_field =>
86
- [{:indexed_field_uRI => {:field_uRI => FIELD_URIS[k][:text], :field_index => v}}, {type=>{k => {:entry => {:key => v, :text => email1}}}}]} unless email1.nil?
87
- v = 'EmailAddress2'
88
- changes << {:set_item_field =>
89
- [{:indexed_field_uRI => {:field_uRI => FIELD_URIS[k][:text], :field_index => v}}, {type=>{k => {:entry => {:key => v, :text => email2}}}}]} unless email2.nil?
90
- v = 'EmailAddress3'
91
- changes << {:set_item_field =>
92
- [{:indexed_field_uRI => {:field_uRI => FIELD_URIS[k][:text], :field_index => v}}, {type=>{k => {:entry => {:key => v, :text => email3}}}}]} unless email3.nil?
93
- @updates.merge!({:preformatted => changes}) {|k,v1,v2| v1 + v2}
94
- end
95
-
96
- # Set the phone number. You must give a type based on the available Exchange phone number types
97
- # @param [Symbol] type the type of number to set. It must be one of these:
98
- # :assistant_phone, :business_fax, :business_phone, :business_phone2, :callback, :car_phone, :company_main_phone,
99
- # :home_fax, :home_phone, :home_phone2, :isdn, :mobile_phone, :other_fax, :other_telephone, :pager, :primary_phone,
100
- # :radio_phone, :telex, :tty_tdd_phone
101
- # @param [String] phone_number The phone number
102
- def set_phone_number(phone_type, phone_number)
103
- valid_types = [:assistant_phone, :business_fax, :business_phone, :business_phone2, :callback, :car_phone, :company_main_phone,
104
- :home_fax, :home_phone, :home_phone2, :isdn, :mobile_phone, :other_fax, :other_telephone, :pager, :primary_phone,
105
- :radio_phone, :telex, :tty_tdd_phone]
106
- raise EwsError, "Invalid phone type (#{phone_type}) passed to Contact#set_phone_number." unless valid_types.index phone_type
107
- type = self.class.name.split(/::/).last.ruby_case.to_sym
108
-
109
- changes = []
110
- k = :phone_numbers
111
- v = phone_type.to_s.camel_case
112
- changes << {:set_item_field =>
113
- [{:indexed_field_uRI => {:field_uRI => FIELD_URIS[k][:text], :field_index => v}}, {type=>{k => {:entry => {:key => v, :text => phone_number}}}}]}
114
- @updates.merge!({:preformatted => changes}) {|k,v1,v2| v1 + v2}
115
- end
116
-
117
- # Set an address for this contact
118
- # @param [Symbol] address_type the type of Exchange address to set. It must be one of the following:
119
- # :business, :home, :other
120
- # @param [Hash] address the address elements to set. It may include the following keys
121
- # :street, :city, :state, :country_or_region, :postal_code
122
- # @todo check for empty address hash
123
- def set_address(address_type, address)
124
- valid_types = [:business, :home, :other]
125
- raise EwsError, "Invalid address type (#{address_type}) passed to Contact#set_address." unless valid_types.index address_type
126
- valid_field_types = [:street, :city, :state, :country_or_region, :postal_code]
127
- type = self.class.name.split(/::/).last.ruby_case.to_sym
128
- v = address_type.to_s.camel_case
129
-
130
- changes = []
131
- field = 'PhysicalAddresses'
132
- address.keys.each do |addr_item|
133
- raise EwsError, "Invalid address element (#{addr_item}) passed to Contact#set_address." unless valid_field_types.index addr_item
134
- index_field = "contacts:PhysicalAddress:#{addr_item.to_s.camel_case}"
135
- changes << {:set_item_field =>
136
- [{:indexed_field_uRI => {
137
- :field_uRI => index_field, :field_index => v}}, {type => {field => {:entry => {:key => v, addr_item =>{ :text => address[addr_item]}}}}}
138
- ]}
139
- end
140
- @updates.merge!({:preformatted => changes}) {|k,v1,v2| v1 + v2}
141
- end
142
-
143
-
144
- private
145
-
146
- def init_methods
147
- super()
148
-
149
- define_str_var :file_as, :file_as_mapping, :display_name, :job_title, :given_name, :surname, :company_name
150
- define_attr_str_var :complete_name, :first_name, :middle_name, :last_name, :initials, :full_name
151
- define_inet_addresses :email_addresses, :im_addresses
152
- define_phone_numbers :phone_numbers
153
- define_physical_addresses :physical_addresses
154
- end
155
-
156
-
157
- # Define email_addresses or im_addresses for a Contact
158
- def define_inet_addresses(*inet_addresses)
159
- inet_addresses.each do |itype|
160
- eval "@#{itype} ||= {}"
161
- return unless self.instance_variable_get("@#{itype}").empty?
162
- if(@ews_item.has_key?(itype))
163
- @ews_methods << itype
164
- if(@ews_item[itype][:entry].is_a?(Array))
165
- @ews_item[itype][:entry].each do |entry|
166
- next if entry.keys.length == 1
167
- eval "@#{itype}[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : '')"
168
- end
169
- else
170
- entry = @ews_item[itype][:entry]
171
- next if entry.keys.length == 1
172
- eval "@#{itype}[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : '')"
173
- end
174
- self.instance_eval <<-EOF
175
- def #{itype}
176
- self.instance_variable_get "@#{itype}"
177
- end
178
- EOF
179
- else
180
- @ews_methods_undef << itype
181
- end
182
- end
183
- end
184
-
185
- def define_phone_numbers(phone_numbers)
186
- @phone_numbers ||= {}
187
- return unless @phone_numbers.empty?
188
- if(@ews_item.has_key?(phone_numbers))
189
- if(@ews_item[phone_numbers][:entry].is_a?(Array))
190
- @ews_item[phone_numbers][:entry].each do |entry|
191
- next if entry.keys.length == 1
192
- @phone_numbers[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : "")
193
- end
194
- else # it is a Hash then
195
- entry = @ews_item[phone_numbers][:entry]
196
- return if entry.keys.length == 1
197
- @phone_numbers[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : "")
198
- end
199
- self.instance_eval <<-EOF
200
- def #{phone_numbers}
201
- @phone_numbers
202
- end
203
- EOF
204
- @ews_methods << phone_numbers
205
- else
206
- @ews_methods_undef << itype
207
- end
208
- end
209
-
210
- # Define physical_addresses for a Contact
211
- def define_physical_addresses(physical_addresses)
212
- @physical_addresses ||= {}
213
- return unless @physical_addresses.empty?
214
- if(@ews_item.has_key?(physical_addresses))
215
- @ews_methods << physical_addresses
216
- entries = @ews_item[physical_addresses][:entry]
217
- entries = entries.is_a?(Array) ? entries : [entries]
218
- entries.each do |entry|
219
- next if entry.keys.length == 1
220
- key = entry.delete(:key)
221
- @physical_addresses[key.ruby_case.to_sym] = {}
222
- entry.each_pair do |ekey,ev|
223
- @physical_addresses[key.ruby_case.to_sym][ekey] = ev[:text]
224
- end
225
- end
226
- self.instance_eval <<-EOF
227
- def #{physical_addresses}
228
- @physical_addresses
229
- end
230
- EOF
231
- else
232
- @ews_methods_undef << itype
233
- end
234
- end
235
-
236
- end # Contact
237
- end # EWS
238
- end # Viewpoint
@@ -1,46 +0,0 @@
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
20
- module EWS
21
- class ContactsFolder < GenericFolder
22
-
23
- # Find folders of type Contact
24
- # @see GenericFolder.find_folders
25
- # @param [String,Symbol] root An folder id, either a DistinguishedFolderId (must me a Symbol)
26
- # or a FolderId (String)
27
- # @param [String] traversal Shallow/Deep/SoftDeleted
28
- # @param [String] shape the shape to return IdOnly/Default/AllProperties
29
- # @param [optional, String] folder_type an optional folder type to limit the search to like 'IPF.Task'
30
- # @return [Array] Returns an Array of Folder or subclasses of Folder
31
- def self.find_folders(root = :msgfolderroot, traversal = 'Deep', shape = 'Default', folder_type = 'IPF.Contact')
32
- super(root, traversal, shape, folder_type)
33
- end
34
-
35
-
36
- # initialize with an item of CalendarFolderType
37
- def initialize(folder)
38
- super(folder)
39
-
40
- # @todo Handle:
41
- # <SharingEffectiveRights/>
42
- end
43
-
44
- end # ContactsFolder
45
- end # EWS
46
- end # Viewpoint
data/lib/model/event.rb DELETED
@@ -1,116 +0,0 @@
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
20
- module EWS
21
- class Event < Item
22
-
23
- attr_reader :subject, :organizer, :location, :start, :end, :cal_item_type
24
-
25
- # Initialize an Exchange Web Services item
26
- def initialize(ews_item, parent_folder, opts={})
27
- raise InvalidEWSItemError if ews_item.nil?
28
-
29
- @subject = ews_item.subject # String
30
- @location = ews_item.location if ews_item.location
31
- @cal_item_type = ews_item.calendarItemType
32
- @organizer = ews_item.organizer.mailbox.name if ews_item.organizer and ews_item.organizer.mailbox # String
33
- @start = ews_item.start if ews_item.start # DateTime
34
- @end = ews_item.v_end if ews_item.v_end # DateTime
35
- @busy_status = ews_item.legacyFreeBusyStatus if ews_item.legacyFreeBusyStatus # String
36
- @date_time_recieved = ews_item.dateTimeReceived if ews_item.dateTimeReceived # DateTime
37
-
38
- # This is where the event object gets loaded if it
39
- # is requested. Think of it like IMAP downloading the
40
- # body when the message is viewed.
41
- @message = nil
42
-
43
- super(ews_item, opts)
44
- end
45
-
46
-
47
-
48
- def body
49
- get_calitem if @message == nil
50
- @message.body
51
- end
52
-
53
- def sender
54
- @organizer
55
- end
56
-
57
-
58
- # Convert item to iCal format: http://www.ietf.org/rfc/rfc2445.txt
59
- # Returns Icalendar::Event object
60
- def to_ical_event
61
- get_calitem if @message == nil
62
- iev = Icalendar::Event.new
63
- iev.uid = @message.uID
64
- unless(@message.organizer == nil)
65
- iev.organizer = "CN=\"#{@message.organizer.mailbox.name}\"" if @message.organizer.mailbox.name
66
- iev.organizer += ":MAILTO:#{@message.organizer.mailbox.emailAddress}" if @message.organizer.mailbox.emailAddress
67
- end
68
- # TODO: Handle EWS Timezones better. TZ_HASH in viewpoint.rb is the start of this
69
- require 'time'
70
- #tzoffset = @message.timeZone.sub(/^\(GMT([^\)]+)\).*$/,'\1')
71
- dtstart = Time.at(@message.start.strftime('%s').to_i)
72
- dtend = Time.at(@message.v_end.strftime('%s').to_i)
73
- dtstamp = Time.at(@message.dateTimeStamp.strftime('%s').to_i)
74
- last_modified = Time.at(@message.lastModifiedTime.strftime('%s').to_i)
75
- timestr = "%Y%m%dT%H%M%S"
76
- iev.dtstart = dtstart.strftime(timestr)
77
- iev.dtend = dtend.strftime(timestr)
78
- iev.tzid = dtstart.strftime('%Z')
79
- iev.dtstamp = dtstamp.strftime(timestr)
80
- iev.last_modified = last_modified.strftime(timestr)
81
- iev.location = @message.location if @message.location
82
- iev.klass = @message.sensitivity if @message.sensitivity
83
- iev.summary = @message.subject if @message.subject
84
- iev.description = @message.body if @message.body
85
- iev.transp = @message.legacyFreeBusyStatus if @message.legacyFreeBusyStatus
86
- iev.duration = @message.duration if @message.duration
87
- iev.sequence = @message.appointmentSequenceNumber if @message.appointmentSequenceNumber
88
- iev.status = @message.myResponseType if @message.myResponseType
89
- #iev.attach @message.attachments if @message.hasAttachments
90
- @message.requiredAttendees.each do |pers|
91
- output = "ROLE=REQ-PARTICIPANT;CN=\"#{pers.mailbox.name}\"" if pers.mailbox.respond_to?(:name)
92
- output += ":MAILTO:#{pers.mailbox.emailAddress}" if pers.mailbox.respond_to?(:emailAddress)
93
- iev.attendees << output if output
94
- end if @message.requiredAttendees
95
- @message.optionalAttendees.each do |pers|
96
- output = "ROLE=OPT-PARTICIPANT;CN=\"#{pers.mailbox.name}\"" if pers.mailbox.respond_to?(:name)
97
- output += ":MAILTO:#{pers.mailbox.emailAddress}" if pers.mailbox.respond_to?(:emailAddress)
98
- iev.attendees << output if output
99
- end if @message.optionalAttendees
100
-
101
- #iev.categories = @message.categories if @message.categories
102
- #iev.resources = @message.resources if @message.resources
103
- return iev
104
- end
105
-
106
-
107
- # These methods are marked 'private' because they return EWS Types and I am trying to
108
- # hide those because they are not elegant and a bit too tedious for the public interface.
109
- private
110
-
111
- def get_calitem
112
- @message = @parent_folder.get_item(@item_id)
113
- end
114
- end # Event
115
- end # EWS
116
- end # Viewpoint
@@ -1,53 +0,0 @@
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
20
- module EWS
21
- # This class represents a file attachment item. You can save this object
22
- # to a file withthe #save_to_file method.
23
- class FileAttachment < Attachment
24
-
25
- attr_reader :file_name, :content
26
- # @param [String] attachment_id The unique ID for the attachment.
27
- def initialize(attachment_id)
28
- @id = attachment_id
29
- conn = Viewpoint::EWS::EWS.instance
30
- resp = conn.ews.get_attachment([attachment_id])
31
- @file_name = resp.items.first[:file_attachment][:name][:text]
32
-
33
- # content in Base64
34
- @content = resp.items.first[:file_attachment][:content][:text]
35
- end
36
-
37
- # Save this FileAttachment object to a file. By default it saves
38
- # it to the original file's name in the current working directory.
39
- # @param [String,nil] base_dir the directory to save the file to. Pass nil if you
40
- # do not want to specify a directory or you are passing a full path name to file_name
41
- # @param [String] file_name The name of the file to save the content to.
42
- # Leave this blank to use the default attachment name.
43
- def save_to_file(base_dir = nil, file_name = @file_name)
44
- base_dir << '/' unless(base_dir.nil? or base_dir.end_with?('/'))
45
- File.open("#{base_dir}#{file_name}", 'w+') do |f|
46
- f.write(Base64.decode64(@content))
47
- end
48
- true
49
- end
50
-
51
- end # FileAttachment
52
- end # EWS
53
- end # Viewpoint