2 # Functions for printer drivers as created by redhat 7.1
4 $mf_wrapper = "/usr/share/printconf/mf_wrapper";
5 @overview_files = ( "/usr/share/printconf/foomatic/data/00-overview.foo",
6 "/usr/share/printconf/foomatic/rh-data/00-overview.foo" );
7 $mfomatic = "/usr/share/printconf/foomatic/mfomatic";
8 $ps_wrapper= "/usr/share/printconf/util/mf_postscript_wrapper";
9 $text_filter = "pipe/postscript/ /usr/bin/mpage -b ifdef(`PAGEsize', PAGEsize, Letter) -1 -o -P- -";
10 $default_filter = "cat/text/";
11 $smb_driver = "/usr/share/printconf/smbprint";
13 @paper_sizes = ( 'Letter', 'Legal', 'Executive',
16 # is_windows_driver(path, &printer)
17 # Returns a driver structure if some path is a windows driver
20 local $sd = "$config{'spool_dir'}/$_[1]->{'name'}";
21 if ($_[1]->{'dev'} eq "|$smb_driver" && -r "$sd/script.cfg") {
22 # Looks like a redhat SMB driver
24 &read_env_file("$sd/script.cfg", \%sconfig);
25 $sconfig{'share'} =~ /^\\\\(.*)\\(.*)$/;
26 return { 'server' => $1,
28 'user' => $sconfig{'user'},
29 'pass' => $sconfig{'password'},
30 'workgroup' => $sconfig{'workgroup'},
37 # is_driver(path, &printer)
38 # Returns a structure containing the details of a driver
39 # XXX do we need to support old redhat drivers?
44 'desc' => "$text{'redhat_none'}" };
46 local $sd = "$config{'spool_dir'}/$_[1]->{'name'}";
47 if ($_[0] eq $mf_wrapper && -r "$sd/mf.cfg") {
48 # Looks like a new printconf driver
50 &read_m4_file("$sd/mf.cfg", \%define);
51 if ($define{'PSfilter'} =~
52 /^filter\s+$ps_wrapper.*\s(\S+)-(\d+)\.foo$/) {
57 'paper' => $define{'PAGEsize'},
58 'make' => $define{'MAKE'},
59 'model' => $define{'MODEL'},
60 'desc' => "$define{'MAKE'} $define{'MODEL'}" };
62 elsif ($define{'PSfilter'} =~ /^filter\s+$ps_wrapper\s*$/) {
66 'paper' => $define{'PAGEsize'},
67 'desc' => 'Postscript printer' };
69 elsif ($define{'PSfilter'} eq 'text' &&
70 $define{'TEXTfilter'} eq 'text') {
74 'desc' => 'Text printer' };
78 # Some other kind of driver
84 # read_m4_file(file, &hash)
90 if (/^\s*define\(([A-Za-z0-9\_]+)\s*,\s*`([^']*)'\)/) {
93 elsif (/^\s*define\(([A-Za-z0-9\_]+)\s*,\s*([^\s\)]+)\)/) {
100 # create_windows_driver(&printer, &driver)
101 # Creates a new windows printer driver
102 sub create_windows_driver
104 local $sd = "$config{'spool_dir'}/$_[0]->{'name'}";
106 # Create the config file and driver
108 &read_file("$sd/script.cfg", \%sconfig);
109 $sconfig{'share'} = "\\\\$_[1]->{'server'}\\$_[1]->{'share'}";
110 $sconfig{'hostip'} = $_[1]->{'server'} eq $config{'hostip'} ?
111 $sconfig{'hostip'} : undef;
112 $sconfig{'user'} = $_[1]->{'user'};
113 $sconfig{'password'} = $_[1]->{'pass'};
114 $sconfig{'workgroup'} = $_[1]->{'workgroup'};
118 &open_lock_tempfile(ENV, ">$sd/script.cfg");
119 &print_tempfile(ENV, "share='$sconfig{'share'}'\n");
120 &print_tempfile(ENV, "hostip=$sconfig{'hostip'}\n");
121 &print_tempfile(ENV, "user='$sconfig{'user'}'\n");
122 &print_tempfile(ENV, "password='$sconfig{'password'}'\n");
123 &print_tempfile(ENV, "workgroup='$sconfig{'workgroup'}'\n");
124 &close_tempfile(ENV);
126 # Set the print device
127 $_[0]->{'dev'} = "|$smb_driver";
128 return $_[1]->{'program'};
131 # create_driver(&printer, &driver)
132 # Creates a new local printer driver and returns the path
135 local ($prn, $drv) = @_;
136 if ($drv->{'mode'} == 0) {
139 elsif ($drv->{'mode'} == 2) {
140 return $drv->{'file'};
143 # Create the config file
144 local $sd = "$config{'spool_dir'}/$_[0]->{'name'}";
146 &lock_file("$sd/mf.cfg");
147 if ($drv->{'text'}) {
148 %driver = ( 'MAKE', '',
151 'PAGEsize', $_[1]->{'paper'},
152 'TEXTfilter', 'text',
154 'PCLfilter', 'reject',
155 'PJLfilter', 'reject',
156 'DEFAULTfilter', $default_filter );
158 elsif ($drv->{'postscript'}) {
159 %driver = ( 'MAKE', '',
162 'PAGEsize', $_[1]->{'paper'},
163 'TEXTfilter', $text_filter,
164 'PSfilter', "filter $ps_wrapper ",
167 'DEFAULTfilter', $default_filter );
170 local $base = "$drv->{'driver'}-$drv->{'id'}.foo";
172 foreach $f (@overview_files) {
173 local $d = $f; $d =~ s/\/[^\/]+$//;
174 $path = "$d/$base" if (-r "$d/$base");
176 &system_logged("cp $path $sd");
177 &read_m4_file("$sd/mf.cfg", \%driver);
178 $driver{'MAKE'} = $drv->{'make'};
179 $driver{'MODEL'} = $drv->{'model'};
180 $driver{'COLOR'} = 'true'; # ???
181 $driver{'PSfilter'} = "filter $ps_wrapper --mfomatic -d $base";
182 $driver{'TEXTfilter'} = $text_filter;
183 $driver{'PCLfilter'} = 'cat';
184 $driver{'PJLfilter'} = 'cat';
185 $driver{'PAGEsize'} = $_[1]->{'paper'};
186 $driver{'DEFAULTfilter'} = $default_filter;
188 &open_tempfile(CFG, ">$sd/mf.cfg");
189 foreach $d (keys %driver) {
190 if ($driver{$d} =~ /`|'/) {
191 &print_tempfile(CFG, "define($d, $driver{$d})dnl\n");
194 &print_tempfile(CFG, "define($d, `$driver{$d}')dnl\n");
197 &close_tempfile(CFG);
198 &unlock_file("$sd/mf.cfg");
203 # delete_driver(name)
206 local $sd = "$config{'spool_dir'}/$_[0]";
207 unlink("$sd/mf.cfg", "$sd/account");
210 # driver_input(&printer, &driver)
213 local ($prn, $drv) = @_;
215 printf "<tr> <td><input type=radio name=mode value=0 %s> %s</td>\n",
216 $drv->{'mode'} == 0 ? "checked" : "", $text{'redhat_none'};
217 print "<td>($text{'redhat_nonemsg'})</td> </tr>\n";
219 printf "<tr> <td><input type=radio name=mode value=2 %s> %s</td>\n",
220 $drv->{'mode'} == 2 ? "checked" : "", $text{'redhat_prog'};
221 printf "<td><input name=iface value=\"%s\" size=35></td> </tr>\n",
222 $drv->{'mode'} == 2 ? $drv->{'file'} : "";
224 printf "<tr> <td valign=top><input type=radio name=mode value=1 %s>\n",
225 $drv->{'mode'} == 1 ? "checked" : "";
226 print "$text{'redhat_driver'}</td> <td><table width=100%>";
228 print "<tr> <td valign=top><b>$text{'redhat_printer2'}</b></td>\n";
229 print "<td><select name=printer size=10 onChange='setdriver(0)'>\n";
230 printf "<option value=%s %s>%s\n",
231 'text', $drv->{'text'} ? 'selected' : '', "Text printer";
232 printf "<option value=%s %s>%s\n",
233 'postscript', $drv->{'postscript'} ? 'selected' : '',
234 "Postscript printer";
236 local $list = &list_printconf_drivers();
237 local $select_driver = 0;
238 foreach $k (sort { lc($a) cmp lc($b) } keys %$list) {
239 foreach $m (@{$list->{$k}}) {
240 next if (!@{$m->{'drivers'}});
241 printf "<option value='%s' %s>%s\n",
242 join(";", $m->{'id'}, @{$m->{'drivers'}}),
243 $drv->{'make'} eq $k &&
244 $drv->{'model'} eq $m->{'model'} ? 'selected' : '',
246 if ($drv->{'make'} eq $k && $drv->{'model'} eq $m->{'model'}) {
247 $select_driver = &indexof($drv->{'driver'},
252 print "</select><select name=driver size=10 width=100></select></td> </tr>\n";
255 print "<tr> <td><b>$text{'redhat_paper'}</b></td> <td><select name=paper>\n";
256 print "<option value='' selected>$text{'redhat_none'}\n" if (!$drv->{'paper'});
257 foreach $p (@paper_sizes) {
258 printf "<option %s>%s\n",
259 $drv->{'paper'} eq $p ? 'selected' : '', $p;
260 $foundp++ if ($drv->{'paper'} eq $p);
262 printf "<option selected>$drv->{'paper'}\n" if (!$foundp && $drv->{'paper'});
263 print "</select></td> </tr>\n";
265 print "</table></td></tr>\n";
268 function setdriver(sel)
270 var idx = document.forms[0].printer.selectedIndex;
271 var v = new String(document.forms[0].printer.options[idx].value);
272 var vv = v.split(";");
273 var driver = document.forms[0].driver;
275 for(var i=1; i<vv.length; i++) {
276 driver.options[i-1] = new Option(vv[i], vv[i]);
278 if (driver.length > 0) {
279 driver.options[sel].selected = true;
282 setdriver($select_driver);
288 # Parse driver selection from %in and return a driver structure
291 if ($in{'mode'} == 0) {
292 return { 'mode' => 0 };
294 elsif ($in{'mode'} == 2) {
295 (-x $in{'iface'}) || &error(&text('redhat_eprog', $in{'iface'}));
296 return { 'mode' => 2,
297 'file' => $in{'iface'} };
300 $in{'printer'} || &error($text{'redhat_edriver'});
301 if ($in{'printer'} eq 'text') {
302 return { 'mode' => 1,
303 'paper' => $in{'paper'},
306 elsif ($in{'printer'} eq 'postscript') {
307 return { 'mode' => 1,
308 'paper' => $in{'paper'},
312 $in{'driver'} || &error($text{'redhat_edriver'});
313 local @p = split(/;/, $in{'printer'});
314 local $list = &list_printconf_drivers();
315 local ($make, $model);
316 foreach $k (keys %$list) {
317 foreach $m (@{$list->{$k}}) {
318 if ($m->{'id'} == $p[0]) {
320 $model = $m->{'model'};
324 return { 'mode' => 1,
325 'paper' => $in{'paper'},
329 'driver' => $in{'driver'} };
334 # list_printconf_drivers()
335 sub list_printconf_drivers
338 foreach $ov (@overview_files) {
343 foreach $k (keys %$VAR1) {
344 foreach $m (@{$VAR1->{$k}}) {
345 push(@{$rv{$k}}, $m);