home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / modules / Y2ModuleConfig.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  335 lines

  1. /**
  2.  * File:    modules/Y2ModuleConfig.ycp
  3.  * Package:    Auto-installation
  4.  * Summary:    Read data from desktop files
  5.  * Author:    Anas Nashif <nashif@suse.de>
  6.  *
  7.  * $Id: Y2ModuleConfig.ycp 28187 2006-02-20 11:45:21Z locilka $
  8.  */
  9.  
  10. {
  11.     module "Y2ModuleConfig";
  12.     textdomain "autoinst";
  13.  
  14.     import "Mode";
  15.     import "Stage";
  16.     import "Profile";
  17.     import "Installation";
  18.     import "Desktop";
  19.     import "Wizard";
  20.     import "Directory";
  21.  
  22.     // include "autoinstall/io.ycp";
  23.  
  24.     global map<string, map> GroupMap = $[];
  25.     global map<string, map> ModuleMap = $[];
  26.  
  27.     /**
  28.      * MenuTreeData
  29.      * @return list of modules
  30.      */
  31.     global list<map> MenuTreeData =[];
  32.  
  33.  
  34.  
  35.     /**
  36.      * Read module configuration files
  37.      * @return map
  38.      */
  39.     list ReadMenuEntries(list<string> modes)
  40.     {
  41.     Desktop::AgentPath = .autoyast2.desktop;
  42.  
  43.     list<string> Values= [ "Name",
  44.                    "GenericName",
  45.                    "X-SuSE-YaST-AutoInst",
  46.                    "X-SuSE-YaST-AutoInstResource",
  47.                    "X-SuSE-YaST-AutoInstClient",
  48.                    "X-SuSE-YaST-Group",
  49.                    "X-SuSE-YaST-AutoInstMerge",
  50.                    "X-SuSE-YaST-AutoInstMergeTypes",
  51.                    "X-SuSE-YaST-AutoInstDataType",
  52.                    "X-SuSE-YaST-AutoInstClonable",
  53.                    "X-SuSE-YaST-AutoInstRequires"
  54.                    ];
  55.     Desktop::Read(Values);
  56.     map<string,map> configurations = Desktop::Modules;
  57.  
  58.     //y2debug("%1", configurations );
  59.     map groups = Desktop::Groups;
  60.  
  61.     map confs = $[];
  62.  
  63.     foreach (string name , map values, configurations, ``{
  64.         if (contains(modes, values["X-SuSE-YaST-AutoInst"]:""))
  65.         {
  66.         string module_auto = "";
  67.         /* determine name of client, if not default name */
  68.         if (!haskey(values,"X-SuSE-YaST-AutoInstClient") || values["X-SuSE-YaST-AutoInstClient"]:"" == "")
  69.         {
  70.             string client =  name + "_auto";
  71.                     y2debug("client: %1", client);
  72.             values["X-SuSE-YaST-AutoInstClient"] = client;
  73.         }
  74.         y2debug("name: %1 values: %2", name, values["X-SuSE-YaST-AutoInstClient"]:"" );
  75.         confs[name]=values;
  76.         }
  77.     });
  78.     return [confs, groups];
  79.     }
  80.  
  81.  
  82.     /**
  83.      * Sort tree groups
  84.      * @param map<string, map> group map
  85.      * @param list<string> group list
  86.      * @return list
  87.      */
  88.     define list<string> SortGroups (map<string, map> GroupMap, list<string> GroupList)
  89.     ``{
  90.         return
  91.         sort (string x, string y, GroupList,
  92.           ``{
  93.         string first = GroupMap[x, "SortKey"]:"";
  94.         string second = GroupMap[y, "SortKey"]:"";
  95.         return (first < second);
  96.         });
  97.     }
  98.  
  99.     /**
  100.      * Create group tree
  101.      * @param map<string, map> groups
  102.      * @return void
  103.      */
  104.     define void CreateGroupTree (map<string, map> Groups)
  105.     ``{
  106.     //y2debug("Groups: %1", Groups);
  107.  
  108.         list<string> grouplist = [];
  109.         grouplist = SortGroups (Groups, maplist (string rawname, map group, Groups, ``(rawname)));
  110.  
  111.         foreach (string name, grouplist, ``{
  112.         textdomain "base";
  113.         string title = Desktop::Translate(Groups[name, "Name"]:name);
  114.         textdomain "autoinst";
  115.  
  116.         map MeunTreeEntry = $[ "entry":name, "title":title ];
  117.         MenuTreeData = add(MenuTreeData,MeunTreeEntry);
  118.         });
  119.  
  120.     //y2debug("data: %1", MenuTreeData);
  121.     return;
  122.     }
  123.  
  124.     /**
  125.      * Construct Menu Widget
  126.      * @return list
  127.      */
  128.     define list ConstructMenu() ``{
  129.  
  130.     CreateGroupTree(GroupMap);
  131.  
  132.     foreach(string m, map v, ModuleMap, ``{
  133.         string name = v["Name"]:"";
  134.         map menu_entry = $["entry":m, "title":name];
  135.         list menu_list = [];
  136.         if (haskey(v,"X-SuSE-YaST-Group"))
  137.         {
  138.         string parent = v["X-SuSE-YaST-Group"]:"";
  139.         MenuTreeData = maplist (map k, MenuTreeData, ``{
  140.             if (k["entry"]:"" == parent)
  141.                     {
  142.             list children = k["children"]:[];
  143.             children = add(children,menu_entry);
  144.             k["children"] = children;
  145.             return(k);
  146.             }
  147.             else {
  148.             return (k);
  149.             }
  150.         });
  151.         }
  152.         else
  153.         {
  154.         MenuTreeData = add(MenuTreeData,menu_entry);
  155.         }
  156.     });
  157.     // y2debug("MenuTreeData: %1", MenuTreeData );
  158.     }
  159.  
  160.  
  161.     /**
  162.      * Y2ModuleConfig ()
  163.      * Constructor
  164.      */
  165.     global define void Y2ModuleConfig () ``{
  166.  
  167.     /* Read module configuration data (desktop files) */
  168.     if (!Stage::initial ())
  169.     {
  170.             list MenuEntries = [];
  171.             if (Mode::autoinst())
  172.             {
  173.                 MenuEntries = ReadMenuEntries(["all", "write"]);
  174.             } else {
  175.                 MenuEntries = ReadMenuEntries(["all", "configure"]);
  176.             }
  177.  
  178.         ModuleMap = MenuEntries[0]:$[];
  179.  
  180.         Profile::ModuleMap = ModuleMap;
  181.  
  182.         GroupMap = MenuEntries[1]:$[];
  183.  
  184.     }
  185.  
  186.     if (Mode::config ())
  187.     {
  188.         // construct the tree menu
  189.         ConstructMenu();
  190.     }
  191.     }
  192.  
  193.  
  194.     /**
  195.      * Get resource name
  196.      * @param string resource
  197.      * @return string resource as defined in desktop file
  198.      */
  199.     global define string getResource( string default_resource)
  200.     {
  201.     string ret = ModuleMap[default_resource, "X-SuSE-YaST-AutoInstResource"]:"";
  202.     if (ret == "")
  203.         return default_resource;
  204.     else
  205.         return ret;
  206.     }
  207.  
  208.     /**
  209.      * Get resource data
  210.      * @param resourceMap Resource Map
  211.      * @param resrouce the resource
  212.      * @return any Resource Data
  213.      */
  214.     global define any getResourceData( map resourceMap, string resource)
  215.     {
  216.     string tmp_resource = resourceMap["X-SuSE-YaST-AutoInstResource"]:"";
  217.     if (tmp_resource != "")
  218.         resource = tmp_resource;
  219.  
  220.     string data_type = resourceMap["X-SuSE-YaST-AutoInstDataType"]:"map";
  221.     string tomerge = resourceMap["X-SuSE-YaST-AutoInstMerge"]:"";
  222.     string tomergetypes = resourceMap["X-SuSE-YaST-AutoInstMergeTypes"]:"";
  223.  
  224.     map mergedResource = $[];
  225.     if (size(tomerge) > 0 )
  226.     {
  227.         list<string> MergeTypes = splitstring(tomergetypes, ",");
  228.         list<string> Merge = splitstring(tomerge, ",");
  229.         integer i = 0;
  230.         foreach ( string res, Merge, ``{
  231.         if ( MergeTypes[i]:"map" == "map")
  232.             mergedResource[res] = eval(Profile::current[res]:$[]);
  233.         else
  234.             mergedResource[res] = eval(Profile::current[res]:[]);
  235.         i = i + 1;
  236.         });
  237.             if (mergedResource==$[])
  238.                 return nil;
  239.             else
  240.             return mergedResource;
  241.     }
  242.     else
  243.     {
  244.         if (data_type == "map")
  245.         {
  246.                 if (Profile::current[resource]:$[] == $[])
  247.                     return nil;
  248.                 else
  249.             return (eval(Profile::current[resource]:$[]));
  250.         }
  251.         else
  252.         {
  253.                 if (Profile::current[resource]:[] == [] )
  254.                     return nil;
  255.                 else
  256.             return (eval(Profile::current[resource]:[]));
  257.         }
  258.     }
  259.  
  260.     }
  261.  
  262.     /**
  263.      * Simple dependency resolving
  264.      * @return list<map>
  265.      */
  266.     global define list<map> Deps ()
  267.     {
  268.         map<string, any> deps = $[];
  269.         list<map> m = [];
  270.         list done = [];
  271.         foreach(string p, map d, ModuleMap,
  272.                 ``{
  273.                 if (haskey(d, "X-SuSE-YaST-AutoInstRequires") && d["X-SuSE-YaST-AutoInstRequires"]:"" != "")
  274.                 {
  275.                 list<string> req = splitstring(d["X-SuSE-YaST-AutoInstRequires"]:"", ", ");
  276.                 req = filter(string r, req, ``(r!=""));
  277.                 deps[p] = req;
  278.                 }
  279.  
  280.                 });
  281.         y2milestone("New dependencies: %1", deps);
  282.  
  283.         foreach(string p, map d, ModuleMap,
  284.                 ``{
  285.                 y2debug("done: %1", done);
  286.                 y2debug("Working on : %1", p );
  287.                 if (!contains(done, p))
  288.                 {
  289.                 if (haskey(deps, p))
  290.                 {
  291.                 foreach(string r, deps[p]:[], ``{
  292.                     if (!contains(done, r)) {
  293.                     m = add(m, $["res":r, "data":ModuleMap[r]:$[]]);
  294.                     done = add(done, r);
  295.                     }
  296.                     });
  297.                 m = add(m, $["res":p, "data":d]);
  298.                 done = add(done, p);
  299.                 }
  300.                 else
  301.                 {
  302.                 m = add(m, $["res":p, "data":d]);
  303.                 done = add(done, p);
  304.                 }
  305.                 }
  306.                 });
  307.  
  308.         return m;
  309.     }
  310.  
  311.     /**
  312.      * Set Desktop Icon
  313.      * @param file Desktop File 
  314.      * @return boolean
  315.      */
  316.     global boolean SetDesktopIcon( string file )
  317.     {
  318.         string filename = sformat("%1/%2.desktop", Directory::desktopdir, file);
  319.         if (SCR::Read(.target.size, filename) < 0 )
  320.             filename = sformat("%1/%2.desktop",
  321.                     "/usr/share/autoinstall/modules", file);
  322.         path filepath = .autoyast2.desktop.v + filename + ."Desktop Entry".Icon;
  323.         string icon = (string) SCR::Read(filepath);
  324.         y2debug("icon: %1 (%2)", icon, filepath);
  325.  
  326.         if (icon == nil)
  327.             return false;
  328.  
  329.         Wizard::SetTitleIcon(icon);
  330.         return true;
  331.     }
  332.  
  333.  
  334. }
  335.