# xisofs v1.3 Perl/Tk Interface to mkisofs / cdwrite # Copyright (c) 1997 Steve Sherwood (pariah@netcomuk.co.uk) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. package cdwrite; use wcenter; use dlg; use status; #--------------------------------- # Set the options for writing a CD #--------------------------------- sub set_options { my ($parent) = @_; my $text; $parent->Busy; my $popup = $parent->Toplevel; $popup->title("CDR Options"); $popup->configure(-background => 'grey80'); $cdwrite::top = $popup; wcenter::offset($popup,155,114); $popup->Label( -font => '-adobe-times-*-*-*-*-18-*-*-*-*-*-*-*', -background => 'grey80', -foreground => 'red4', -text => 'CDR Options', -wraplength => '5.0i')->pack( -padx => 5, -pady => 5, -side => 'top'); my $topFrame = $popup->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey80')->pack( -padx => 10, -side => 'top', -fill => 'both'); #------------------ # The writing speed #------------------ my $topLeftFrame = $topFrame->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey80')->pack( -padx => 10, -side => 'left', -fill => 'both'); $topLeftFrame->Label( -background => 'grey80', -foreground => 'red4', -text => 'Writing Speed')->pack( -padx => 5, -pady => 5, -side => 'top'); my $writingSpeedFrame = $topLeftFrame->Frame( -relief => 'sunken', -borderwidth => 1, -background => 'grey70')->pack( -padx => 5, -side => 'top', -fill => 'both'); my $writingInnerFrame = $writingSpeedFrame->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey70')->pack( -padx => 5, -pady => 5, -side => 'top', -fill => 'both'); $writingInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -highlightthickness => 0, -variable => \$main::dataField{'writingspeed'}, -background => 'grey70', -activebackground => 'grey70', -value => 1, -text => '1x')->pack( -side => 'top'); $popup->bind('' => sub { $main::dataField{'writingspeed'} = 1; }); $writingInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'writingspeed'}, -background => 'grey70', -value => 2, -text => '2x')->pack( -side => 'top'); $popup->bind('' => sub { $main::dataField{'writingspeed'} = 2; }); $writingInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'writingspeed'}, -background => 'grey70', -value => 4, -text => '4x')->pack( -side => 'top'); $popup->bind('' => sub { $main::dataField{'writingspeed'} = 4; }); $writingInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'writingspeed'}, -background => 'grey70', -value => 6, -text => '6x')->pack( -side => 'top'); $popup->bind('' => sub { $main::dataField{'writingspeed'} = 6; }); $writingInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'writingspeed'}, -background => 'grey70', -value => 8, -text => '8x')->pack( -side => 'top'); $popup->bind('' => sub { $main::dataField{'writingspeed'} = 8; }); #------------------ # The writing speed #------------------ my $topRightFrame = $topFrame->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey80')->pack( -padx => 10, -side => 'right', -fill => 'both'); $topRightFrame->Label( -background => 'grey80', -foreground => 'red4', -text => 'Device Type')->pack( -padx => 5, -pady => 5, -side => 'top'); my $deviceTypeFrame = $topRightFrame->Frame( -relief => 'sunken', -borderwidth => 1, -background => 'grey70')->pack( -padx => 5, -side => 'top', -fill => 'both'); my $deviceInnerFrame = $deviceTypeFrame->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey70')->pack( -padx => 5, -pady => 5, -side => 'top', -fill => 'both'); $cdwrite::rt[0] = $deviceInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'devicetype'}, -background => 'grey70', -value => 'philips', -text => 'Philips')->pack( -anchor => 'w', -side => 'top'); $popup->bind('' => sub { $main::dataField{'devicetype'} = 'philips'; }); $cdwrite::rt[1] = $deviceInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'devicetype'}, -background => 'grey70', -value => 'ims', -text => 'Ims')->pack( -anchor => 'w', -side => 'top'); $popup->bind('' => sub { $main::dataField{'devicetype'} = 'ims'; }); $cdwrite::rt[2] = $deviceInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'devicetype'}, -background => 'grey70', -value => 'kodak', -text => 'Kodak')->pack( -anchor => 'w', -side => 'top'); $popup->bind('' => sub { $main::dataField{'devicetype'} = 'kodak'; }); $cdwrite::rt[3] = $deviceInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'devicetype'}, -background => 'grey70', -value => 'yamaha', -text => 'Yamaha')->pack( -anchor => 'w', -side => 'top'); $popup->bind('' => sub { $main::dataField{'devicetype'} = 'yamaha'; }); $cdwrite::rt[4] = $deviceInnerFrame->Radiobutton( -command => sub{save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'devicetype'}, -background => 'grey70', -value => 'hp', -text => 'Hewlet Packard')->pack( -anchor => 'w', -side => 'top'); $popup->bind('' => sub { $main::dataField{'devicetype'} = 'hp'; }); #------------------------ # use cdwrite or cdrecord #------------------------ my $cdrecFrame = $popup->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey80')->pack( -padx => 15, -side => 'top', -fill => 'x'); $cdrecFrame->Label( -background => 'grey80', -foreground => 'red4', -text => 'CDR Program')->pack( -padx => 5, -pady => 5, -side => 'top'); my $cdInnerFrame = $cdrecFrame->Frame( -relief => 'sunken', -borderwidth => 1, -background => 'grey70')->pack( -padx => 5, -side => 'top', -fill => 'both'); my $usecdwrite = $cdInnerFrame->Radiobutton( -command => sub{ my $i; for ($i=0; $i<5; $i++) { $cdwrite::rt[$i]->configure(-state => 'normal'); } $cdwrite::deviceLabel->configure( -text => 'Device Path (eg /dev/cdwriter)'); save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'use_program'}, -background => 'grey70', -value => 'cdwrite', -text => 'Use cdwrite')->pack( -padx => 10, -side => 'left'); my $usecdrecord = $cdInnerFrame->Radiobutton( -command => sub{ my $i; for ($i=0; $i<5; $i++) { $cdwrite::rt[$i]->configure(-state => 'disabled'); } $cdwrite::deviceLabel->configure( -text => 'Device SCSI ID,LUN (eg 2,0)'); save_as_on()}, -underline => 0, -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'use_program'}, -background => 'grey70', -value => 'cdrecord', -text => 'Use cdrecord')->pack( -padx => 10, -side => 'right'); $usecdwrite->configure(-state => 'disabled') unless ($cdwrite::cdwrite); $usecdrecord->configure(-state => 'disabled') unless ($cdwrite::cdrecord); $main::dataField{'use_program'} = 'cdwrite' if (($cdwrite::cdwrite)&&(!$cdwrite::cdrecord)); $main::dataField{'use_program'} = 'cdrecord' if ((!$cdwrite::cdwrite)&&($cdwrite::cdrecord)); if ($main::dataField{'use_program'} eq 'cdrecord') { my $i; for ($i=0; $i<5; $i++) { $cdwrite::rt[$i]->configure(-state => 'disabled'); } } #------------ # Device Name #------------ $cdwrite::deviceLabel = $popup->Label( -background => 'grey80', -foreground => 'red4', -text => 'Device Name')->pack( -padx => 5, -pady => 5, -side => 'top'); my $popEntry = $popup->Entry( -relief => 'sunken', -borderwidth => 2, -width => 40, -highlightthickness => 0, -textvariable => \$main::dataField{'devicename'}, -background => 'PapayaWhip')->pack( -side => 'top', -padx => 10); $popEntry->bind('' => sub {save_as_on()}); if ($main::dataField{'use_program'} eq 'cdwrite') { my $i; for ($i=0; $i<5; $i++) { $cdwrite::rt[$i]->configure(-state => 'disabled'); } $cdwrite::deviceLabel->configure( -text => 'Device Path (eg /dev/cdwriter)'); } else { $cdwrite::deviceLabel->configure( -text => 'Device SCSI ID,LUN (eg 2,0)'); } #------------------- # Command Buttons #------------------- my $buttonBar = $popup->Frame->pack( -side => 'top', -pady => 5); $buttonBar->Button( -command => sub{ destroy $popup }, -borderwidth => 1, -text => 'Dismiss', -underline => 0, -background => 'grey80', -activebackground => 'grey80', -highlightthickness => 0)->pack( -pady => 5, -side => 'left'); $cdwrite::saveas = $buttonBar->Button( -command => sub{copy_defs()}, -borderwidth => 1, -state => 'disabled', -text => 'Save As Default', -background => 'grey80', -underline => 0, -activebackground => 'grey80', -highlightthickness => 0)->pack( -pady => 5, -padx => 5, -side => 'left'); $popup->bind('' => sub { destroy $popup; }); $popup->bind('' => ''); $parent->Unbusy; } sub copy_defs { $defaults::item{'writingspeed'} = $main::dataField{'writingspeed'}; $defaults::item{'devicetype'} = $main::dataField{'devicetype'}; $defaults::item{'devicename'} = $main::dataField{'devicename'}; $defaults::item{'use_program'} = $main::dataField{'use_program'}; defaults::save(); save_as_off(); } sub save_as_on { $cdwrite::saveas->configure(-state => 'normal'); $cdwrite::top->bind('' => sub {copy_defs()}); $main::changed = 1; main::set_title(); } sub save_as_off { $cdwrite::saveas->configure(-state => 'disabled'); $cdwrite::top->bind('' => ''); } #------------------------------- # Create the pre-write cd window #------------------------------- sub write_image { my ($parent) = @_; my $text; $parent->Busy; my $popup = $parent->Toplevel; $popup->title("Write CDROM"); $popup->configure(-background => 'grey80'); $cdwrite::top = $popup; wcenter::offset($popup,110,156); $popup->Label( -font => '-adobe-times-*-*-*-*-18-*-*-*-*-*-*-*', -background => 'grey80', -foreground => 'red4', -text => 'Write CDROM', -wraplength => '5.0i')->pack( -padx => 5, -pady => 5, -side => 'top'); my $outerFrame = $popup->Frame( -relief => 'flat', -borderwidth => 0, -background => 'grey80')->pack( -padx => 10, -pady => 10, -side => 'top', -expand => 'yes', -fill => 'both'); my $popFrame = $outerFrame->Frame( -relief => 'sunken', -borderwidth => 1, -background => 'grey70')->pack( -side => 'top', -expand => 'yes', -fill => 'both'); # The cdrom image my $imageFrame = $popFrame->Frame( -background => 'grey70')->pack( -side => 'top', -fill => 'x'); my $imageLabel = $imageFrame->Label( -text => 'CDROM Image', -background => 'grey70')->pack( -padx => 5, -side => 'left'); $imageLabel->bind('' => sub { help::display($parent, 'help23'); }); my $imageEntry = $imageFrame->Entry( -relief => 'sunken', -borderwidth => 2, -width => 40, -highlightthickness => 0, -background => 'PapayaWhip')->pack( -padx => 5, -pady => 2, -side => 'right'); $imageEntry->insert('end',$main::dataField{'destpath'}); # Options $popFrame->Checkbutton( -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'simulate'}, -background => 'grey70', -text => 'Simulate Recording')->pack( -anchor => 'w', -padx => 5, -side => 'top'); $popFrame->Checkbutton( -activebackground => 'grey70', -highlightthickness => 0, -variable => \$main::dataField{'eject'}, -background => 'grey70', -text => 'Eject After Writing')->pack( -anchor => 'w', -padx => 5, -side => 'top'); #------------------- # Command Buttons #------------------- my $buttonBar = $popup->Frame->pack( -side => 'top', -pady => 5); $buttonBar->Button( -command => sub{ write_cdrom(get $imageEntry); destroy $popup; }, -borderwidth => 1, -text => 'Write CD', -background => 'grey80', -underline => 0, -activebackground => 'grey80', -highlightthickness => 0)->pack( -pady => 5, -padx => 5, -side => 'left'); $buttonBar->Button( -command => sub{ destroy $popup }, -borderwidth => 1, -text => 'Cancel', -underline => 0, -background => 'grey80', -activebackground => 'grey80', -highlightthickness => 0)->pack( -pady => 5, -side => 'left'); $popup->bind('' => sub { write_cdrom(get $imageEntry); destroy $popup; }); $popup->bind('' => sub { destroy $popup; }); $parent->Unbusy; } sub write_cdrom { my ($src) = @_; my $cmdline; if ($main::dataField{'use_program'} eq '') { dlg::error($cdwrite::top, 'No CD Writer program has been specified. Use CDR Options to select','Error'); return; } if ($main::dataField{'use_program'} eq 'cdwrite') { $cmdline = 'cdwrite --verbose'; unless ($cdwrite::cdwrite) { dlg::error($cdwrite::top, 'cdwrite cannot be found on the path','Error'); return; } } else { $cmdline = 'cdrecord -v'; unless ($cdwrite::cdrecord) { dlg::error($cdwrite::top, 'cdrecord cannot be found on the path','Error'); return; } } if (length($src) == 0) { dlg::error($cdwrite::top,'A CDROM image path must be specified','Error'); return; } unless(-r $src) { dlg::error($cdwrite::top,"$src is not a valid readable image file",'Error'); return; } # sort out command line if ($main::dataField{'use_program'} eq 'cdwrite') { $cmdline = "$cmdline --eject" if ($main::dataField{'eject'} == 1); $cmdline = "$cmdline --dummy" if ($main::dataField{'simulate'} == 1); $cmdline = "$cmdline --speed " . $main::dataField{'writingspeed'} . " --device " . $main::dataField{'devicename'} . " --" . $main::dataField{'devicetype'}; $cmdline = "$cmdline $src"; } else { $cmdline = "$cmdline -dummy" if ($main::dataField{'simulate'} == 1); $cmdline = "$cmdline -eject" if ($main::dataField{'eject'} == 1); $cmdline = "$cmdline -speed " . $main::dataField{'writingspeed'}; $cmdline = "$cmdline -dev " . $main::dataField{'devicename'}; $cmdline = "$cmdline $src"; } status::status_window(1,'Writing ISO9660 Image'); status::status_window(3,"Command Line: $cmdline\n"); status::runCommand($cmdline); dlg::error($cdwrite::top,'Write Finished','Information'); status::status_window(4); } sub check_programs { $cdwrite::cdwrite = 0; $cdwrite::cdrecord = 0; my $which = `which cdwrite`; $cdwrite::cdwrite = 1 if (substr($which,0,1) eq '/'); $which = `which cdrecord`; $cdwrite::cdrecord = 1 if (substr($which,0,1) eq '/'); } 1;