viewpoint 0.0.3 → 0.0.4

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.
data/Rakefile CHANGED
@@ -29,6 +29,7 @@ GEMSPEC = Gem::Specification.new do |gem|
29
29
  gem.required_ruby_version = '>= 1.8.7'
30
30
  gem.add_runtime_dependency 'soap4r', '>=1.5.8'
31
31
  gem.add_runtime_dependency 'icalendar'
32
+ gem.add_runtime_dependency 'rubyntlm', '>=0.1.1'
32
33
  gem.post_install_message = "Don't forget to create .viewpointrc. See README"
33
34
  end
34
35
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -1,4 +1,5 @@
1
1
  module Viewpoint
2
2
  end
3
3
 
4
+ require 'viewpoint/errors'
4
5
  require 'viewpoint/exchwebserv'
@@ -116,5 +116,13 @@ class Viewpoint::CalendarFolder < Viewpoint::Folder
116
116
  def get_item(item_id)
117
117
  cali = super(item_id, "calendarItem", true)
118
118
  end
119
+
120
+ def get_event(item_id)
121
+ begin
122
+ return CalendarItem.new(get_item(item_id), self)
123
+ rescue InvalidEWSItemError => e
124
+ return nil
125
+ end
126
+ end
119
127
  end
120
128
 
@@ -25,13 +25,12 @@ require 'item'
25
25
  class Viewpoint::CalendarItem < Viewpoint::Item
26
26
  include Viewpoint
27
27
 
28
- attr_reader :subject, :parent_folder, :sender
29
- attr_reader :ews_item if $DEBUG
28
+ attr_reader :subject, :organizer, :location, :start, :end, :cal_item_type
30
29
 
31
30
  # Initialize an Exchange Web Services item
32
31
  def initialize(ews_item, parent_folder)
33
- # keep this now for debuging
34
- @ews_item = ews_item if $DEBUG
32
+ raise InvalidEWSItemError if ews_item.nil?
33
+
35
34
  @subject = ews_item.subject # String
36
35
  @location = ews_item.location if ews_item.location
37
36
  @cal_item_type = ews_item.calendarItemType
@@ -50,6 +49,16 @@ class Viewpoint::CalendarItem < Viewpoint::Item
50
49
  end
51
50
 
52
51
 
52
+ def body
53
+ get_calitem if @message == nil
54
+ @message.body
55
+ end
56
+
57
+ def sender
58
+ @organizer
59
+ end
60
+
61
+
53
62
  # Convert item to iCal format: http://www.ietf.org/rfc/rfc2445.txt
54
63
  # Returns Icalendar::Event object
55
64
  def to_ical_event
@@ -0,0 +1,34 @@
1
+ #############################################################################
2
+ # Copyright © 2009 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
+ $:.unshift(File.dirname(__FILE__))
21
+ require 'viewpoint'
22
+
23
+ class Viewpoint::InvalidEWSItemError < Exception
24
+ def message
25
+ "Invalid Item for Exchange Web Services"
26
+ end
27
+ end
28
+
29
+
30
+ class Viewpoint::NoSuchItemIdError < Exception
31
+ def message
32
+ "No such item_id found in Exchange"
33
+ end
34
+ end
@@ -39,6 +39,10 @@ class Viewpoint::Folder
39
39
  # to check_subscription will use that id.
40
40
  # Returns true if the operation is successful, false otherwise
41
41
  def subscribe
42
+ # Refresh the subscription if already subscribed
43
+ if( subscribed? )
44
+ unsubscribe
45
+ end
42
46
  subscribe = SubscribeType.new
43
47
  pull = PullSubscriptionRequestType.new
44
48
 
@@ -69,6 +73,10 @@ class Viewpoint::Folder
69
73
  return (resp.responseCode == "NoError")? true: false
70
74
  end
71
75
 
76
+ def subscribed?
77
+ ( @subscription_id.nil? or @watermark.nil? )? false : true
78
+ end
79
+
72
80
 
73
81
  # unsubscribe from folder
74
82
  # Returns true if unsubscription succeeds, false otherwise
@@ -88,6 +96,9 @@ class Viewpoint::Folder
88
96
 
89
97
  # Fetch events with the subscription_id. If one does not exists or is expired,
90
98
  # call subscribe.
99
+ # Returns a hash with the event type as the key and an Array of Hashes that
100
+ # represent each event's data
101
+ # An :error key is set if there is a problem
91
102
  def check_subscription
92
103
  begin
93
104
  if( @subscription_id == nil or @watermark == nil) then
@@ -102,40 +113,77 @@ class Viewpoint::Folder
102
113
 
103
114
  notifications = resp.first.notification
104
115
 
116
+ notif_hash = {}
105
117
  # Process Notifications
