viewpoint 0.1.0 → 0.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.
- data/TODO +2 -0
- data/VERSION +1 -1
- data/lib/model/generic_folder.rb +34 -1
- data/lib/model/item.rb +51 -3
- data/lib/model/message.rb +30 -7
- data/lib/soap/handsoap/builders/ews_build_helpers.rb +39 -14
- data/lib/soap/handsoap/ews_service.rb +66 -18
- data/lib/soap/handsoap/parsers/ews_parser.rb +38 -0
- data/lib/viewpoint.rb +18 -0
- data/test/spec/basic_functions.spec +18 -0
- data/test/spec/item_tests.spec +43 -0
- data/test/spec/spec.opts +7 -0
- metadata +5 -50
- data/examples/cal2ical.rb +0 -29
- data/examples/ews_fusefs.rb +0 -363
- data/examples/webclient/.gems +0 -2
- data/examples/webclient/README +0 -1
- data/examples/webclient/config.ru +0 -26
- data/examples/webclient/ews_access_handler.rb +0 -42
- data/examples/webclient/public/css/mail.css +0 -33
- data/examples/webclient/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/examples/webclient/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/examples/webclient/public/css/smoothness/jquery-ui-1.7.2.custom.css +0 -406
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/examples/webclient/public/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/examples/webclient/public/css/ui-lightness/jquery-ui-1.7.2.custom.css +0 -406
- data/examples/webclient/public/js/jquery-1.3.2.min.js +0 -19
- data/examples/webclient/public/js/jquery-ui-1.7.2.custom.min.js +0 -145
- data/examples/webclient/viewpoint_web.rb +0 -295
- data/examples/webclient/views/_footer.haml +0 -1
- data/examples/webclient/views/_header.haml +0 -11
- data/examples/webclient/views/_tagline.haml +0 -1
- data/examples/webclient/views/index.haml +0 -20
- data/examples/webclient/views/layout.haml +0 -42
- data/examples/webclient/views/mail.haml +0 -45
- data/examples/webclient/views/welcome.haml +0 -0
- data/lib/model/task_list.rb +0 -19
data/lib/viewpoint.rb
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
# We only what one instance of this class so include Singleton
|
|
22
22
|
require 'singleton'
|
|
23
23
|
require 'date'
|
|
24
|
+
require 'base64'
|
|
24
25
|
|
|
25
26
|
# Class Extensions
|
|
26
27
|
require 'extensions/string'
|
|
@@ -72,20 +73,37 @@ module Viewpoint
|
|
|
72
73
|
|
|
73
74
|
attr_reader :ews
|
|
74
75
|
|
|
76
|
+
# Set the endpoint for Exchange Web Services.
|
|
77
|
+
# @param [String] endpoint The URL of the endpoint. This should end in
|
|
78
|
+
# 'exchange.asmx' and is typically something like this:
|
|
79
|
+
# https://myexch/ews/exchange.asmx
|
|
80
|
+
# @param [Integer] version The SOAP version to use. This defaults to 1
|
|
81
|
+
# and you should not need to pass this parameter.
|
|
75
82
|
def self.endpoint=(endpoint, version = 1)
|
|
76
83
|
@@endpoint = endpoint
|
|
77
84
|
SOAP::ExchangeWebService.endpoint(:uri => endpoint, :version => version)
|
|
78
85
|
end
|
|
79
86
|
|
|
87
|
+
# Fetch the current endpoint
|
|
80
88
|
def self.endpoint
|
|
81
89
|
@@endpoint
|
|
82
90
|
end
|
|
83
91
|
|
|
92
|
+
# Set the SOAP username and password.
|
|
93
|
+
# @param [String] user The user name
|
|
94
|
+
# @param [String] pass The password
|
|
84
95
|
def self.set_auth(user,pass)
|
|
85
96
|
@@user = user
|
|
86
97
|
SOAP::ExchangeWebService.set_auth(user,pass)
|
|
87
98
|
end
|
|
88
99
|
|
|
100
|
+
# Set the http driver that the SOAP back-end will use.
|
|
101
|
+
# @param [Symbol] driver The HTTP driver. Available drivers:
|
|
102
|
+
# :curb, :net_http, :http_client(Default)
|
|
103
|
+
def self.set_http_driver(driver)
|
|
104
|
+
Handsoap.http_driver = driver
|
|
105
|
+
end
|
|
106
|
+
|
|
89
107
|
def initialize
|
|
90
108
|
@ews = SOAP::ExchangeWebService.new
|
|
91
109
|
end
|
|
@@ -22,6 +22,15 @@ describe "Test the basic features of Viewpoint" do
|
|
|
22
22
|
(Viewpoint::EWS::GenericFolder.get_folder :tasks).should be_instance_of(Viewpoint::EWS::TasksFolder)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
it 'should retrive the Inbox by name' do
|
|
26
|
+
(Viewpoint::EWS::GenericFolder.get_folder_by_name 'Inbox').should be_instance_of(Viewpoint::EWS::Folder)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should retrive the Inbox by FolderId' do
|
|
30
|
+
inbox = Viewpoint::EWS::GenericFolder.get_folder_by_name 'Inbox'
|
|
31
|
+
(Viewpoint::EWS::GenericFolder.get_folder inbox.id).should be_instance_of(Viewpoint::EWS::Folder)
|
|
32
|
+
end
|
|
33
|
+
|
|
25
34
|
it 'should retrieve an Array of Folder Types' do
|
|
26
35
|
flds = Viewpoint::EWS::GenericFolder.find_folders
|
|
27
36
|
flds.should be_instance_of(Array)
|
|
@@ -48,4 +57,13 @@ describe "Test the basic features of Viewpoint" do
|
|
|
48
57
|
end
|
|
49
58
|
end
|
|
50
59
|
|
|
60
|
+
it 'should retrieve a folder by name' do
|
|
61
|
+
inbox = Viewpoint::EWS::GenericFolder.get_folder_by_name("Inbox")
|
|
62
|
+
inbox.should be_instance_of(Viewpoint::EWS::Folder)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should retrieve a list of folder names' do
|
|
66
|
+
Viewpoint::EWS::GenericFolder.folder_names.should_not be_empty
|
|
67
|
+
end
|
|
68
|
+
|
|
51
69
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
$: << File.dirname(__FILE__) + '/../../lib/'
|
|
2
|
+
require 'kconv'
|
|
3
|
+
require 'viewpoint'
|
|
4
|
+
require 'json'
|
|
5
|
+
|
|
6
|
+
# To run this test put a file called 'creds.json' in this directory with the following format:
|
|
7
|
+
# {"user":"myuser","pass":"mypass","endpoint":"https://mydomain.com/ews/exchange.asmx"}
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
describe "Test the basic functionality of Items" do
|
|
11
|
+
before(:all) do
|
|
12
|
+
creds = JSON.load(File.open('spec/creds.json','r'))
|
|
13
|
+
Viewpoint::EWS::EWS.endpoint = creds['endpoint']
|
|
14
|
+
Viewpoint::EWS::EWS.set_auth(creds['user'],creds['pass'])
|
|
15
|
+
@ews = Viewpoint::EWS::EWS.instance
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should create a new Message Item that we can test with.' do
|
|
19
|
+
$message = Viewpoint::EWS::Message.send('RSPEC test subject', 'RSPEC test body', [@ews.me.email_address],nil,nil,nil,true)
|
|
20
|
+
$message.should be_instance_of(Viewpoint::EWS::Message)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should move the Message Item to the Inbox folder' do
|
|
24
|
+
inbox = Viewpoint::EWS::GenericFolder.get_folder :inbox
|
|
25
|
+
$message.move!(inbox).should be_true
|
|
26
|
+
end
|
|
27
|
+
it 'should copy the Message Item to the Drafts folder' do
|
|
28
|
+
drafts = Viewpoint::EWS::GenericFolder.get_folder :drafts
|
|
29
|
+
$msg_copy = $message.copy(drafts)
|
|
30
|
+
$msg_copy.should be_instance_of(Viewpoint::EWS::Message)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "Clean up after ourselves." do
|
|
34
|
+
it 'should delete the initial Message' do
|
|
35
|
+
$message.delete!.should be_true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'should send the copy message to Deleted Items' do
|
|
39
|
+
$msg_copy.recycle!.should be_true
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
data/test/spec/spec.opts
ADDED
metadata
CHANGED
|
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 1
|
|
8
|
-
-
|
|
9
|
-
version: 0.1.
|
|
8
|
+
- 1
|
|
9
|
+
version: 0.1.1
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Dan Wanek
|
|
@@ -14,7 +14,7 @@ autorequire:
|
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
16
|
|
|
17
|
-
date: 2010-08-
|
|
17
|
+
date: 2010-08-04 00:00:00 -05:00
|
|
18
18
|
default_executable:
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
@@ -97,52 +97,6 @@ files:
|
|
|
97
97
|
- Rakefile
|
|
98
98
|
- TODO
|
|
99
99
|
- VERSION
|
|
100
|
-
- examples/cal2ical.rb
|
|
101
|
-
- examples/ews_fusefs.rb
|
|
102
|
-
- examples/webclient/.gems
|
|
103
|
-
- examples/webclient/README
|
|
104
|
-
- examples/webclient/config.ru
|
|
105
|
-
- examples/webclient/ews_access_handler.rb
|
|
106
|
-
- examples/webclient/public/css/mail.css
|
|
107
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
|
|
108
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
|
|
109
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
|
|
110
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
|
|
111
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
|
|
112
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
|
|
113
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
|
|
114
|
-
- examples/webclient/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
|
115
|
-
- examples/webclient/public/css/smoothness/images/ui-icons_222222_256x240.png
|
|
116
|
-
- examples/webclient/public/css/smoothness/images/ui-icons_2e83ff_256x240.png
|
|
117
|
-
- examples/webclient/public/css/smoothness/images/ui-icons_454545_256x240.png
|
|
118
|
-
- examples/webclient/public/css/smoothness/images/ui-icons_888888_256x240.png
|
|
119
|
-
- examples/webclient/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png
|
|
120
|
-
- examples/webclient/public/css/smoothness/jquery-ui-1.7.2.custom.css
|
|
121
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
|
|
122
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
|
|
123
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
|
|
124
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
|
|
125
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
|
|
126
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
|
|
127
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
|
|
128
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
|
|
129
|
-
- examples/webclient/public/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
|
|
130
|
-
- examples/webclient/public/css/ui-lightness/images/ui-icons_222222_256x240.png
|
|
131
|
-
- examples/webclient/public/css/ui-lightness/images/ui-icons_228ef1_256x240.png
|
|
132
|
-
- examples/webclient/public/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
|
|
133
|
-
- examples/webclient/public/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
|
|
134
|
-
- examples/webclient/public/css/ui-lightness/images/ui-icons_ffffff_256x240.png
|
|
135
|
-
- examples/webclient/public/css/ui-lightness/jquery-ui-1.7.2.custom.css
|
|
136
|
-
- examples/webclient/public/js/jquery-1.3.2.min.js
|
|
137
|
-
- examples/webclient/public/js/jquery-ui-1.7.2.custom.min.js
|
|
138
|
-
- examples/webclient/viewpoint_web.rb
|
|
139
|
-
- examples/webclient/views/_footer.haml
|
|
140
|
-
- examples/webclient/views/_header.haml
|
|
141
|
-
- examples/webclient/views/_tagline.haml
|
|
142
|
-
- examples/webclient/views/index.haml
|
|
143
|
-
- examples/webclient/views/layout.haml
|
|
144
|
-
- examples/webclient/views/mail.haml
|
|
145
|
-
- examples/webclient/views/welcome.haml
|
|
146
100
|
- lib/exceptions/exceptions.rb
|
|
147
101
|
- lib/extensions/string.rb
|
|
148
102
|
- lib/model/calendar_folder.rb
|
|
@@ -163,7 +117,6 @@ files:
|
|
|
163
117
|
- lib/model/model.rb
|
|
164
118
|
- lib/model/search_folder.rb
|
|
165
119
|
- lib/model/task.rb
|
|
166
|
-
- lib/model/task_list.rb
|
|
167
120
|
- lib/model/tasks_folder.rb
|
|
168
121
|
- lib/soap/handsoap/builder.rb
|
|
169
122
|
- lib/soap/handsoap/builders/ews_build_helpers.rb
|
|
@@ -177,6 +130,8 @@ files:
|
|
|
177
130
|
- test/spec/basic_functions.spec
|
|
178
131
|
- test/spec/folder_subscriptions.spec
|
|
179
132
|
- test/spec/folder_synchronization.spec
|
|
133
|
+
- test/spec/item_tests.spec
|
|
134
|
+
- test/spec/spec.opts
|
|
180
135
|
- utils/ewsWSDL2rb.rb
|
|
181
136
|
has_rdoc: true
|
|
182
137
|
homepage: http://github.com/zenchild/Viewpoint
|
data/examples/cal2ical.rb
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
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
|
-
require File.dirname(__FILE__) + '/../lib/exchwebserv'
|
|
21
|
-
include Viewpoint
|
|
22
|
-
|
|
23
|
-
vp = ExchWebServ.instance
|
|
24
|
-
vp.authenticate
|
|
25
|
-
vp.find_folders
|
|
26
|
-
cal = vp.get_folder("Calendar")
|
|
27
|
-
ical = cal.to_ical
|
|
28
|
-
puts ical.to_ical
|
|
29
|
-
|
data/examples/ews_fusefs.rb
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
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
|
-
$: << File.dirname(__FILE__) + '/../lib/'
|
|
21
|
-
require 'fusefs'
|
|
22
|
-
require 'time'
|
|
23
|
-
include FuseFS
|
|
24
|
-
require 'viewpoint'
|
|
25
|
-
include Viewpoint
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class EWSFuse < FuseDir
|
|
29
|
-
|
|
30
|
-
@@maildir_dirs = ['cur','new', 'tmp']
|
|
31
|
-
@@ewsfuse_dir = "#{ENV['HOME']}/.ewsfuse"
|
|
32
|
-
|
|
33
|
-
def initialize(mountpoint)
|
|
34
|
-
@vp = ExchWebServ.instance
|
|
35
|
-
@vp.authenticate
|
|
36
|
-
@vp.find_folders
|
|
37
|
-
@mf = (@vp.get_mail_folders)
|
|
38
|
-
@messages = {} # Message objects
|
|
39
|
-
@open_files = {} # Files open for RAW IO
|
|
40
|
-
@mountpoint = mountpoint
|
|
41
|
-
|
|
42
|
-
#File::umask(0077)
|
|
43
|
-
if( !File.directory?(@@ewsfuse_dir) )
|
|
44
|
-
Dir.mkdir(@@ewsfuse_dir)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# ----- FuserFS Methods ----- #
|
|
49
|
-
def contents(path)
|
|
50
|
-
puts "--- IN: contents ---"
|
|
51
|
-
if (local_path?(path))
|
|
52
|
-
puts "--- IN: contents: if ---"
|
|
53
|
-
Dir.entries(local_path(path))
|
|
54
|
-
else
|
|
55
|
-
puts "--- IN: contents: else ---"
|
|
56
|
-
parts = scan_path(path)
|
|
57
|
-
case parts.pop
|
|
58
|
-
when nil
|
|
59
|
-
puts "--- IN: contents: else --- while 'nil'"
|
|
60
|
-
output = @mf.keys do |folder_name|
|
|
61
|
-
folder_name
|
|
62
|
-
end
|
|
63
|
-
output + Dir.entries(local_path(path))
|
|
64
|
-
when 'cur'
|
|
65
|
-
np = parts.pop
|
|
66
|
-
puts "folder: #{np}"
|
|
67
|
-
mdir = @mf[np]
|
|
68
|
-
if( mdir == nil )
|
|
69
|
-
[]
|
|
70
|
-
else
|
|
71
|
-
mdir = @vp.get_folder(mdir.display_name)
|
|
72
|
-
puts "Fetching todays messages for #{mdir.display_name} of type #{mdir.class.to_s}"
|
|
73
|
-
mdir.get_todays_messages.map do |msg|
|
|
74
|
-
puts "Got message of type: #{msg.class.to_s}"
|
|
75
|
-
msg_hash = msg.item_id.hash.abs
|
|
76
|
-
@messages[msg_hash.to_s] = msg
|
|
77
|
-
"#{msg.date_time_recieved.strftime('%s')}_#{msg_hash}"
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
when 'new','tmp'
|
|
81
|
-
[]
|
|
82
|
-
else
|
|
83
|
-
['cur','new','tmp']
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def directory?(path)
|
|
89
|
-
if( local_path?(path) )
|
|
90
|
-
puts "Checking for Local_dir?"
|
|
91
|
-
File.directory?( local_path(path) )
|
|
92
|
-
else
|
|
93
|
-
parts = scan_path(path)
|
|
94
|
-
part = parts.pop
|
|
95
|
-
case part
|
|
96
|
-
when /^[0-9]{10,}_/
|
|
97
|
-
puts "NOT DIR: #{path}"
|
|
98
|
-
return false
|
|
99
|
-
when nil, 'cur','new','tmp'
|
|
100
|
-
puts "IS DIR: #{path}"
|
|
101
|
-
return true
|
|
102
|
-
else
|
|
103
|
-
if( (@mf[part] ) != nil )
|
|
104
|
-
puts "IS DIR: #{path}"
|
|
105
|
-
return true
|
|
106
|
-
else
|
|
107
|
-
puts "NOT DIR: #{path}"
|
|
108
|
-
return false
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def file?(path)
|
|
115
|
-
if( local_path?(path) )
|
|
116
|
-
if(File.exists?(local_path(path)))
|
|
117
|
-
ans = !directory?(path)
|
|
118
|
-
else
|
|
119
|
-
ans = false
|
|
120
|
-
end
|
|
121
|
-
else
|
|
122
|
-
ans = !directory?(path)
|
|
123
|
-
end
|
|
124
|
-
puts "=> file?(#{path}) ... " + (ans ? "yes" : "no")
|
|
125
|
-
return ans
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def executable?(path)
|
|
129
|
-
if( local_path?(path) )
|
|
130
|
-
return File.executable?(local_path(path))
|
|
131
|
-
else
|
|
132
|
-
return directory?(path)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def read_file(path)
|
|
137
|
-
if( local_path?(path) )
|
|
138
|
-
IO.read(local_path(path))
|
|
139
|
-
else
|
|
140
|
-
parts = scan_path(path)
|
|
141
|
-
msg_hash = parts.last.split('_').last
|
|
142
|
-
@messages[msg_hash.to_s].to_rfc822
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def can_write?(path)
|
|
147
|
-
return false if path =~ /folders.db/
|
|
148
|
-
parts = scan_path(path)
|
|
149
|
-
|
|
150
|
-
ans = local_path?(path) || path == '/' #||
|
|
151
|
-
#parts.last =~ /^[0-9]{10,}_/
|
|
152
|
-
|
|
153
|
-
puts "=> can_write?(#{path}) ... " + (ans ? "yes" : "no")
|
|
154
|
-
return ans
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def write_to(path, str)
|
|
158
|
-
puts "=> write_to(#{path}, str...)"
|
|
159
|
-
io = File.open(local_path(path),'w+')
|
|
160
|
-
io.write(str)
|
|
161
|
-
io.close
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def can_delete?(path)
|
|
165
|
-
parts = scan_path(path)
|
|
166
|
-
|
|
167
|
-
ans = local_path?(path) ||
|
|
168
|
-
parts.last =~ /^[0-9]{10,}_/
|
|
169
|
-
|
|
170
|
-
puts "=> can_delete?(#{path}) ... " + (ans ? "yes" : "no")
|
|
171
|
-
ans
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def delete(path)
|
|
175
|
-
puts "=> delete(#{path})"
|
|
176
|
-
if( local_path?(path) )
|
|
177
|
-
puts "In LOCAL DELETE"
|
|
178
|
-
lpath = local_path(path)
|
|
179
|
-
if( File.directory?(lpath) )
|
|
180
|
-
puts "Removing local directory #{lpath}"
|
|
181
|
-
else
|
|
182
|
-
puts "Removing local file #{lpath}"
|
|
183
|
-
File.unlink(lpath)
|
|
184
|
-
end
|
|
185
|
-
else
|
|
186
|
-
puts "In NON LOCAL DELETE"
|
|
187
|
-
parts = scan_path(path)
|
|
188
|
-
msg_hash = parts.last.split('_').last
|
|
189
|
-
puts "In NON LOCAL DELETE 2: #{msg_hash}"
|
|
190
|
-
puts "In NON LOCAL DELETE 3: #{parts[-3]}"
|
|
191
|
-
#mdir = @vp.get_folder(parts[-3])
|
|
192
|
-
if ( (msg = @messages[msg_hash.to_s]) == nil)
|
|
193
|
-
npath = parts
|
|
194
|
-
npath.pop
|
|
195
|
-
contents(npath.join('/'))
|
|
196
|
-
msg = @messages[msg_hash.to_s]
|
|
197
|
-
end
|
|
198
|
-
puts "In NON LOCAL DELETE 4: #{msg.class.to_s}"
|
|
199
|
-
puts "MESG: #{msg.class.to_s}, ID: #{msg.item_id}, PARENT: #{msg.parent_folder.class.to_s}"
|
|
200
|
-
#puts "MESG: #{mdir.class.to_s}"
|
|
201
|
-
msg.parent_folder.recycle_item(msg.item_id)
|
|
202
|
-
true
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def can_mkdir?(path)
|
|
207
|
-
ans = local_path?(path)
|
|
208
|
-
puts "=> can_mkdir?(#{path}) ... " + (ans ? "yes" : "no")
|
|
209
|
-
ans
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def mkdir(path)
|
|
213
|
-
puts "=> mkdir(#{path})"
|
|
214
|
-
lpath = local_path(path)
|
|
215
|
-
Dir.mkdir lpath
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def can_rmdir?(path)
|
|
219
|
-
puts "=> can_rmdir?(#{path})"
|
|
220
|
-
local_path?(path)
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
def rmdir(path)
|
|
224
|
-
lpath = local_path(path)
|
|
225
|
-
puts "=> rmdir(#{lpath})"
|
|
226
|
-
Dir.rmdir(lpath)
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def size(path)
|
|
230
|
-
if(local_path?(path))
|
|
231
|
-
File.size(local_path(path))
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
# --- RAW FuserFS Methods --- #
|
|
236
|
-
def raw_open(path,mode) # mode is "r" "w" or "rw", with "a" if the file
|
|
237
|
-
puts "** => raw_open(#{path}, '#{mode}')"
|
|
238
|
-
|
|
239
|
-
if( !local_path?(path) )
|
|
240
|
-
return false
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
lpath = local_path(path)
|
|
244
|
-
|
|
245
|
-
case mode
|
|
246
|
-
when /^r$/
|
|
247
|
-
mode = 'r'
|
|
248
|
-
when /^w$/
|
|
249
|
-
mode = 'a'
|
|
250
|
-
when /^[wr]{2}$/, /a/
|
|
251
|
-
if(File.exists?(lpath))
|
|
252
|
-
mode = 'r+'
|
|
253
|
-
else
|
|
254
|
-
mode = 'w+'
|
|
255
|
-
end
|
|
256
|
-
else
|
|
257
|
-
raise "Unknown mode error #{mode}"
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
puts "Setting mode to '#{mode}'"
|
|
261
|
-
|
|
262
|
-
return true if @open_files.has_key?(path)
|
|
263
|
-
begin
|
|
264
|
-
puts "Raw opening.... File.open(#{lpath}, #{mode})"
|
|
265
|
-
@open_files[path] = File.open(lpath, mode)
|
|
266
|
-
return true
|
|
267
|
-
rescue => error
|
|
268
|
-
puts "Error opening raw file: #{error}"
|
|
269
|
-
return false
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
def raw_read(path,offset,size)
|
|
274
|
-
begin
|
|
275
|
-
puts "** => raw_read(#{path}, #{offset}, #{size})"
|
|
276
|
-
file = @open_files[path]
|
|
277
|
-
return unless file
|
|
278
|
-
#file.sysseek(offset,IO::SEEK_SET)
|
|
279
|
-
#file.sysread(size)
|
|
280
|
-
file.seek(offset, File::SEEK_SET)
|
|
281
|
-
file.read(size)
|
|
282
|
-
rescue => error
|
|
283
|
-
puts "Error reading raw file: #{error}"
|
|
284
|
-
nil
|
|
285
|
-
end
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
def raw_write(path,offset,size,buf)
|
|
289
|
-
begin
|
|
290
|
-
puts "** => raw_write(#{path}, #{offset}, #{size}, ... buf)"
|
|
291
|
-
file = @open_files[path]
|
|
292
|
-
return unless file
|
|
293
|
-
file.seek(offset, File::SEEK_CUR)
|
|
294
|
-
file.write(buf[0, size])
|
|
295
|
-
#file.sysseek(offset,IO::SEEK_CUR)
|
|
296
|
-
#file.syswrite(buf[0, size])
|
|
297
|
-
rescue => error
|
|
298
|
-
puts "Error writing to raw file: #{error}"
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
def raw_close(path)
|
|
303
|
-
begin
|
|
304
|
-
puts "** => raw_close(#{path})"
|
|
305
|
-
file = @open_files[path]
|
|
306
|
-
return unless file
|
|
307
|
-
file.close
|
|
308
|
-
@open_files.delete path
|
|
309
|
-
rescue => error
|
|
310
|
-
puts "Error closing raw file: #{error}"
|
|
311
|
-
end
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
# --- End FuserFS Methods --- #
|
|
316
|
-
|
|
317
|
-
# Is this a virtual dir/file or a local file
|
|
318
|
-
def local_path?(path)
|
|
319
|
-
parts = scan_path(path)
|
|
320
|
-
|
|
321
|
-
if parts.empty?
|
|
322
|
-
ans = false
|
|
323
|
-
else
|
|
324
|
-
ans = ((!@@maildir_dirs.include? parts.last) &&
|
|
325
|
-
parts.last !~ /^[0-9]{10,}_/ &&
|
|
326
|
-
((@mf[parts.last]) == nil)
|
|
327
|
-
)
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
puts "==> local_path?(#{path}) ... " + (ans ? "yes" : "no")
|
|
331
|
-
return ans
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
# Return local path as a string
|
|
335
|
-
def local_path(path)
|
|
336
|
-
puts "==> local_path(#{path})"
|
|
337
|
-
#lpath = path.gsub(/#{@mountpoint}\/?/,'')
|
|
338
|
-
lpath = path.gsub(/^\/?/,'')
|
|
339
|
-
return "#{@@ewsfuse_dir}/#{lpath}"
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
# FuserFS set-up
|
|
344
|
-
if (File.basename($0) == File.basename(__FILE__))
|
|
345
|
-
if (ARGV.size != 1)
|
|
346
|
-
puts "Usage: #{$0} <directory>"
|
|
347
|
-
exit
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
dirname = ARGV.shift
|
|
351
|
-
|
|
352
|
-
unless File.directory?(dirname)
|
|
353
|
-
puts "Usage: #{dirname} is not a directory."
|
|
354
|
-
exit
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
root = EWSFuse.new(dirname)
|
|
358
|
-
|
|
359
|
-
# Set the root FuseFS
|
|
360
|
-
FuseFS.set_root(root)
|
|
361
|
-
FuseFS.mount_under(dirname)
|
|
362
|
-
FuseFS.run # This doesn't return until we're unmounted.
|
|
363
|
-
end
|