module "SambaPrinters"; textdomain "samba-server";
import "SambaConfig";
import "Spooler";
/** * list of all system printers */ list<string> system_printers = [];
/** * default settings for [printers] */ map<string, any> default_printers = $[ "comment": "All Printers", "path": "/var/tmp", "printable": true, "browseable": false, "available": "yes", "guest ok": "no", "yast": true ];
/** * default settings for a single printer share */ map<string, any> default_printer_share = $[ "path": "/var/tmp", "browseable": true, "printable": true, "yast": true ];
global Read()
{
printer_status = $[]; // Progress::off(); string spooler = Spooler::checkSpoolSystemNoDialog(); y2milestone ("Spooler: %1", spooler ); Spooler::Set(spooler); system_printers = Spooler::GetAvailableQueues(); // Progress::on();
SambaConfig::Read();
// setup correctly the printer status if (SambaConfig::ExistsShare("printers")) { // load the system printers // setup system printer status boolean on = SambaServer::IsEnabledShare("printers") && toboolean(SambaConfig::GetGlobal("load printers", "Yes"));
share_printers = on; if (system_printers != nil) { foreach(string printer, system_printers , ``{ printer_status[printer] = on; }); } } // update printer_status for printable shares foreach(string share, map options, SambaConfig::GetShares(), ``{ if (share != "printers") { if (toboolean(SambaConfig::GetShare(share, "printable", "No"))) { // if the printer was enabled because of printers and it is commented, skip // TODO - handle "available" correctly boolean on = SambaConfig::ShareEnabled(share); if (!(printer_status[share]:false && !on)) { printer_status[share] = on; if (on) share_printers = true; } } } }); return true; }
/** * Turn on/off [printers] * * @param on should be enabled? */ global define void enablePrinters( boolean on ) ``{ if( share_printers != on ) { share_printers = on;
// if they should be turned off and there is no such share, done if (!on) { disableAllPrinters(); } else { SambaConfig::EnableShare("printers"); enableAllSystemPrinters(); }
modified = true; } }
/**
* Turn on all system printers. Will enable [printers] as well.
*/
global define void enableAllSystemPrinters()
``{
if (system_printers != nil) {
foreach( string printer, system_printers, ``{
printer_status[ printer ] = true;
share_printers = true;
});
}
}
/**
* Disable all printers.
*/
global define void disableAllPrinters()
``{
// disable each share with printable = true
foreach(string share, SambaConfig::GetShares(), {
if (toboolean(SambaConfig::GetShare(share, "printable", nil)))
SambaConfig::DisableShare(share);
});
}
/** * Enable printers in a list. If possible, use [printers] section * * @param enable_names list of printer names to be enabled */ global define void enablePrinterNames( list<string> enable_names ) ``{
y2debug( "System printers are: %1", system_printers ); y2debug( "Enable: %1", enable_names );
// first, check, if we can use [printers] boolean printers = true; if (system_printers != nil) { foreach( string name, system_printers, ``{ // each system printer must be enabled and not disabled if( (printer_status[name]:false) && !contains( enable_names, name ) ) { printers = false; y2debug( "[printers] can't be used, because of %1", name ); } }); }
enableShare( "printers", printers ); // if we can use [printers] if( printers ) { // filter out printers enabled by [printers] enable_names = filter( string name, enable_names, ``( !contains( system_printers, name ) ) ); // remove yast-defined shares shares = filter( string name, map<string,any> options, shares, ``( ! (options["yast"]:false) ) ); }
// update the status of these printers if (system_printers != nil) { foreach( string name, system_printers, ``{ printer_status[ name ] = printers; // if printers are used, do not use the shares themselves if( printers ) { enableShare( name, false ); } }); }
// work on enable_names y2debug( "Now need to work on %1", enable_names ); foreach( string name, enable_names, ``{ if( haskey( shares, name ) ) { if( shares[name, "printable"]:false == true ) { printer_status[ name ] = true; enableShare( name, true ); y2debug( "Enabling printer %1", name ); } else { // a share with the same name, but without printable!!! y2error( "Share '%1' is not printable: %2", name, shares[name]:$[] ); // translators: error message. There is a given share, but configured differently Report::Error( sformat( _("There is already a share '%1', but it is not configured as a printer.\n YaST2 will not modify this share."), name ) ); } } else { y2debug( "Adding a share for printer %1", name ); // no share, create one shares[ name ] = eval(default_printer_share); printer_status[ name ] = true; enableShare( name, true ); } });
modified = true; }
/**
* Are some of the system printers enabled?
*
* @return boolean true if yes
*/
global define boolean SystemPrintersEnabled()
``{
boolean result = false;
if (system_printers != nil) {
foreach( string printer, system_printers, ``{
if( printer_status[ printer ]:false ) result = true;
});
}
return result;
}
removeShare()
{
...
// update the printer lists
// if( haskey( printer_status, name ) ) printer_status = remove( printer_status, name );
... }
enableShare()
{
...
// [printers] is coupled with "load printers"
if( name == "printers" )
global_config["load printers"] = on;
... }