106
118
  if( notifications.copiedEvent != nil)
107
- notifications.copiedEvent .each do |note|
119
+ notif_hash[:copiedEvent] = []
120
+ notifications.copiedEvent.each do |note|
108
121
  @watermark = note.watermark
122
+ item = {}
123
+ item.store(:old_item_id,note.oldItemId.xmlattr_Id) if note.itemId
124
+ item.store(:old_folder_id,note.oldParentFolderId.xmlattr_Id) if note.oldParentFolderId
125
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
126
+ item.store(:folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
127
+ notif_hash[:copiedEvent] << item
109
128
  end
110
129
  end
111
130
 
112
131
  if( notifications.createdEvent != nil)
132
+ notif_hash[:createdEvent] = []
113
133
  notifications.createdEvent.each do |note|
114
134
  @watermark = note.watermark
135
+ item = {}
136
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
137
+ item.store(:folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
138
+ notif_hash[:createdEvent] << item
115
139
  end
116
140
  end
117
141
 
118
142
  if( notifications.deletedEvent != nil)
143
+ notif_hash[:deletedEvent] = []
119
144
  notifications.deletedEvent.each do |note|
120
145
  @watermark = note.watermark
146
+ item = {}
147
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
148
+ item.store(:folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
149
+ notif_hash[:deletedEvent] << item
121
150
  end
122
151
  end
123
152
 
124
153
  if( notifications.modifiedEvent != nil)
154
+ notif_hash[:modifiedEvent] = []
125
155
  notifications.modifiedEvent.each do |note|
126
156
  @watermark = note.watermark
157
+ item = {}
158
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
159
+ item.store(:folder_id,note.folderId.xmlattr_Id) if note.folderId
160
+ item.store(:parent_folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
161
+ item.store(:unreadCount,note.unreadCount)
162
+ notif_hash[:modifiedEvent] << item
127
163
  end
128
164
  end
129
165
 
130
166
  if( notifications.movedEvent != nil)
167
+ notif_hash[:movedEvent] = []
131
168
  notifications.movedEvent.each do |note|
132
169
  @watermark = note.watermark
170
+ item = {}
171
+ item.store(:old_item_id,note.oldItemId.xmlattr_Id) if note.oldItemId
172
+ item.store(:old_folder_id,note.oldParentFolderId.xmlattr_Id) if note.oldParentFolderId
173
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
174
+ item.store(:folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
175
+ notif_hash[:movedEvent] << item
133
176
  end
134
177
  end
135
178
 
136
179
  if( notifications.newMailEvent!= nil)
180
+ notif_hash[:newMailEvent] = []
137
181
  notifications.newMailEvent.each do |note|
138
182
  @watermark = note.watermark
183
+ item = {}
184
+ item.store(:item_id,note.itemId.xmlattr_Id) if note.itemId
185
+ item.store(:folder_id,note.parentFolderId.xmlattr_Id) if note.parentFolderId
186
+ notif_hash[:newMailEvent] << item
139
187
  end
140
188
  end
141
189
 
@@ -145,9 +193,17 @@ class Viewpoint::Folder
145
193
  end
146
194
  end
147
195
 
196
+ rescue NoMethodError
197
+ # This ocurrs if something bad happened to the subscription.
198
+ # This is handled by resubscribing to the subscription and returning
199
+ # an error key.
200
+ self.subscribe
201
+ return {:error => "Something bad happened to your subscription. You have been re-subscribed" }
148
202
  end
149
203
 
150
- return resp
204
+ #return resp
205
+ notif_hash[:resp] = resp
206
+ return notif_hash
151
207
  end
152
208
 
153
209
 
@@ -25,12 +25,16 @@
25
25
  class Viewpoint::Item
26
26
  include Viewpoint
27
27
 
28
- attr_accessor :item_id
28
+ attr_accessor :item_id, :parent_folder, :item_class
29
+ attr_reader :ews_item if $DEBUG
29
30
 
30
31
  # Initialize an Exchange Web Services item
31
32
  def initialize(ews_item, parent_folder)
33
+ @ews_item = ews_item if $DEBUG
34
+
32
35
  @item_id = ews_item.itemId.xmlattr_Id
33
36
  @parent_folder = parent_folder
37
+ @item_class = ews_item.itemClass
34
38
  end
35
39
 
36
40
  # Takes an object of type Viewpoint::Folder as an argument
@@ -43,26 +47,28 @@ class Viewpoint::Item
43
47
  end
44
48
 
45
49
 
50
+ def entry_id
51
+ convert_id(IdFormatType::EntryId)
52
+ end
53
+
46
54
  # Return the OWA ID so we can link to webmail
55
+ # Example usage: uri = "https://host/owa/?ae=Item&a=open&id=" + owa_id
47
56
  def owa_id
48
- vp = ExchWebServ.instance
49
- altids_ar = NonEmptyArrayOfAlternateIdsType.new
50
-
51
- altid_t = AlternateIdType.new
52
- altid_t.xmlattr_Format = IdFormatType::EwsId
53
- altid_t.xmlattr_Id = @item_id
54
- altid_t.xmlattr_Mailbox = vp.email
55
- altids_ar.alternateId << altid_t
56
-
57
- convertid_t = ConvertIdType.new(altids_ar)
58
- convertid_t.xmlattr_DestinationFormat = IdFormatType::OwaId
59
-
60
- resp = vp.ews.convertId(convertid_t)
61
- resp.responseMessages.convertIdResponseMessage.first.alternateId.xmlattr_Id
62
- #uri = "https://host/owa/?ae=Item&a=open&id=" + owa_id
57
+ convert_id(IdFormatType::OwaId)
63
58
  end
64
59
 
60
+ def ews_legacy_id
61
+ convert_id(IdFormatType::EwsLegacyId)
62
+ end
63
+
64
+ def hex_id
65
+ convert_id(IdFormatType::HexEntryId)
66
+ end
65
67
 
68
+ def store_id
69
+ convert_id(IdFormatType::StoreId)
70
+ end
71
+
66
72
  # Returns a boolean value, true if the delete ocurred, false otherwise.
67
73
  def delete!
68
74
  @parent_folder.delete_item(@item_id)
@@ -72,4 +78,24 @@ class Viewpoint::Item
72
78
  def recycle!
73
79
  @parent_folder.recycle_item(@item_id)
74
80
  end
81
+
82
+
83
+ private
84
+
85
+ def convert_id(dest_type)
86
+ vp = ExchWebServ.instance
87
+ altids_ar = NonEmptyArrayOfAlternateIdsType.new
88
+
89
+ altid_t = AlternateIdType.new
90
+ altid_t.xmlattr_Format = IdFormatType::EwsId
91
+ altid_t.xmlattr_Id = @item_id
92
+ altid_t.xmlattr_Mailbox = vp.email
93
+ altids_ar.alternateId << altid_t
94
+
95
+ convertid_t = ConvertIdType.new(altids_ar)
96
+ convertid_t.xmlattr_DestinationFormat = dest_type
97
+
98
+ resp = vp.ews.convertId(convertid_t)
99
+ resp.responseMessages.convertIdResponseMessage.first.alternateId.xmlattr_Id
100
+ end
75
101
  end
@@ -110,4 +110,8 @@ class Viewpoint::MailFolder < Viewpoint::Folder
110
110
  def get_item(item_id)
111
111
  msg = super(item_id, "message", true)
112
112
  end
113
+
114
+ def get_message(item_id)
115
+ Message.new(get_item(item_id), self)
116
+ end
113
117
  end
@@ -23,13 +23,12 @@ require 'item'
23
23
  class Viewpoint::Message < Viewpoint::Item
24
24
  include Viewpoint
25
25
 
26
- attr_reader :subject, :parent_folder, :sender, :date_time_recieved
27
- attr_reader :ews_item if $DEBUG
26
+ attr_reader :subject, :sender, :date_time_recieved
28
27
 
29
28
  # Initialize an Exchange Web Services item of MessageType
30
29
  def initialize(ews_item, parent_folder)
31
- # keep this now for debuging
32
- @ews_item = ews_item if $DEBUG
30
+ raise InvalidEWSItemError if ews_item.nil?
31
+
33
32
  @subject = ews_item.subject # String
34
33
  @sender = ews_item.sender.mailbox.name if ews_item.sender # String
35
34
  @recipients =
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: viewpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Wanek
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-13 00:00:00 -06:00
12
+ date: 2009-11-27 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,6 +32,16 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: "0"
34
34
  version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rubyntlm
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.1.1
44
+ version:
35
45
  description: " \tA Ruby client access library for Microsoft Exchange Web Services (EWS). It is a work in progress. Methods are still being added from the EWS API docs. Please see them for further information: http://msdn.microsoft.com/en-us/library/bb204119.aspx\n"
36
46
  email: dan.wanek@gmail.com
37
47
  executables: []
@@ -97,6 +107,7 @@ files:
97
107
  - lib/viewpoint.rb
98
108
  - lib/viewpoint/calendar.rb
99
109
  - lib/viewpoint/calendar_item.rb
110
+ - lib/viewpoint/errors.rb
100
111
  - lib/viewpoint/event.rb
101
112
  - lib/viewpoint/exchange_headers.rb
102
113
  - lib/viewpoint/exchwebserv.rb