dokan-ruby 0.0.1-mswin32

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ require 'mkmf'
2
+
3
+ $LDFLAGS="/DUNICODE /D_UNICODE /MD"
4
+
5
+ #dir_config('dokan', '..\\dokan', '..\\dokan\\objchk_wxp_x86\\i386')
6
+ dir_config('dokan', '.', '.')
7
+ have_header('dokan.h')
8
+ have_library('dokan')
9
+
10
+ create_makefile('dokan_lib')
11
+
@@ -0,0 +1,390 @@
1
+
2
+ require 'dokan_lib'
3
+
4
+ class DokanProxy
5
+
6
+
7
+ def initialize
8
+ @root = nil
9
+ end
10
+
11
+ def set_root(root)
12
+ @root = root
13
+ def @root.method_missing(name, *arg)
14
+ puts "#method_missing " + name.to_s
15
+ false
16
+ end
17
+ end
18
+
19
+ def open(path, fileinfo)
20
+ puts "#open " + path
21
+ if path == "/"
22
+ true
23
+ else
24
+ @root.file?(path) or @root.directory?(path)
25
+ end
26
+ end
27
+
28
+ def create(path, fileinfo)
29
+ puts "#create " + path
30
+ if @root.can_write?(path)
31
+ @root.write_to(path, "")
32
+ true
33
+ else
34
+ false
35
+ end
36
+ end
37
+
38
+ def truncate(path, fileinfo)
39
+ puts "#truncate " + path
40
+ @root.can_write?(path) and @root.write_to(path, "")
41
+ end
42
+
43
+ def opendir(path, fileinfo)
44
+ puts "#opendir " + path
45
+ if path == "/"
46
+ true
47
+ else
48
+ @root.directory?(path)
49
+ end
50
+ end
51
+
52
+ def mkdir(path, fileinfo)
53
+ puts "#mkdir " + path
54
+ @root.can_mkdir?(path) and @root.mkdir(path)
55
+ end
56
+
57
+ def cleanup(path, fileinfo)
58
+ puts "#cleanup " + path
59
+ if fileinfo.context
60
+ @root.can_write?(path) and @root.write_to(path, fileinfo.context)
61
+ end
62
+ true
63
+ end
64
+
65
+ def close(path, fileinfo)
66
+ puts "#close " + path
67
+ true
68
+ end
69
+
70
+ def read(path, offset, length, fileinfo)
71
+ puts "#read " + path
72
+ return "" unless @root.file?(path)
73
+ str = @root.read_file(path)
74
+ if offset < str.length
75
+ str[offset, length]
76
+ else
77
+ false
78
+ end
79
+ end
80
+
81
+ def write(path, offset, data, fileinfo)
82
+ puts "#write " + path
83
+ fileinfo.context = "" unless fileinfo.context
84
+ fileinfo.context[offset, data.length] = data
85
+ true
86
+ end
87
+
88
+ def flush(path, fileinfo)
89
+ puts "#flush " + path
90
+ true
91
+ end
92
+
93
+ def stat(path, fileinfo)
94
+ puts "#stat " + path
95
+ #[size, attr, ctime, atime, mtime]
96
+
97
+ size = @root.size(path)
98
+ size = 0 unless size
99
+
100
+ if path == "/" or @root.directory?(path)
101
+ [size, Dokan::DIRECTORY, 0, 0, 0]
102
+ else
103
+ [size, Dokan::NORMAL, 0, 0, 0]
104
+ end
105
+ end
106
+
107
+ # def readdira(path, fileinfo)
108
+ # end
109
+
110
+ def readdir(path, fileinfo)
111
+ puts "#readdir " + path
112
+ path == "/" or @root.directory?(path) and @root.contents(path)
113
+ end
114
+
115
+ def setattr(path, attr, fileinfo)
116
+ puts "#setattr " + path
117
+ false
118
+ end
119
+
120
+ def utime(path, ctime, atime, mtime, fileinfo)
121
+ puts "#utime " + path
122
+ false
123
+ end
124
+
125
+ def remove(path, fileinfo)
126
+ puts "#remove " + path
127
+ @root.can_delete?(path) and @root.delete(path)
128
+ end
129
+
130
+ def rename(path, newpath, fileinfo)
131
+ puts "#rename " + path
132
+ if @root.file?(path) and @root.can_delete?(path) and @root.can_write?(path)
133
+ str = @root.read_file(path)
134
+ @root.write_to(newpath, str)
135
+ @root.delete(path)
136
+ else
137
+ false
138
+ end
139
+ end
140
+
141
+ def rmdir(path, fileinfo)
142
+ puts "#rmdir " + path
143
+ @root.can_rmdir(path) and @root.rmdir(path)
144
+ end
145
+
146
+ def lock(path, fileinfo)
147
+ true
148
+ end
149
+
150
+ def unlock(path, fileinfo)
151
+ true
152
+ end
153
+
154
+ def unmount(fileinfo)
155
+ puts "#unmount"
156
+ @root.unmount
157
+ end
158
+
159
+
160
+ end
161
+
162
+
163
+ #
164
+ # from fusefs.rb
165
+ # Author: Greg Millam <walker@deafcode.com>.
166
+ #
167
+ module DokanFS
168
+
169
+
170
+ def DokanFS.set_root(root)
171
+ @proxy = DokanProxy.new
172
+ @proxy.set_root(root)
173
+ end
174
+
175
+ def DokanFS.mount_under(letter)
176
+ @letter = letter
177
+ end
178
+
179
+ def DokanFS.run
180
+ Dokan.mount(@letter, @proxy)
181
+ end
182
+
183
+
184
+ class DokanDir
185
+ def split_path(path)
186
+ cur, *rest = path.scan(/[^\/]+/)
187
+ if rest.empty?
188
+ [ cur, nil ]
189
+ else
190
+ [ cur, File.join(rest) ]
191
+ end
192
+ end
193
+ def scan_path(path)
194
+ path.scan(/[^\/]+/)
195
+ end
196
+ end
197
+
198
+ FuseDir = DokanDir
199
+
200
+ class MetaDir < DokanDir
201
+ def initialize
202
+ @subdirs = Hash.new(nil)
203
+ @files = Hash.new(nil)
204
+ end
205
+
206
+ # Contents of directory.
207
+ def contents(path)
208
+ base, rest = split_path(path)
209
+ case
210
+ when base.nil?
211
+ (@files.keys + @subdirs.keys).sort.uniq
212
+ when ! @subdirs.has_key?(base)
213
+ nil
214
+ when rest.nil?
215
+ @subdirs[base].contents('/')
216
+ else
217
+ @subdirs[base].contents(rest)
218
+ end
219
+ end
220
+
221
+ # File types
222
+ def directory?(path)
223
+ base, rest = split_path(path)
224
+ case
225
+ when base.nil?
226
+ true
227
+ when ! @subdirs.has_key?(base)
228
+ false
229
+ when rest.nil?
230
+ true
231
+ else
232
+ @subdirs[base].directory?(rest)
233
+ end
234
+ end
235
+ def file?(path)
236
+ base, rest = split_path(path)
237
+ case
238
+ when base.nil?
239
+ false
240
+ when rest.nil?
241
+ @files.has_key?(base)
242
+ when ! @subdirs.has_key?(base)
243
+ false
244
+ else
245
+ @subdirs[base].file?(rest)
246
+ end
247
+ end
248
+
249
+ # File Reading
250
+ def read_file(path)
251
+ base, rest = split_path(path)
252
+ case
253
+ when base.nil?
254
+ nil
255
+ when rest.nil?
256
+ @files[base].to_s
257
+ when ! @subdirs.has_key?(base)
258
+ nil
259
+ else
260
+ @subdirs[base].read_file(rest)
261
+ end
262
+ end
263
+
264
+ # Write to a file
265
+ def can_write?(path)
266
+ #return false unless Process.uid == FuseFS.reader_uid
267
+ base, rest = split_path(path)
268
+ case
269
+ when base.nil?
270
+ true
271
+ when rest.nil?
272
+ true
273
+ when ! @subdirs.has_key?(base)
274
+ false
275
+ else
276
+ @subdirs[base].can_write?(rest)
277
+ end
278
+ end
279
+ def write_to(path,file)
280
+ base, rest = split_path(path)
281
+ case
282
+ when base.nil?
283
+ false
284
+ when rest.nil?
285
+ @files[base] = file
286
+ when ! @subdirs.has_key?(base)
287
+ false
288
+ else
289
+ @subdirs[base].write_to(rest,file)
290
+ end
291
+ end
292
+
293
+ # Delete a file
294
+ def can_delete?(path)
295
+ #return false unless Process.uid == FuseFS.reader_uid
296
+ base, rest = split_path(path)
297
+ case
298
+ when base.nil?
299
+ false
300
+ when rest.nil?
301
+ @files.has_key?(base)
302
+ when ! @subdirs.has_key?(base)
303
+ false
304
+ else
305
+ @subdirs[base].can_delete?(rest)
306
+ end
307
+ end
308
+ def delete(path)
309
+ base, rest = split_path(path)
310
+ case
311
+ when base.nil?
312
+ nil
313
+ when rest.nil?
314
+ # Delete it.
315
+ @files.delete(base)
316
+ when ! @subdirs.has_key?(base)
317
+ nil
318
+ else
319
+ @subdirs[base].delete(rest)
320
+ end
321
+ end
322
+
323
+ # Make a new directory
324
+ def can_mkdir?(path)
325
+ #return false unless Process.uid == FuseFS.reader_uid
326
+ base, rest = split_path(path)
327
+ case
328
+ when base.nil?
329
+ false
330
+ when rest.nil?
331
+ ! (@subdirs.has_key?(base) || @files.has_key?(base))
332
+ when ! @subdirs.has_key?(base)
333
+ false
334
+ else
335
+ @subdirs[base].can_mkdir?(rest)
336
+ end
337
+ end
338
+ def mkdir(path,dir=nil)
339
+ base, rest = split_path(path)
340
+ case
341
+ when base.nil?
342
+ false
343
+ when rest.nil?
344
+ dir ||= MetaDir.new
345
+ @subdirs[base] = dir
346
+ true
347
+ when ! @subdirs.has_key?(base)
348
+ false
349
+ else
350
+ @subdirs[base].mkdir(rest,dir)
351
+ end
352
+ end
353
+
354
+ # Delete an existing directory.
355
+ def can_rmdir?(path)
356
+ #return false unless Process.uid == FuseFS.reader_uid
357
+ base, rest = split_path(path)
358
+ case
359
+ when base.nil?
360
+ false
361
+ when rest.nil?
362
+ @subdirs.has_key?(base)
363
+ when ! @subdirs.has_key?(base)
364
+ false
365
+ else
366
+ @subdirs[base].can_rmdir?(rest)
367
+ end
368
+ end
369
+ def rmdir(path)
370
+ base, rest = split_path(path)
371
+ dir ||= MetaDir.new
372
+ case
373
+ when base.nil?
374
+ false
375
+ when rest.nil?
376
+ @subdirs.delete(base)
377
+ true
378
+ when ! @subdirs.has_key?(base)
379
+ false
380
+ else
381
+ @subdirs[base].rmdir(rest,dir)
382
+ end
383
+ end
384
+ end
385
+ end
386
+
387
+
388
+ FuseFS = DokanFS
389
+
390
+
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2007 Hiroki Asakawa
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,144 @@
1
+ #ifndef _LIST_H_
2
+ #define _LIST_H_
3
+
4
+ #include <windows.h>
5
+
6
+ #if _MSC_VER < 1300
7
+ #define FORCEINLINE __inline
8
+ #endif
9
+
10
+ FORCEINLINE
11
+ VOID
12
+ InitializeListHead(
13
+ PLIST_ENTRY ListHead)
14
+ {
15
+ ListHead->Flink = ListHead->Blink = ListHead;
16
+ }
17
+
18
+ FORCEINLINE
19
+ BOOLEAN
20
+ IsListEmpty(
21
+ const LIST_ENTRY * ListHead)
22
+ {
23
+ return (BOOLEAN)(ListHead->Flink == ListHead);
24
+ }
25
+
26
+ FORCEINLINE
27
+ BOOLEAN
28
+ RemoveEntryList(
29
+ PLIST_ENTRY Entry)
30
+ {
31
+ PLIST_ENTRY Blink;
32
+ PLIST_ENTRY Flink;
33
+
34
+ Flink = Entry->Flink;
35
+ Blink = Entry->Blink;
36
+ Blink->Flink = Flink;
37
+ Flink->Blink = Blink;
38
+ return (BOOLEAN)(Flink == Blink);
39
+ }
40
+
41
+ FORCEINLINE
42
+ PLIST_ENTRY
43
+ RemoveHeadList(
44
+ PLIST_ENTRY ListHead)
45
+ {
46
+ PLIST_ENTRY Flink;
47
+ PLIST_ENTRY Entry;
48
+
49
+ Entry = ListHead->Flink;
50
+ Flink = Entry->Flink;
51
+ ListHead->Flink = Flink;
52
+ Flink->Blink = ListHead;
53
+ return Entry;
54
+ }
55
+
56
+
57
+
58
+ FORCEINLINE
59
+ PLIST_ENTRY
60
+ RemoveTailList(
61
+ PLIST_ENTRY ListHead)
62
+ {
63
+ PLIST_ENTRY Blink;
64
+ PLIST_ENTRY Entry;
65
+
66
+ Entry = ListHead->Blink;
67
+ Blink = Entry->Blink;
68
+ ListHead->Blink = Blink;
69
+ Blink->Flink = ListHead;
70
+ return Entry;
71
+ }
72
+
73
+
74
+ FORCEINLINE
75
+ VOID
76
+ InsertTailList(
77
+ PLIST_ENTRY ListHead,
78
+ PLIST_ENTRY Entry)
79
+ {
80
+ PLIST_ENTRY Blink;
81
+
82
+ Blink = ListHead->Blink;
83
+ Entry->Flink = ListHead;
84
+ Entry->Blink = Blink;
85
+ Blink->Flink = Entry;
86
+ ListHead->Blink = Entry;
87
+ }
88
+
89
+
90
+ FORCEINLINE
91
+ VOID
92
+ InsertHeadList(
93
+ PLIST_ENTRY ListHead,
94
+ PLIST_ENTRY Entry)
95
+ {
96
+ PLIST_ENTRY Flink;
97
+
98
+ Flink = ListHead->Flink;
99
+ Entry->Flink = Flink;
100
+ Entry->Blink = ListHead;
101
+ Flink->Blink = Entry;
102
+ ListHead->Flink = Entry;
103
+ }
104
+
105
+ FORCEINLINE
106
+ VOID
107
+ AppendTailList(
108
+ PLIST_ENTRY ListHead,
109
+ PLIST_ENTRY ListToAppend)
110
+ {
111
+ PLIST_ENTRY ListEnd = ListHead->Blink;
112
+
113
+ ListHead->Blink->Flink = ListToAppend;
114
+ ListHead->Blink = ListToAppend->Blink;
115
+ ListToAppend->Blink->Flink = ListHead;
116
+ ListToAppend->Blink = ListEnd;
117
+ }
118
+
119
+ FORCEINLINE
120
+ PSINGLE_LIST_ENTRY
121
+ PopEntryList(
122
+ PSINGLE_LIST_ENTRY ListHead)
123
+ {
124
+ PSINGLE_LIST_ENTRY FirstEntry;
125
+ FirstEntry = ListHead->Next;
126
+ if (FirstEntry != NULL) {
127
+ ListHead->Next = FirstEntry->Next;
128
+ }
129
+
130
+ return FirstEntry;
131
+ }
132
+
133
+
134
+ FORCEINLINE
135
+ VOID
136
+ PushEntryList(
137
+ PSINGLE_LIST_ENTRY ListHead,
138
+ PSINGLE_LIST_ENTRY Entry)
139
+ {
140
+ Entry->Next = ListHead->Next;
141
+ ListHead->Next = Entry;
142
+ }
143
+
144
+ #endif