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;

    ...
}