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 / include / packages / common.ycp
Text File  |  2006-11-29  |  6KB  |  246 lines

  1. /**
  2.  * File:    include/package/common.ycp
  3.  * Package:    yast2
  4.  * Summary:    Packages manipulation (common routines)
  5.  * Authors:    Martin Vidner <mvidner@suse.cz>
  6.  *        Michal Svec <msvec@suse.cz>
  7.  *
  8.  * $Id: common.ycp 26523 2005-12-14 15:45:07Z mvidner $
  9.  *
  10.  * The documentation is maintained at
  11.  * <a href="../index.html">.../docs/index.html</a>.
  12.  */
  13.  
  14. {
  15.  
  16. textdomain "base";
  17.  
  18. import "Label";
  19. import "Popup";
  20. import "Wizard";
  21. import "Mode";
  22. import "CommandLine";
  23.  
  24. /* Main module prototypes */
  25.  
  26. global boolean Available(string package);
  27. global boolean Installed(string package);
  28.  
  29. global boolean DoInstall(list<string> packages);
  30. global boolean DoRemove(list<string> packages);
  31. global boolean DoInstallAndRemove(list<string> toinstall, list<string> toremove);
  32.  
  33. /**
  34.  * Are all of these packages available?
  35.  * @param packages list of packages
  36.  * @return boolean true if yes
  37.  */
  38. global define boolean AvailableAll(list<string> packages) {
  39.     string which = find(string p, packages, {
  40.     return ! Available(p);
  41.     });
  42.     return which == nil;
  43. }
  44.  
  45. /**
  46.  * Is any of these packages available?
  47.  * @param packages list of packages
  48.  * @return boolean true if yes
  49.  */
  50. global define boolean AvailableAny(list<string> packages) {
  51.     string which = find(string p, packages, {
  52.     return Available(p);
  53.     });
  54.     return which != nil;
  55. }
  56.  
  57. /**
  58.  * Are all of these packages installed?
  59.  * @param packages list of packages
  60.  * @return boolean true if yes
  61.  */
  62. global define boolean InstalledAll(list<string> packages) {
  63.     string which = find(string p, packages, {
  64.     return ! Installed(p);
  65.     });
  66.     return which == nil;
  67. }
  68.  
  69. /**
  70.  * Is any of these packages installed?
  71.  * @param packages list of packages
  72.  * @return boolean true if yes
  73.  */
  74. global define boolean InstalledAny(list<string> packages) {
  75.     string which = find(string p, packages, {
  76.     return Installed(p);
  77.     });
  78.     return which != nil;
  79. }
  80.  
  81. boolean AskPackages(list<string> packs) {
  82.     string pkgs = mergestring(packs, ", ");
  83.     // the message is followed by list of required packages
  84.     string text = _("These packages need to be installed:") + " " + pkgs;
  85.     CommandLine::Print(text);
  86.  
  87.     return CommandLine::YesNo();
  88. }
  89.  
  90. /**
  91.  * Main package installatio|removal dialog
  92.  * @param packages list of packages
  93.  * @param install true if install, false if remove
  94.  * @param message optional installation|removal text (nil -> standard will be used)
  95.  * @return true on success
  96.  */
  97. boolean PackageDialog(list<string> packages, boolean install, string message) {
  98.  
  99.     y2debug("Asking for packages: %1", packages);
  100.     list<string> packs = filter(string package, packages, {
  101.     return (install ? !Installed(package) : Installed(package));
  102.     });
  103.     y2debug("Remaining packages: %1", packs);
  104.  
  105.     if(size(packs) < 1) return true;
  106.  
  107.     /* Popup Text */
  108.     string text = _("These packages need to be installed:") + "<p>";
  109.     /* Popup Text */
  110.     if(install == false) text = _("These packages need to be removed:") + "<p>";
  111.  
  112.     foreach(string p, packs, { text = text + sformat("%1<br>", p); });
  113.  
  114.     if (message != nil)
  115.     text = sformat (message, mergestring (packs, ", "));
  116.  
  117.     boolean doit = (Mode::commandline()) ? (CommandLine::Interactive() ? AskPackages(packs) : true ) : Popup::AnyQuestionRichText(
  118.     "", text, 40, 10,
  119.     Label::ContinueButton (), Label::CancelButton (),
  120.     `focus_yes
  121.     );
  122.  
  123.     if (doit)
  124.     {
  125.     last_op_canceled = false;
  126.     if(install == false) return DoRemove(packs);
  127.     return DoInstall(packs);
  128.     }
  129.  
  130.     last_op_canceled = true;
  131.     return false;
  132. }
  133.  
  134. /**
  135.  * Install a package with a custom text message
  136.  * @param package to be installed
  137.  * @param message custom text message
  138.  * @return True on success
  139.  */
  140. global boolean InstallMsg(string package, string message) {
  141.     return PackageDialog([package], true, message);
  142. }
  143.  
  144. /**
  145.  * Install list of packages with a custom text message
  146.  * @param packages The list packages to be installed
  147.  * @param message custom text message
  148.  * @return True on success
  149.  */
  150. global boolean InstallAllMsg(list<string> packages, string message) {
  151.     return PackageDialog(packages, true, message);
  152. }
  153.  
  154. global boolean InstallAnyMsg(list<string> packages, string message);
  155. // FIXME
  156.  
  157. /**
  158.  * Remove a package with a custom text message
  159.  * @param package  package to be removed
  160.  * @param message custom text message
  161.  * @return True on success
  162.  */
  163. global boolean RemoveMsg(string package, string message) {
  164.     return PackageDialog([package], false, message);
  165. }
  166.  
  167. /**
  168.  * Remove a list of packages with a custom text message
  169.  * @param packages The list of packages to be removed
  170.  * @param message custom text message
  171.  * @return True on success
  172.  */
  173. global boolean RemoveAllMsg(list<string> packages, string message) {
  174.     return PackageDialog(packages, false, message);
  175. }
  176.  
  177. global boolean Install(string package) {
  178.     return InstallMsg(package, nil);
  179. }
  180.  
  181. global boolean InstallAll(list<string> packages) {
  182.     return InstallAllMsg(packages, nil);
  183. }
  184.  
  185. global boolean InstallAny(list<string> packages);
  186. // FIXME
  187.  
  188. global boolean Remove(string package) {
  189.     return RemoveMsg(package, nil);
  190. }
  191.  
  192. global boolean RemoveAll(list<string> packages) {
  193.     return RemoveAllMsg(packages, nil);
  194. }
  195.  
  196. /**
  197.  * Run SUSEconfig, create new wizard dialog before it,
  198.  * close after it is finished
  199.  */
  200. global void RunSUSEconfig() {
  201.     if (Mode::commandline())
  202.     {
  203.     // in the commandline mode start SuSEconfig in background
  204.     SCR::Execute(.background.run_output, "/sbin/SuSEconfig");
  205.  
  206.     list<string> script_out = [];
  207.     symbol ret = nil;
  208.  
  209.     // print SuSEconfig output
  210.     while((boolean)SCR::Read(.background.output_open) || ((integer)SCR::Read(.background.newlines) > 0))
  211.     {
  212.         script_out = (list<string>)SCR::Read(.background.newout);
  213.  
  214.         foreach(string line, script_out, {
  215.             CommandLine::PrintVerbose(line);
  216.         }
  217.         );
  218.  
  219.         while ((integer)SCR::Read(.background.newlines) == 0 && (boolean)SCR::Read(.background.output_open))
  220.         {
  221.         sleep(200);    // small wait
  222.         }
  223.     }
  224.     }
  225.     else
  226.     {
  227.     Wizard::CreateDialog ();
  228.     // inst_suseconfig returns `auto or `next
  229.     // (update mode or Args(2) is true) => no error checking
  230.     WFM::CallFunction("inst_suseconfig", [$["enable_back":false, "enable_next":false]]);
  231.     Wizard::CloseDialog ();
  232.     }
  233. }
  234.  
  235. /**
  236.  * Return result of the last operation
  237.  * Use immediately after calling any Package*:: function
  238.  * @return true if it last operation was canceled
  239.  */
  240. global boolean LastOperationCanceled() {
  241.     return last_op_canceled;
  242. }
  243.  
  244. /* EOF */
  245. }
  246.