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 / Timezone.ycp < prev    next >
Text File  |  2006-11-29  |  20KB  |  791 lines

  1. /**
  2.  * File:    modules/Timezone.ycp
  3.  * Package:    Country settings
  4.  * Summary:    Timezone related stuff
  5.  * Authors:    Klaus Kaempf <kkaempf@suse.de>
  6.  *        Thomas Roelz <tom@suse.de>
  7.  *
  8.  * $Id: Timezone.ycp 34195 2006-11-09 11:41:43Z jsuchome $
  9.  */
  10.  
  11. {
  12.  
  13. module "Timezone";
  14. textdomain "country";
  15.  
  16. import "Arch";
  17. import "Language";
  18. import "Misc";
  19. import "Mode";
  20. import "Stage";
  21. import "String";
  22. import "ProductFeatures";
  23.  
  24. // --------------------------------------------------------------
  25. // START: Globally defined data to be accessed via Timezone::<variable>
  26. // --------------------------------------------------------------
  27.  
  28. global string timezone = "";    // e.g. "Europe/Berlin"
  29.  
  30. // hwclock parameter
  31. // possible values:
  32. //     ""        dont change timezone
  33. //     "-u"        system clock runs UTC
  34. //   "--localtime"    system clock runs localtime
  35. global string hwclock = "";
  36.  
  37. // The default timezone if set.
  38. //
  39. global string default_timezone = "";
  40.  
  41. // Flag indicating if the user has chosen a timezone.
  42. // To be set from outside.
  43. //
  44. global boolean user_decision = false;
  45. global boolean user_hwclock = false;
  46.  
  47. global integer diff = 0;
  48.  
  49. /**
  50.  * if anyuthing was modified (currently for auto client only)
  51.  */
  52. global boolean modified        = false;
  53.  
  54. /**
  55.  * If there is windows partition, assume that local time is used
  56.  */
  57. global boolean windows_partition    = false;
  58.  
  59. // internal map used to store initial data
  60. map push = $[];
  61.  
  62. // ------------------------------------------------------------------
  63. // END: Globally defined data to be accessed via Timezone::<variable>
  64. // ------------------------------------------------------------------
  65.  
  66.  
  67.  
  68. // ------------------------------------------------------------------
  69. // START: Locally defined data
  70. // ------------------------------------------------------------------
  71.  
  72. string name = "";
  73.  
  74. list < map < string, any> > zonemap = [];
  75.  
  76. // 'language --> default timezone' conversion map
  77. map<string, string> lang2tz = $[];
  78.  
  79. // ------------------------------------------------------------------
  80. // END: Locally defined data
  81. // ------------------------------------------------------------------
  82.  
  83.  
  84. // ---------------------------------------------------------------------------------------
  85. // START: Globally defined functions
  86. // ---------------------------------------------------------------------------------------
  87.  
  88. /**
  89.  * get_lang2tz()
  90.  *
  91.  * Get the language --> timezone conversion map.
  92.  *
  93.  * @return  conversion map
  94.  *
  95.  * @see    get_zonemap()
  96.  */
  97.  
  98. define map<string, string> get_lang2tz () {
  99.  
  100.     if (size (lang2tz) == 0)
  101.     {
  102.     map base_lang2tz = (map) SCR::Read (.target.yast2, "lang2tz.ycp");
  103.     if (base_lang2tz == nil) base_lang2tz = $[];
  104.  
  105.     lang2tz    = (map<string,string>) union (
  106.         base_lang2tz,
  107.         Language::GetLang2TimezoneMap ()
  108.     );
  109.     }
  110.     return lang2tz;
  111. }
  112.  
  113. /**
  114.  * get_zonemap()
  115.  *
  116.  * Get the timezone database.
  117.  *
  118.  * @return  timezone DB (map)
  119.  *
  120.  * @see    get_lang2tz()
  121.  */
  122.  
  123. global define list<map<string,any> > get_zonemap() {
  124.  
  125.     if (size(zonemap) == 0)
  126.     {
  127.     zonemap = (list<map<string,any> >)
  128.         eval (SCR::Read (.target.yast2, "timezone_raw.ycp"));
  129.     if( zonemap == nil ) zonemap = [];
  130.     }
  131.     return zonemap;
  132. }
  133.  
  134. // ------------------------------------------------------------------
  135. // END: Locally defined functions
  136. // ------------------------------------------------------------------
  137. /**
  138.  * Set()
  139.  *
  140.  * Set system to selected timezone.
  141.  *
  142.  * @param    string timezone to select, e.g. "Europe/Berlin"
  143.  *
  144.  * @return    the number of the region that contains the timezone
  145.  *
  146.  */
  147. global define integer Set (string zone, boolean really) {
  148.  
  149.     list <map <string, any> > zmap = get_zonemap();
  150.  
  151.     // Set the new timezone internally
  152.     timezone = zone;
  153.  
  154.     integer sel = 0;
  155.     while (sel<size (zmap) && !haskey (zmap[sel,"entries"]:$[], zone))
  156.     {
  157.     sel = sel + 1;
  158.     }
  159.  
  160.     name    = zmap [sel,"name"]:"" + " / " + zmap[sel,"entries",zone]:zone;
  161.  
  162.     // Adjust system to the new timezone.
  163.     //
  164.     if (!Mode::config () && really )
  165.     {
  166.     string cmd = "/usr/sbin/zic -l " + timezone;
  167.     y2milestone( "Set cmd %1", cmd );
  168.     y2milestone( "Set ret %1", SCR::Execute( .target.bash_output, cmd ));
  169.     if (!Arch::s390 ())
  170.     {
  171.         cmd = "/sbin/hwclock --hctosys " + hwclock;
  172.         y2milestone( "Set cmd %1", cmd );
  173.         y2milestone( "Set ret %1", SCR::Execute(.target.bash_output, cmd ));
  174.     }
  175.     }
  176.  
  177.     // On first assignment store default timezone.
  178.     //
  179.     if (default_timezone == "")
  180.     {
  181.     default_timezone = timezone;
  182.     y2milestone( "Set default timezone: <%1>", timezone );
  183.     }
  184.  
  185.     y2milestone( "Set timezone:%1 sel:%2 name:%3", timezone, sel, name );
  186.     return sel;
  187. }
  188.  
  189. /**
  190.  * Convert the duplicated timezone to the only one supported
  191.  * Temporary solution - a result of discussion of bug #47472
  192.  * @param tmz current timezone
  193.  */
  194. global define string UpdateTimezone (string tmz) {
  195.  
  196.     string updated_tmz    = tmz;
  197.  
  198.     map tmz_duplicates    = $[
  199.     "Australia/Adelaide"    : "Australia/South",
  200.     "Australia/Darwin"    : "Australia/North",
  201.     "Australia/Sydney"    : "Australia/NSW",
  202.     "Australia/Canberra"    : "Australia/ACT",
  203.     "Australia/Brisbane"    : "Australia/Queensland",
  204.     "Australia/Hobart"    : "Australia/Tasmania",
  205.     "Australia/Perth"    : "Australia/West",
  206.     // etc.
  207.     "America/Los_Angeles"    : "US/Pacific",
  208.     ];
  209.  
  210.     if (haskey (tmz_duplicates, tmz))
  211.     {
  212.     updated_tmz    = tmz_duplicates[tmz]:tmz;
  213.     y2milestone ("updating timezone from %1 to %2", tmz, updated_tmz);
  214.     // TODO if still not present, search file in /usr/share/zoneinfo
  215.     }
  216.  
  217.     return updated_tmz;
  218. }
  219.  
  220.  
  221.   /**
  222.    * Read timezone settings from sysconfig
  223.    */
  224.   global define void Read () {
  225.  
  226.     hwclock        = Misc::SysconfigRead(.sysconfig.clock.HWCLOCK, hwclock);
  227.     timezone        = Misc::SysconfigRead (.sysconfig.clock.TIMEZONE, timezone);
  228.     default_timezone    =
  229.     Misc::SysconfigRead(.sysconfig.clock.DEFAULT_TIMEZONE, default_timezone);
  230.  
  231.     // get name for cloning purposes
  232.     if (Mode::config ())
  233.     {
  234.     list <map <string, any> > zmap = get_zonemap();
  235.     integer sel = 0;
  236.     while (sel<size (zmap) && !haskey (zmap[sel,"entries"]:$[], timezone))
  237.     {
  238.         sel = sel + 1;
  239.     }
  240.     name    = zmap [sel,"name"]:"" + " / " + zmap[sel,"entries",timezone]:timezone;
  241.     }
  242.   }
  243.  
  244. /**
  245.   * Timezone()
  246.   *
  247.   * The module constructor.
  248.   * Sets the proprietary module data defined globally for public access.
  249.   * This is done only once (and automatically) when the module is loaded for the first time.
  250.   * Calls Set() in initial mode.
  251.   * Reads current timezone from sysconfig in normal mode.
  252.   *
  253.   * @see    Set()
  254.   */
  255. global define void Timezone() {
  256.  
  257.     // Set default values.
  258.     //
  259.     hwclock = "-u";
  260.     if (Stage::initial ())
  261.     {
  262.     // language --> timezone database, e.g. "de_DE" : "Europe/Berlin"
  263.     map<string, string> lang2tz = get_lang2tz();
  264.  
  265.     string new_timezone = lang2tz[Language::language]:"";
  266.     y2milestone( "Timezone new_timezone %1", new_timezone );
  267.  
  268.     if (new_timezone != "")
  269.     {
  270.         Set (new_timezone, true);
  271.     }
  272.     }
  273.     else if (!Mode::config ())
  274.     {
  275.     Read ();
  276.     }
  277.     return;
  278. }
  279.  
  280. /**
  281.  * Set the new time and date given by user
  282.  */
  283. global define void SetTime (string year, string month, string day,
  284.                             string hour, string minute, string second ) {
  285.     if (!Arch::s390 ())
  286.     {
  287.     string date = sformat( " --date=\"%1/%2/%3 %4:%5:%6\" ", month, day,
  288.                            year, hour, minute, second );
  289.     string cmd = "";
  290.     if (size (timezone) >0 && hwclock != "--localtime")
  291.     {
  292.         cmd = "TZ=" + timezone + " ";
  293.     }
  294.     cmd = cmd + "/sbin/hwclock --set " + hwclock + date;
  295.     y2milestone( "SetTime cmd %1", cmd );
  296.     SCR::Execute(.target.bash, cmd );
  297.     cmd = "/sbin/hwclock --hctosys " + hwclock;
  298.     y2milestone( "SetTime cmd %1", cmd );
  299.     SCR::Execute(.target.bash, cmd );
  300.     }
  301. };
  302.  
  303. /**
  304.  * GetTimezoneForLanguage()
  305.  *
  306.  * Get the timezone for the given system language.
  307.  *
  308.  * @param    System language code, e.g. "en_US".
  309.  *        Default timezone to be returned if nothing found.
  310.  *
  311.  * @return  The timezone for this language, e.g. "US/Eastern"
  312.  *        or the default value if nothing found.
  313.  *
  314.  * @see    -
  315.  */
  316. global define string GetTimezoneForLanguage (string sys_language,
  317.                                              string default_timezone)
  318. {
  319.     // The system_language --> timezone conversion map.
  320.     //
  321.     map<string, string> lang2timezone = get_lang2tz();
  322.     string ret = lang2timezone[sys_language]:default_timezone;
  323.  
  324.     y2milestone ("language %1 default timezone %2 returned timezone %3",
  325.                  sys_language, default_timezone, ret);
  326.     return ret;
  327. }
  328.  
  329. /**
  330.  * Set the timezone for the given system language.
  331.  * @param    System language code, e.g. "en_US".
  332.  * @return the number of the region that contains the timezone
  333.  */
  334. global define void SetTimezoneForLanguage (string sys_language) {
  335.  
  336.     string tmz = GetTimezoneForLanguage (sys_language, "US/Eastern");
  337.     y2debug ("language %1 proposed timezone %2", sys_language, tmz);
  338.     if (tmz != "")
  339.     {
  340.     Set (tmz, true);
  341.     }
  342. }
  343.  
  344. /**
  345.  * Return the language code for given timezone (by reverse searching the
  346.  * "language -> timezone" map)
  347.  * @param timezone, if empty the current one is used
  348.  */
  349. global define string GetLanguageForTimezone (string tz)
  350. {
  351.     if (tz == "" || tz == nil)
  352.     tz    = timezone;
  353.  
  354.     string lang    = "";
  355.     foreach (string code, string tmz, get_lang2tz(), {
  356.     if (tmz == tz && (lang == "" || !issubstring (lang, "_")))
  357.         lang    = code;
  358.     });
  359.     return lang;
  360. }
  361.  
  362. /**
  363.  * Return the country part of language code for given timezone
  364.  * @param timezone, if empty the current one is used
  365.  */
  366. global define string GetCountryForTimezone (string tz)
  367. {
  368.     return Language::GetGivenLanguageCountry (GetLanguageForTimezone(tz));
  369. }
  370.  
  371. /**
  372.  * Return translated country name of given timezone
  373.  * @param timezone value (as saved in sysconfig/clock)
  374.  */
  375. global define string GetTimezoneCountry (string zone) {
  376.  
  377.     list zmap = (list) eval (SCR::Read (.target.yast2, "timezone_raw.ycp"));
  378.  
  379.     integer sel = 0;
  380.     while (sel<size (zmap) && !haskey (zmap[sel,"entries"]:$[], zone))
  381.     {
  382.     sel = sel + 1;
  383.     }
  384.     return zmap [sel,"name"]:"" + " / " + zmap[sel,"entries",zone]:zone;
  385. }
  386.  
  387. /**
  388.  * GetDateTime()
  389.  *
  390.  * Get the output of date "+%H:%M:%S - %Y-%m-%d" or in locale defined format
  391.  *
  392.  * @param    flag if to get real system time or if to simulate changed
  393.  *        timezone settings with TZ=
  394.  * @param    if the date and time should be returned in locale defined format
  395.  *
  396.  * @return  The string output.
  397.  *
  398.  * @see    -
  399.  */
  400. global define string GetDateTime (boolean real_time, boolean locale_format) {
  401.  
  402.     string cmd = "";
  403.  
  404.     string date_format = (locale_format && Mode::normal ())
  405.     ? "+%c" : "+%H:%M:%S - %Y-%m-%d";
  406.  
  407.     y2milestone( "GetDateTime hwclock %1 real:%2", hwclock, real_time );
  408.     if (!real_time && !Mode::config ())
  409.     {
  410.     integer ds = 0;
  411.     if (diff!=0)
  412.     {
  413.         map out    = (map) SCR::Execute (.target.bash_output, "date +%z");
  414.         string tzd = out["stdout"]:"";
  415.         y2milestone( "GetDateTime tcd=%1", tzd );
  416.         integer t = tointeger( String::CutZeros( substring( tzd, 1, 2 )));
  417.         if (t != nil)
  418.         {
  419.         ds = ds + t * 3600;
  420.         t = tointeger( String::CutZeros( substring( tzd, 3, 2 )));
  421.         ds = ds + t * 60;
  422.         if (substring (tzd, 0, 1) == "-")
  423.             ds = -ds;
  424.         y2milestone( "GetDateTime ds %1 diff %2", ds, diff );
  425.         }
  426.     }
  427.     cmd = "";
  428.     if (hwclock != "--localtime")
  429.     {
  430.         cmd = sformat( "TZ=%1 ", timezone );
  431.     }
  432.     cmd = cmd + sformat( "/bin/date \"%1\" \"--date=now %2sec\"",
  433.                  date_format, ds*diff );
  434.     }
  435.     else
  436.     {
  437.     cmd = sformat( "/bin/date \"%1\"", date_format );
  438.     }
  439.     y2milestone( "GetDateTime cmd=%1", cmd );
  440.     map out    = (map) SCR::Execute (.target.bash_output, cmd);
  441.     string local_date = out["stdout"]:"";
  442.  
  443.     y2milestone( "GetDateTime local_date=%1", local_date );
  444.  
  445.     return( local_date );
  446.     }
  447.  
  448. global define void  ResetZonemap()
  449.     ``{
  450.     zonemap = [];
  451.     }
  452.  
  453. /**
  454.  * Return true if localtime should be proposed as default
  455.  * Based on current hardware configuration:
  456.  * Win partitions present or 32bit Mac
  457.  */
  458. global define boolean ProposeLocaltime () {
  459.  
  460.     return windows_partition || (Arch::board_mac() && Arch::ppc32());
  461. }
  462.  
  463. /**
  464.  * MakeProposal()
  465.  *
  466.  * Return proposal string and set system timezone.
  467.  *
  468.  * @param    boolean force_reset
  469.  *        boolean language_changed
  470.  *
  471.  * @return    string    user readable description.
  472.  *        If force_reset is true reset the module to the timezone
  473.  *        stored in default_timezone.
  474.  */
  475.  
  476. global define string MakeProposal (boolean force_reset,
  477.                                    boolean language_changed )
  478. {
  479.     y2milestone ("force_reset: %1", force_reset);
  480.     y2milestone ("language_changed: %1 user_decision %2 user_hwclock %3",
  481.     language_changed, user_decision, user_hwclock);
  482.  
  483.     if (language_changed)
  484.     ResetZonemap();
  485.  
  486.     if (!user_hwclock || force_reset)
  487.     {
  488.     hwclock = "-u";
  489.     if (ProposeLocaltime ())
  490.     {
  491.         hwclock = "--localtime";
  492.     }
  493.     }
  494.     if (force_reset)
  495.     {
  496.     // If user wants to reset do it if a default is available.
  497.     //
  498.     if( default_timezone != "" )
  499.         {
  500.         Set( default_timezone, true );    // reset
  501.         }
  502.  
  503.     // Reset user_decision flag.
  504.     //
  505.     user_decision = false;
  506.     }
  507.     else    // no reset
  508.     {
  509.     // Only follow the language if the user has never actively chosen
  510.     // a timezone. The indicator for this is user_decision which is
  511.     // set from outside the module.
  512.     //
  513.     if (user_decision || Mode::autoinst () ||
  514.         ProductFeatures::GetStringFeature ("globals", "timezone") != "")
  515.     {
  516.         if( language_changed )
  517.         {
  518.         y2milestone("User has chosen a timezone; not following language - only retranslation.");
  519.  
  520.         Set( timezone, true );
  521.         }
  522.     }
  523.     else
  524.     {
  525.         // User has not yet chosen a timezone ==> follow language.
  526.         //
  527.         string local_timezone =
  528.         GetTimezoneForLanguage( Language::language, "US/Eastern");
  529.  
  530.         if( local_timezone != "" )
  531.         {
  532.         Set( local_timezone, true );
  533.         default_timezone = local_timezone;
  534.         }
  535.         else
  536.         {
  537.         if( language_changed )
  538.             {
  539.             y2error("Can't follow language - only retranslation");
  540.  
  541.             Set( timezone, true );
  542.             }
  543.         }
  544.     }
  545.     }
  546.  
  547.     // label text (Clock setting)
  548.     string clock_setting = _("UTC");
  549.  
  550.     if (hwclock == "--localtime")
  551.     // label text, Clock setting: local time (not UTC)
  552.     clock_setting = _("Local Time");
  553.  
  554.     // label text
  555.     clock_setting = _("Hardware Clock Set To") + " " + clock_setting;
  556.  
  557.     string date = GetDateTime (true, true);
  558.  
  559.     y2milestone( "MakeProposal hwclock %1", hwclock );
  560.  
  561.     return name + " - " + clock_setting + " " + date;
  562. }
  563.  
  564. /**
  565.   * Selection()
  566.   *
  567.   * Return a map of ids and names to build up a selection list
  568.   * for the user. The key is used later in the Set function
  569.   * to select this timezone. The name is a translated string.
  570.   *
  571.   * @param    -
  572.   *
  573.   * @return    map    map for timezones
  574.   *            'timezone_id' is used internally in Set and Probe
  575.   *            functions. 'timezone_name' is a user-readable string.
  576.   *            Uses Language::language for translation.
  577.   * @see Set()
  578.   */
  579.  
  580. global define list Selection (integer num) {
  581.  
  582.     list<map<string,any> > zmap = get_zonemap();
  583.  
  584.     list<list<string> > trl    = maplist (
  585.     string key, string name, zmap[num,"entries"]:$[], ``([ name, key ]));
  586.  
  587.     trl    = sort (list<string> a, list<string> b, trl, {
  588.     list lsorted    = lsort ([a[0]:"", b[0]:""]);
  589.     return (lsorted[0]:"" == a[0]:"" && a[0]:"" != b[0]:"");
  590.     });
  591.     y2debug ("trl = %1", trl);
  592.  
  593.     return maplist (list e, trl, ``(`item (`id(e[1]:""), e[0]:"", false)));
  594. }
  595.  
  596. /**
  597.  * Return list of regions for timezone selection list
  598.  */
  599. global define list Region() {
  600.  
  601.     integer num = -1;
  602.     return maplist (map entry, get_zonemap (), {
  603.     num = num + 1;
  604.     return (`item (`id(num), entry["name"]:"", false ));
  605.     });
  606. }
  607.  
  608.  
  609. /**
  610.  * Save()
  611.  *
  612.  * Save timezone to target sysconfig.
  613.  *
  614.  * @param    -
  615.  *
  616.  * @return    -
  617.  */
  618. global define void Save() {
  619.  
  620.     if ( Mode::update () )
  621.     {
  622.     return;
  623.     }
  624.  
  625.     SCR::Write(.sysconfig.clock.TIMEZONE, timezone);
  626.     SCR::Write(.sysconfig.clock.DEFAULT_TIMEZONE, default_timezone);
  627.     SCR::Write(.sysconfig.clock.HWCLOCK, hwclock);
  628.  
  629.     SCR::Write(.sysconfig.clock, nil);    // flush
  630.  
  631.     y2milestone( "Save Saved data for timezone: <%1>", timezone );
  632.  
  633.     return;
  634. }
  635.  
  636.  
  637. /**
  638.  * Return current date and time in the map
  639.  */
  640. global define map GetDateTimeMap() {
  641.  
  642.     map ret = $[];
  643.     list dparts = filter (
  644.     string v,splitstring (GetDateTime (false,false), " -:" ),``(size(v)>0));
  645.  
  646.     ret["hour"]        = dparts[0]:"";
  647.     ret["minute"]    = dparts[1]:"";
  648.     ret["second"]    = dparts[2]:"";
  649.     ret["year"]        = dparts[3]:"";
  650.     ret["month"]    = dparts[4]:"";
  651.     ret["day"]        = deletechars (dparts[5]:"", "\n");
  652.     y2milestone( "GetDateTimeMap dparts %1 ret %2", dparts, ret );
  653.     return( ret );
  654. }
  655.  
  656. global define boolean CheckTime( string hour, string minute, string second )
  657.     ``{
  658.     boolean ret = true;
  659.     integer tmp = tointeger( String::CutZeros(hour) );
  660.     if (tmp == nil) return false;
  661.     ret = ret && tmp>=0 && tmp<24;
  662.     tmp = tointeger( String::CutZeros(minute) );
  663.     if (tmp == nil) return false;
  664.     ret = ret && tmp>=0 && tmp<60;
  665.     tmp = tointeger( String::CutZeros(second) );
  666.     if (tmp == nil) return false;
  667.     ret = ret && tmp>=0 && tmp<60;
  668.     return( ret );
  669.     }
  670.  
  671. global define boolean CheckDate( string day, string month, string year )
  672.     ``{
  673.     list mdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
  674.     boolean ret = true;
  675.     integer yea = tointeger( String::CutZeros(year) );
  676.     integer mon = tointeger( String::CutZeros(month) );
  677.     integer da = tointeger(  String::CutZeros(day) );
  678.     if (yea == nil || mon == nil || da == nil)
  679.     return false;
  680.     ret = ret && mon>=1 && mon<=12;
  681.     if( yea%4==0 && (yea%100!=0 || yea%400==0))
  682.     {
  683.     mdays[1] = 29;
  684.     }
  685.     ret = ret && da>=1 && da<=mdays[mon-1]:0;
  686.     ret = ret && yea>=1970 && yea<2032;
  687.     return( ret );
  688.     }
  689.  
  690. // does the hwclock run on UTC only ? -> skip asking
  691. global define boolean utc_only () {
  692.  
  693.     y2milestone( "Arch::sparc () %1 Arch::board_iseries () %2 Arch::board_chrp () %3 Arch::board_prep () %4", Arch::sparc (), Arch::board_iseries (), Arch::board_chrp (), Arch::board_prep () );
  694.  
  695.     return (Arch::sparc () || Arch::board_iseries () ||
  696.         Arch::board_chrp () || Arch::board_prep ());
  697. }
  698.  
  699.   /**
  700.    * save the initial data
  701.    */
  702.   global define void PushVal () {
  703.  
  704.     push = $[ "hwclock" : hwclock, "timezone" : timezone ];
  705.     y2milestone ( "PushVal map %1", push );
  706.   }
  707.  
  708.   /**
  709.    * restore the original data from internal map
  710.    */
  711.   global define void PopVal() {
  712.  
  713.     y2milestone ("before Pop: timezone %1 hwclock %2", timezone, hwclock );
  714.     if ( haskey( push, "hwclock" ))
  715.     hwclock = push["hwclock"]:hwclock;
  716.     if( haskey( push, "timezone" ))
  717.     timezone = push["timezone"]:timezone;
  718.     push = $[];
  719.     y2milestone ("after Pop: timezone %1 hwclock %2", timezone, hwclock );
  720.   }
  721.  
  722.   /**
  723.    * was anything modified?
  724.    */
  725.   global define boolean Modified () {
  726.  
  727.     return modified ||
  728.     timezone != push["timezone"]:timezone || hwclock != push["hwclock"]:hwclock;
  729.   }
  730.  
  731.   /**
  732.    * AutoYaST interface function: Get the Timezone configuration from a map.
  733.    * @param settings imported map
  734.    * @return success
  735.    */
  736.   global define boolean Import (map settings) {
  737.  
  738.     // Read was not called -> do the init
  739.     if (push == $[])
  740.     PushVal ();
  741.  
  742.     if (haskey (settings, "hwclock"))
  743.     {
  744.     hwclock    = settings["hwclock"]:"UTC" == "UTC" ? "-u" : "--localtime";
  745.     user_hwclock    = true;
  746.     }
  747.     Set (settings["timezone"]:timezone, true);
  748.     return true;
  749.   }
  750.  
  751.   /**
  752.    * AutoYaST interface function: Return the Timezone configuration as a map.
  753.    * @return map with the settings
  754.    */
  755.   global define map Export () {
  756.  
  757.     map ret = $[
  758.     "timezone"    : timezone,
  759.     "hwclock"    : hwclock == "-u" ? "UTC" : "localtime",
  760.     ];
  761.     return ret;
  762.   }
  763.  
  764.   /**
  765.    * AutoYaST interface function: Return the summary of Timezone configuration as a map.
  766.    * @return summary string (html)
  767.    */
  768.   global define string Summary () {
  769.  
  770.     import "HTML";
  771.  
  772.     string clock_setting = _("UTC");
  773.  
  774.     if (hwclock == "--localtime")
  775.     // label text, Clock setting: local time (not UTC)
  776.     clock_setting = _("Local Time");
  777.  
  778.     // label text
  779.     clock_setting = _("Hardware Clock Set To") + " " + clock_setting;
  780.  
  781.     list<string> ret =  [
  782.     // summary label
  783.     sformat (_("Current Time Zone: %1"), name),
  784.     clock_setting
  785.     ];
  786.     return HTML::List (ret);
  787.   }
  788.  
  789.  
  790. } // -EOF-
  791.