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 / PackageCallbacks.ycp < prev    next >
Text File  |  2006-11-29  |  40KB  |  1,596 lines

  1. /**
  2.  * Module:        PackageCallbacks.ycp
  3.  *
  4.  * Authors:        Gabriele Strattner <gs@suse.de>
  5.  *            Klaus Kaempf <kkaempf@suse.de>
  6.  *            Arvin Schnell <arvin@suse.de>
  7.  *
  8.  * Purpose:        provides the default Callbacks for Pkg::
  9.  *
  10.  */
  11.  
  12. {
  13.     module "PackageCallbacks";
  14.  
  15.     textdomain "packager";
  16.  
  17.     import "Installation";
  18.     import "Directory";
  19.     import "Label";
  20.     import "Mode";
  21.     import "Popup";
  22.     import "PackageCallbacksInit";
  23.     import "URL";
  24.     import "CommandLine";
  25.     import "String";
  26.     import "Report";
  27.  
  28.     global boolean _provide_popup = false;
  29.     global boolean _source_popup = false;
  30.     global boolean _package_popup = false;
  31.     global boolean _script_popup = false;
  32.  
  33.     global string _package_name = "";
  34.     global integer _package_size = 0;
  35.     global boolean _deleting_package = false;
  36.  
  37.     global integer _current_source = 1;
  38.  
  39.     // make showLongInfo module-global so it gets remembered (cf. #14018)
  40.     boolean showLongInfo = false;
  41.  
  42.  
  43.     // used to en-/disable StartPackage, ProgressPackage and DonePackage
  44.     boolean enable_asterix_package = true;
  45.  
  46.     boolean provide_aborted = false;
  47.     boolean source_aborted = false;
  48.  
  49.     string back_string = "\b\b\b\b\b\b\b\b\b\b";
  50.     string clear_string = back_string + "          " + back_string;
  51.  
  52.     //--------------------------------------------------------------------------
  53.     // defaults
  54.  
  55.     term ProgressBox (string heading, string name, string sz) {
  56.     term progressbox = `VBox(
  57.         `HSpacing(40),
  58.         // popup heading
  59.         `Heading (heading),
  60.         `Left (`HBox (
  61.         `VBox (
  62.             `Left (`Label (`opt (`boldFont), _("Package: "))),
  63.             `Left (`Label (`opt (`boldFont), _("Size: ")))
  64.         ),
  65.         `VBox (
  66.             `Left (`Label (name)),
  67.             `Left (`Label (sz))
  68.         )
  69.         )),
  70.         `ProgressBar(`id(`progress), "", 100, 0 ),
  71.         `HBox (
  72.         `HStretch (),
  73.         `PushButton (`id (`abort), Label::AbortButton ()),
  74.         `HStretch ()
  75.         )
  76.     );
  77.     return progressbox;
  78.     }
  79.  
  80.     /** at start of file providal
  81.      *
  82.      */
  83.     global boolean StartProvide (string name, integer archivesize, boolean remote)
  84.     {
  85.     y2milestone("StartProvide: name: %1, remote: %2", name, remote);
  86.     if (remote)
  87.     {
  88.         string sz = String::FormatSizeWithPrecision (archivesize, 2, false);
  89.         if (Mode::commandline()) {
  90.         CommandLine::PrintVerbose(sformat(_("Downloading package %1 (%2)..."), name, sz));
  91.         }
  92.         else {
  93.         // popup heading
  94.         term providebox = ProgressBox (_("Downloading Package"), name, sz);
  95.         UI::OpenDialog(providebox);
  96.         _provide_popup = true;
  97.         }
  98.     }
  99.     return true;
  100.     }
  101.  
  102.  
  103.     /** during file providal
  104.      *
  105.      */
  106.     global boolean ProgressProvide (integer percent)
  107.     {
  108.     y2milestone("ProgressProvide: %1", percent);
  109.     if (_provide_popup)
  110.     {
  111.         UI::ChangeWidget(`id(`progress), `Value, percent);
  112.         provide_aborted = UI::PollInput () == `abort;
  113.         return ! provide_aborted;
  114.     }
  115.     else if (Mode::commandline()) {
  116.         // there is no popup window, but command line mode is set
  117.         CommandLine::PrintVerboseNoCR(clear_string + sformat("%1%%", percent));
  118.     }
  119.     return true;
  120.     }
  121.  
  122.  
  123.  
  124.     // creates layout for ChangeMediumPopup
  125.     global term LayoutPopup ( string message, term button_box,
  126.                 integer vertical_size, boolean info_on )
  127.     {
  128.     term dialog_layout =  `VBox(
  129.                     `HSpacing(40),    // enforce width
  130.                     `VSpacing(0.1),
  131.                     `Left(`Label( message)),
  132.                     `Left(`CheckBox(`id(`show), `opt(`notify),
  133.                             // check box
  134.                             _("Show &details"), info_on )),
  135.                     `VSpacing(0.4),
  136.                     `HBox(`VSpacing(vertical_size),
  137.                       `HSpacing(0.1),
  138.                       `ReplacePoint(`id(`info), `Empty()),
  139.                       `HSpacing(0.1)
  140.                       ),
  141.                     `HBox(`HSpacing(0.1),
  142.                       button_box,
  143.                       `HSpacing(0.1)
  144.                       ),
  145.                     `VSpacing(0.2)
  146.                     );
  147.     return dialog_layout;
  148.     }
  149.  
  150.     global boolean ShowLogInfo (string message, term buttonbox)
  151.     {
  152.     if (UI::QueryWidget(`id(`show), `Value ) == true)
  153.     {
  154.         UI::CloseDialog();
  155.         UI::OpenDialog( `opt(`decorated), LayoutPopup (message, buttonbox, 10, true) );
  156.         return true;
  157.     }
  158.     else
  159.     {
  160.         UI::CloseDialog();
  161.         UI::OpenDialog( `opt(`decorated),  LayoutPopup (message, buttonbox, 2, false) );
  162.         UI::ReplaceWidget(`id(`info), `Empty() );
  163.     }
  164.     return false;
  165.     }
  166.  
  167.  
  168.     /** during file providal
  169.      *
  170.      // return "" for ignore
  171.      // return "R" for retry
  172.      // return "C" for abort
  173.      */
  174.     global string DoneProvide (integer error, string reason, string name)
  175.     {
  176.     y2milestone("DoneProvide: %1", error);
  177.     if (_provide_popup)
  178.         UI::CloseDialog();
  179.  
  180.     if (Mode::commandline())
  181.     {
  182.         // remove the progress
  183.         CommandLine::PrintVerboseNoCR(clear_string);
  184.     }
  185.  
  186.     if (provide_aborted)
  187.     {
  188.         provide_aborted = false;
  189.         return "CANCEL";
  190.     }
  191.     _provide_popup = false;
  192.  
  193.     if (error != 0)
  194.     {
  195.         string message = sformat (_("Package %1 was not found on the medium."), name);
  196.  
  197.         if (Mode::commandline()) {
  198.         CommandLine::Print(message);
  199.  
  200.         // ask user in the interactive mode
  201.         if (CommandLine::Interactive())
  202.         {
  203.             CommandLine::Print("");
  204.  
  205.             // command line mode - ask user whether installation of the failed package should be retried
  206.             CommandLine::Print(_("Retry installation of the package?"));
  207.  
  208.             if (CommandLine::YesNo())
  209.             {
  210.             // return Retry
  211.             return "R";
  212.             }
  213.  
  214.             // command line mode - ask user whether the installation should be aborted
  215.             CommandLine::Print(_("Abort the installation?"));
  216.             if (CommandLine::YesNo())
  217.             {
  218.             // return Abort
  219.             return "C";
  220.             }
  221.  
  222.             // otherwise return Ignore (default)
  223.             return "I";
  224.         }
  225.  
  226.         return "I";
  227.         }
  228.  
  229.         term button_box = `HBox (`PushButton (`id(`abort), Label::AbortButton()));
  230.         button_box = add (button_box, `PushButton(`id(`retry), Label::RetryButton()));
  231.         button_box = add (button_box, `PushButton(`id(`ignore), Label::IgnoreButton()));
  232.  
  233.         if ( showLongInfo )
  234.         {
  235.         UI::OpenDialog( `opt(`decorated), LayoutPopup (message, button_box, 10, true) );
  236.         UI::ReplaceWidget(`id(`info), `RichText (`opt(`plainText), sformat (_("Error: %1:"), error) + reason) );
  237.         }
  238.         else
  239.         {
  240.         UI::OpenDialog( `opt(`decorated),  LayoutPopup (message, button_box, 2, false) );
  241.         UI::ReplaceWidget(`id(`info), `Empty() );
  242.         }
  243.  
  244.         any r = nil;
  245.  
  246.         repeat
  247.         {
  248.             r = UI::UserInput();
  249.             if ( r == `show )
  250.             {
  251.             showLongInfo = ShowLogInfo (message, button_box);
  252.             if (showLongInfo)
  253.             {
  254.                 UI::ReplaceWidget(`id(`info),
  255.                           `RichText (`opt(`plainText),
  256.                              sformat (_("Error: %1:"), error) + reason) );
  257.             }
  258.             else
  259.             {
  260.                 UI::ReplaceWidget(`id(`info), `Empty() );
  261.             }
  262.             }
  263.         } until (r == `abort || r == `retry || r == `ignore);
  264.  
  265.         y2milestone ("DoneProvide %1", r);
  266.  
  267.         UI::CloseDialog();
  268.  
  269.         if (r == `abort)
  270.         return "C";
  271.         if (r == `retry)
  272.         return "R";
  273.         if (r == `ignore)
  274.         return "I";
  275.  
  276.         y2error("Unknown user input: %1", r);
  277.     }
  278.  
  279.     return "I";
  280.     }
  281.  
  282.  
  283.     /**
  284.      *  Enable or disable StartPackage, ProgressPackage and DonePackage
  285.      *  callbacks, but only the progress bar and not the final error
  286.      *  message.  Returns old value.
  287.      */
  288.     global boolean EnableAsterixPackage (boolean f)
  289.     {
  290.     boolean ret = enable_asterix_package;
  291.     enable_asterix_package = f;
  292.     return ret;
  293.     }
  294.  
  295.  
  296.     /**
  297.      *  At start of package install.
  298.      */
  299.     global boolean StartPackage (string name, string summary, integer
  300.                     installsize, boolean is_delete)
  301.     {
  302.     if (!enable_asterix_package)
  303.         return true;
  304.  
  305.     _package_name = name;
  306.     _package_size = installsize;
  307.     _deleting_package = is_delete;
  308.     string sz = String::FormatSizeWithPrecision (installsize, 2, false);
  309.  
  310.     if (Mode::commandline()) {
  311.         CommandLine::PrintVerbose(sformat(
  312.         is_delete
  313.             ? _("Uninstalling package %1 (%2)...")
  314.             : _("Installing package %1 (%2)..."),
  315.          name, sz));
  316.     }
  317.     else {
  318.         term packagebox = ProgressBox (is_delete
  319.         ? _("Uninstalling Package")
  320.         : _("Installing Package"),
  321.         name, sz);
  322.  
  323.         UI::OpenDialog( `opt(`decorated), packagebox );
  324.         _package_popup = true;
  325.     }
  326.     return true;
  327.     }
  328.  
  329.  
  330.     /**
  331.      *  During package install.
  332.      */
  333.     global boolean ProgressPackage (integer percent)
  334.     {
  335.     if (_package_popup)
  336.     {
  337.         UI::ChangeWidget (`id(`progress), `Value, percent);
  338.         return UI::PollInput () != `abort;
  339.     }
  340.     else if (Mode::commandline()) {
  341.         CommandLine::PrintVerboseNoCR(clear_string + sformat("%1%%", percent));
  342.         if (percent == 100)
  343.         {
  344.         // sleep for a wile
  345.         sleep(200);
  346.         // remove the progress
  347.         CommandLine::PrintVerboseNoCR(clear_string);
  348.         }
  349.     }
  350.  
  351.     return true;
  352.     }
  353.  
  354.  
  355.     /**
  356.      *  After package install.
  357.      *
  358.      *  return "" for ignore
  359.      *  return "R" for retry
  360.      *  return "C" for abort (not implemented !)
  361.      */
  362.     global string DonePackage (integer error, string reason)
  363.     {
  364.     if (_package_popup)
  365.         UI::CloseDialog();
  366.     _package_popup = false;
  367.  
  368.     if (error != 0)
  369.     {
  370.         string infopath = (string) SCR::Read (.target.tmpdir) + "/rpmlog";
  371.         SCR::Execute (.target.bash, "/usr/bin/tail '" + String::Quote (Installation::destdir)
  372.               + Directory::logdir + "/y2logRPM' > " + infopath);
  373.         string info = reason + "\n---\n" + (string) SCR::Read (.target.string, [infopath, "-?-"]);
  374.  
  375.         string message = sformat ( _deleting_package ? 
  376.         // error popup during package installation, %1 is the name of the package
  377.         _("Removal of package %1 failed.")
  378.         // error popup during package installation, %1 is the name of the package
  379.         : _("Installation of package %1 failed.")
  380.           , _package_name);
  381.  
  382.         if (Mode::commandline()) {
  383.         CommandLine::Print(message);
  384.         CommandLine::Print(info);
  385.  
  386.         // ask user in the interactive mode
  387.         if (CommandLine::Interactive())
  388.         {
  389.             CommandLine::Print("");
  390.  
  391.             // command line mode - ask user whether installation of the failed package should be retried
  392.             CommandLine::Print(_("Retry installation of the package?"));
  393.  
  394.             if (CommandLine::YesNo())
  395.             {
  396.             // return Retry
  397.             return "R";
  398.             }
  399.  
  400.             // command line mode - ask user whether the installation should be aborted
  401.             CommandLine::Print(_("Abort the installation?"));
  402.             if (CommandLine::YesNo())
  403.             {
  404.             // return Abort
  405.             return "C";
  406.             }
  407.  
  408.             // otherwise return Ignore (default)
  409.             return "";
  410.         }
  411.         }
  412.         else {
  413.         term button_box = `HBox (`PushButton (`id(`abort), Label::AbortButton()),
  414.                      `PushButton(`id(`retry), Label::RetryButton()),
  415.                      `PushButton(`id(`ignore), Label::IgnoreButton()));
  416.  
  417.         if ( showLongInfo )
  418.         {
  419.             UI::OpenDialog( `opt(`decorated), LayoutPopup (message, button_box, 10, true) );
  420.             UI::ReplaceWidget(`id(`info), `RichText (`opt(`plainText), info) );
  421.         }
  422.         else
  423.         {
  424.             UI::OpenDialog( `opt(`decorated),  LayoutPopup (message, button_box, 2, false) );
  425.             UI::ReplaceWidget(`id(`info), `Empty() );
  426.         }
  427.  
  428.         any r = nil;
  429.  
  430.         repeat {
  431.             r = UI::UserInput();
  432.             if ( r == `show )
  433.             {
  434.             showLongInfo = ShowLogInfo (message, button_box);
  435.             if (showLongInfo)
  436.             {
  437.                 UI::ReplaceWidget(`id(`info), `RichText (`opt(`plainText), info) );
  438.             }
  439.             else
  440.             {
  441.                 UI::ReplaceWidget(`id(`info), `Empty() );
  442.             }
  443.             }
  444.         } until (r == `abort || r == `retry || r == `ignore);
  445.  
  446.         y2milestone ("DonePackage %1", r);
  447.  
  448.         UI::CloseDialog();
  449.  
  450.         if (r == `abort)
  451.             return "C";
  452.         if (r == `retry)
  453.             return "R";
  454.         }
  455.  
  456.         // default: ignore
  457.     }
  458.  
  459.     return "";
  460.     }
  461.  
  462.  
  463. //=============================================================================
  464. //    MEDIA CHANGE
  465. //=============================================================================
  466.  
  467.  
  468.     //-------------------------------------------------------------------------
  469.     //
  470.     // media change callback
  471.     //
  472.     // if current == -1, show "Ignore"
  473.     //
  474.     // return "" for ok, retry
  475.     // return "E" for eject media
  476.     // return "I" for ignore bad media
  477.     // return "S" for skip this media
  478.     // return "C" for cancel (not implemented !)
  479.     // return url to change media URL
  480.  
  481.     global string MediaChange (string error, string url, string product,
  482.                       integer current, string current_label,
  483.                       integer wanted, string wanted_label,
  484.                       boolean double_sided)
  485.     {
  486.     import "Mode";
  487.  
  488.     if (!Mode::normal ())
  489.     {
  490.         import "SlideShow";
  491.         SlideShow::StopTimer();
  492.     }
  493.  
  494.     y2milestone ("MediaChange err'%1', url'%2', prd'%3', cur'%4'/'%5', wan'%6'/'%7'",
  495.              error, url, product, current, current_label, wanted, wanted_label);
  496.  
  497.     map url_tokens = URL::Parse (url);
  498.     string url_scheme = url_tokens["scheme"]:"";
  499.     url_scheme = tolower (url_scheme);
  500.  
  501.     // true if it makes sense to offer an eject button (for cd/dvd only ...)
  502.     boolean offer_eject_button = url_scheme == "cd" || url_scheme == "dvd";
  503.  
  504.     if (issubstring (error, "ERROR(InstSrc:E_bad_id)"))
  505.     {
  506.         error =
  507.         // error report
  508. _("<p>The source at the specified URL now provides a different media ID.
  509. If the URL is correct, this indicates that the source content has changed. To 
  510. continue using this source, start <b>Change Source of Installation</b> from 
  511. the YaST control center and refresh the installation source.</p>\n");
  512.     }
  513.  
  514.     if (wanted_label == "")
  515.     {
  516.         // will be used in conjunction with other text below
  517.         // prompt for user to insert the correct CD/DVD
  518.         string medianame = "CD "; // FIXME?
  519.         if (url_scheme == "cd")
  520.         {
  521.         medianame = "CD ";
  522.         }
  523.         if (url_scheme == "dvd")
  524.         {
  525.         medianame = "DVD ";
  526.         }
  527.  
  528.         string mediaside = sformat ("%1", (medianame + wanted));
  529.  
  530.         if (double_sided)
  531.         {
  532.         // media is double sided, we want the user to insert the 'Side A' of the media
  533.         // the complete string will be "<product> <media> <number>, <side>"
  534.         // e.g. "'SuSE Linux 9.0' DVD 1, Side A"
  535.         string side = _("Side A");
  536.         if ((wanted & 1) == 0)
  537.         {
  538.             // media is double sided, we want the user to insert the 'Side B' of the media
  539.             side = _("Side B");
  540.         }
  541.         wanted = (wanted + 1) >> 1;
  542.         mediaside = sformat ("%1", (medianame + wanted)) + ", " + side;
  543.         }
  544.  
  545.         wanted_label = sformat ("%1 %2", product, mediaside);
  546.     }
  547.  
  548.     // prompt to insert product (%1 == "SuSE Linux version 9.2 CD 2")
  549.     string message = sformat (_("Insert\n'%1'"), wanted_label);
  550.     // with network source it doesn't make sense to ask for disk
  551.     if (url_scheme == "dir")
  552.     {
  553.         // report error while accessing local directory with product (%1 == "SuSE Linux ...")
  554.         message = sformat (_("Cannot access installation media\n%1.
  555. Check that the directory is accessible."), wanted_label);
  556.     }
  557.     else if (url_scheme != "cd" && url_scheme != "dvd")
  558.     {
  559.         // report error while accessing network media of product (%1 == "SuSE Linux ...")
  560.         message = sformat (_("Cannot access installation media \n%1.
  561. Check that the server is accessible."), wanted_label);
  562.     }
  563.  
  564.     // currently unused
  565.     string media_prompt = _("The correct catalog medium could not be mounted.");
  566.  
  567.     // --------------------------------------
  568.     // build up button box
  569.  
  570.     term button_box = `HBox (`PushButton (`id(`retry), `opt(`default), Label::OKButton()));
  571.  
  572.     if (current == -1)            // wrong media id, offer "Ignore"
  573.     {
  574.         button_box = add (button_box, `PushButton(`id(`ignore), Label::IgnoreButton()));
  575.     }
  576.  
  577.     button_box = add (button_box, `PushButton (`id(`cancel), Label::AbortButton()));
  578.  
  579.     // push button label during media change popup, user can skip
  580.     // this media (CD) so no packages from this media will be installed
  581.     button_box = add (button_box, `PushButton (`id(`skip), _("&Skip")));
  582.  
  583.     if (offer_eject_button)
  584.     {
  585.         // push button label during media change popup, user can eject the CD/DVD
  586.         button_box = add (button_box, `PushButton (`id(`eject), _("&Eject")));
  587.     }
  588.  
  589.     if (Mode::commandline())
  590.     {
  591.         CommandLine::Print(message);
  592.         CommandLine::Print(error);
  593.  
  594.         // ask user in the interactive mode
  595.         if (CommandLine::Interactive())
  596.         {
  597.         CommandLine::Print("");
  598.  
  599.         // command line mode - ask user whether installation of the failed package should be retried
  600.         CommandLine::Print(_("Retry the installation?"));
  601.  
  602.         if (CommandLine::YesNo())
  603.         {
  604.             // return Retry
  605.             return "";
  606.         }
  607.  
  608.         // command line mode - ask user whether the installation should be aborted
  609.         CommandLine::Print(_("Skip the medium?"));
  610.         if (CommandLine::YesNo())
  611.         {
  612.             // return Skip
  613.             return "S";
  614.         }
  615.  
  616.         // otherwise ignore the medium
  617.         CommandLine::Print(_("Ignoring the bad medium..."));
  618.         return "I";
  619.         }
  620.  
  621.         return "S";
  622.     }
  623.  
  624.     if ( showLongInfo )
  625.     {
  626.         UI::OpenDialog( `opt(`decorated), LayoutPopup (message, button_box, 10, true) );
  627.         /* TextEntry label */
  628.         UI::ReplaceWidget(`id(`info), `VBox (`TextEntry (`id(`url), _("&URL")), `RichText(error)) );
  629.         UI::ChangeWidget(`id(`url), `Value, url);
  630.     }
  631.     else
  632.     {
  633.         UI::OpenDialog( `opt(`decorated), LayoutPopup (message, button_box, 2, false) );
  634.         UI::ReplaceWidget(`id(`info), `Empty() );
  635.     }
  636.  
  637.     any r = nil;
  638.  
  639.     repeat {
  640.         r = UI::UserInput();
  641.         if ( r == `show )
  642.         {
  643.         showLongInfo = ShowLogInfo (message, button_box);
  644.         if (showLongInfo)
  645.         {
  646.             /* TextEntry label */
  647.             UI::ReplaceWidget(`id(`info), `VBox (`TextEntry (`id(`url), _("&URL")), `RichText(error)) );
  648.             UI::ChangeWidget(`id(`url), `Value, url);
  649.         }
  650.         else
  651.         {
  652.             UI::ReplaceWidget(`id(`info), `Empty() );
  653.         }
  654.         }
  655.         if (r == `retry || r == `url)
  656.         {
  657.         if (showLongInfo)    // id(`url) must exist
  658.         {
  659.             string newurl = (string) UI::QueryWidget(`id(`url), `Value);
  660.             if (newurl != url)
  661.             {
  662.             url = newurl;
  663.             r = `url;
  664.             }
  665.         }
  666.         }
  667.     } until (r == `cancel || r == `retry || r == `eject || r == `skip || r == `ignore || r == `url);
  668.  
  669.     y2milestone ("MediaChange %1", r);
  670.  
  671.     UI::CloseDialog();
  672.  
  673.     if (!Mode::normal ())
  674.     {
  675.         import "SlideShow";
  676.         SlideShow::StartTimer();
  677.     }
  678.  
  679.     if (r == `cancel)
  680.         return "C";
  681.     if (r == `ignore)
  682.         return "I";
  683.     if (r == `skip)
  684.         return "S";
  685.     if (r == `eject)
  686.         return "E";
  687.  
  688.     if (!Mode::normal ())
  689.     {
  690.         import "SlideShow";
  691.         SlideShow::SetCurrentCdNo (_current_source, wanted);
  692.     }
  693.  
  694.     if (r == `url)
  695.     {
  696.         return url;
  697.     }
  698.  
  699.     return "";
  700.     }
  701.  
  702.  
  703.     /**
  704.      * dummy source change callback, see SlideShowCallbacks for the real one
  705.      */
  706.     global void SourceChange (integer source, integer medianr)
  707.     {
  708.     y2milestone ("SourceChange (%1, %2)", source, medianr);
  709.     _current_source = source;
  710.     }
  711.  
  712. // reference couter to the open popup window
  713. integer _source_open = 0;
  714.  
  715. void OpenSourcePopup(string text)
  716. {
  717.     if (_source_open == 0)
  718.     {
  719.     // the popup doesn't exist
  720.     y2milestone("Opening source progress popup: %1", text);
  721.  
  722.     // if the text is too long then display only part of the message
  723.     // and then refresh the label to the full string
  724.     // reason: display a small popup, but user can resize it to see
  725.     // the full message
  726.     integer max_size = 60;
  727.     string display = text;
  728.     boolean refresh_label = false;
  729.  
  730.  
  731.     // truncate long text
  732.     if (size(display) > max_size)
  733.     {
  734.         // ellipsis appended to a truncated text (if it's too long)
  735.         display = substring(text, 0, max_size - 1) + _("...");
  736.         refresh_label = true;
  737.     }
  738.  
  739.     UI::OpenDialog(
  740.         `VBox(
  741.         `HSpacing(max_size),
  742.         `Heading(`id(`label), `opt(`hstretch), display),
  743.         `ProgressBar (`id (`progress), " ", 100, 0)
  744.         )
  745.     );
  746.  
  747.     // set the full text if needed
  748.     if (refresh_label)
  749.     {
  750.         UI::ChangeWidget(`label, `Value, text);
  751.     }
  752.     }
  753.     else
  754.     {
  755.     // refresh the labels in the popup
  756.     UI::ChangeWidget(`progress, `Label, text);
  757.     // reset the progressbar
  758.     UI::ChangeWidget(`progress, `Value, 0);
  759.     y2milestone("OpenSourcePopup: new label: %1", text);
  760.     }
  761.  
  762.     _source_open = _source_open + 1;
  763.     y2milestone("OpenSourcePopup: _source_open: %1", _source_open);
  764. }
  765.  
  766. boolean SourcePopupSetProgress(integer value)
  767. {
  768.     if (_source_open > 0)
  769.     {
  770.     UI::ChangeWidget (`id (`progress), `Value, value);
  771.     any input = UI::PollInput ();
  772.     if (input == `abort)
  773.         return false;
  774.     }
  775.     return true;
  776. }
  777.  
  778. void CloseSourcePopup()
  779. {
  780.     _source_open = _source_open - 1;
  781.  
  782.     // set 100% progress
  783.     SourcePopupSetProgress(100);
  784.  
  785.     if (_source_open == 0)
  786.     {
  787.     y2milestone("Closing source progress popup");
  788.     UI::CloseDialog();
  789.     }
  790.     y2milestone("CloseSourcePopup: _source_open: %1", _source_open);
  791. }
  792.  
  793. global void SourceCreateStart(string url) {
  794.     y2milestone ("SourceCreateStart: %1", url);
  795.  
  796.     // popup label (%1 is source URL)
  797.     string msg = sformat(_("Creating source %1"), url);
  798.  
  799.     if (Mode::commandline()) {
  800.     CommandLine::Print(msg);
  801.     }
  802.     else
  803.     {
  804.     OpenSourcePopup(sformat(_("Creating source %1"), url));
  805.     }
  806. }
  807.  
  808. global boolean SourceCreateProgress(integer percent) {
  809.     boolean ret = SourcePopupSetProgress(percent);
  810.     y2milestone("SourceCreateProgress(%1) = %2", percent, ret);
  811.  
  812.     return ret;
  813. }
  814.  
  815. global symbol SourceCreateError (string url, symbol error, string description) {
  816.     y2milestone ("Source create: error: url: %1, error: %2, description: %3", url, error, description);
  817.  
  818.     // error message - a label followed by a richtext with details
  819.     string message = _("Error occurred while creating the catalog.");
  820.  
  821.     if (error == `NOT_FOUND)
  822.     // error message - a label followed by a richtext with details
  823.     message = _("Unable to retrieve the remote catalog description.");
  824.     else if (error == `IO)
  825.     // error message - a label followed by a richtext with details
  826.     message = _("An error occurred while retrieving the new metadata.");
  827.     else if (error == `INVALID)
  828.     // error message - a label followed by a richtext with details
  829.     message = _("The source is not valid.");
  830.     else if (error == `REJECTED)
  831.     // error message - a label followed by a richtext with details
  832.     message = _("The source metadata is invalid.");
  833.  
  834.     if (Mode::commandline())
  835.     {
  836.     CommandLine::Print(message);
  837.     CommandLine::Print(url);
  838.     CommandLine::Print(description);
  839.  
  840.     // ask user in the interactive mode
  841.     if (CommandLine::Interactive())
  842.     {
  843.         CommandLine::Print("");
  844.  
  845.         // command line mode - ask user whether the source refreshment should be retried
  846.         CommandLine::Print(_("Retry?"));
  847.  
  848.         if (CommandLine::YesNo())
  849.         {
  850.         // return Retry
  851.         return `RETRY;
  852.         }
  853.     }
  854.  
  855.     return `ABORT;
  856.     }
  857.     string detail = sformat ("%1<br>%2", url, description);
  858.     UI::OpenDialog (`VBox (
  859.     `Label (message),
  860.     `RichText(detail),
  861.     `HBox (
  862.         `PushButton (`id (`RETRY), Label::RetryButton()),
  863.         `PushButton (`id (`ABORT), Label::AbortButton())
  864.     )
  865.     ));
  866.     symbol ret = (symbol)UI::UserInput ();
  867.     UI::CloseDialog ();
  868.     y2milestone ("Source create error: Returning %1", ret);
  869.  
  870.     if (ret == `RETRY)
  871.     {
  872.     // The start callback will be evaluated again,
  873.     // but the end callback will be called just once.
  874.     // This call replaces the missing end callback.
  875.     CloseSourcePopup();
  876.     }
  877.  
  878.     return ret;
  879. }
  880.  
  881. global void SourceCreateEnd(string url, symbol error, string description)
  882. {
  883.     CloseSourcePopup();
  884.  
  885.     y2milestone ("Source create end: error: url: %1, error: %2, description: %3", url, error, description);
  886. }
  887.  
  888.  
  889.  
  890. global void SourceProbeStart(string url)
  891. {
  892.     y2milestone ("SourceProbeStart: %1", url);
  893.  
  894.     // popup label (%1 is source URL)
  895.     string msg = sformat(_("Probing source %1"), url);
  896.  
  897.     if (Mode::commandline()) {
  898.     CommandLine::Print(msg);
  899.     }
  900.     else
  901.     {
  902.     OpenSourcePopup(_("Probing source..."));
  903.     OpenSourcePopup(sformat(_("Probing source %1"), url));
  904.     }
  905. }
  906.  
  907.  
  908. global void SourceProbeFailed(string url, string type)
  909. {
  910.     y2milestone("Source %1 is not %2 source", url, type);
  911. }
  912.  
  913. global void SourceProbeSucceeded(string url, string type)
  914. {
  915.     y2milestone("Source %1 is type %2", url, type);
  916. }
  917.  
  918.  
  919. global boolean SourceProbeProgress(string url, integer value)
  920. {
  921.     return SourcePopupSetProgress(value);
  922. }
  923.  
  924. global symbol SourceProbeError(string url, symbol error, string description) {
  925.  
  926.     y2milestone ("Source probe: error: url: %1, error: %2, description: %3", url, error, description);
  927.  
  928.     // error message - a label followed by a richtext with details
  929.     string message = _("Error occurred while probing the source.");
  930.  
  931.     if (error == `NOT_FOUND)
  932.     // error message - a label followed by a richtext with details
  933.     message = _("Unable to retrieve the remote catalog description.");
  934.     else if (error == `IO)
  935.     // error message - a label followed by a richtext with details
  936.     message = _("An error occurred while retrieving the new metadata.");
  937.     else if (error == `INVALID)
  938.     // error message - a label followed by a richtext with details
  939.     message = _("The source is not valid.");
  940.     else if (error == `NO_ERROR)
  941.     // error message - a label followed by a richtext with details
  942.     message = _("Source probing details.");
  943.     else if (error == `REJECTED)
  944.     // error message - a label followed by a richtext with details
  945.     message = _("Source metadata is invalid.");
  946.  
  947.     if (Mode::commandline())
  948.     {
  949.     CommandLine::Print(message);
  950.     CommandLine::Print(url);
  951.     CommandLine::Print(description);
  952.  
  953.     // ask user in the interactive mode
  954.     if (CommandLine::Interactive())
  955.     {
  956.         CommandLine::Print("");
  957.  
  958.         // command line mode - ask user whether the source refreshment should be retried
  959.         CommandLine::Print(_("Retry?"));
  960.  
  961.         if (CommandLine::YesNo())
  962.         {
  963.         // return Retry
  964.         return `RETRY;
  965.         }
  966.     }
  967.  
  968.     return `ABORT;
  969.     }
  970.     string detail = sformat ("%1<br>%2", url, description);
  971.     UI::OpenDialog (`VBox (
  972.     `Label (message),
  973.     `RichText(detail),
  974.     `HBox (
  975.         `PushButton (`id (`RETRY), Label::RetryButton()),
  976.         `PushButton (`id (`ABORT), Label::AbortButton())
  977.     )
  978.     ));
  979.     symbol ret = (symbol)UI::UserInput ();
  980.     UI::CloseDialog ();
  981.     y2milestone ("Source probe error: Returning %1", ret);
  982.     return ret;
  983. }
  984.  
  985. global void SourceProbeEnd(string url, symbol error, string description) {
  986.     CloseSourcePopup();
  987.     CloseSourcePopup();
  988.  
  989.     y2milestone ("Source probe end: error: url: %1, error: %2, description: %3", url, error, description);
  990. }
  991.  
  992.  
  993. global void SourceReportStart(integer source_id, string url, string task)
  994. {
  995.     y2milestone("Source report start: src: %1, URL: %2, task: %3", source_id, url, task);
  996.  
  997.     if (Mode::commandline()) {
  998.     CommandLine::Print(task);
  999.     }
  1000.     else
  1001.     {
  1002.     OpenSourcePopup(task);
  1003.     }
  1004. }
  1005.  
  1006. global boolean SourceReportProgress(integer value)
  1007. {
  1008.     boolean ret = SourcePopupSetProgress(value);
  1009.     y2debug("SourceReportProgress(%1) = %2", value, ret);
  1010.  
  1011.     return ret;
  1012. }
  1013.  
  1014.  
  1015. global symbol SourceReportError(integer source_id, string url, symbol error, string description) {
  1016.     y2milestone ("Source report: error: id: %1, url: %2, error: %3, description: %4", source_id, url, error, description);
  1017.  
  1018.     // error message - a label followed by a richtext with details
  1019.     string message = sformat(_("Source %1"), url);
  1020.  
  1021.     if (error == `NOT_FOUND)
  1022.     // error message - a label followed by a richtext with details
  1023.     message = _("Unable to retrieve the remote catalog description.");
  1024.     else if (error == `IO)
  1025.     // error message - a label followed by a richtext with details
  1026.     message = _("An error occurred while retrieving the new metadata.");
  1027.     else if (error == `INVALID)
  1028.     // error message - a label followed by a richtext with details
  1029.     message = _("The source is not valid.");
  1030.  
  1031.     if (Mode::commandline())
  1032.     {
  1033.     CommandLine::Print(message);
  1034.     CommandLine::Print(url);
  1035.     CommandLine::Print(description);
  1036.  
  1037.     // ask user in the interactive mode
  1038.     if (CommandLine::Interactive())
  1039.     {
  1040.         CommandLine::Print("");
  1041.  
  1042.         // command line mode - ask user whether the source refreshment should be retried
  1043.         CommandLine::Print(_("Retry?"));
  1044.  
  1045.         if (CommandLine::YesNo())
  1046.         {
  1047.         // return Retry
  1048.         return `RETRY;
  1049.         }
  1050.     }
  1051.  
  1052.     return `ABORT;
  1053.     }
  1054.     string detail = sformat ("%1<br>%2", url, description);
  1055.     UI::OpenDialog (`VBox (
  1056.     `Label (message),
  1057.     `RichText(detail),
  1058.     `HBox (
  1059.         `PushButton (`id (`RETRY), Label::RetryButton()),
  1060.         `PushButton (`id (`ABORT), Label::AbortButton())
  1061.     )
  1062.     ));
  1063.     symbol ret = (symbol)UI::UserInput ();
  1064.     UI::CloseDialog ();
  1065.     y2milestone ("Source report error: Returning %1", ret);
  1066.  
  1067.     if (ret == `RETRY)
  1068.     {
  1069.     // The start callback will be evaluated again,
  1070.     // but the end callback will be called just once.
  1071.     // This call replaces the missing end callback.
  1072.     CloseSourcePopup();
  1073.     }
  1074.  
  1075.     return ret;
  1076. }
  1077.  
  1078. global void SourceReportEnd(integer src_id, string url, string task, symbol error, string description)
  1079. {
  1080.     CloseSourcePopup();
  1081.  
  1082.     y2milestone ("Source report end: src: %1, url: %2, task: %3, error: %4, description: %5", src_id, url, task, error, description);
  1083. }
  1084.  
  1085.     /** at start of delta providal
  1086.      *
  1087.      */
  1088.     global boolean StartDeltaProvide (string name, integer archivesize)
  1089.     {
  1090.     string sz = String::FormatSizeWithPrecision (archivesize, 2, false);
  1091.     if (Mode::commandline())
  1092.     {
  1093.         CommandLine::PrintVerbose(sformat(_("Downloading delta RPM package %1 (%2)..."), name, sz));
  1094.     }
  1095.     else {
  1096.         if (_provide_popup)
  1097.         UI::CloseDialog ();
  1098.         // popup heading
  1099.         term providebox = ProgressBox (_("Downloading Delta RPM package"), name, sz);
  1100.         UI::OpenDialog(providebox);
  1101.         _provide_popup = true;
  1102.     }
  1103.     return true;
  1104.     }
  1105.  
  1106.     /** at start of delta application
  1107.      *
  1108.      */
  1109.     global boolean StartDeltaApply (string name)
  1110.     {
  1111.     if (Mode::commandline())
  1112.     {
  1113.         CommandLine::PrintVerbose(sformat(_("Applying delta RPM package %1..."), name));
  1114.     }
  1115.     else {
  1116.       // popup heading
  1117.       term progressbox = `VBox(
  1118.         `HSpacing(40),
  1119.         // popup heading
  1120.         `Heading (_("Applying delta RPM package")),
  1121.         `Left (`HBox (
  1122.         `Left (`Label (`opt (`boldFont), _("Package: "))),
  1123.         `Left (`Label (name))
  1124.         )),
  1125.         `ProgressBar(`id(`progress), "", 100, 0 )
  1126.       );
  1127.       if (_provide_popup)
  1128.         UI::CloseDialog ();
  1129.       UI::OpenDialog(progressbox);
  1130.       _provide_popup = true;
  1131.     }
  1132.     return true;
  1133.     }
  1134.  
  1135.     /** at start of patch providal
  1136.      *
  1137.      */
  1138.     global boolean StartPatchProvide (string name, integer archivesize)
  1139.     {
  1140.     string sz = String::FormatSizeWithPrecision (archivesize, 2, false);
  1141.     if (Mode::commandline())
  1142.     {
  1143.         CommandLine::PrintVerbose(sformat(_("Downloading patch RPM package %1 (%2)..."), name, sz));
  1144.     }
  1145.     else {
  1146.         if (_provide_popup)
  1147.         UI::CloseDialog ();
  1148.         // popup heading
  1149.         term providebox = ProgressBox (_("Downloading Patch RPM Package"), name, sz);
  1150.         UI::OpenDialog(providebox);
  1151.         _provide_popup = true;
  1152.     }
  1153.     return true;
  1154.     }
  1155.  
  1156.     global void FinishPatchDeltaProvide () {
  1157.     if (_provide_popup)
  1158.     {
  1159.         UI::CloseDialog ();
  1160.         _provide_popup = false;
  1161.     }
  1162.     }
  1163.  
  1164.     global void ProblemDeltaDownload (string descr) {
  1165.     FinishPatchDeltaProvide (); // close popup
  1166.     Report::ShowText (_("Failed to download delta RPM"), descr);
  1167.     }
  1168.  
  1169.     global void ProblemDeltaApply (string descr) {
  1170.     FinishPatchDeltaProvide (); // close popup
  1171.     Report::ShowText (_("Failed to apply delta RPM"), descr);
  1172.     }
  1173.  
  1174.     global void ProblemPatchDownload (string descr) {
  1175.     FinishPatchDeltaProvide (); // close popup
  1176.     Report::ShowText (_("Failed to download patch RPM"), descr);
  1177.     }
  1178.  
  1179.  
  1180.     global string FormatPatchName(string patch_name, string patch_version, string patch_arch)
  1181.     {
  1182.     string patch_full_name = (patch_name != nil && patch_name != "") ? patch_name : "";
  1183.  
  1184.     if (patch_full_name != "")
  1185.     {
  1186.         if (patch_version != nil && patch_version != "")
  1187.         {
  1188.         patch_full_name = patch_full_name + "-" + patch_version;
  1189.         }
  1190.  
  1191.         if (patch_arch != nil && patch_arch != "")
  1192.         {
  1193.         patch_full_name = patch_full_name + "." + patch_arch;
  1194.         }
  1195.  
  1196.     }
  1197.  
  1198.     return patch_full_name;
  1199.     }
  1200.  
  1201.     global void ScriptStart(string patch_name, string patch_version, string patch_arch, string script_path, boolean installation)
  1202.     {
  1203.     string patch_full_name = FormatPatchName(patch_name, patch_version, patch_arch);
  1204.  
  1205.     y2milestone("ScriptStart callback: patch: %1, script: %2, installation: %3", patch_full_name, script_path, installation);
  1206.  
  1207.     if (Mode::commandline())
  1208.     {
  1209.         CommandLine::PrintVerbose(sformat(_("Starting script %1 (patch %2)..."), script_path, patch_full_name));
  1210.     }
  1211.     else
  1212.     {
  1213.         term progressbox = `VBox(
  1214.         `HSpacing(40),
  1215.         // popup heading
  1216.         `Heading(_("Running Script")),
  1217.         `Left(
  1218.             `HBox
  1219.             (
  1220.             // label, script name follows
  1221.             `Left(`Label(`opt(`boldFont), _("Script: "))),
  1222.             `Left(`Label(script_path))
  1223.             ),
  1224.             (patch_full_name != "") ?
  1225.             `HBox
  1226.             (
  1227.                 // label, patch name follows
  1228.                 `Left(`Label(`opt(`boldFont), _("Patch: "))),
  1229.                 `Left(`Label(patch_full_name))
  1230.             )
  1231.             :
  1232.             `Empty()
  1233.         ),
  1234.  
  1235.         // label
  1236.         `LogView(`id(`log), _("Output of the Script")),
  1237.  
  1238.         `PushButton(`id(`abort), Label::AbortButton())
  1239.         );
  1240.  
  1241.         if (_script_popup)
  1242.         UI::CloseDialog ();
  1243.  
  1244.         UI::OpenDialog(progressbox);
  1245.         _script_popup = true;
  1246.     }
  1247.     }
  1248.  
  1249.     global boolean ScriptProgress (boolean ping, string output)
  1250.     {
  1251.     y2milestone("ScriptProgress: ping:%1, output: %2", ping, output);
  1252.  
  1253.     if (_script_popup)
  1254.     {
  1255.         if (ping)
  1256.         {
  1257.         // TODO: refresh progress indicator
  1258.         }
  1259.  
  1260.         if (output != nil && output != "")
  1261.         {
  1262.         // add the output to the log widget
  1263.         UI::ChangeWidget(`id(`log), `Value, output);
  1264.         }
  1265.  
  1266.         any input = UI::PollInput ();
  1267.         if (input == `abort || input == `close)
  1268.         return false;
  1269.     }
  1270.     return true;
  1271.     }
  1272.  
  1273.     global void ScriptProblem(string description)
  1274.     {
  1275.     y2warning("ScriptProblem: %1", description);
  1276.     Popup::Error(description);
  1277.     }
  1278.  
  1279.     global void ScriptFinish()
  1280.     {
  1281.     y2milestone("ScriptFinish");
  1282.  
  1283.     if (_script_popup)
  1284.     {
  1285.         UI::CloseDialog();
  1286.     }
  1287.     }
  1288.  
  1289.     global void Message(string patch_name, string patch_version, string patch_arch, string message)
  1290.     {
  1291.     string patch_full_name = FormatPatchName(patch_name, patch_version, patch_arch);
  1292.     y2milestone("Message (%1): %2", patch_full_name, message);
  1293.  
  1294.     if (patch_full_name != "")
  1295.     {
  1296.         // label, %1 is patch name with version and architecture
  1297.         patch_full_name = sformat(_("Patch: %1\n\n"), patch_full_name);
  1298.     }
  1299.  
  1300.     Popup::LongMessage(patch_full_name + message);
  1301.     }
  1302.  
  1303.     global void SetScriptCallbacks()
  1304.     {
  1305.     Pkg::CallbackScriptStart("PackageCallbacks::ScriptStart");
  1306.     Pkg::CallbackScriptProgress("PackageCallbacks::ScriptProgress");
  1307.     Pkg::CallbackScriptProblem("PackageCallbacks::ScriptProblem");
  1308.     Pkg::CallbackScriptFinish("PackageCallbacks::ScriptFinish");
  1309.  
  1310.     Pkg::CallbackMessage("PackageCallbacks::Message");
  1311.     }
  1312.  
  1313.     global void ClearScriptCallbacks()
  1314.     {
  1315.     Pkg::CallbackScriptStart("");
  1316.     Pkg::CallbackScriptProgress("");
  1317.     Pkg::CallbackScriptProblem("");
  1318.     Pkg::CallbackScriptFinish("");
  1319.  
  1320.     Pkg::CallbackMessage("");
  1321.     }
  1322.  
  1323. //=============================================================================
  1324. //    constructor and callback init
  1325. //=============================================================================
  1326.  
  1327.  
  1328.  
  1329.     /**
  1330.      * constructor
  1331.      *
  1332.      */
  1333.  
  1334.     global void PackageCallbacks()
  1335.     {
  1336.     y2milestone ( "PackageCallbacks constructor" );
  1337.     PackageCallbacksInit::InitPackageCallbacks ();
  1338.     }
  1339.  
  1340.  
  1341.     global void StartDownload (string url, string localfile)
  1342.     {
  1343.     // heading of popup
  1344.     string heading = _("Download");
  1345.  
  1346.     // message in a progress popup
  1347.     string message = sformat (_("Downloading: %1"), url);
  1348.  
  1349.     if (Mode::commandline()) {
  1350.         CommandLine::PrintVerbose(message);
  1351.     }
  1352.     else
  1353.     {
  1354.         UI::OpenDialog (`opt(`decorated),
  1355.                 `VBox (`Heading (heading) ,
  1356.                    `VBox (
  1357.                       `Label(message),
  1358.                       `HSpacing(60),
  1359.                       `HBox(
  1360.                         `HSpacing(2),
  1361.                         `ProgressBar (`id(`progress),
  1362.                                   _("Status"), 100),
  1363.                         `HSpacing(2)
  1364.                         ),
  1365.                       `VSpacing(1),
  1366.                       `HBox (
  1367.                         `HStretch (),
  1368.                         `PushButton (`id (`abort), Label::AbortButton ()),
  1369.                         `HStretch ()
  1370.                       ),
  1371.                       `VSpacing(1)
  1372.                       )
  1373.                    )
  1374.                 );
  1375.  
  1376.         UI::ChangeWidget (`id(`progress), `Value, 0);
  1377.     }
  1378.     }
  1379.  
  1380.  
  1381.     global boolean ProgressDownload (integer percent, integer expected_size)
  1382.     {
  1383.     if (Mode::commandline()) {
  1384.         CommandLine::PrintVerboseNoCR(clear_string + sformat("%1%%", percent));
  1385.         if (percent == 100)
  1386.         {
  1387.         // sleep for a wile
  1388.         sleep(200);
  1389.         // remove the progress
  1390.         CommandLine::PrintVerboseNoCR(clear_string);
  1391.         // print newline when reached 100%
  1392.         }
  1393.     }
  1394.     else {
  1395.         UI::ChangeWidget (`id(`progress), `Value, percent);
  1396.         return UI::PollInput () != `abort;
  1397.     }
  1398.     }
  1399.  
  1400.  
  1401.     global void DoneDownload (integer error_value, string error_text)
  1402.     {
  1403.     if (error_value != 0)
  1404.     {
  1405.         if (Mode::commandline()) {
  1406.         //error message, %1 is the cause for the error
  1407.         CommandLine::Print(sformat (_("Download failed:
  1408. %1"), error_text));
  1409.         }
  1410.         else
  1411.         {
  1412.         // error message, %1 is the cause for the error
  1413.         Popup::Error (sformat (_("Download failed:
  1414. %1"), error_text));
  1415.         }
  1416.     }
  1417.  
  1418.     UI::CloseDialog ();
  1419.     }
  1420.  
  1421.  
  1422.     global void SetDownloadCallbacks ()
  1423.     {
  1424.     Pkg::CallbackStartDownload ("PackageCallbacks::StartDownload");
  1425.     Pkg::CallbackProgressDownload ("PackageCallbacks::ProgressDownload");
  1426.     Pkg::CallbackDoneDownload ("PackageCallbacks::DoneDownload");
  1427.     }
  1428.  
  1429.     global void ClearDownloadCallbacks ()
  1430.     {
  1431.     Pkg::CallbackStartDownload ("");
  1432.     Pkg::CallbackProgressDownload ("");
  1433.     Pkg::CallbackDoneDownload ("");
  1434.     }
  1435.  
  1436.  
  1437.     global void StartRebuildDB ()
  1438.     {
  1439.     // heading of popup
  1440.     string heading = _("Checking Package Database");
  1441.  
  1442.     // message in a progress popup
  1443.     string message = _("Rebuilding package database. This process can take some time.");
  1444.  
  1445.     // progress bar label
  1446.     string progress_label = _("Status");
  1447.  
  1448.     UI::OpenDialog (`opt(`decorated),
  1449.             `VBox (`Heading (heading) ,
  1450.                    `VBox (
  1451.                       `Label(message),
  1452.                       `HSpacing(60),
  1453.                       `HBox(
  1454.                         `HSpacing(2),
  1455.                         `ProgressBar (`id(`progress),
  1456.                               "", 100),
  1457.                         `HSpacing(2)
  1458.                         ),
  1459.                       `VSpacing(1)
  1460.                       )
  1461.                    )
  1462.             );
  1463.  
  1464.     UI::ChangeWidget (`id(`progress), `Value, 0);
  1465.     }
  1466.  
  1467.  
  1468.     global void ProgressRebuildDB (integer percent)
  1469.     {
  1470.     UI::ChangeWidget (`id(`progress), `Value, percent);
  1471.     }
  1472.  
  1473.  
  1474.     global void StopRebuildDB (integer error_value, string error_text)
  1475.     {
  1476.     if (error_value != 0)
  1477.     {
  1478.         // error message, %1 is the cause for the error
  1479.         Popup::Error (sformat (_("Rebuilding of package database failed:
  1480. %1"), error_text));
  1481.     }
  1482.  
  1483.     UI::CloseDialog ();
  1484.     }
  1485.  
  1486.  
  1487.     global void NotifyRebuildDB (string error_text)
  1488.     {
  1489.     // error popup
  1490.     Popup::Error (sformat (_("Error rebuilding database:
  1491. %1"), error_text));
  1492.     }
  1493.  
  1494.  
  1495.     global void SetRebuildDBCallbacks ()
  1496.     {
  1497.     Pkg::CallbackStartRebuildDb ("PackageCallbacks::StartRebuildDB");
  1498.     Pkg::CallbackProgressRebuildDb ("PackageCallbacks::ProgressRebuildDB");
  1499.     Pkg::CallbackStopRebuildDb ("PackageCallbacks::StopRebuildDB");
  1500.     Pkg::CallbackNotifyRebuildDb ("PackageCallbacks::NotifyRebuildDB");
  1501.     }
  1502.  
  1503.  
  1504.  
  1505.     global void StartConvertDB (string unused1)
  1506.     {
  1507.     // heading of popup
  1508.     string heading = _("Checking Package Database");
  1509.  
  1510.     // message in a progress popup
  1511.     string message = _("Converting package database. This process can take some time.");
  1512.  
  1513.     UI::OpenDialog (`opt(`decorated),
  1514.             `VBox (`Heading (heading) ,
  1515.                    `VBox (
  1516.                       `Label(message),
  1517.                       `HSpacing(60),
  1518.                       `HBox(
  1519.                         `HSpacing(2),
  1520.                         `ProgressBar (`id(`progress),
  1521.                               _("Status"), 100),
  1522.                         `HSpacing(2)
  1523.                         ),
  1524.                       `VSpacing(1)
  1525.                       )
  1526.                    )
  1527.             );
  1528.  
  1529.     UI::ChangeWidget (`id(`progress), `Value, 0);
  1530.     }
  1531.  
  1532.  
  1533.     global void ProgressConvertDB (integer percent, integer unused1,
  1534.                       integer unused2, integer unused3,
  1535.                       integer unused4)
  1536.     {
  1537.     UI::ChangeWidget (`id(`progress), `Value, percent);
  1538.     }
  1539.  
  1540.  
  1541.     global void StopConvertDB (integer error_value, string error_text)
  1542.     {
  1543.     if (error_value != 0)
  1544.     {
  1545.         // error message, %1 is the cause for the error
  1546.         Popup::Error (sformat (_("Conversion of package database failed:
  1547. %1"), error_text));
  1548.     }
  1549.  
  1550.     UI::CloseDialog ();
  1551.     }
  1552.  
  1553.  
  1554.     global string NotifyConvertDB (string message_type, integer unused1,
  1555.                       string detail)
  1556.     {
  1557.     if (message_type == "Nindb")
  1558.     {
  1559.         // error popup
  1560.         Popup::Error (sformat (_("Package %1 is already present in the new database."),
  1561.                    detail));
  1562.         return "";
  1563.     }
  1564.  
  1565.     if (message_type == "Eread")
  1566.     {
  1567.         boolean skip = Popup::YesNoHeadline (Label::ErrorMsg (),
  1568.                         // yes-no popup
  1569.                          _("Error reading from old database.
  1570. Ignore this error and continue?"));
  1571.         return skip ? "SKIP" : "CANCEL";
  1572.     }
  1573.  
  1574.     if (message_type == "Ewrite")
  1575.     {
  1576.         // error popup
  1577.         Popup::Error (_("Error writing to new database"));
  1578.         return "";
  1579.     }
  1580.  
  1581.     y2error ("unknown message_type %1", message_type);
  1582.     }
  1583.  
  1584.  
  1585.     global void SetConvertDBCallbacks ()
  1586.     {
  1587.     Pkg::CallbackStartConvertDb ("PackageCallbacks::StartConvertDB");
  1588.     Pkg::CallbackProgressConvertDb ("PackageCallbacks::ProgressConvertDB");
  1589.     Pkg::CallbackStopConvertDb ("PackageCallbacks::StopConvertDB");
  1590.     Pkg::CallbackNotifyConvertDb ("PackageCallbacks::NotifyConvertDB");
  1591.     }
  1592.  
  1593.  
  1594. // EOF
  1595. }
  1596.