viewpoint 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/README +84 -45
  2. data/Rakefile +7 -5
  3. data/TODO +6 -0
  4. data/VERSION +1 -1
  5. data/lib/exceptions/exceptions.rb +34 -0
  6. data/lib/extensions/string.rb +37 -0
  7. data/lib/model/calendar_folder.rb +45 -0
  8. data/lib/model/calendar_item.rb +145 -0
  9. data/lib/model/contact.rb +58 -0
  10. data/lib/model/contacts_folder.rb +35 -0
  11. data/lib/model/distribution_list.rb +26 -0
  12. data/lib/model/event.rb +118 -0
  13. data/lib/model/folder.rb +36 -0
  14. data/lib/model/generic_folder.rb +302 -0
  15. data/lib/model/item.rb +126 -0
  16. data/lib/model/mailbox_user.rb +107 -0
  17. data/lib/model/meeting_cancellation.rb +28 -0
  18. data/lib/{viewpoint/errors.rb → model/meeting_message.rb} +10 -14
  19. data/lib/model/meeting_request.rb +26 -0
  20. data/lib/model/meeting_response.rb +26 -0
  21. data/lib/model/message.rb +73 -0
  22. data/lib/model/model.rb +161 -0
  23. data/lib/model/search_folder.rb +36 -0
  24. data/lib/model/task.rb +62 -0
  25. data/lib/model/task_list.rb +19 -0
  26. data/lib/model/tasks_folder.rb +33 -0
  27. data/lib/soap/handsoap/builder.rb +22 -0
  28. data/lib/soap/handsoap/builders/ews_build_helpers.rb +317 -0
  29. data/lib/soap/handsoap/builders/ews_builder.rb +86 -0
  30. data/lib/soap/handsoap/ews_service.rb +646 -0
  31. data/lib/soap/handsoap/parser.rb +106 -0
  32. data/lib/soap/handsoap/parsers/ews_parser.rb +165 -0
  33. data/lib/soap/soap_provider.rb +75 -0
  34. data/lib/viewpoint.rb +98 -3
  35. data/preamble +1 -1
  36. data/test/spec/basic_functions.spec +51 -0
  37. data/test/spec/folder_subscriptions.spec +35 -0
  38. data/test/spec/folder_synchronization.spec +28 -0
  39. data/utils/ewsWSDL2rb.rb +29 -0
  40. metadata +101 -43
  41. data/lib/exchwebserv.rb +0 -6
  42. data/lib/soap/viewpoint.conf +0 -3
  43. data/lib/viewpoint/calendar.rb +0 -128
  44. data/lib/viewpoint/calendar_item.rb +0 -118
  45. data/lib/viewpoint/event.rb +0 -0
  46. data/lib/viewpoint/exchange_headers.rb +0 -49
  47. data/lib/viewpoint/exchwebserv.rb +0 -236
  48. data/lib/viewpoint/folder.rb +0 -358
  49. data/lib/viewpoint/item.rb +0 -101
  50. data/lib/viewpoint/mail.rb +0 -117
  51. data/lib/viewpoint/message.rb +0 -132
  52. data/lib/viewpoint/task.rb +0 -0
  53. data/lib/viewpoint/tasks.rb +0 -0
  54. data/lib/wsdl/defaultMappingRegistry.rb +0 -10680
  55. data/lib/wsdl/exchangeServiceBinding.rb +0 -349
  56. data/lib/wsdl/exchangeServiceTypes.rb +0 -11013
  57. data/test/spec/basic_features_spec.rb +0 -37
  58. data/test/test_client.rb +0 -13
  59. data/test/testrestrict.rb +0 -75
