virtfs-camcorderfs 0.0.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.
@@ -0,0 +1,145 @@
1
+ module VirtFS::CamcorderFS # rubocop:disable Style/ClassAndModuleChildren
2
+ #
3
+ # File instance methods - called by CamcorderFS::File instances.
4
+ # Methods are wraped in delegate class for camcorder interposition.
5
+ #
6
+ class CcDelegate
7
+ module FileInstanceMethods
8
+ #
9
+ # File instance methods - implementation.
10
+ #
11
+ def file_i_atime(instance_handle)
12
+ instance_call(:atime, instance_handle)
13
+ end
14
+
15
+ def file_i_chmod(instance_handle, permission)
16
+ instance_call(:chmod, instance_handle, permission)
17
+ end
18
+
19
+ def file_i_chown(instance_handle, owner, group)
20
+ instance_call(:chown, instance_handle, owner, group)
21
+ end
22
+
23
+ def file_i_ctime(instance_handle)
24
+ instance_call(:ctime, instance_handle)
25
+ end
26
+
27
+ def file_i_flock(instance_handle, locking_constant)
28
+ instance_call(:flock, instance_handle, locking_constant)
29
+ end
30
+
31
+ def file_i_lstat(instance_handle)
32
+ VirtFS::Stat.new(instance_call(:lstat, instance_handle))
33
+ end
34
+
35
+ def file_i_mtime(instance_handle)
36
+ instance_call(:mtime, instance_handle)
37
+ end
38
+
39
+ def file_i_size(instance_handle)
40
+ instance_call(:size, instance_handle)
41
+ end
42
+
43
+ def file_i_truncate(instance_handle, to_size)
44
+ instance_call(:truncate, instance_handle, to_size)
45
+ end
46
+
47
+ #
48
+ # IO instance methods.
49
+ #
50
+ def file_i_close(instance_handle)
51
+ instance_call(:close, instance_handle)
52
+ end
53
+
54
+ def file_i_close_on_exec?(instance_handle)
55
+ instance_call(:close_on_exec?, instance_handle)
56
+ end
57
+
58
+ def file_i_close_on_exec=(instance_handle, bool_val)
59
+ instance_call(:close_on_exec=, instance_handle, bool_val)
60
+ end
61
+
62
+ def file_i_close_read(instance_handle)
63
+ instance_call(:close_read, instance_handle)
64
+ end
65
+
66
+ def file_i_close_write(instance_handle)
67
+ instance_call(:close_write, instance_handle)
68
+ end
69
+
70
+ def file_i_fcntl(instance_handle, cmd, arg)
71
+ instance_call(:fcntl, instance_handle, cmd, arg)
72
+ end
73
+
74
+ def file_i_fdatasync(instance_handle)
75
+ instance_call(:fdatasync, instance_handle)
76
+ end
77
+
78
+ def file_i_fileno(instance_handle)
79
+ instance_call(:fileno, instance_handle)
80
+ end
81
+
82
+ def file_i_flush(instance_handle)
83
+ instance_call(:flush, instance_handle)
84
+ end
85
+
86
+ def file_i_fsync(instance_handle)
87
+ instance_call(:fsync, instance_handle)
88
+ end
89
+
90
+ def file_i_ioctl(instance_handle, cms, arg)
91
+ instance_call(:ioctl, instance_handle, cms, arg)
92
+ end
93
+
94
+ def file_i_isatty(instance_handle)
95
+ instance_call(:isatty, instance_handle)
96
+ end
97
+
98
+ def file_i_pid(instance_handle)
99
+ instance_call(:pid, instance_handle)
100
+ end
101
+
102
+ def file_i_raw_read(instance_handle, start_byte, num_bytes)
103
+ instance_handle.sysseek(start_byte, IO::SEEK_SET)
104
+ instance_handle.sysread(num_bytes)
105
+ end
106
+
107
+ def file_i_raw_write(instance_handle, start_byte, buf)
108
+ instance_handle.sysseek(start_byte, IO::SEEK_SET)
109
+ instance_handle.syswrite(buf)
110
+ end
111
+
112
+ def file_i_readpartial(instance_handle, limit, result)
113
+ instance_call(:readpartial, instance_handle, limit, result)
114
+ end
115
+
116
+ def file_i_read_nonblock(instance_handle, limit, result)
117
+ instance_call(:read_nonblock, instance_handle, limit, result)
118
+ end
119
+
120
+ def file_i_stat(instance_handle)
121
+ VirtFS::Stat.new(instance_call(:stat, instance_handle))
122
+ end
123
+
124
+ def file_i_sync(instance_handle)
125
+ instance_call(:sync, instance_handle)
126
+ end
127
+
128
+ def file_i_sync=(instance_handle, bool_val)
129
+ instance_call(:sync=, instance_handle, bool_val)
130
+ end
131
+
132
+ def file_i_to_i(instance_handle)
133
+ instance_call(:to_i, instance_handle)
134
+ end
135
+
136
+ def file_i_tty?(instance_handle)
137
+ instance_call(:tty?, instance_handle)
138
+ end
139
+
140
+ def file_i_write_nonblock(instance_handle, buf)
141
+ instance_call(:write_nonblock, instance_handle, buf)
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,37 @@
1
+ module VirtFS::CamcorderFS # rubocop:disable Style/ClassAndModuleChildren
2
+ #
3
+ # CamcorderFS::Dir class.
4
+ # Instance methods call into CamcorderFS::FS instance.
5
+ #
6
+ class Dir
7
+ attr_reader :fs
8
+
9
+ NS_PFX = "dir_i_"
10
+
11
+ def initialize(fs, instance_handle, hash_args)
12
+ @fs = fs
13
+ @instance_handle = instance_handle
14
+ @hash_args = hash_args
15
+ @cache = nil
16
+ end
17
+
18
+ def close
19
+ fs_call(__method__)
20
+ end
21
+
22
+ # returns file_name and new position.
23
+ def read(pos)
24
+ return cache[pos], pos + 1
25
+ end
26
+
27
+ private
28
+
29
+ def cache
30
+ @cache ||= fs_call(:each, nil, nil).to_a
31
+ end
32
+
33
+ def fs_call(method, *args)
34
+ @fs.send("#{NS_PFX}#{method}", @instance_handle, *args)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,157 @@
1
+ module VirtFS::CamcorderFS # rubocop:disable Style/ClassAndModuleChildren
2
+ #
3
+ # CamcorderFS::File class.
4
+ # Instance methods call into CamcorderFS::FS instance.
5
+ #
6
+ class File
7
+ attr_reader :fs
8
+
9
+ NS_PFX = "file_i_"
10
+
11
+ def initialize(fs, instance_handle, parsed_args)
12
+ @fs = fs
13
+ @instance_handle = instance_handle
14
+ @parsed_args = parsed_args
15
+ end
16
+
17
+ #
18
+ # File instance methods.
19
+ #
20
+ def atime
21
+ fs_call(__method__)
22
+ end
23
+
24
+ def chmod(permission)
25
+ fs_call(__method__, permission)
26
+ end
27
+
28
+ def chown(owner, group)
29
+ fs_call(__method__, owner, group)
30
+ end
31
+
32
+ def ctime
33
+ fs_call(__method__)
34
+ end
35
+
36
+ def flock(locking_constant)
37
+ fs_call(__method__, locking_constant)
38
+ end
39
+
40
+ def lstat
41
+ fs_call(__method__)
42
+ end
43
+
44
+ def mtime
45
+ fs_call(__method__)
46
+ end
47
+
48
+ def size
49
+ fs_call(__method__)
50
+ end
51
+
52
+ def truncate(to_size)
53
+ fs_call(__method__, to_size)
54
+ end
55
+
56
+ #
57
+ # IO instance methods.
58
+ #
59
+ def close
60
+ fs_call(__method__)
61
+ end
62
+
63
+ def close_on_exec?
64
+ fs_call(__method__)
65
+ end
66
+
67
+ def close_on_exec=(bool_val)
68
+ fs_call(__method__, bool_val)
69
+ end
70
+
71
+ def close_read
72
+ fs_call(__method__)
73
+ end
74
+
75
+ def close_write
76
+ fs_call(__method__)
77
+ end
78
+
79
+ def fcntl(cmd, arg)
80
+ fs_call(__method__, cmd, arg)
81
+ end
82
+
83
+ def fdatasync
84
+ fs_call(__method__)
85
+ end
86
+
87
+ def fileno
88
+ fs_call(__method__)
89
+ end
90
+
91
+ def flush
92
+ fs_call(__method__)
93
+ end
94
+
95
+ def fsync
96
+ fs_call(__method__)
97
+ end
98
+
99
+ def ioctl(cms, arg)
100
+ fs_call(__method__, cms, arg)
101
+ end
102
+
103
+ def isatty
104
+ fs_call(__method__)
105
+ end
106
+
107
+ def pid
108
+ fs_call(__method__)
109
+ end
110
+
111
+ def raw_read(start_byte, num_bytes)
112
+ fs_call(__method__, start_byte, num_bytes)
113
+ end
114
+
115
+ def raw_write(start_byte, buf)
116
+ fs_call(__method__, start_byte, buf)
117
+ end
118
+
119
+ def readpartial(limit, result = "")
120
+ fs_call(__method__, limit, result)
121
+ end
122
+
123
+ def read_nonblock(limit, result = "")
124
+ fs_call(__method__, limit, result)
125
+ end
126
+
127
+ def stat
128
+ fs_call(__method__)
129
+ end
130
+
131
+ def sync
132
+ fs_call(__method__)
133
+ end
134
+
135
+ def sync=(bool_val)
136
+ fs_call(__method__, bool_val)
137
+ end
138
+
139
+ def to_i
140
+ fs_call(__method__)
141
+ end
142
+
143
+ def tty?
144
+ fs_call(__method__)
145
+ end
146
+
147
+ def write_nonblock(buf)
148
+ fs_call(__method__, buf)
149
+ end
150
+
151
+ private
152
+
153
+ def fs_call(method, *args)
154
+ @fs.send("#{NS_PFX}#{method}", @instance_handle, *args)
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,106 @@
1
+ require_relative 'fs/dir_class_methods'
2
+ require_relative 'fs/dir_instance_methods'
3
+ require_relative 'fs/file_class_methods'
4
+ require_relative 'fs/file_instance_methods'
5
+
6
+ module VirtFS::CamcorderFS # rubocop:disable Style/ClassAndModuleChildren
7
+ class FS
8
+ attr_accessor :mount_point, :name, :root
9
+ attr_reader :recording_path
10
+
11
+ include DirClassMethods
12
+ include DirInstanceMethods
13
+ include FileClassMethods
14
+ include FileInstanceMethods
15
+
16
+ def initialize(recording_path = nil, root = VfsRealFile::SEPARATOR)
17
+ @mount_point = nil
18
+ @name = self.class.name
19
+ @root = root
20
+
21
+ if recording_path.nil?
22
+ @cc_delegate = CcDelegate.new
23
+ else
24
+ start_recorder(recording_path)
25
+ end
26
+ end
27
+
28
+ def start_recorder(recording_path)
29
+ @recording_path = recording_path
30
+ @recorder = Camcorder::Recorder.new(@recording_path)
31
+
32
+ @cc_delegate = Camcorder.proxy_class(CcDelegate, @recorder) do
33
+ #
34
+ # Dir class methods.
35
+ #
36
+ methods_with_side_effects :dir_chdir, :dir_delete, :dir_mkdir, :dir_new
37
+
38
+ #
39
+ # Dir instance methods.
40
+ #
41
+ methods_with_side_effects :dir_i_close, :dir_i_each
42
+
43
+ #
44
+ # File class methods.
45
+ #
46
+ methods_with_side_effects :file_atime, :file_chmod, :file_chown, :file_ctime,
47
+ :file_delete, :file_lchmod, :file_lchown, :file_link,
48
+ :file_lstat, :file_mtime, :file_new, :file_rename,
49
+ :file_stat, :file_symlink?, :file_symlink, :file_truncate,
50
+ :file_utime
51
+
52
+ #
53
+ # File instance methods.
54
+ #
55
+ methods_with_side_effects :file_i_atime, :file_i_chmod, :file_i_chown,
56
+ :file_i_ctime, :file_i_flock, :file_i_lstat,
57
+ :file_i_mtime, :file_i_truncate, :file_i_close,
58
+ :file_i_close_on_exec=, :file_i_close_read, :file_i_close_write,
59
+ :file_i_fcntl, :file_i_ioctl, :file_i_raw_read,
60
+ :file_i_raw_write, :file_i_readpartial, :file_i_read_nonblock,
61
+ :file_i_write_nonblock
62
+ end.new
63
+
64
+ @recorder.start
65
+ end
66
+
67
+ def thin_interface?
68
+ true
69
+ end
70
+
71
+ def umount
72
+ @recorder.commit unless @recorder.nil?
73
+ @mount_point = nil
74
+ end
75
+
76
+ def apply_root(path)
77
+ VfsRealFile.join(@root, path)
78
+ end
79
+ private :apply_root
80
+
81
+ def ccd_call(method, *args)
82
+ @cc_delegate.send(method, *args)
83
+ rescue SystemCallError => scerr
84
+ #
85
+ # The errno is lost when the exception is YAML.dump'd but the
86
+ # sub-class is correct. We get the errno from the sub-class
87
+ # and instantiate a new exception to raise.
88
+ #
89
+ # Passing the whole message from the original exception isn't
90
+ # the right thing to do. We need to find a way to extract the
91
+ # target name from the original message.
92
+ #
93
+ raise SystemCallError.new(scerr.message, scerr.class::Errno)
94
+ rescue
95
+ raise
96
+ end
97
+ private :ccd_call
98
+
99
+ def return_enum(array, block, rv = nil)
100
+ return array.each if block.nil? # return Enumerator.
101
+ array.each(&block)
102
+ rv
103
+ end
104
+ private :return_enum
105
+ end
106
+ end