diff options
Diffstat (limited to 'kcontrol/clock/tzone.cpp')
-rw-r--r-- | kcontrol/clock/tzone.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/kcontrol/clock/tzone.cpp b/kcontrol/clock/tzone.cpp new file mode 100644 index 000000000..fad22152a --- /dev/null +++ b/kcontrol/clock/tzone.cpp @@ -0,0 +1,200 @@ +/* + * tzone.cpp + * + * Copyright (C) 1998 Luca Montecchiani <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <config.h> + +#include <qlabel.h> +#include <qfile.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kdialog.h> +#include <kio/netaccess.h> + +//#include "xpm/world.xpm" +#include "tzone.h" +#include "tzone.moc" + +#if defined(USE_SOLARIS) +#include <ktempfile.h> +#include <kstandarddirs.h> +#include <sys/param.h> +#include <sys/types.h> +#include <sys/stat.h> +#endif + +Tzone::Tzone(QWidget * parent, const char *name) + : QVGroupBox(parent, name) +{ + setTitle(i18n("To change the timezone, select your area from the list below")); + + tzonelist = new KTimezoneWidget(this, "ComboBox_1", &m_zoneDb); + connect( tzonelist, SIGNAL(selectionChanged()), SLOT(handleZoneChange()) ); + + m_local = new QLabel(this); + + load(); + + tzonelist->setEnabled(getuid() == 0); +} + +void Tzone::load() +{ + currentZone(); + + // read the currently set time zone + tzonelist->setSelected(m_zoneDb.local()->name(), true); +} + +void Tzone::currentZone() +{ + QString localZone(i18n("Current local timezone: %1 (%2)")); + QCString result(100); + + time_t now = time(0); + tzset(); + strftime(result.data(), result.size(), "%Z", localtime(&now)); + m_local->setText(localZone.arg(KTimezoneWidget::displayName(m_zoneDb.local())).arg(result)); +} + +// FIXME: Does the logic in this routine actually work correctly? For example, +// on non-Solaris systems which do not use /etc/timezone? +void Tzone::save() +{ + QStringList selectedZones(tzonelist->selection()); + + if (selectedZones.count() > 0) + { + // Find untranslated selected zone + QString selectedzone(selectedZones[0]); + +#if defined(USE_SOLARIS) // MARCO + + KTempFile tf( locateLocal( "tmp", "kde-tzone" ) ); + tf.setAutoDelete( true ); + QTextStream *ts = tf.textStream(); + +# ifndef INITFILE +# define INITFILE "/etc/default/init" +# endif + + QFile fTimezoneFile(INITFILE); + bool updatedFile = false; + + if (tf.status() == 0 && fTimezoneFile.open(IO_ReadOnly)) + { + bool found = false; + + QTextStream is(&fTimezoneFile); + + for (QString line = is.readLine(); !line.isNull(); + line = is.readLine()) + { + if (line.find("TZ=") == 0) + { + *ts << "TZ=" << selectedzone << endl; + found = true; + } + else + { + *ts << line << endl; + } + } + + if (!found) + { + *ts << "TZ=" << selectedzone << endl; + } + + updatedFile = true; + fTimezoneFile.close(); + } + + if (updatedFile) + { + ts->device()->reset(); + fTimezoneFile.remove(); + + if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate)) + { + QTextStream os(&fTimezoneFile); + + for (QString line = ts->readLine(); !line.isNull(); + line = ts->readLine()) + { + os << line << endl; + } + + fchmod(fTimezoneFile.handle(), + S_IXUSR | S_IRUSR | S_IRGRP | S_IXGRP | + S_IROTH | S_IXOTH); + fTimezoneFile.close(); + } + } + + + QString val = selectedzone; +#else + QFile fTimezoneFile("/etc/timezone"); + + if (fTimezoneFile.open(IO_WriteOnly | IO_Truncate) ) + { + QTextStream t(&fTimezoneFile); + t << selectedzone; + fTimezoneFile.close(); + } + + QString tz = "/usr/share/zoneinfo/" + selectedzone; + + kdDebug() << "Set time zone " << tz << endl; + + if (!QFile::remove("/etc/localtime")) + { + //After the KDE 3.2 release, need to add an error message + } + else + if (!KIO::NetAccess::file_copy(KURL(tz),KURL("/etc/localtime"))) + KMessageBox::error( 0, i18n("Error setting new timezone."), + i18n("Timezone Error")); + + QString val = ":" + tz; +#endif // !USE_SOLARIS + + setenv("TZ", val.ascii(), 1); + tzset(); + + } else { +#if !defined(USE_SOLARIS) // Do not update the System! + unlink( "/etc/timezone" ); + unlink( "/etc/localtime" ); + + setenv("TZ", "", 1); + tzset(); +#endif // !USE SOLARIS + } + + currentZone(); +} |