@@ -0,0 +1,126 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+
22
+ # This class is inherited by all Item subtypes such as Message, Event,
23
+ # and Task. It will serve as the brain for all of the methods that
24
+ # each of these Item types have in common.
25
+ module Viewpoint
26
+ module EWS
27
+ class Item
28
+ include Model
29
+
30
+ # This is a class method that fetches an existing Item from the
31
+ # Exchange Store.
32
+ # @param [String] item_id The id of the item.
33
+ # @return [Item] Returns an Item or subclass of Item
34
+ # @todo Add support to fetch an item with a ChangeKey
35
+ def self.get_item(item_id)
36
+ conn = Viewpoint::EWS::EWS.instance
37
+ resp = conn.ews.get_item([item_id])
38
+ resp = resp.items.shift
39
+ self.new(resp[resp.keys.first])
40
+ end
41
+
42
+ attr_reader :item_id, :body_type
43
+ alias :id :item_id
44
+
45
+ # Initialize an Exchange Web Services item
46
+ # @param [Hash] ews_item A hash representing this item
47
+ # @param [Boolean] shallow Whether or not we have retrieved all the elements for this object
48
+ def initialize(ews_item, shallow = true)
49
+ super() # Calls initialize in Model (creates @ews_methods Array)
50
+ @ews_item = ews_item
51
+ @shallow = shallow
52
+ @item_id = ews_item[:item_id][:id]
53
+
54
+ init_methods
55
+ end
56
+
57
+ def deepen!
58
+ conn = Viewpoint::EWS::EWS.instance
59
+ resp = conn.ews.get_item([@item_id], {:base_shape => 'AllProperties'})
60
+ resp = resp.items.shift
61
+ @ews_item = resp[resp.keys.first]
62
+ @shallow = false
63
+ @ews_methods = []
64
+ @ews_methods_undef = []
65
+ init_methods
66
+ end
67
+
68
+ # Delete this item
69
+ # @param [Boolean] soft Whether or not to do a soft delete. By default EWS will do a
70
+ # hard delete of this item. See the MSDN docs for more info:
71
+ # http://msdn.microsoft.com/en-us/library/aa562961.aspx
72
+ # @return [Boolean] Whether or not the item was deleted
73
+ # @todo Add exception handling for failed deletes
74
+ def delete!(soft=false)
75
+ deltype = soft ? 'SoftDelete' : 'HardDelete'
76
+ resp = (Viewpoint::EWS::EWS.instance).ews.delete_item([@item_id], deltype)
77
+ self.clear_object!
78
+ resp.status == 'Success'
79
+ end
80
+
81
+ # Delete this item by moving it to the Deleted Items folder
82
+ # @see http://msdn.microsoft.com/en-us/library/aa562961.aspx
83
+ # @return [Boolean] Whether or not the item was deleted
84
+ # @todo Add exception handling for failed deletes
85
+ def recycle!
86
+ resp = (Viewpoint::EWS::EWS.instance).ews.delete_item([@item_id], 'MoveToDeletedItems')
87
+ self.clear_object!
88
+ resp.status == 'Success'
89
+ end
90
+
91
+ private
92
+
93
+ # @todo Handle:
94
+ # <Attachments/> <Categories/> <InternetMessageHeaders/> <ResponseObjects/>
95
+ # <ExtendedProperty/> <EffectiveRights/>
96
+ def init_methods
97
+ @parent_folder_id = @ews_item[:parent_folder_id][:id] if @ews_item[:parent_folder_id].is_a?(Hash)
98
+ @conversation_id = @ews_item[:conversation_id][:id] if @ews_item[:conversation_id].is_a?(Hash)
99
+ @ews_methods << :item_id
100
+ if(@ews_item[:body] && @ews_item[:body][:body_type])
101
+ @body_type = @ews_item[:body][:body_type]
102
+ @ews_methods << :body_type
103
+ end
104
+ if(@ews_item[:unique_body] && @ews_item[:unique_body][:body_type])
105
+ @unique_body_type = @ews_item[:body][:body_type]
106
+ @ews_methods << :unique_body_type
107
+ end
108
+ if(@ews_item[:mime_content] && @ews_item[:mime_content][:character_set])
109
+ @mime_charset = @ews_item[:mime_content][:character_set]
110
+ @ews_methods << :mime_charset
111
+ end
112
+ define_str_var :subject, :sensitivity, :body, :item_class, :importance, :in_reply_to, :unique_body
113
+ define_str_var :display_cc, :display_to, :culture, :last_modified_name, :mime_content
114
+ define_str_var :web_client_read_form_query_string, :web_client_edit_form_query_string
115
+ define_int_var :size, :reminder_minutes_before_start
116
+ define_bool_var :has_attachments, :is_submitted, :is_draft, :is_from_me, :is_resend, :is_unmodified, :reminder_is_set, :is_associated
117
+ define_datetime_var :date_time_sent, :date_time_created, :date_time_received, :reminder_due_by, :last_modified_time
118
+ end
119
+
120
+ def method_missing(m, *args, &block)
121
+ warn "!!! No such method: #{m}"
122
+ end
123
+
124
+ end # Item
125
+ end # EWS
126
+ end # Viewpoint
@@ -0,0 +1,107 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+ module Viewpoint
22
+ module EWS
23
+
24
+ # This represents a Mailbox object in the Exchange data store
25
+ # @see http://msdn.microsoft.com/en-us/library/aa565036.aspx MSDN docs
26
+ # @todo Design a Class method that resolves to an Array of MailboxUsers
27
+ class MailboxUser
28
+ include Model
29
+
30
+ # Resolve a user in the Exchange Data Store
31
+ # @param [String] A user to resolve to.
32
+ # @return [MailboxUser,Array] If it resolves to one user then it returns a MailboxUser.
33
+ # If it resolves to more than one user an Array of MailboxUsers are returned. If an
34
+ # error ocurrs an exception is raised.
35
+ def self.find_user(resolve)
36
+ resp = (Viewpoint::EWS::EWS.instance).ews.resolve_names(resolve)
37
+ if(resp.status == 'Success')
38
+ return self.new(resp.items.first[:mailbox])
39
+ elsif(resp.code == 'ErrorNameResolutionMultipleResults')
40
+ users = []
41
+ resp.items.each do |u|
42
+ users << self.new(u[:mailbox])
43
+ end
44
+ return users
45
+ else
46
+ raise EwsError, "Find User produced an error: #{resp.code}: #{resp.message}"
47
+ end
48
+ end
49
+
50
+ def initialize(mbox_user)
51
+ super() # Calls initialize in Model (creates @ews_methods Array)
52
+ @ews_item = mbox_user
53
+ define_str_var :name, :email_address, :routing_type, :mailbox_type, :item_id
54
+ end
55
+
56
+ # Adds one or more delegates to a principal's mailbox and sets specific access permissions
57
+ # @see http://msdn.microsoft.com/en-us/library/bb856527.aspx
58
+ #
59
+ # @param [String,MailboxUser] delegate_email The user you would like to give delegate access to.
60
+ # This can either be a simple String e-mail address or you can pass in a MailboxUser object.
61
+ # @param [Hash] permissions A hash of folder type keys and permission type values. An example
62
+ # would be {:calendar_folder_permission_level => 'Editor'}. Possible keys are:
63
+ # :calendar_folder_permission_level, :tasks_folder_permission_level, :inbox_folder_permission_level
64
+ # :contacts_folder_permission_level, :notes_folder_permission_level, :journal_folder_permission_level
65
+ # and possible values are: None/Editor/Reviewer/Author/Custom
66
+ # @return [true] This method either returns true or raises an error with the message
67
+ # as to why this operation did not succeed.
68
+ def add_delegate!(delegate_email, permissions)
69
+ # Modify permissions so we can pass it to the builders
70
+ permissions.each_pair do |k,v|
71
+ permissions[k] = {:text => v}
72
+ end
73
+
74
+ resp = (Viewpoint::EWS::EWS.instance).ews.add_delegate(self.email_address, delegate_email, permissions)
75
+ if(resp.status == 'Success')
76
+ return true
77
+ else
78
+ raise EwsError, "Could not add delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
79
+ end
80
+ end
81
+
82
+ def update_delegate!(delegate_email, permissions)
83
+ # Modify permissions so we can pass it to the builders
84
+ permissions.each_pair do |k,v|
85
+ permissions[k] = {:text => v}
86
+ end
87
+
88
+ resp = (Viewpoint::EWS::EWS.instance).ews.update_delegate(self.email_address, delegate_email, permissions)
89
+ if(resp.status == 'Success')
90
+ return true
91
+ else
92
+ raise EwsError, "Could not update delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
93
+ end
94
+ end
95
+
96
+ def get_delegate_info()
97
+ resp = (Viewpoint::EWS::EWS.instance).ews.get_delegate(self.email_address)
98
+ # if(resp.status == 'Success')
99
+ # return true
100
+ # else
101
+ # raise EwsError, "Could not update delegate access for user #{delegate_email}: #{resp.code}, #{resp.message}"
102
+ # end
103
+ end
104
+
105
+ end # MailboxUser
106
+ end # EWS
107
+ end # Viewpoint
@@ -0,0 +1,28 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+ module Viewpoint
22
+ module EWS
23
+ # Meeting cancellations have the exact same elements as a Meeting Message
24
+ # so MeetingCancellation is just a subclass of that.
25
+ class MeetingCancellation < MeetingMessage
26
+ end # MeetingCancellation
27
+ end # EWS
28
+ end # Viewpoint
@@ -1,5 +1,5 @@
1
1
  #############################################################################
