1#compdef cdrdao
2
3# TODO: Options must come before parameters.
4
5# Command completion and main loop {{{1
6
7_cdrdao () {
8  local ret=1
9  local -a commands
10  if (( CURRENT == 2 )); then
11    commands=( ${${${(M)${(f)"$(_call_program subcommands cdrdao 2>&1)"}:#  *}// #- /:}#??} )
12    _describe -t subcommands 'cdrdao command' commands && ret=0
13  else
14    local cmd="${words[2]}"
15    local curcontext="${curcontext%:*:*}:cdrdao-$cmd:"
16    shift words
17    (( CURRENT-- ))
18    if ! _call_function ret _cdrdao-$cmd; then
19      _default && ret=0
20    fi
21  fi
22
23  return ret
24}
25
26# Common arguments {{{1
27
28declare -ga _cdrdao_tmpfile_args
29_cdrdao_tmpfile_args=(
30  '--tmpdir[directory to store temporary data in]:directory:_directories'
31  '--keep[do not remove temporary data when done]'
32)
33
34# TODO: Gah!  Fix a cddb server spec matcher
35declare -ga _cdrdao_cddb_args
36_cdrdao_cddb_args=(
37  '--cddb-servers[specify list of CDDB servers to use]:CDDB servers:'
38  '--cddb-timeout[specify timeout in seconds for connections to CDDB servers]: :_guard "[[\:digit\:]]" timeout'
39  '--cddb-directory[directory where fetched CDDB records will be stored]:directory:_directories'
40)
41
42declare -g _cdrdao_paranoiamode_arg
43_cdrdao_paranoiamode_arg='--paranoia-mode[set correction mode for digital audio extraction]:mode:(("0\:no checking" "1\:perform overlapped reading to avoid jitter" "2\:like 1 but with checks of read audio data" "3\:like 2 but with scratch detection/repair (default)"))'
44
45declare -g _cdrdao_fasttoc_arg
46_cdrdao_fasttoc_arg='--fast-toc[skip pre-gap-length and index-mark extraction]'
47
48declare -g _cdrdao_swap_arg
49_cdrdao_swap_arg='--swap[swap the byte order of samples]'
50
51declare -g _cdrdao_reload_arg
52_cdrdao_reload_arg='--reload[reload the disk if necessary]'
53
54declare -g _cdrdao_eject_arg
55_cdrdao_eject_arg='--eject[eject CD after completed operation]'
56
57declare -g _cdrdao_speed_arg
58_cdrdao_speed_arg='-speed[set writing speed]: :_guard "[[\:digit\:]]##" speed'
59
60declare -ga _cdrdao_common_args
61_cdrdao_common_args=(
62  '(*)'{-h,--help}'[display command/option summary]'
63  '-v[set verbosity level]: :_guard "[[\:digit\:]]##" verbosity')
64
65declare -ga _cdrdao_common_toc_args
66_cdrdao_common_toc_args=(
67  $_cdrdao_common_args
68  ':TOC file:_files -g "*.toc(-.)"')
69
70declare -ga _cdrdao_common_device_args
71_cdrdao_common_device_args=(
72  $_cdrdao_common_args
73  '--device[set SCSI address of the CD recorder]:device:__cdrdao-device'
74  '--driver[use given driver for the CD recorder]:driver:__cdrdao-drivers'
75)
76
77declare -ga _cdrdao_common_toc_device_args
78_cdrdao_common_toc_device_args=(
79  $_cdrdao_common_toc_args
80  $_cdrdao_common_device_args
81  '--force[force execution of operation]'
82)
83
84declare -ga _cdrdao_common_read_args
85_cdrdao_common_read_args=(
86  '--rspeed[set reading speed]: :_guard "[[\:digit\:]]##" speed'
87  '--session[specify what session to process on multi-session CDs]: :_guard "[[\:digit\:]]##" "session number"'
88  '--read-subchan[set sub-channel reading-mode]:mode:(("rw\:de-interleaved and error corrected" "rw_raw\:not de-interleaved, not error-corrected, and L-EC data included"))'
89  '--tao-source[indicate that source CD was written in TAO mode]'
90  '--with-cddb[retrieve CD-TEXT data from a CDDB server]')
91
92# Sub-command completion {{{1
93
94_cdrdao-show-toc () {
95  __cdrdao-show-toc-or-toc-info-or-toc-size
96}
97
98_cdrdao-toc-info () {
99  __cdrdao-show-toc-or-toc-info-or-toc-size
100}
101
102_cdrdao-toc-size () {
103  __cdrdao-show-toc-or-toc-info-or-toc-size
104}
105
106__cdrdao-show-toc-or-toc-info-or-toc-size () {
107  _arguments \
108    $_cdrdao_common_toc_args \
109    $_cdrdao_tmpfile_args
110}
111
112_cdrdao-read-toc () {
113  __cdrdao-read-toc-or-read-cd $_cdrdao_cddb_args
114}
115
116_cdrdao-read-cd () {
117  __cdrdao-read-toc-or-read-cd \
118    $_cdrdao_paranoiamode_arg \
119    $_cdrdao_cddb_args
120}
121
122__cdrdao-read-toc-or-read-cd () {
123  local -a dependent_args
124
125  __cdrdao-read-toc-or-read-cd-or-copy-dependent-args
126
127  _arguments \
128    $_cdrdao_common_toc_device_args \
129    $_cdrdao_common_read_args \
130    $dependent_args \
131    $_cdrdao_fasttoc_arg \
132    '--datafile[set name of data file placed in TOC file]:file:_files' \
133    '--read-raw[read data in raw format from CD]' \
134    '--no-mode2-mixed[if MODE2_FORM1 or MODE2_FORM2, do not extract as MODE2_FORM_MIX]' \
135    "$@" && ret=0
136}
137
138_cdrdao-read-cddb () {
139  _arguments \
140    $_cdrdao_common_toc_args \
141    $_cdrdao_cddb_args
142}
143
144_cdrdao-show-data () {
145  _arguments \
146    $_cdrdao_common_toc_args \
147    $_cdrdao_swap_arg
148}
149
150_cdrdao-read-test () {
151  _arguments \
152    $_cdrdao_common_toc_args
153}
154
155_cdrdao-disk-info () {
156  __cdrdao-disk-info-or-drive-info
157}
158
159__cdrdao-disk-info-or-drive-info () {
160  _arguments \
161    $_cdrdao_common_device_args
162}
163
164_cdrdao-discid() {
165  _arguments $_cdrdao_common_device_args $_cdrdao_cddb_args \
166    '--query-string[print out CDDB query only]'
167}
168
169_cdrdao-msinfo () {
170  _arguments \
171    $_cdrdao_common_device_args \
172    $_cdrdao_reload_arg
173}
174
175_cdrdao-drive-info () {
176  __cdrdao-disk-info-or-drive-info
177}
178
179_cdrdao-unlock () {
180  _arguments \
181    $_cdrdao_common_device_args \
182    $_cdrdao_reload_arg \
183    $_cdrdao_eject_arg
184}
185
186_cdrdao-blank () {
187  _arguments \
188    $_cdrdao_common_device_args \
189    $_cdrdao_speed_arg \
190    '--blank-mode[set the blanking mode]:blanking mode:(("full\:completely erase data" "minimal\:only dereference data"))' \
191    $_cdrdao_eject_arg
192}
193
194_cdrdao-scanbus () {
195  _arguments \
196    $_cdrdao_common_args
197}
198
199_cdrdao-simulate () {
200  __cdrdao-simulate-or-write
201}
202
203__cdrdao-simulate-or-write () {
204  local _cdrdao_capacity_arg=
205
206  if (( $words[(I)--full-burn] )); then
207    _cdrdao_capacity_arg='--capacity[set disk capacity for --full-burn]: :_guard "[[\:digit\:]]" minutes'
208  fi
209
210  _arguments \
211    $_cdrdao_common_toc_device_args \
212    $_cdrdao_speed_arg \
213    '--multi[do not close the session after successful write]' \
214    '--overburn[allow overburning of medium]' \
215    '--full-burn[force burning to the outer disk edge]' \
216    $_cdrdao_capacity_arg \
217    $_cdrdao_eject_arg \
218    $_cdrdao_swap_arg \
219    '--buffers[set fifo buffer size]: :_guard "[[\:digit\:]]" size' \
220    $_cdrdao_reload_arg \
221    $_cdrdao_tmpfile_args \
222    '-n[do not pause before writing]' \
223    $*
224}
225
226_cdrdao-write () {
227  __cdrdao-simulate-or-write \
228    '--simulate[only perform a write simulation]' \
229    '--buffer-under-run-protection[whether to use buffer under-run protection]:buffer under-run protection setting:(("0\:disable buffer under-run protection" "1\:enable buffer under-run protection"))' \
230    '--write-speed-control[whether to use writing-speed control]:writing-speed control setting:(("0\:disable writing-speed control" "1\:enable writing-speed control"))' \
231    $*
232}
233
234__cdrdao-read-toc-or-read-cd-or-copy-dependent-args () {
235  if (( words[(I)--tao-source] )); then
236    dependent_args+='--tao-source-adjust[specify number of link blocks for tracks written in TAO mode]: :_guard "[[\:digit\:]]##" "link blocks"'
237  fi
238
239  if (( words[(I)--with-cddb] )); then
240    dependent_args+=$_cdrdao_cddb_args
241  fi
242}
243
244_cdrdao-copy () {
245  local -a dependent_args
246
247  __cdrdao-read-toc-or-read-cd-or-copy-dependent-args
248
249  _cdrdao-write \
250    $dependent_args \
251    $_cdrdao_common_read_args \
252    '--source-device[set SCSI address of the CD reader]:device:__cdrdao-device' \
253    '--source-driver[use given driver for the CD reader]:driver:__cdrdao-drivers' \
254    '--on-the-fly[perform on-the-fly copy of CD (no image created)]' \
255    $_cdrdao_fasttoc_arg \
256    '--keepimage[do not remove generated image when done]' \
257    $_cdrdao_paranoiamode_arg
258}
259
260# Type completion {{{1
261
262__cdrdao-device () {
263  # Use cdrdao scanbus and also check what OS we're running under and provide
264  # additional stuff, like devices (/dev/sg0)
265  local -a expl devices
266  devices=(${${(f)"$(_call_program devices cdrdao scanbus -v 0 2>&1)"}%% :*})
267
268  _wanted devices expl 'device' compadd -a devices
269}
270
271__cdrdao-drivers () {
272  local expl suf
273  local -Ua drivers
274  drivers=(${(f)"$(_call_program drivers cut -d'\|' -f4 /usr/share/cdrdao/drivers -s)"})
275  if compset -P \*:; then
276    _message -e options option
277  else
278    compset -S :\* || suf=-qS:
279    _wanted drivers expl 'driver' compadd $suf -a drivers
280  fi
281}
282
283# }}}1
284
285_cdrdao
286