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
@@ -20,17 +20,14 @@ module Viewpoint
20
20
  module EWS
21
21
  module ItemFieldUriMap
22
22
 
23
- FIELD_URIS= {:folder_id => {:text => 'older:FolderId', :writable => true},
24
- :parent_folder_id => {:text => 'folder:ParentFolderId', :writable => true},
25
- :display_name => {:text => 'folder:DisplayName', :writable => true},
26
- :unread_count => {:text => 'folder:UnreadCount', :writable => true},
23
+ FIELD_URIS= {
24
+ :folder_id => {:text => 'folder:FolderId', :writable => true},
27
25
  :total_count => {:text => 'folder:TotalCount', :writable => true},
28
26
  :child_folder_count => {:text => 'folder:ChildFolderCount', :writable => true},
29
27
  :folder_class => {:text => 'folder:FolderClass', :writable => true},
30
28
  :search_parameters => {:text => 'folder:SearchParameters', :writable => true},
31
29
  :managed_folder_information => {:text => 'folder:ManagedFolderInformation', :writable => true},
32
30
  :permission_set => {:text => 'folder:PermissionSet', :writable => true},
33
- :effective_rights => {:text => 'folder:EffectiveRights', :writable => true},
34
31
  :sharing_effective_rights => {:text => 'folder:SharingEffectiveRights', :writable => true},
35
32
  :item_id => {:text => 'item:ItemId', :writable => true},
36
33
  :parent_folder_id => {:text => 'item:ParentFolderId', :writable => true},
@@ -39,10 +36,6 @@ module Viewpoint
39
36
  :attachments => {:text => 'item:Attachments', :writable => true},
40
37
  :subject => {:text => 'item:Subject', :writable => true},
41
38
  :date_time_received => {:text => 'item:DateTimeReceived', :writable => true},
42
- :size => {:text => 'item:Size', :writable => true},
43
- :categories => {:text => 'item:Categories', :writable => true},
44
- :has_attachments => {:text => 'item:HasAttachments', :writable => true},
45
- :importance => {:text => 'item:Importance', :writable => true},
46
39
  :in_reply_to => {:text => 'item:InReplyTo', :writable => true},
47
40
  :internet_message_headers => {:text => 'item:InternetMessageHeaders', :writable => true},
48
41
  :is_associated => {:text => 'item:IsAssociated', :writable => true},
@@ -61,19 +54,15 @@ module Viewpoint
61
54
  :reminder_minutes_before_start => {:text => 'item:ReminderMinutesBeforeStart', :writable => true},
62
55
  :display_to => {:text => 'item:DisplayTo', :writable => true},
63
56
  :display_cc => {:text => 'item:DisplayCc', :writable => true},
64
- :culture => {:text => 'item:Culture', :writable => true},
65
57
  :effective_rights => {:text => 'item:EffectiveRights', :writable => true},
66
58
  :last_modified_name => {:text => 'item:LastModifiedName', :writable => true},
67
59
  :last_modified_time => {:text => 'item:LastModifiedTime', :writable => true},
68
- :conversation_id => {:text => 'item:ConversationId', :writable => true},
69
60
  :unique_body => {:text => 'item:UniqueBody', :writable => true},
70
61
  :web_client_read_form_query_string => {:text => 'item:WebClientReadFormQueryString', :writable => true},
71
62
  :web_client_edit_form_query_string => {:text => 'item:WebClientEditFormQueryString', :writable => true},
72
63
  :conversation_index => {:text => 'message:ConversationIndex', :writable => true},
73
- :conversation_topic => {:text => 'message:ConversationTopic', :writable => true},
74
64
  :internet_message_id => {:text => 'message:InternetMessageId', :writable => true},
75
65
  :is_read => {:text => 'message:IsRead', :writable => true},
76
- :is_response_requested => {:text => 'message:IsResponseRequested', :writable => true},
77
66
  :is_read_receipt_requested => {:text => 'message:IsReadReceiptRequested', :writable => true},
78
67
  :is_delivery_receipt_requested => {:text => 'message:IsDeliveryReceiptRequested', :writable => true},
79
68
  :references => {:text => 'message:References', :writable => true},
@@ -99,7 +88,6 @@ module Viewpoint
99
88
  :when => {:text => 'calendar:When', :writable => true},
100
89
  :is_meeting => {:text => 'calendar:IsMeeting', :writable => true},
101
90
  :is_cancelled => {:text => 'calendar:IsCancelled', :writable => true},
102
- :is_recurring => {:text => 'calendar:IsRecurring', :writable => true},
103
91
  :meeting_request_was_sent => {:text => 'calendar:MeetingRequestWasSent', :writable => true},
104
92
  :is_response_requested => {:text => 'calendar:IsResponseRequested', :writable => true},
105
93
  :calendar_item_type => {:text => 'calendar:CalendarItemType', :writable => true},
@@ -117,7 +105,6 @@ module Viewpoint
117
105
  :appointment_reply_time => {:text => 'calendar:AppointmentReplyTime', :writable => true},
118
106
  :appointment_sequence_number => {:text => 'calendar:AppointmentSequenceNumber', :writable => true},
119
107
  :appointment_state => {:text => 'calendar:AppointmentState', :writable => true},
120
- :recurrence => {:text => 'calendar:Recurrence', :writable => true},
121
108
  :first_occurrence => {:text => 'calendar:FirstOccurrence', :writable => true},
122
109
  :last_occurrence => {:text => 'calendar:LastOccurrence', :writable => true},
123
110
  :modified_occurrences => {:text => 'calendar:ModifiedOccurrences', :writable => true},
@@ -137,7 +124,6 @@ module Viewpoint
137
124
  :assigned_time => {:text => 'task:AssignedTime', :writable => true},
138
125
  :billing_information => {:text => 'task:BillingInformation', :writable => true},
139
126
  :change_count => {:text => 'task:ChangeCount', :writable => true},
140
- :companies => {:text => 'task:Companies', :writable => true},
141
127
  :complete_date => {:text => 'task:CompleteDate', :writable => true},
142
128
  :contacts => {:text => 'task:Contacts', :writable => true},
143
129
  :delegation_state => {:text => 'task:DelegationState', :writable => true},
@@ -147,7 +133,6 @@ module Viewpoint
147
133
  :is_complete => {:text => 'task:IsComplete', :writable => true},
148
134
  :is_recurring => {:text => 'task:IsRecurring', :writable => true},
149
135
  :is_team_task => {:text => 'task:IsTeamTask', :writable => true},
150
- :mileage => {:text => 'task:Mileage', :writable => true},
151
136
  :owner => {:text => 'task:Owner', :writable => true},
152
137
  :percent_complete => {:text => 'task:PercentComplete', :writable => true},
153
138
  :recurrence => {:text => 'task:Recurrence', :writable => true},
@@ -218,7 +203,6 @@ module Viewpoint
218
203
  :item_ids => {:text => 'conversation:ItemIds', :writable => true},
219
204
  :global_item_ids => {:text => 'conversation:GlobalItemIds', :writable => true}
220
205
  }
221
-
222
206
  end
223
207
  end
224
208
  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
@@ -0,0 +1,7 @@
1
+ module Viewpoint::EWS::Types
2
+ class MeetingCancellation
3
+ include Viewpoint::EWS
4
+ include Viewpoint::EWS::Types
5
+ include Viewpoint::EWS::Types::Item
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Viewpoint::EWS::Types
2
+ class MeetingMessage
3
+ include Viewpoint::EWS
4
+ include Viewpoint::EWS::Types
5
+ include Viewpoint::EWS::Types::Item
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Viewpoint::EWS::Types
2
+ class MeetingRequest
3
+ include Viewpoint::EWS
4
+ include Viewpoint::EWS::Types
5
+ include Viewpoint::EWS::Types::Item
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Viewpoint::EWS::Types
2
+ class MeetingResponse
3
+ include Viewpoint::EWS
4
+ include Viewpoint::EWS::Types
5
+ include Viewpoint::EWS::Types::Item
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Viewpoint::EWS::Types
2
+ class Message
3
+ include Viewpoint::EWS
4
+ include Viewpoint::EWS::Types
5
+ include Viewpoint::EWS::Types::Item
6
+ end
7
+ end
@@ -0,0 +1,48 @@
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
+ class ModifiedEvent < Event
22
+
23
+ MODIFIED_EVENT_KEY_PATHS = {
24
+ }
25
+
26
+ MODIFIED_EVENT_KEY_TYPES = {
27
+ }
28
+
29
+ MODIFIED_EVENT_KEY_ALIAS = { }
30
+
31
+
32
+ private
33
+
34
+
35
+ def key_paths
36
+ @key_paths ||= super.merge MODIFIED_EVENT_KEY_PATHS
37
+ end
38
+
39
+ def key_types
40
+ @key_types ||= super.merge MODIFIED_EVENT_KEY_TYPES
41
+ end
42
+
43
+ def key_alias
44
+ @key_alias ||= super.merge MODIFIED_EVENT_KEY_ALIAS
45
+ end
46
+
47
+ end
48
+ end
@@ -16,20 +16,36 @@
16
16
  limitations under the License.
17
17
  =end
18
18
 
19
- # Custom extensions to the class String
20
- class String
21
- # Change CamelCased strings to ruby_cased strings
22
- # It uses the lookahead assertion ?= In this case it basically says match
23
- # anything followed by a capital letter, but not the capital letter itself.
24
- # @see http://www.pcre.org/pcre.txt The PCRE guide for more details
25
- def ruby_case
26
- self.split(/(?=[A-Z])/).join('_').downcase
27
- end
19
+ module Viewpoint::EWS::Types
20
+
21
+ class MovedEvent < Event
22
+
23
+ MOVED_EVENT_KEY_PATHS = {
24
+ :old_item_id => [:old_item_id, :attribs],
25
+ :old_folder_id => [:old_folder_id, :attribs],
26
+ :old_parent_folder_id => [:old_parent_folder_id, :attribs],
27
+ }
28
+
29
+ MOVED_EVENT_KEY_TYPES = {
30
+ }
31
+
32
+ MOVED_EVENT_KEY_ALIAS = { }
33
+
34
+
35
+ private
36
+
37
+
38
+ def key_paths
39
+ @key_paths ||= super.merge MOVED_EVENT_KEY_PATHS
40
+ end
41
+
42
+ def key_types
43
+ @key_types ||= super.merge MOVED_EVENT_KEY_TYPES
44
+ end
45
+
46
+ def key_alias
47
+ @key_alias ||= super.merge MOVED_EVENT_KEY_ALIAS
48
+ end
28
49
 
29
- # Change a ruby_cased string to CamelCased
30
- def camel_case
31
- self.split(/_/).map { |i|
32
- i.sub(/^./) { |s| s.upcase }
33
- }.join
34
50
  end
35
- end # String
51
+ end
@@ -0,0 +1,24 @@
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
+ class NewMailEvent < Event
22
+
23
+ end
24
+ end
@@ -0,0 +1,147 @@
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
+ OOF_KEY_PATHS = {
22
+ :enabled? => [:oof_settings, :oof_state],
23
+ :scheduled? => [:oof_settings, :oof_state],
24
+ :duration => [:oof_settings, :duration],
25
+ }
26
+
27
+ OOF_KEY_TYPES = {
28
+ :enabled? => ->(str){str == :enabled},
29
+ :scheduled? => ->(str){str == :scheduled},
30
+ :duration => ->(hsh){ hsh[:start_time]..hsh[:end_time] },
31
+ }
32
+
33
+ OOF_KEY_ALIAS = {}
34
+
35
+ # This represents OutOfOffice settings
36
+ # @see http://msdn.microsoft.com/en-us/library/aa563465.aspx
37
+ class OutOfOffice
38
+ include Viewpoint::EWS
39
+ include Viewpoint::EWS::Types
40
+
41
+ attr_reader :user
42
+
43
+ # @param [MailboxUser] user
44
+ # @param [Hash] ews_item
45
+ def initialize(user, ews_item)
46
+ @ews = user.ews
47
+ @user = user
48
+ @ews_item = ews_item
49
+ @changed = false
50
+ simplify!
51
+ end
52
+
53
+ def changed?
54
+ @changed
55
+ end
56
+
57
+ def save!
58
+ return true unless changed?
59
+ opts = { mailbox: {address: user.email_address} }.merge(@ews_item[:oof_settings])
60
+ resp = @ews.set_user_oof_settings(opts)
61
+ if resp.success?
62
+ @changed = false
63
+ true
64
+ else
65
+ raise SaveFailed, "Could not save #{self.class}. #{resp.code}: #{resp.message}"
66
+ end
67
+ end
68
+
69
+ def enable
70
+ return true if enabled?
71
+ @changed = true
72
+ @ews_item[:oof_settings][:oof_state] = :enabled
73
+ end
74
+
75
+ def disable
76
+ return true unless enabled? || scheduled?
77
+ @changed = true
78
+ @ews_item[:oof_settings][:oof_state] = :disabled
79
+ end
80
+
81
+ # Schedule an out of office.
82
+ # @param [DateTime] start_time
83
+ # @param [DateTime] end_time
84
+ def schedule(start_time, end_time)
85
+ @changed = true
86
+ @ews_item[:oof_settings][:oof_state] = :scheduled
87
+ set_duration start_time, end_time
88
+ end
89
+
90
+ # Specify a duration for this Out Of Office setting
91
+ # @param [DateTime] start_time
92
+ # @param [DateTime] end_time
93
+ def set_duration(start_time, end_time)
94
+ @changed = true
95
+ @ews_item[:oof_settings][:duration][:start_time] = start_time
96
+ @ews_item[:oof_settings][:duration][:end_time] = end_time
97
+ end
98
+
99
+ # A message to send to internal users
100
+ # @param [String] message
101
+ def internal_reply=(message)
102
+ @changed = true
103
+ @ews_item[:oof_settings][:internal_reply] = message
104
+ end
105
+
106
+ # A message to send to external users
107
+ # @param [String] message
108
+ def external_reply=(message)
109
+ @changed = true
110
+ @ews_item[:oof_settings][:external_reply] = message
111
+ end
112
+
113
+
114
+ private
115
+
116
+ def key_paths
117
+ @key_paths ||= super.merge(OOF_KEY_PATHS)
118
+ end
119
+
120
+ def key_types
121
+ @key_types ||= super.merge(OOF_KEY_TYPES)
122
+ end
123
+
124
+ def key_alias
125
+ @key_alias ||= super.merge(OOF_KEY_ALIAS)
126
+ end
127
+
128
+ def simplify!
129
+ oof_settings = @ews_item[:oof_settings][:elems].inject(:merge)
130
+ oof_settings[:oof_state] = oof_settings[:oof_state][:text].downcase.to_sym
131
+ oof_settings[:external_audience] = oof_settings[:external_audience][:text]
132
+ if oof_settings[:duration]
133
+ dur = oof_settings[:duration][:elems].inject(:merge)
134
+ oof_settings[:duration] = {
135
+ start_time: DateTime.iso8601(dur[:start_time][:text]),
136
+ end_time: DateTime.iso8601(dur[:end_time][:text])
137
+ }
138
+ end
139
+ oof_settings[:internal_reply] = oof_settings[:internal_reply][:elems][0][:message][:text] || ""
140
+ oof_settings[:external_reply] = oof_settings[:external_reply][:elems][0][:message][:text] || ""
141
+ @ews_item[:oof_settings] = oof_settings
142
+ @ews_item[:allow_external_oof] = @ews_item[:allow_external_oof][:text]
143
+ end
144
+
145
+ end #OutOfOffice
146
+
147
+ end