1 /**
2  * Copyright (C) 2009
3  *	- Salvatore Santagati <salvatore.santagati@gmail.com>
4  *	- Abdur Rab <c.abdur@yahoo.com>
5  *
6  * All rights reserved.
7  *
8  * This program is free software; under the terms of the
9  * GNU General Public License as published by the Free Software Foundation;
10  * either version 2 of the License, or (at your option) any later version.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions are
14  * met:
15  *
16  * @ Redistributions of source code must retain the above copyright
17  *   notice, this list of conditions and the following disclaimer.
18  *
19  * @ Redistributions in binary form must reproduce the above copyright
20  *   notice, this list of conditions and the following disclaimer in
21  *   the documentation and/or other materials provided with the
22  *   distribution.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  *
36  * You should have received a copy of the GNU General Public License
37  * along with this program; if not, write to the
38  * Free Software Foundation, Inc.,
39  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
40  */
41 
42 #ifndef MKTOC_H
43 #include "mktoc.h"
44 #endif
45 
46 /* --- @print_toc_time@ --- *
47  *
48  * Arguments:   @file_ptrs *fptrs@ = input file
49  * 		@struct_toc *toc@ =  pointer struct of toc
50  *
51  *
52  * Returns:	---
53  *
54  * Use:	 	print time of image.
55  */
print_toc_time(file_ptrs * fptrs,struct_toc * toc)56 void print_toc_time ( file_ptrs* fptrs, struct_toc *toc )
57 {
58 	fprintf ( fptrs->fdesc, " %02d:%02d:%02d", toc->minute ,  toc->second-2, toc->frame );
59 }
60 
61 /* --- @print_toc_mode@ --- *
62  *
63  * Arguments:   @file_ptrs *fptrs@ = input file
64  *		@struct_toc *toc@ = pointer struct of toc
65  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
66  *
67  *
68  * Returns:	---
69  *
70  * Use:         read first block of image and  print type of mode.
71  */
print_toc_mode(file_ptrs * fptrs,struct_toc * toc,image_struct * img_struct)72 void print_toc_mode ( file_ptrs* fptrs, struct_toc* toc, image_struct* img_struct )
73 {
74 	switch ( ( img_struct-> block ) ) {
75 		case 2048:
76 		case 2368:
77 			fprintf ( fptrs->fdesc, "\n" );
78 			break;
79 		case 2336:
80 			fprintf ( fptrs->fdesc, "_FORM_MIX\n");
81 			break;
82 		case 2352:
83 			fprintf ( fptrs->fdesc, "_RAW\n" );
84 			break;
85 		case 2448:
86 			fprintf ( fptrs->fdesc, "_RAW RW_RAW\n");
87 			break;
88 		default:
89 			break;
90 	}
91 
92 }
93 
94 /* --- @print_toc_datafile@ --- *
95  *
96  * Arguments:   @file_ptrs *fptrs@ = input file
97  *		@char *file_input@  =  name of input file
98  *
99  *
100  * Returns:     ---
101  *
102  * Use:         print name of datafile.
103  */
print_toc_datafile(file_ptrs * fptrs,char * file_input)104 void print_toc_datafile ( file_ptrs* fptrs, char* file_input )
105 {
106 	fprintf ( fptrs->fdesc, "DATAFILE \"%s\"", file_input );
107 }
108 
109 /* --- @print_toc_track@ --- *
110  *
111  * Arguments:   @file_ptrs *fptrs@ = input file
112  *		@struct_toc *toc@ = pointer struct of toc
113  *
114  *
115  * Returns:     ---
116  *
117  * Use:         print track of image.
118  */
print_toc_track(file_ptrs * fptrs,struct_toc * toc)119 void print_toc_track ( file_ptrs* fptrs, struct_toc* toc )
120 {
121 	fprintf( fptrs->fdesc, "TRACK MODE%d", toc->mode  );
122 }
123 
124 
125 /* --- @print_toc_vcd_time@ --- *
126  *
127  * Arguments:   @file_ptrs *fptrs@ = input file
128  *		@struct_toc *toc@ = pointer struct of toc
129  *		@image_struct *img_struct@ = pointer struct of type image and pregap of image
130  * 		@off_t l_loop@ = length of track;
131  *		@off_t loop_last@ = loop end last track;
132  *
133  *
134  * Returns:     ---
135  *
136  * Use:         print time of track.
137  */
138 
print_toc_vcd_time(file_ptrs * fptrs,struct_toc * toc,image_struct * img_struct,off_t l_loop,off_t loop_last)139 void print_toc_vcd_time ( file_ptrs* fptrs, struct_toc* toc, image_struct* img_struct,
140 				off_t l_loop, off_t loop_last)
141 {
142 	msf_mode_block		msf_block;
143 
144 	if ( ( loop_last * img_struct-> block ) > 0 )
145 		fprintf ( fptrs-> fdesc , "\t#%d",  ( loop_last * img_struct->block ) );
146 
147 	lba2msf (  l_loop, &msf_block );
148 
149 	toc->frame =  ( *( msf_block.frame ) ) ;
150 	toc->second = ( *(  msf_block.second ) );
151 	toc->minute = ( *( msf_block.minute ) );
152 
153 	print_toc_time ( fptrs, toc );
154 
155 	fprintf ( fptrs->fdesc, " // length in bytes: %d\n", ( l_loop * img_struct->block ) );
156 
157 }
158 
159 /* --- @toc_first_track@ --- *
160  *
161  * Arguments:   @file_ptrs *fptrs@ = input file
162  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
163  *		@char *file_input@  =  name of input file
164  *		@struct_toc *toc@ = pointer struct of cuesheet
165  *
166  * Returns:     ---
167  *
168  * Use:         detect track of image.
169  */
toc_first_track(file_ptrs * fptrs,image_struct * img_struct,char * file_input,struct_toc * toc)170 void toc_first_track ( file_ptrs* fptrs, image_struct* img_struct, char *file_input, struct_toc* toc )
171 {
172 	off_t lba = 0;
173 
174 	msf_mode_block msf_block;
175 
176 	/* inizialization first track */
177 	toc->mode = is_mode ( fptrs, img_struct );
178 	toc->block = img_struct->block;
179 
180 	toc->track = 1;
181 /*	toc->index = 1; */
182 
183 	fprintf ( fptrs->fdesc, "// TRACK %d\n", toc->track );
184 
185 	print_toc_track ( fptrs, toc );
186 
187 	print_toc_mode ( fptrs, toc, img_struct );
188 
189 	print_toc_datafile ( fptrs, file_input );
190 
191 }
192 /* --- @create_raw_toc@ --- *
193  *
194  * Arguments:   @file_ptrs *fptrs@ = input file
195  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
196  *		@char *file_input@  = name of input file
197  *
198  *
199  *
200  * Returns:     ---
201  *
202  * Use:         generate a toc for raw image.
203  */
create_raw_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)204 void create_raw_toc  ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
205 {
206 	struct_toc toc;
207 
208 	toc_first_track  ( fptrs, img_struct, file_input, &toc );
209 
210 }
211 
212 /* --- @create_iso_toc@ --- *
213  *
214  * Arguments:   @file_ptrs *fptrs@ = input file
215  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
216  *		@char *file_input@  = name of input file
217  *
218  *
219  *
220  * Returns:     ---
221  *
222  * Use:         generate a cuesheet for iso/udf image.
223  */
create_iso_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)224 void create_iso_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
225 {
226 	struct_toc toc;
227 
228 	toc_first_track ( fptrs, img_struct, file_input, &toc );
229 
230 }
231 /* --- @create_vcd_toc@ --- *
232  *
233  * Arguments:   @file_ptrs *fptrs @ = input file
234  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
235  *		@char *file_input@  = name of input file
236  *
237  *
238  * Returns:     Zeor on success, @-1@ on error.
239  *
240  * Use:         generate a TOC file for vcd.
241  */
create_vcd_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)242 int create_vcd_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
243 {
244 	off_t n_loop;
245 	off_t loop_cur = 0;
246 	off_t loop_last = 0;
247 	off_t l_loop;
248 	off_t n_img_size;
249 
250 	struct_toc 		toc;
251 	msf_mode_block		msf_block;
252 
253 	if ( ( n_img_size = get_file_size ( fptrs -> fsource ) ) < 1 ) return ( -1 ); /* The image file is empty */
254 
255 	toc_first_track  ( fptrs, img_struct, file_input, &toc );
256 
257 	n_loop = img_struct->pregap ;
258 
259 	while ( n_loop <  n_img_size ) {
260 
261 		progress_bar ( ( int ) ( ( ( n_loop + 1 ) * 100 ) / n_img_size ) );
262 
263 		if ( track_vcd ( fptrs, img_struct, &toc, n_loop ) == AOK ) {
264 
265 			toc.track++;
266 
267 			l_loop  = loop_cur - loop_last;
268 
269 			print_toc_vcd_time  ( fptrs, &toc, img_struct, l_loop, loop_last);
270 
271 			fprintf ( fptrs->fdesc, "// TRACK %d\n", toc.track );
272 
273 			print_toc_track ( fptrs, &toc );
274 
275 			print_toc_mode ( fptrs, &toc, img_struct );
276 
277 			print_toc_datafile ( fptrs, file_input );
278 
279 			loop_last = loop_cur;
280 
281 		}
282 
283 
284 		loop_cur++;
285 
286 		n_loop += img_struct->block;
287 
288 	}
289 
290 	l_loop = loop_cur - loop_last;
291 
292 	print_toc_vcd_time  ( fptrs, &toc, img_struct, l_loop, loop_last);
293 
294 	progress_bar ( 100 );
295 
296 	return ( 0 );
297 }
298 
299 /* --- @create_toc@ --- *
300  *
301  * Arguments:   @file_ptrs *fptrs @ = input file
302  * 		@image_struct *img_struct@ = pointer struct of type image and pregap of image
303  *		@char *file_input@  = name of input file
304  *
305  *
306  * Returns:     Zeor on success, @-1@ on error.
307  *
308  * Use:         Get info from file for generate a TOC file descriptor.
309  */
create_toc(file_ptrs * fptrs,image_struct * img_struct,char * file_input)310 int create_toc ( file_ptrs* fptrs, image_struct* img_struct, char *file_input )
311 {
312 	int     n_return_value = AOK;
313 
314 	fprintf( fptrs->fdesc, "// Generated with %s v%s\n", PACKAGE_NAME, VERSION );
315 
316 
317 
318 	switch (  img_struct->type  )	{
319 		case IMG_AUDIO:
320 			fprintf ( fptrs->fdesc, "CD_DA\n" );
321 			printf ("Need implementation\n");
322 			break;
323 		case IMG_ISO:
324 			fprintf ( fptrs->fdesc, "CD_ROM\n" );
325 			create_iso_toc ( fptrs, img_struct, file_input );
326 			break;
327 		case IMG_RAW:
328 			fprintf ( fptrs->fdesc, "CD_ROM\n" );
329 			create_raw_toc ( fptrs, img_struct, file_input );
330 			break;
331 		case IMG_VCD: case 9  : case 10 :
332 			fprintf ( fptrs->fdesc, "CD_ROM_XA\n");
333 			create_vcd_toc ( fptrs, img_struct, file_input );
334 			break;
335 		default :
336 			n_return_value = ERROR;
337 			break;
338 	}
339 	return ( n_return_value );
340 }
341 
342 
343