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 / clients / inst_hwinfo.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  398 lines

  1. /**
  2.  *
  3.  * Module:    Initial hwinfo
  4.  *
  5.  * Author:    Ladislav Slezak <lslezak@suse.cz>
  6.  *
  7.  * $Id: inst_hwinfo.ycp 33530 2006-10-20 11:08:26Z lslezak $
  8.  *
  9.  * Initial hwinfo module - configuration workflow
  10.  */
  11.  
  12. {
  13.  
  14. textdomain "tune";
  15.  
  16. import "InitHWinfo";
  17. import "Wizard";
  18. import "Label";
  19. import "Report";
  20. import "Popup";
  21. import "Sequencer";
  22. import "Stage";
  23. import "Arch";
  24.  
  25. include "hwinfo/routines.ycp";
  26. include "hwinfo/classnames.ycp";
  27. include "hwinfo/system_settings_ui.ycp";
  28. include "hwinfo/system_settings_dialogs.ycp";
  29.  
  30. string selected_model = "";
  31. map selected_info = $[];
  32. string selected_device = nil;
  33.  
  34.  
  35. /**
  36.  * Show floppy selection dialog.
  37.  * @param devices map with pairs $["device name" : "model (description)"]
  38.  * @return string selected floppy device name or nil when canceled
  39.  */
  40. define string floppy_selection(map<string,string> devices) ``{
  41.     list devs = maplist(string d, string m, devices, ``{
  42.         return `item(`id(d), sformat("%1 (%2)", m, d));
  43.     }
  44.     );
  45.  
  46.     term dialog = `VBox(
  47.     // combo box label
  48.     `ComboBox(`id(`device), _("&Floppy Disk Device"), devs),
  49.     `VSpacing(1),
  50.     `HBox(
  51.         `PushButton(`id(`ok), Label::OKButton()),
  52.         `VSpacing(2),
  53.         `PushButton(`id(`cancel), Label::CancelButton())
  54.     )
  55.     );
  56.  
  57.     symbol ui = nil;
  58.  
  59.     UI::OpenDialog(dialog);
  60.  
  61.     while (ui != `ok && ui != `cancel && ui != `close)
  62.     {
  63.     ui = (symbol)UI::UserInput();
  64.     }
  65.  
  66.     // get selected device
  67.     string selected = (string)UI::QueryWidget(`device, `Value);
  68.  
  69.     UI::CloseDialog();
  70.  
  71.     // return nil if [OK] wasn't pressed
  72.     return (ui == `ok) ? selected : nil;
  73. }
  74.  
  75. /**
  76.  * Select floppy device where hwifo will be stored.
  77.  * If more than one floppy device was found display
  78.  * selection dialog
  79.  * @return string floppy device name (e.g. /dev/fd0) or nil when no floppy was found
  80.  */
  81. define string selected_floppy() ``{
  82.  
  83.     integer floppy_size = size(InitHWinfo::floppy);
  84.  
  85.     if (floppy_size == 0)
  86.     {
  87.     return nil;
  88.     }
  89.     else if (floppy_size == 1)
  90.     {
  91.     string device = "";
  92.  
  93.     // get device name
  94.     foreach(string dev, string m, InitHWinfo::floppy, ``{
  95.         device = dev;
  96.         }
  97.     );
  98.     return device;
  99.     }
  100.     else
  101.     {
  102.     // there is more than 2 floppies in the system
  103.     // ask user which should be used
  104.     return floppy_selection(InitHWinfo::floppy);
  105.     }
  106. }
  107.  
  108. /**
  109.  * Show detail dialog for selected device
  110.  * @param model hardware description (used in the tree widget
  111.  * as a root node)
  112.  * @param info hardware description returned by .probe agent
  113.  * @return symbol UserInput() value
  114.  */
  115. define symbol details_dialog(string model, map info) ``{
  116.     // convert information in the map to tree widget content
  117.     list l = [`item(model, true, expandTree(info))];
  118.  
  119.     term content = `VBox(
  120.     // tree widget label
  121.     `Tree(_("&Details"), l)
  122.     );
  123.  
  124.     Wizard::HideBackButton();
  125.     Wizard::HideAbortButton();
  126.     Wizard::SetNextButton( `ok, Label::OKButton() );
  127.  
  128.     // help text
  129.     string help_text = _("<P><B>Details</B></P><P>The details of the selected hardware component are displayed here.</P>");
  130.  
  131.     // heading text, %1 is component name (e.g. "USB UHCI Root Hub")
  132.     Wizard::SetContents(sformat(_("Component '%1'"), model), content,
  133.             help_text,
  134.             true, true);
  135.     if ( Stage::initial() )
  136.     Wizard::SetTitleIcon( "hardware_info" );
  137.  
  138.     y2debug("tree content: %1", l);
  139.  
  140.     symbol ret = `dummy;
  141.     while (ret != `ok && ret != `close)
  142.     {
  143.     ret = (symbol)UI::UserInput();
  144.     }
  145.  
  146.     if (ret == `close)
  147.     {
  148.     ret = `bort;
  149.     }
  150.  
  151.     Wizard::RestoreNextButton();
  152.     Wizard::RestoreAbortButton();
  153.     Wizard::RestoreBackButton();
  154.  
  155.     return ret;
  156. }
  157.  
  158. /**
  159.  * Show summary dialog with all detected hardware
  160.  * @return symbol UserInput() value
  161.  */
  162. define symbol detected_dialog() ``{
  163.  
  164.     // this block is evaluated before each hardware class detection
  165.     block<boolean> abortblock = ``{return (UI::PollInput() == `abort && Popup::ReallyAbort(false));};
  166.  
  167.     list<map> hw = InitHWinfo::DetectedHardware(false, abortblock);
  168.  
  169.     if (hw == nil)
  170.     {
  171.     // detection was aborted
  172.     return `abort;
  173.     }
  174.  
  175.     // create table content
  176.     list table_cont = [];
  177.  
  178.     if (size(hw) > 0)
  179.     {
  180.     foreach(map info, hw, ``{
  181.         // device model name fallback
  182.         string model = (string)(info["model"]:_("Unknown device"));
  183.  
  184.         string uniq = (string)(info["info", "unique_key"]:"unknown");
  185.         integer class = (integer)(info["info", "class_id"]:0xff);
  186.         integer subclass = (integer)(info["info", "sub_class_id"]:0);
  187.  
  188.         // find subclass name
  189.         string cls = (string)(ClassNames[class, subclass]:nil);
  190.  
  191.         // try to use class name if subclass name wasn't found
  192.         if (cls == nil)
  193.         {
  194.             cls = (string)(ClassNames[class, "name"]:nil);
  195.         }
  196.  
  197.         // set to "unknown" if class name wasn't found too
  198.         if (cls == nil)
  199.         {
  200.             // device class is unknown
  201.             cls = _("Unknown device class");
  202.         }
  203.  
  204.         table_cont = add(table_cont, `item(`id(uniq), cls, model));
  205.         }
  206.     );
  207.     }
  208.  
  209.     y2debug("table content: %1", table_cont);
  210.  
  211.     term content = `VBox(
  212.     // table header
  213.     `Table(`id(`hwtable), `header(_("Class"), _("Model")), table_cont),
  214.     `VSpacing(0.4),
  215.     `HBox(
  216.         // push button label
  217.         `PushButton(`id(`newid), _("&System Settings...")),
  218.         `HSpacing(4),
  219.         // push button label
  220.         `PushButton(`id(`details), _("&Details...")),
  221.  
  222.         // FIXME: there should be only "Save to file" in Xen and UML system
  223.         (!Arch::is_uml()) ?
  224.         // menu button label
  225.         `MenuButton(`id(`savemenu), _("&Save to File"),
  226.         [
  227.             // menu item
  228.             `item(`id(`file), _("Save to &File...")),
  229.             // menu item
  230.             `item(`id(`floppy), _("Save to F&loppy..."))
  231.         ]
  232.         )
  233.         : `Empty()
  234.     ),
  235.     `VSpacing(1)
  236.     );
  237.  
  238.     // help text - part 1/3
  239.     string help_text = _("<P><B>Detected Hardware</B><BR>This table contains all hardware components detected in your system.</P>")
  240.     // help text - part 2/3
  241.     + _("<P><B>Details</B><BR>Select a component and press <B>Details</B> to see a more detailed description of the component.</P>")
  242.     // help text - part 3/3
  243.     + ((Arch::is_uml()) ? "" : _("<P><B>Save to File</B><BR>You can save
  244.     hardware information (<I>hwinfo</I> output) to a file or floppy disk. Select the target type in <B>Save to File</B>.</P>"));
  245.  
  246.     Wizard::HideBackButton();
  247.     Wizard::HideAbortButton();
  248.     Wizard::SetNextButton( `ok, Label::OKButton() );
  249.  
  250.     // heading text
  251.     Wizard::SetContents(_("Detected Hardware"), content,
  252.             help_text,
  253.             true, true);
  254.  
  255.     // preselect last selected device
  256.     if (selected_device != nil)
  257.     {
  258.     UI::ChangeWidget(`id(`hwtable), `CurrentItem, selected_device);
  259.     }
  260.  
  261.     symbol ret = `dummy;
  262.  
  263.     while (ret != `ok && ret != `details && ret != `newid)
  264.     {
  265.     ret = (symbol)UI::UserInput();
  266.  
  267.     y2debug("UserInput: %1", ret);
  268.  
  269.     if (ret == `details || ret == `hwtable)
  270.     {
  271.         selected_device = (string)(UI::QueryWidget(`id(`hwtable), `CurrentItem));
  272.  
  273.         if (selected_device != nil)
  274.         {
  275.         map device_info = find(map<any,any> i, hw, ``((string)(i["info", "unique_key"]:nil) == selected_device));
  276.  
  277.         if (device_info != nil)
  278.         {
  279.             // remember selected device
  280.             selected_info =  (map)(device_info["info"]:$[]);
  281.             // device model is unknown
  282.             selected_model = (string)(device_info["model"]:_("Unknown device"));
  283.         }
  284.         else
  285.         {
  286.             ret = `dummy;
  287.         }
  288.         }
  289.         else
  290.         {
  291.         ret = `dummy;
  292.         }
  293.     }
  294.     else if (ret == `floppy)
  295.     {
  296.         string save_device = selected_floppy();
  297.  
  298.         if (save_device != nil)
  299.         {
  300.         y2debug("Selected floppy: %1", save_device);
  301.  
  302.         // mount floppy
  303.         string mpoint = mount_device(save_device);
  304.  
  305.         if (mpoint != nil)
  306.         {
  307.             save_hwinfo_to_file(mpoint + "/hwinfo.out");
  308.  
  309.             // unmount floppy
  310.             umount_device(mpoint);
  311.         }
  312.         else
  313.         {
  314.             // error popup - mount failed, %1 is device file name (e.g. /dev/fd0)
  315.             Report::Error(sformat(_("Floppy device '%1' cannot be mounted."), save_device));
  316.         }
  317.  
  318.         }
  319.     }
  320.     else if (ret == `file)
  321.     {
  322.         // save to file
  323.         save_hwinfo_to_file("/hwinfo.out");
  324.     }
  325.     }
  326.  
  327.     Wizard::RestoreNextButton();
  328.     Wizard::RestoreAbortButton();
  329.     Wizard::RestoreBackButton();
  330.  
  331.     y2debug("detected_dialog result: %1", ret);
  332.  
  333.     return ret;
  334. }
  335.  
  336. // only activate the settings,
  337. // the configuration is written in system_settings_finish.ycp
  338. symbol ActivateSystemSetting()
  339. {
  340.     SystemSettings::Activate();
  341.  
  342.     return `next;
  343. }
  344.  
  345. /**************************************
  346.  *
  347.  *            Main part
  348.  *
  349.  **************************************/
  350.  
  351. // aliases for wizard sequncer
  352. map aliases =
  353.     $[
  354.     "detected"    :   ``(detected_dialog()),
  355.     "details"    :   [``(details_dialog(selected_model, selected_info)), true],
  356.     "newid"        :   [``(SystemSettingsDialog()), true],
  357.     "activate"    :   ``(ActivateSystemSetting())
  358.     ];
  359.  
  360. // workflow sequence
  361. map sequence = $[
  362.     "ws_start" : "detected",
  363.     "detected" :
  364.     $[
  365.     `abort    : `abort,
  366.     `ok    : "activate",
  367.     `details    : "details",
  368.     `newid : "newid"
  369.     ],
  370.     "details" :
  371.     $[
  372.     `abort    : `abort,
  373.     `ok    : "detected"
  374.     ],
  375.     "newid" :
  376.     $[
  377.     `abort    : `abort,
  378.     `next    : "detected"
  379.     ],
  380.     "activate" :
  381.     $[
  382.     `next    : `next
  383.     ]
  384. ];
  385.  
  386. Wizard::CreateDialog();
  387. Wizard::SetDesktopIcon("hwinfo");
  388.  
  389. // start workflow
  390. any ret = Sequencer::Run(aliases, sequence);
  391.  
  392. Wizard::CloseDialog();
  393.  
  394. return ret;
  395.  
  396. }
  397.  
  398.