viewpoint 0.1.26 → 1.1.1

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.
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