2
- # Copyright © 2009 Dan Wanek <dan.wanek@gmail.com>
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
3
  #
4
4
  #
5
5
  # This file is part of Viewpoint.
@@ -17,18 +17,14 @@
17
17
  # You should have received a copy of the GNU General Public License along
18
18
  # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
19
  #############################################################################
20
- $:.unshift(File.dirname(__FILE__))
21
- require 'viewpoint'
22
20
 
23
- class Viewpoint::InvalidEWSItemError < Exception
24
- def message
25
- "Invalid Item for Exchange Web Services"
26
- end
27
- end
21
+ module Viewpoint
22
+ module EWS
23
+ class MeetingMessage < Item
28
24
 
29
-
30
- class Viewpoint::NoSuchItemIdError < Exception
31
- def message
32
- "No such item_id found in Exchange"
33
- end
34
- end
25
+ def initialize(ews_item)
26
+ super(ews_item)
27
+ end
28
+ end # MeetingMessage
29
+ end # EWS
30
+ end # Viewpoint
@@ -0,0 +1,26 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+ module Viewpoint
22
+ module EWS
23
+ class MeetingRequest < Item
24
+ end # MeetingRequest
25
+ end # EWS
26
+ end # Viewpoint
@@ -0,0 +1,26 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+ module Viewpoint
22
+ module EWS
23
+ class MeetingResponse < Item
24
+ end # MeetingResponse
25
+ end # EWS
26
+ end # Viewpoint
@@ -0,0 +1,73 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+ module Viewpoint
22
+ module EWS
23
+ class Message < Item
24
+
25
+ # Send an E-mail message
26
+ #
27
+ # @param [String] subject The message subject
28
+ # @param [String] body The message body
29
+ # @param [Array] to_recipients An array of e-mail addresses to send to
30
+ # @param [Array] cc_recipients An array of e-mail addresses to send to
31
+ # @param [Array] bcc_recipients An array of e-mail addresses to send to
32
+ # @return [true] Returns true on successful send or it raises an error with
33
+ # a message stating why the e-mail could not be sent.
34
+ def self.send(subject, body, to_recipients, cc_recipients=[], bcc_recipients=[])
35
+ item = {}
36
+ item[:subject] = {:text => subject}
37
+ item[:body] = {:text => body, :body_type => 'Text'} unless body.nil?
38
+ to_recipients.each do |a|
39
+ item[:to_recipients] = [] unless item[:to_recipients].is_a?(Array)
40
+ item[:to_recipients] << {:mailbox => {:email_address => {:text => a}}}
41
+ end
42
+ cc_recipients.each do |a|
43
+ item[:cc_recipients] = [] unless item[:cc_recipients].is_a?(Array)
44
+ item[:cc_recipients] << {:mailbox => {:email_address => {:text => a}}}
45
+ end
46
+ bcc_recipients.each do |a|
47
+ item[:bcc_recipients] = [] unless item[:bcc_recipients].is_a?(Array)
48
+ item[:bcc_recipients] << {:mailbox => {:email_address => {:text => a}}}
49
+ end
50
+
51
+ conn = Viewpoint::EWS::EWS.instance
52
+ resp = conn.ews.create_message_item(:sentitems, item, 'SendAndSaveCopy')
53
+ (resp.status == 'Success') || (raise EwsError, "Could not retrieve item. #{resp.code}: #{resp.message}")
54
+ end
55
+
56
+ # Initialize an Exchange Web Services item of type Message
57
+ def initialize(ews_item)
58
+ super(ews_item)
59
+ end
60
+
61
+ private
62
+
63
+ def init_methods
64
+ super()
65
+ define_str_var :conversation_index, :conversation_topic, :internet_message_id, :references
66
+ define_mbox_users :to_recipients, :cc_recipients, :bcc_recipients, :reply_to
67
+ define_mbox_user :from, :sender, :received_by, :received_representing
68
+ define_bool_var :is_read, :is_read_receipt_requested, :is_response_requested, :is_delivery_receipt_requested
69
+ end
70
+
71
+ end # Message
72
+ end # EWS
73
+ end # Viewpoint
@@ -0,0 +1,161 @@
1
+ #############################################################################
2
+ # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
+ #
4
+ #
5
+ # This file is part of Viewpoint.
6
+ #
7
+ # Viewpoint is free software: you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or (at
10
+ # your option) any later version.
11
+ #
12
+ # Viewpoint is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
+ # Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along
18
+ # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
+ #############################################################################
20
+
21
+
22
+ # This class is inherited by all Item subtypes such as Message, Event,
23
+ # and Task. It will serve as the brain for all of the methods that
24
+ # each of these Item types have in common.
25
+ module Viewpoint
26
+ module EWS
27
+ # This is the base model Module for shared code among all Model classes.
28
+ # @attr_reader [Array] :ews_methods The EWS methods created for this Model.
29
+ module Model
30
+
31
+ # These are convenience methods to quickly create instance methods for
32
+ # the various Model types when passed a Hash from the SOAP parser.
33
+ # These functions depend on each model type saving the passed Hash
34
+ # in an instance variable called @ews_item.
35
+
36
+ attr_reader :ews_methods, :ews_methods_undef
37
+
38
+ def initialize
39
+ # Defined EWS methods
40
+ @ews_methods = []
41
+ # Undefined EWS methods
42
+ @ews_methods_undef = []
43
+ end
44
+
45
+ protected
46
+
47
+ def define_str_var(*vars)
48
+ vars.each do |var|
49
+ if(@ews_item[var])
50
+ @ews_methods << var
51
+ self.instance_eval <<-EOF
52
+ def #{var.to_s}
53
+ @ews_item[:#{var}][:text]
54
+ end
55
+ EOF
56
+ else
57
+ @ews_methods_undef << var
58
+ end
59
+ end
60
+ end
61
+
62
+ def define_int_var(*vars)
63
+ vars.each do |var|
64
+ if(@ews_item[var])
65
+ @ews_methods << var
66
+ self.instance_eval <<-EOF
67
+ def #{var}
68
+ @#{var} ||= @ews_item[:#{var}][:text].to_i
69
+ end
70
+ EOF
71
+ else
72
+ @ews_methods_undef << var
73
+ end
74
+ end
75
+ end
76
+
77
+ def define_bool_var(*vars)
78
+ vars.each do |var|
79
+ if(@ews_item[var])
80
+ @ews_methods << "#{var}?".to_sym
81
+ self.instance_eval <<-EOF
82
+ def #{var}?
83
+ @#{var} ||= (@ews_item[:#{var}][:text] == 'true') ? true : false
84
+ end
85
+ EOF
86
+ else
87
+ @ews_methods_undef << "#{var}?".to_sym
88
+ end
89
+ end
90
+ end
91
+
92
+ def define_datetime_var(*vars)
93
+ vars.each do |var|
94
+ if(@ews_item[var])
95
+ @ews_methods << var
96
+ self.instance_eval <<-EOF
97
+ def #{var}
98
+ @#{var} ||= DateTime.parse(@ews_item[:#{var}][:text])
99
+ end
100
+ EOF
101
+ else
102
+ @ews_methods_undef << var
103
+ end
104
+ end
105
+ end
106
+
107
+ def define_mbox_users(*vars)
108
+ vars.each do |var|
109
+ if(@ews_item[var])
110
+ @ews_methods << var
111
+ self.instance_eval <<-EOF
112
+ def #{var}
113
+ return @#{var} if defined?(@#{var})
114
+ if( (@ews_item[:#{var}][:mailbox]).is_a?(Hash) )
115
+ @#{var} = [MailboxUser.new(@ews_item[:#{var}][:mailbox])]
116
+ elsif( (@ews_item[:#{var}][:mailbox]).is_a?(Array) )
117
+ @#{var} = []
118
+ @ews_item[:#{var}][:mailbox].each do |i|
119
+ @#{var} << MailboxUser.new(i)
120
+ end
121
+ else
122
+ raise EwsError, "Bad value for mailbox: " + @ews_item[:#{var}][:mailbox]
123
+ end
124
+ @#{var}
125
+ end
126
+ EOF
127
+ else
128
+ @ews_methods_undef << var
129
+ end
130
+ end
131
+ end
132
+
133
+ def define_mbox_user(*vars)
134
+ vars.each do |var|
135
+ if(@ews_item[var])
136
+ @ews_methods << var
137
+ self.instance_eval <<-EOF
138
+ def #{var}
139
+ @#{var} ||= MailboxUser.new(@ews_item[:#{var}][:mailbox])
140
+ end
141
+ EOF
142
+ else
143
+ @ews_methods_undef << var
144
+ end
145
+ end
146
+ end
147
+
148
+ # After a delete is called on an object this method will clear
149
+ # out all of the defined EWS methods so they can't be called on the
150
+ # instantiated object.
151
+ def clear_object!
152
+ @ews_methods.each do |m|
153
+ self.instance_variables.each do |iv|
154
+ self.instance_variable_set("#{iv}",nil)
155
+ end
156
+ end
157
+ end
158
+
159
+ end # Model
160
+ end # EWS
161
+ end # Viewpoint