aboutsummaryrefslogtreecommitdiffstats
path: root/kde2/kpsion/kpsion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kde2/kpsion/kpsion.cpp')
-rw-r--r--kde2/kpsion/kpsion.cpp1859
1 files changed, 0 insertions, 1859 deletions
diff --git a/kde2/kpsion/kpsion.cpp b/kde2/kpsion/kpsion.cpp
deleted file mode 100644
index d897e70..0000000
--- a/kde2/kpsion/kpsion.cpp
+++ /dev/null
@@ -1,1859 +0,0 @@
-/*-*-c++-*-
- * $Id$
- *
- * This file is part of plptools.
- *
- * Copyright (C) 2000-2002 Fritz Elfert <felfert@to.com>
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "kpsion.h"
-#include "kpsionconfig.h"
-#include "wizards.h"
-
-#include <klocale.h>
-#include <kaction.h>
-#include <kstdaction.h>
-#include <kconfig.h>
-#include <kiconview.h>
-#include <kmessagebox.h>
-#include <kfileitem.h>
-#include <kprocess.h>
-#include <kstatusbar.h>
-#include <kiconloader.h>
-
-#include <qwhatsthis.h>
-#include <qtimer.h>
-#include <qlayout.h>
-#include <qiodevice.h>
-#include <qheader.h>
-#include <qdir.h>
-#include <qmessagebox.h>
-#include <qregexp.h>
-#include <qstyle.h>
-
-#include <ppsocket.h>
-#include <rfsvfactory.h>
-#include <rpcsfactory.h>
-#include <bufferarray.h>
-#include <psiprocess.h>
-
-#include <iostream>
-
-#define STID_CONNECTION 1
-
-using namespace std;
-
-KPsionMainWindow::KPsionMainWindow()
- : KMainWindow() {
- setupActions();
-
- statusBar()->insertItem(i18n("Idle"), STID_CONNECTION, 1);
- statusBar()->setItemAlignment(STID_CONNECTION,
- QLabel::AlignLeft|QLabel::AlignVCenter);
-
- progress = new KPsionStatusBarProgress(statusBar(), "progressBar");
- statusBar()->addWidget(progress, 10);
-
- connect(progress, SIGNAL(pressed()), this, SLOT(slotProgressBarPressed()));
- connect(this, SIGNAL(setProgress(int)), progress, SLOT(setValue(int)));
- connect(this, SIGNAL(setProgress(int, int)), progress,
- SLOT(setValue(int, int)));
- connect(this, SIGNAL(setProgressText(const QString &)), progress,
- SLOT(setText(const QString &)));
- connect(this, SIGNAL(enableProgressText(bool)), progress,
- SLOT(setTextEnabled(bool)));
-
- backupRunning = false;
- restoreRunning = false;
- formatRunning = false;
- doScheduledBackup = false;
- quitImmediately = false;
-
- view = new KIconView(this, "iconview");
- view->setSelectionMode(KIconView::Multi);
- view->setResizeMode(KIconView::Adjust);
- view->setItemsMovable(false);
- connect(view, SIGNAL(clicked(QIconViewItem *)),
- SLOT(iconClicked(QIconViewItem *)));
- connect(view, SIGNAL(onItem(QIconViewItem *)),
- SLOT(iconOver(QIconViewItem *)));
- connect(this, SIGNAL(rearrangeIcons(bool)), view,
- SLOT(arrangeItemsInGrid(bool)));
- KConfig *config = kapp->config();
- KPsionConfig pcfg;
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_UIDS));
- QStringList uids = config->readListEntry(
- pcfg.getOptionName(KPsionConfig::OPT_UIDS));
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_MACHNAME));
- QString tmp = pcfg.getOptionName(KPsionConfig::OPT_MACHNAME);
-
- for (QStringList::Iterator it = uids.begin(); it != uids.end(); it++)
- machines.insert(*it, config->readEntry(tmp.arg(*it)));
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_BACKUPDIR));
- backupDir = config->readEntry(
- pcfg.getOptionName(KPsionConfig::OPT_BACKUPDIR));
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_CONNRETRY));
- reconnectTime = config->readNumEntry(
- pcfg.getOptionName(KPsionConfig::OPT_CONNRETRY));
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_SERIALDEV));
- ncpdDevice = config->readEntry(pcfg.getOptionName(
- KPsionConfig::OPT_SERIALDEV), "off");
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_NCPDPATH));
- ncpdPath = config->readEntry(pcfg.getOptionName(
- KPsionConfig::OPT_NCPDPATH), "ncpd");
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_SERIALSPEED));
- ncpdSpeed = config->readEntry(
- pcfg.getOptionName(KPsionConfig::OPT_SERIALSPEED), "115200");
-
- QWhatsThis::add(view, i18n(
- "<qt>Here, you see your Psion's drives.<br/>"
- "Every drive is represented by an Icon. If you "
- "click on it, it gets selected for the next "
- "operation. E.g.: backup, restore or format.<br/>"
- "To unselect it, simply click on it again.<br/>"
- "Select as many drives a you want, then choose "
- "an operation.</qt>"));
- setCentralWidget(view);
-
- rfsvSocket = 0L;
- rpcsSocket = 0L;
- plpRfsv = 0L;
- plpRpcs = 0L;
-
- firstTry = true;
- connected = false;
- shuttingDown = false;
-
- args = KCmdLineArgs::parsedArgs();
- if (args->isSet("autobackup")) {
- firstTry = false;
- reconnectTime = 0;
- }
- tryConnect();
-}
-
-KPsionMainWindow::~KPsionMainWindow() {
- shuttingDown = true;
- if (plpRfsv)
- delete plpRfsv;
- if (plpRpcs)
- delete plpRpcs;
- if (rfsvSocket)
- delete rfsvSocket;
- if (rfsvSocket)
- delete rpcsSocket;
-}
-
-QString KPsionMainWindow::
-unix2psion(const char * const path) {
- QString tmp = path;
- tmp.replace(QRegExp("/"), "\\");
- tmp.replace(QRegExp("%2f"), "/");
- tmp.replace(QRegExp("%25"), "%");
- return tmp;
-}
-
-QString KPsionMainWindow::
-psion2unix(const char * const path) {
- QString tmp = path;
- tmp.replace(QRegExp("%"), "%25");
- tmp.replace(QRegExp("/"), "%2f");
-#if QT_VERSION >= 300
- tmp.replace(QRegExp("\\\\"), "/");
-#else
- tmp.replace(QRegExp("\\"), "/");
-#endif
- return tmp;
-}
-
-void KPsionMainWindow::
-setupActions() {
-
- KStdAction::quit(this, SLOT(close()), actionCollection());
- KStdAction::showToolbar(this, SLOT(slotToggleToolbar()),
- actionCollection());
- KStdAction::showStatusbar(this, SLOT(slotToggleStatusbar()),
- actionCollection());
- KStdAction::preferences(this, SLOT(slotPreferences()),
- actionCollection());
- new KAction(i18n("Start &Format"), "psion_format", 0, this,
- SLOT(slotStartFormat()), actionCollection(), "format");
- new KAction(i18n("Start Full &Backup"), "psion_backup", 0, this,
- SLOT(slotStartFullBackup()), actionCollection(),
- "fullbackup");
- new KAction(i18n("Start &Incremental Backup"), "psion_backup", 0, this,
- SLOT(slotStartIncBackup()), actionCollection(), "incbackup");
- new KAction(i18n("Start &Restore"), "psion_restore", 0, this,
- SLOT(slotStartRestore()), actionCollection(), "restore");
- createGUI();
-
- actionCollection()->action("fullbackup")->setEnabled(false);
- actionCollection()->action("incbackup")->setEnabled(false);
- actionCollection()->action("restore")->setEnabled(false);
- actionCollection()->action("format")->setEnabled(false);
-
- actionCollection()->action("fullbackup")->
- setToolTip(i18n("Full backup of selected drive(s)"));
- actionCollection()->action("incbackup")->
- setToolTip(i18n("Incremental backup of selected drive(s)"));
- actionCollection()->action("restore")->
- setToolTip(i18n("Restore selected drive(s)"));
- actionCollection()->action("format")->
- setToolTip(i18n("Format selected drive(s)"));
-}
-
-void KPsionMainWindow::
-iconOver(QIconViewItem *i) {
- lastSelected = i->isSelected();
-}
-
-void KPsionMainWindow::
-switchActions() {
- QIconViewItem *i;
- bool rwSelected = false;
- bool anySelected = false;
-
- if (backupRunning | restoreRunning | formatRunning)
- view->setEnabled(false);
- else {
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->isSelected()) {
- anySelected = true;
- if (i->key() != "Z") {
- rwSelected = true;
- break;
- }
- }
- }
- view->setEnabled(true);
- }
- actionCollection()->action("restore")->setEnabled(rwSelected);
- actionCollection()->action("format")->setEnabled(rwSelected);
- actionCollection()->action("fullbackup")->setEnabled(anySelected);
- actionCollection()->action("incbackup")->setEnabled(anySelected);
-}
-
-void KPsionMainWindow::
-iconClicked(QIconViewItem *i) {
- if (i == 0L)
- return;
- lastSelected = !lastSelected;
- i->setSelected(lastSelected);
- switchActions();
-}
-
-void KPsionMainWindow::
-insertDrive(char letter, const char * const name) {
- QString tmp;
-
- if (name && strlen(name))
- tmp = QString::fromLatin1("%1 (%2:)").arg(name).arg(letter);
- else
- tmp = QString::fromLatin1("%1:").arg(letter);
- drives.insert(letter,tmp);
- QIconViewItem *it =
- new QIconViewItem(view, tmp,
- KGlobal::iconLoader()->loadIcon("psion_drive",
- KIcon::Desktop));
- tmp = QString::fromLatin1("%1").arg(letter);
- it->setKey(tmp);
- it->setDropEnabled(false);
- it->setDragEnabled(false);
- it->setRenameEnabled(false);
-}
-
-bool KPsionMainWindow::
-shouldQuit() {
- return quitImmediately;
-}
-
-void KPsionMainWindow::
-syncTime(QString uid) {
-}
-
-void KPsionMainWindow::
-queryPsion() {
- u_int32_t devbits;
- Enum <rfsv::errs> res;
-
- statusBar()->changeItem(i18n("Retrieving machine info ..."),
- STID_CONNECTION);
-
- Enum<rpcs::machs> machType;
- if (plpRpcs->getMachineType(machType) != rfsv::E_PSI_GEN_NONE) {
- QString msg = i18n("Could not get Psion machine type");
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- if (machType == rpcs::PSI_MACH_S5) {
- rpcs::machineInfo mi;
- if ((res = plpRpcs->getMachineInfo(mi)) != rfsv::E_PSI_GEN_NONE) {
- QString msg = i18n("Could not get Psion machine info");
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- machineUID = mi.machineUID;
- S5mx = (strcmp(mi.machineName, "SERIES5mx") == 0);
- } else {
- // On a SIBO, first check for a file 'SYS$PT.CFG' on the default
- // directory. If it exists, read the UID from it. Otherwise
- // calculate a virtual machine UID from the OwnerInfo data and
- // write it to that file.
- bufferArray b;
- u_int32_t handle;
- u_int32_t count;
-
- res = plpRfsv->fopen(plpRfsv->opMode(rfsv::PSI_O_RDONLY),
- "SYS$PT.CFG", handle);
- if (res == rfsv::E_PSI_GEN_NONE) {
- res = plpRfsv->fread(handle, (unsigned char *)&machineUID,
- sizeof(machineUID), count);
- plpRfsv->fclose(handle);
- if ((res != rfsv::E_PSI_GEN_NONE) || (count != sizeof(machineUID))) {
- QString msg = i18n("Could not read SIBO UID file");
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- } else {
- if ((res = plpRpcs->getOwnerInfo(b)) != rfsv::E_PSI_GEN_NONE) {
- QString msg = i18n("Could not get Psion owner info");
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- machineUID = 0;
- std::string oi = "";
- while (!b.empty()) {
- oi += b.pop().getString();
- oi += "\n";
- }
- const char *p = oi.c_str();
- unsigned long long z;
- int i = 0;
-
- while (*p) {
- z = *p;
- machineUID ^= (z << i);
- p++; i++;
- i &= ((sizeof(machineUID) * 8) - 1);
- }
- res = plpRfsv->fcreatefile(plpRfsv->opMode(rfsv::PSI_O_RDWR),
- "SYS$PT.CFG", handle);
- if (res == rfsv::E_PSI_GEN_NONE) {
- res = plpRfsv->fwrite(handle, (const unsigned char *)&machineUID,
- sizeof(machineUID), count);
- plpRfsv->fclose(handle);
- }
- if (res != rfsv::E_PSI_GEN_NONE) {
- QString msg = i18n("Could not write SIBO UID file %1").arg((const char *)res);
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- }
- S5mx = false;
- }
-
- QString uid = getMachineUID();
- bool machineFound = false;
- KConfig *config = kapp->config();
- KPsionConfig pcfg;
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_BACKUPDRIVES));
- QString tmp = pcfg.getOptionName(KPsionConfig::OPT_BACKUPDRIVES);
- machineName = i18n("an unknown machine");
- psionMap::Iterator it;
- for (it = machines.begin(); it != machines.end(); it++) {
- if (uid == it.key()) {
- machineName = it.data();
- backupDrives = config->readListEntry(tmp.arg(it.key()));
- machineFound = true;
- }
- }
-
- drives.clear();
- statusBar()->changeItem(i18n("Retrieving drive list ..."),
- STID_CONNECTION);
- if ((res = plpRfsv->devlist(devbits)) != rfsv::E_PSI_GEN_NONE) {
- QString msg = i18n("Could not get list of drives");
- statusBar()->changeItem(msg, STID_CONNECTION);
- KMessageBox::error(this, msg);
- return;
- }
- for (int i = 0; i < 26; i++) {
- if ((devbits & 1) != 0) {
- PlpDrive drive;
- if (plpRfsv->devinfo('A' + i, drive) == rfsv::E_PSI_GEN_NONE)
- insertDrive('A' + i, drive.getName().c_str());
- }
- devbits >>= 1;
- }
-
- if (!machineFound) {
- if (args->isSet("autobackup")) {
- connected = false;
- if (plpRfsv)
- delete plpRfsv;
- if (plpRpcs)
- delete plpRpcs;
- if (rfsvSocket)
- delete rfsvSocket;
- if (rfsvSocket)
- delete rpcsSocket;
- quitImmediately = true;
- return;
- }
- NewPsionWizard *wiz = new NewPsionWizard(this, "newpsionwiz");
- wiz->exec();
- }
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
-
- syncTime(uid);
-
- if (args->isSet("autobackup")) {
- // Check, if scheduled backups to perform
-
- doScheduledBackup = false;
- KPsionConfig pcfg;
- QIconViewItem *i;
- QStringList::Iterator it;
- QDateTime d;
- KConfig *config = kapp->config();
- QString uid = getMachineUID();
- QString key;
- int fi = pcfg.getIntervalDays(config, KPsionConfig::OPT_FULLINTERVAL);
- int ii = pcfg.getIntervalDays(config, KPsionConfig::OPT_INCINTERVAL);
-
- // Check for Full Backup
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_LASTFULL));
- for (it = backupDrives.begin(); it != backupDrives.end(); ++it) {
- key =
- pcfg.getOptionName(KPsionConfig::OPT_LASTFULL).arg(uid).arg(*it);
- d.setTime_t(config->readNumEntry(key));
-
- if (fi && d.daysTo(QDateTime::currentDateTime()) >= fi) {
- fullBackup = true;
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == *it) {
- i->setSelected(true);
- doScheduledBackup = true;
- }
- }
- }
- }
- if (!doScheduledBackup) {
- // Check for Incremental Backup
- fullBackup = false;
- view->clearSelection();
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_LASTINC));
- for (it = backupDrives.begin(); it != backupDrives.end(); ++it) {
- key =
- pcfg.getOptionName(KPsionConfig::OPT_LASTINC).arg(uid).arg(*it);
- d.setTime_t(config->readNumEntry(key));
- if (ii && d.daysTo(QDateTime::currentDateTime()) >= ii) {
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == *it) {
- i->setSelected(true);
- doScheduledBackup = true;
- }
- }
- }
- }
- }
- if (!doScheduledBackup) {
- quitImmediately = true;
- return;
- }
-
- }
- if (doScheduledBackup || args->isSet("backup") ||
- args->isSet("restore") || args->isSet("format")) {
- view->setEnabled(false);
- actionCollection()->action("restore")->setEnabled(false);
- actionCollection()->action("format")->setEnabled(false);
- actionCollection()->action("fullbackup")->setEnabled(false);
- actionCollection()->action("incbackup")->setEnabled(false);
- QTimer::singleShot(1000, this, SLOT(slotAutoAction()));
- }
-}
-
-void KPsionMainWindow::
-slotAutoAction() {
- QIconViewItem *i;
-
- if (doScheduledBackup) {
- doBackup();
- QTimer::singleShot(1000, this, SLOT(close()));
- return;
- }
-
- if (args->isSet("backup")) {
- bool any = false;
-
- QCStringList argl = args->getOptionList("backup");
- QCStringList::Iterator it;
-
- for (it = argl.begin(); it != argl.end(); ++it) {
- i = 0L;
- if ((*it).left(7) == "psion:/") {
- QString volname((*it).mid(7));
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->text().startsWith(volname + " "))
- break;
- }
- } else {
- QString drv((*it).upper());
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == drv)
- break;
- }
- }
- if (i) {
- i->setSelected(true);
- any = true;
- }
- }
- if (any) {
- fullBackup = true;
- doBackup();
- }
- QTimer::singleShot(1000, this, SLOT(close()));
- return;
- }
-
- if (args->isSet("restore")) {
- bool any = false;
-
- QCStringList argl = args->getOptionList("restore");
- QCStringList::Iterator it;
-
- for (it = argl.begin(); it != argl.end(); ++it) {
- i = 0L;
- if ((*it).left(7) == "psion:/") {
- QString volname((*it).mid(7));
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->text().startsWith(volname + " "))
- break;
- }
- } else {
- QString drv((*it).upper());
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == drv)
- break;
- }
- }
- if (i) {
- if (i->key() == "Z") {
- KMessageBox::sorry(this, i18n(
- "<QT>The selected drive <B>Z:</B> is "
- "a <B>ROM</B> drive and therefore cannot be restored.</QT>"));
- continue;
- }
- i->setSelected(true);
- any = true;
- }
- }
- if (any)
- slotStartRestore();
- QTimer::singleShot(1000, this, SLOT(close()));
- return;
- }
-
- if (args->isSet("format")) {
- bool any = false;
- QCStringList argl = args->getOptionList("format");
- QCStringList::Iterator it;
-
- for (it = argl.begin(); it != argl.end(); ++it) {
- i = 0L;
- if ((*it).left(7) == "psion:/") {
- QString volname((*it).mid(7));
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->text().startsWith(volname + " "))
- break;
- }
- } else {
- QString drv((*it).upper());
- for (i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == drv)
- break;
- }
- }
- if (i) {
- if (i->key() == "Z") {
- KMessageBox::sorry(this, i18n(
- "<QT>The selected drive <B>Z:</B> is "
- "a <B>ROM</B> drive and therefore cannot be formatted.</QT>"));
- continue;
- }
- i->setSelected(true);
- any = true;
- }
- }
- if (any)
- slotStartFormat();
- QTimer::singleShot(1000, this, SLOT(close()));
- return;
- }
- QTimer::singleShot(1000, this, SLOT(close()));
-}
-
-QString KPsionMainWindow::
-getMachineUID() {
- // ??! None of QString's formatting methods knows about long long.
- char tmp[20];
- sprintf(tmp, "%16llx", machineUID);
- return QString(tmp);
-}
-
-bool KPsionMainWindow::
-queryClose() {
- QString msg = 0L;
-
- if (backupRunning)
- msg = i18n("A backup is running.\nDo you really want to quit?");
- if (restoreRunning)
- msg = i18n("A restore is running.\nDo you really want to quit?");
- if (formatRunning)
- msg = i18n("A format is running.\nDo you really want to quit?");
-
- if ((!msg.isNull()) &&
- (KMessageBox::warningYesNo(this, msg) == KMessageBox::No))
- return false;
- return true;
-}
-
-void KPsionMainWindow::
-startupNcpd() {
- if (ncpdDevice == "off")
- return;
- KProcess proc;
- ppsocket *testSocket;
- time_t start_time = time(0L) + 2;
- bool connectOk = false;
-
- testSocket = new ppsocket();
- if (!testSocket->connect(NULL, 7501)) {
-
- statusBar()->changeItem(i18n("Starting ncpd daemon ..."),
- STID_CONNECTION);
- proc << ncpdPath;
- proc << "-s" << ncpdDevice << "-b" << ncpdSpeed;
- proc.start(KProcess::DontCare);
- while ((time(0L) < start_time) &&
- (!(connectOk = testSocket->connect(NULL, 7501))))
- kapp->processEvents();
- }
- delete testSocket;
- if (connectOk) {
- // 2 more seconds for ncpd to negotiate with the Psion.
- start_time = time(0L) + 2;
- while (time(0L) < start_time)
- kapp->processEvents();
- }
-}
-
-void KPsionMainWindow::
-tryConnect() {
- if (shuttingDown || connected)
- return;
- bool showMB = firstTry;
- firstTry = false;
-
- if (plpRfsv)
- delete plpRfsv;
- if (plpRpcs)
- delete plpRpcs;
- if (rfsvSocket)
- delete rfsvSocket;
- if (rfsvSocket)
- delete rpcsSocket;
-
- startupNcpd();
- rfsvSocket = new ppsocket();
- statusBar()->changeItem(i18n("Connecting ..."), STID_CONNECTION);
- if (!rfsvSocket->connect(NULL, 7501)) {
- if (args->isSet("autobackup")) {
- quitImmediately = true;
- return;
- }
- statusMsg = i18n("RFSV could not connect to ncpd at %1:%2. ").arg("localhost").arg(7501);
- if (reconnectTime) {
- nextTry = reconnectTime;
- statusMsg += i18n(" (Retry in %1 seconds.)");
- QTimer::singleShot(1000, this, SLOT(slotUpdateTimer()));
-
- statusBar()->changeItem(statusMsg.arg(reconnectTime),
- STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg.arg(reconnectTime));
- } else {
- statusBar()->changeItem(statusMsg, STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg);
- }
- return;
- }
- rfsvfactory factory(rfsvSocket);
- plpRfsv = factory.create(false);
- if (plpRfsv == 0L) {
- if (args->isSet("autobackup")) {
- quitImmediately = true;
- return;
- }
- statusMsg = i18n("RFSV could not establish link: %1.").arg(KGlobal::locale()->translate(factory.getError()));
- delete rfsvSocket;
- rfsvSocket = 0L;
- if (reconnectTime) {
- nextTry = reconnectTime;
- statusMsg += i18n(" (Retry in %1 seconds.)");
- QTimer::singleShot(1000, this, SLOT(slotUpdateTimer()));
- statusBar()->changeItem(statusMsg.arg(reconnectTime),
- STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg.arg(reconnectTime));
- } else {
- statusBar()->changeItem(statusMsg, STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg);
- }
- return;
- }
-
- rpcsSocket = new ppsocket();
- if (!rpcsSocket->connect(NULL, 7501)) {
- if (args->isSet("autobackup")) {
- quitImmediately = true;
- return;
- }
- statusMsg = i18n("RPCS could not connect to ncpd at %1:%2.").arg("localhost").arg(7501);
- delete plpRfsv;
- plpRfsv = 0L;
- delete rfsvSocket;
- rfsvSocket = 0L;
- if (reconnectTime) {
- nextTry = reconnectTime;
- statusMsg += i18n(" (Retry in %1 seconds.)");
- QTimer::singleShot(1000, this, SLOT(slotUpdateTimer()));
- statusBar()->changeItem(statusMsg.arg(reconnectTime),
- STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg.arg(reconnectTime));
- } else {
- statusBar()->changeItem(statusMsg, STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg);
- }
- return;
- }
- rpcsfactory factory2(rpcsSocket);
- plpRpcs = factory2.create(false);
- if (plpRpcs == 0L) {
- if (args->isSet("autobackup")) {
- quitImmediately = true;
- return;
- }
- statusMsg = i18n("RPCS could not establish link: %1.").arg(KGlobal::locale()->translate(factory2.getError()));
- delete plpRfsv;
- plpRfsv = 0L;
- delete rfsvSocket;
- rfsvSocket = 0L;
- delete rpcsSocket;
- rpcsSocket = 0L;
- if (reconnectTime) {
- nextTry = reconnectTime;
- statusMsg += i18n(" (Retry in %1 seconds.)");
- QTimer::singleShot(1000, this, SLOT(slotUpdateTimer()));
- statusBar()->changeItem(statusMsg.arg(reconnectTime),
- STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg.arg(reconnectTime));
- } else {
- statusBar()->changeItem(statusMsg, STID_CONNECTION);
- if (showMB)
- KMessageBox::error(this, statusMsg);
- }
- return;
- }
- connected = true;
- queryPsion();
-}
-
-void KPsionMainWindow::
-slotUpdateTimer() {
- nextTry--;
- if (nextTry <= 0)
- tryConnect();
- else {
- statusBar()->changeItem(statusMsg.arg(nextTry), STID_CONNECTION);
- QTimer::singleShot(1000, this, SLOT(slotUpdateTimer()));
- }
-}
-
-void KPsionMainWindow::
-slotProgressBarPressed() {
-}
-
-void KPsionMainWindow::
-slotStartFullBackup() {
- fullBackup = true;
- doBackup();
-}
-
-void KPsionMainWindow::
-slotStartIncBackup() {
- fullBackup = false;
- doBackup();
-}
-
-const KTarEntry *KPsionMainWindow::
-findTarEntry(const KTarEntry *te, QString path, QString rpath) {
- const KTarEntry *fte = NULL;
- if (te->isDirectory() && (path.left(rpath.length()) == rpath)) {
- KTarDirectory *td = (KTarDirectory *)te;
- QStringList files = td->entries();
- for (QStringList::Iterator f = files.begin(); f != files.end(); f++) {
- QString tmp = rpath;
- if (tmp.length())
- tmp += "/";
- tmp += *f;
- fte = findTarEntry(td->entry(*f), path, tmp);
- if (fte != 0L)
- break;
- }
- } else {
- if (path == rpath)
- fte = te;
- }
- return fte;
-}
-
-void KPsionMainWindow::
-updateBackupStamps() {
- KConfig *config = kapp->config();
- KPsionConfig pcfg;
- QString uid = getMachineUID();
- int cfgBtype = (fullBackup)
- ? KPsionConfig::OPT_LASTFULL : KPsionConfig::OPT_LASTINC;
-
- config->setGroup(pcfg.getSectionName(cfgBtype));
- for (QIconViewItem *i = view->firstItem(); i; i = i->nextItem()) {
- QString key = pcfg.getOptionName(cfgBtype).arg(uid).arg(i->key());
- if (i->isSelected())
- config->writeEntry(key, time(0));
- }
-}
-
-void KPsionMainWindow::
-doBackup() {
- backupRunning = true;
- switchActions();
- QStringList processDrives;
- toBackup.clear();
-
- // Collect list of files to backup
- backupSize = 0;
- backupCount = 0;
- progressTotal = 0;
- emit enableProgressText(true);
- emit setProgress(0);
- for (QIconViewItem *i = view->firstItem(); i; i = i->nextItem()) {
- if (i->isSelected()) {
- QString drv = i->key();
- drv += ":";
- int drvChar = drv[0].latin1();
- PlpDrive drive;
- if (plpRfsv->devinfo(drvChar, drive) != rfsv::E_PSI_GEN_NONE) {
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- emit enableProgressText(false);
- emit setProgress(0);
- KMessageBox::error(this, i18n("Could not retrieve drive details for drive %1").arg(drv));
- backupRunning = false;
- switchActions();
- return;
- }
- emit setProgressText(i18n("Scanning drive %1").arg(drv));
-
- progressLocal = drive.getSize() - drive.getSpace();
- progressLocalCount = 0;
- progressLocalPercent = -1;
- progress->setValue(0);
- collectFiles(drv);
- processDrives += drv;
- }
- }
- emit setProgressText(i18n("%1 files need backup").arg(backupSize));
- if (backupCount == 0) {
- emit enableProgressText(false);
- emit setProgress(0);
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- updateBackupStamps();
- if (!args->isSet("autobackup"))
- KMessageBox::information(this, i18n("No files need backup"));
- backupRunning = false;
- switchActions();
- return;
- }
-
- progressCount = 0;
- progressTotal = backupSize;
- progressPercent = -1;
-
- // Create tgz with index file.
- QString archiveName = backupDir;
- if (archiveName.right(1) != "/")
- archiveName += "/";
- archiveName += getMachineUID();
- QDir archiveDir(archiveName);
- if (!archiveDir.exists())
- if (!archiveDir.mkdir(archiveName)) {
- emit enableProgressText(false);
- emit setProgress(0);
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- KMessageBox::error(this, i18n("Could not create backup folder %1").arg(archiveName));
- backupRunning = false;
- switchActions();
- return;
- }
-
- archiveName += (fullBackup) ? "/F-" : "/I-";
- time_t now = time(0);
- char tstr[30];
- strftime(tstr, sizeof(tstr), "%Y-%m-%d-%H-%M-%S.tmp.gz",
- localtime(&now));
- archiveName += tstr;
- backupTgz = new KTar(archiveName, "application/x-gzip");
- backupTgz->open(IO_WriteOnly);
- createIndex();
-
- // Kill all running applications on the Psion
- // and save their state.
- killSave();
-
- bool badBackup = false;
- Enum<rfsv::errs> res;
- // Now the real backup
- progressTotalText = i18n("Backup %1% done");
- for (int i = 0; i < toBackup.size(); i++) {
- PlpDirent e = toBackup[i];
- const char *fn = e.getName();
- QByteArray ba;
- QDataStream os(ba, IO_WriteOnly);
-
- emit setProgressText(QString("%1").arg(fn));
- progressLocal = e.getSize();
- progressLocalCount = 0;
- progressLocalPercent = -1;
- emit setProgress(0);
-
- u_int32_t handle;
-
- kapp->processEvents();
- bool tryLoop = true;
- do {
- res = plpRfsv->fopen(plpRfsv->opMode(rfsv::PSI_O_RDONLY), fn,
- handle);
- if (res == rfsv::E_PSI_GEN_NONE) {
- unsigned char *buff = new unsigned char[RFSV_SENDLEN];
- u_int32_t len;
- do {
- if ((res = plpRfsv->fread(handle, buff, RFSV_SENDLEN,
- len)) == rfsv::E_PSI_GEN_NONE) {
- os.writeRawBytes((char *)buff, len);
- updateProgress(len);
- }
- } while ((len > 0) && (res == rfsv::E_PSI_GEN_NONE));
- delete[]buff;
- plpRfsv->fclose(handle);
- }
- if (res != rfsv::E_PSI_GEN_NONE) {
- switch (KMessageBox::warningYesNoCancel(
- this, i18n(
- "<QT>Could not backup<BR/><B>%1</B><BR/>"
- "<FONT COLOR=RED>%2</FONT><BR/></QT>"
- ).arg(fn).arg((const char *)res),
- QString::null, i18n("Retry"), i18n("Ignore"))) {
- case KMessageBox::Cancel:
- badBackup = true;
- tryLoop = false;
- break;
- case KMessageBox::No:
- e.setName("!");
- tryLoop = false;
- break;
- case KMessageBox::Yes:
- break;
- }
- } else {
- tryLoop = false;
- }
- } while (tryLoop);
- if (badBackup)
- break;
- if (res != rfsv::E_PSI_GEN_NONE)
- continue;
- backupTgz->writeFile(psion2unix(fn), "root", "root", ba.size(),
- ba.data());
- }
-
- if (!badBackup) {
- // Reset archive attributes of all backuped files.
- emit setProgressText(i18n("Resetting archive attributes"));
- progressLocal = backupSize;
- progressLocalCount = 0;
- progressLocalPercent = -1;
- emit setProgress(0);
- kapp->processEvents();
- progressTotal = 0;
- for (int i = 0; i < toBackup.size(); i++) {
- PlpDirent e = toBackup[i];
- const char *fn = e.getName();
- if ((e.getAttr() & rfsv::PSI_A_ARCHIVE) &&
- (strcmp(fn, "!") != 0)) {
- kapp->processEvents();
- res = plpRfsv->fsetattr(fn, 0, rfsv::PSI_A_ARCHIVE);
- if (res != rfsv::E_PSI_GEN_NONE) {
- if (KMessageBox::warningYesNo(this, i18n("<QT>Could not set attributes of<BR/><B>%1</B><BR/><FONT COLOR=red>%2</FONT><BR/>Continue?</QT>").arg(fn)) == KMessageBox::No) {
- break;
- }
- }
- }
- updateProgress(e.getSize());
- }
- updateBackupStamps();
- }
- // Restart previously running applications on the Psion
- // from saved state info.
- runRestore();
-
- backupTgz->close();
- delete backupTgz;
- emit enableProgressText(false);
- emit setProgress(0);
-
- if (badBackup)
- ::unlink(archiveName.latin1());
- else {
- QString newName = archiveName;
- newName.replace(QRegExp("\\.tmp\\.gz$"), ".tar.gz");
- // Rename Tarfile to its final name;
- if (::rename(archiveName.latin1(), newName.latin1()) != 0)
- KMessageBox::sorry(this, i18n("<QT>Could not rename backup archive from<BR/><B>%1</B> to<BR/><B>%2</B></QT>").arg(archiveName).arg(newName));
- else
- removeOldBackups(processDrives);
- }
-
- backupRunning = false;
- switchActions();
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- emit enableProgressText(false);
- emit setProgress(0);
- statusBar()->message(i18n("Backup done"), 2000);
-}
-
-class Barchive {
-public:
- Barchive()
- : n(""), d(0) {}
- Barchive(const QString &name, time_t date)
- : n(name), d(date) {}
-
- QString name() const { return n; }
- time_t date() const { return d; }
- bool operator==(const Barchive &a) { return (a.n == n); }
-private:
- QString n;
- time_t d;
-};
-
-typedef QValueList<Barchive>ArchList;
-
-void KPsionMainWindow::
-removeOldBackups(QStringList &drives) {
-
- if (!fullBackup)
- return;
-
- KConfig *config = kapp->config();
- KPsionConfig pcfg;
-
- config->setGroup(pcfg.getSectionName(KPsionConfig::OPT_BACKUPGEN));
- int bgen = config->readNumEntry(
- pcfg.getOptionName(KPsionConfig::OPT_BACKUPGEN));
-
- if (bgen == 0)
- return;
-
- statusBar()->changeItem(i18n("Removing old backups ..."), STID_CONNECTION);
- QString bdir(backupDir);
- bdir += "/";
- bdir += getMachineUID();
- QDir d(bdir);
- kapp->processEvents();
- const QFileInfoList *fil =
- d.entryInfoList("*.tar.gz", QDir::Files|QDir::Readable, QDir::Name);
- QFileInfoListIterator it(*fil);
- QFileInfo *fi;
- ArchList alist;
-
- // Build a list of full-backups sorted by date
- while ((fi = it.current())) {
- kapp->processEvents();
-
- KTar tgz(fi->absFilePath());
- const KTarEntry *te;
-
- tgz.open(IO_ReadOnly);
- te = tgz.directory()->entry("KPsionFullIndex");
- if (te && (!te->isDirectory())) {
- for (QStringList::Iterator d = drives.begin(); d != drives.end();
- d++) {
- const KTarEntry *de = tgz.directory()->entry(*d);
- if (de && (de->isDirectory())) {
- Barchive a(tgz.fileName(), te->date());
- if (!alist.contains(a)) {
- if (alist.isEmpty() || (alist.first().date()>te->date()))
- alist.prepend(a);
- else
- alist.append(a);
- }
- }
- }
- }
- tgz.close();
- ++it;
- }
-
- // Remove entries from the beginning of the list if there are more than
- // bgen entries. This leaves at most bgen of the youngest backups in the
- // list.
- while (alist.count() > bgen) {
- Barchive r = alist.first();
- alist.remove(r);
- }
-
- // Finally iterate over all backups and delete those which are older
- // than the first entry in alist.
-
- (void)it.toFirst();
-
- while ((fi = it.current())) {
- kapp->processEvents();
-
- KTar tgz(fi->absFilePath());
- const KTarEntry *te;
- bool valid = false;
- bool del = false;
-
- tgz.open(IO_ReadOnly);
- te = tgz.directory()->entry("KPsionFullIndex");
- if (te && (!te->isDirectory()))
- valid = true;
- else {
- te = tgz.directory()->entry("KPsionIncrementalIndex");
- if (te && (!te->isDirectory()))
- valid = true;
- }
- if (valid) {
- Barchive a(tgz.fileName(), te->date());
- if (alist.isEmpty() ||
- ((!alist.contains(a)) && (te->date() < alist.first().date())))
- del = true;
- }
- tgz.close();
- if (del)
- ::remove(fi->absFilePath().data());
- ++it;
- }
-}
-
-bool KPsionMainWindow::
-askOverwrite(PlpDirent e) {
- if (overWriteAll)
- return true;
- const char *fn = e.getName();
- if (overWriteList.contains(QString(fn)))
- return true;
- PlpDirent old;
- Enum<rfsv::errs> res = plpRfsv->fgeteattr(fn, old);
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not get attributes of<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- return false;
- }
-
- // Don't ask if size and attribs are same
- if ((old.getSize() == e.getSize()) &&
- ((old.getAttr() & ~rfsv::PSI_A_ARCHIVE) ==
- (e.getAttr() & ~rfsv::PSI_A_ARCHIVE)))
- return true;
-
- QDateTime odate;
- QDateTime ndate;
-
- odate.setTime_t(old.getPsiTime().getTime());
- ndate.setTime_t(e.getPsiTime().getTime());
-
- // Dates
- QString od = KGlobal::locale()->formatDateTime(odate, false);
- QString nd = KGlobal::locale()->formatDateTime(ndate, false);
-
- // Sizes
- QString os = QString("%1 (%2)").arg(KIO::convertSize(old.getSize())).arg(KGlobal::locale()->formatNumber(old.getSize(), 0));
- QString ns = QString("%1 (%2)").arg(KIO::convertSize(e.getSize())).arg(KGlobal::locale()->formatNumber(e.getSize(), 0));
-
- // Attributes
- QString oa(plpRfsv->attr2String(old.getAttr()).c_str());
- QString na(plpRfsv->attr2String(e.getAttr()).c_str());
-
- KDialogBase dialog(i18n("Overwrite"), KDialogBase::Yes | KDialogBase::No |
- KDialogBase::Cancel, KDialogBase::No,
- KDialogBase::Cancel, this, "overwriteDialog", true, true,
- QString::null, QString::null, i18n("Overwrite &All"));
-
- QWidget *contents = new QWidget(&dialog);
- QHBoxLayout * lay = new QHBoxLayout(contents);
- lay->setSpacing(KDialog::spacingHint()*2);
- lay->setMargin(KDialog::marginHint()*2);
-
- lay->addStretch(1);
- QLabel *label1 = new QLabel(contents);
-
-#if (QT_VERSION >= 300)
- label1->setPixmap(kapp->style().stylePixmap(
- kapp->style().SP_MessageBoxWarning));
-#else
- label1->setPixmap(QMessageBox::standardIcon(QMessageBox::Warning,
- kapp->style().guiStyle()));
-#endif
- lay->add(label1);
- lay->add(new QLabel(i18n(
- "<QT>The file <B>%1</B> exists already on the Psion with "
- "different size and/or attributes."
- "<P><B>On the Psion:</B><BR/>"
- " Size: %2<BR/>"
- " Date: %3<BR/>"
- " Attributes: %4</P>"
- "<P><B>In backup:</B><BR/>"
- " Size: %5<BR/>"
- " Date: %6<BR/>"
- " Attributes: %7</P>"
- "Do you want to overwrite it?</QT>").arg(fn).arg(os).arg(od).arg(oa).arg(ns).arg(nd).arg(na), contents));
- lay->addStretch(1);
-
- dialog.setMainWidget(contents);
- dialog.enableButtonSeparator(false);
-
- int result = dialog.exec();
- switch (result) {
- case KDialogBase::Yes:
- return true;
- case KDialogBase::No:
- return false;
- case KDialogBase::Cancel:
- overWriteAll = true;
- return true;
- default: // Huh?
- break;
- }
-
- return false; // Default
-}
-
-void KPsionMainWindow::
-slotStartRestore() {
- restoreRunning = true;
- switchActions();
-
- kapp->setOverrideCursor(Qt::waitCursor);
- statusBar()->changeItem(i18n("Reading backups ..."), STID_CONNECTION);
- update();
- kapp->processEvents();
- KPsionRestoreDialog restoreDialog(this, getMachineUID());
- kapp->restoreOverrideCursor();
- statusBar()->changeItem(i18n("Selecting backups ..."), STID_CONNECTION);
-
- for (QIconViewItem *i = view->firstItem(); i; i = i->nextItem()) {
- if (i->isSelected() && (i->key() != "Z"))
- restoreDialog.autoSelect(i->key());
- }
-
- overWriteList.clear();
- overWriteAll = false;
-
- if (restoreDialog.exec() == KDialogBase::Accepted) {
- QStringList tars = restoreDialog.getSelectedTars();
- QStringList fmtDrives = restoreDialog.getFormatDrives();
- QStringList::Iterator t;
-
- backupSize = 0;
- backupCount = 0;
- for (t = tars.begin(); t != tars.end(); t++) {
- PlpDir toRestore = restoreDialog.getRestoreList(*t);
- for (int r = 0; r < toRestore.size(); r++) {
- PlpDirent e = toRestore[r];
- backupSize += e.getSize();
- backupCount++;
- }
- }
- if (backupCount == 0) {
- restoreRunning = false;
- switchActions();
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- return;
- }
-
- progressTotalText = i18n("Restore %1% done");
- progressTotal = backupSize;
- progressCount = 0;
- progressPercent = -1;
- emit setProgressText("");
- emit enableProgressText(true);
- emit setProgress(0);
-
- // Kill all running applications on the Psion
- // and save their state.
- killSave();
-
- for (t = tars.begin(); t != tars.end(); t++) {
- PlpDir toRestore = restoreDialog.getRestoreList(*t);
- if (toRestore.size() > 0) {
- KTar tgz(*t);
- const KTarEntry *te;
- QString pDir("");
-
- tgz.open(IO_ReadOnly);
- for (int r = 0; r < toRestore.size(); r++) {
- PlpDirent e = toRestore[r];
- PlpDirent olde;
-
- const char *fn = e.getName();
- Enum<rfsv::errs> res;
-
- progressLocal = e.getSize();
- progressLocalCount = 0;
- progressLocalPercent = -1;
- emit setProgressText(QString("%1").arg(fn));
- emit setProgress(0);
-
- te = findTarEntry(tgz.directory(), psion2unix(fn));
- if (te != 0L) {
- u_int32_t handle;
- QString cpDir(fn);
- QByteArray ba = ((KTarFile *)te)->data();
- int bslash = cpDir.findRev('\\');
- if (bslash > 0)
- cpDir = cpDir.left(bslash);
-
- QString drv = cpDir.left(1);
- if (fmtDrives.find(drv) != fmtDrives.end()) {
- int tSave = progressCount;
- doFormat(drv);
- fmtDrives.remove(drv);
- progressTotalText = i18n("Restore %1% done");
- progressTotal = backupSize;
- progressCount = tSave;
- progressLocal = e.getSize();
- progressLocalCount = 0;
- progressLocalPercent = -1;
- emit setProgressText(QString("%1").arg(fn));
- emit enableProgressText(true);
- emit setProgress(0);
- }
- if (pDir != cpDir) {
- pDir = cpDir;
- res = plpRfsv->mkdir(pDir);
- if ((res != rfsv::E_PSI_GEN_NONE) &&
- (res != rfsv::E_PSI_FILE_EXIST)) {
- KMessageBox::error(this, i18n(
- "<QT>Could not create directory<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(pDir).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- }
- res = plpRfsv->fcreatefile(
- plpRfsv->opMode(rfsv::PSI_O_RDWR), fn, handle);
- if (res == rfsv::E_PSI_FILE_EXIST) {
- if (!askOverwrite(e))
- continue;
- res = plpRfsv->freplacefile(
- plpRfsv->opMode(rfsv::PSI_O_RDWR), fn, handle);
- }
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not create<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- const unsigned char *data =
- (const unsigned char *)(ba.data());
- long len = ba.size();
-
- do {
- u_int32_t written;
- u_int32_t count =
- (len > RFSV_SENDLEN) ? RFSV_SENDLEN : len;
- res = plpRfsv->fwrite(handle, data, count, written);
- if (res != rfsv::E_PSI_GEN_NONE)
- break;
- len -= written;
- data += written;
- updateProgress(written);
- } while (len > 0);
- plpRfsv->fclose(handle);
-
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not write to<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- u_int32_t oldattr;
- res = plpRfsv->fgetattr(fn, oldattr);
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not get attributes of<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- u_int32_t mask = e.getAttr() ^ oldattr;
- u_int32_t sattr = e.getAttr() & mask;
- u_int32_t dattr = ~sattr & mask;
- int retry = 10;
- // Retry, because file somtimes takes some time
- // to close;
- do {
- res = plpRfsv->fsetattr(fn, sattr, dattr);
- if (res != rfsv::E_PSI_GEN_NONE)
- usleep(100000);
- retry--;
- } while ((res != rfsv::E_PSI_GEN_NONE) && (retry > 0));
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not set attributes of<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- retry = 10;
- do {
- res = plpRfsv->fsetmtime(fn, e.getPsiTime());
- if (res != rfsv::E_PSI_GEN_NONE)
- usleep(100000);
- retry--;
- } while ((res != rfsv::E_PSI_GEN_NONE) && (retry > 0));
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not set modification time of<BR/>"
- "<B>%1</B><BR/>Reason: %2</QT>").arg(fn).arg(KGlobal::locale()->translate(res)));
- continue;
- }
- overWriteList += QString(fn);
- }
- }
- tgz.close();
- }
- }
- // Restart previously running applications on the Psion
- // from saved state info.
- runRestore();
- } else {
- restoreRunning = false;
- switchActions();
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- return;
- }
-
- restoreRunning = false;
- switchActions();
- emit setProgress(0);
- emit enableProgressText(false);
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- statusBar()->message(i18n("Restore done"), 2000);
-}
-
-void KPsionMainWindow::
-doFormat(QString drive) {
- int handle;
- int count;
- const char dchar = drive[0].latin1();
- QString dname("");
-
- PlpDrive drv;
- if (plpRfsv->devinfo(dchar, drv) == rfsv::E_PSI_GEN_NONE)
- dname = QString(drv.getName().c_str());
-
- statusBar()->changeItem(i18n("Formatting drive %1:").arg(dchar),
- STID_CONNECTION);
- update();
-
- emit setProgressText(QString(""));
- emit setProgress(0);
- emit enableProgressText(true);
-
- Enum<rfsv::errs> res = plpRpcs->formatOpen(dchar, handle, count);
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Could not format drive %1:<BR/>"
- "%2</QT>").arg(dchar).arg(KGlobal::locale()->translate(res)));
- emit setProgress(0);
- emit enableProgressText(false);
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- return;
- }
- progressTotal = 0;
- progressLocal = count;
- progressLocalCount = 0;
- progressLocalPercent = -1;
- updateProgress(0);
- for (int i = 0; i < count; i++) {
- res = plpRpcs->formatRead(handle);
- if (res != rfsv::E_PSI_GEN_NONE) {
- KMessageBox::error(this, i18n(
- "<QT>Error during format of drive %1:<BR/>"
- "%2</QT>").arg(dchar).arg(KGlobal::locale()->translate(res)));
- emit setProgress(0);
- emit enableProgressText(false);
- statusBar()->changeItem(
- i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- count = 0;
- return;
- }
- updateProgress(1);
- }
- setDriveName(dchar, dname);
-
- emit setProgress(0);
- emit enableProgressText(false);
- statusBar()->changeItem(i18n("Connected to %1").arg(machineName),
- STID_CONNECTION);
- statusBar()->message(i18n("Format done"), 2000);
-}
-
-void KPsionMainWindow::
-slotStartFormat() {
- if (KMessageBox::warningYesNo(this, i18n(
- "<QT>This erases <B>ALL</B> data "
- "on the drive(s).<BR/>Do you really "
- "want to proceed?"
- )) == KMessageBox::No)
- return;
- formatRunning = true;
- switchActions();
- killSave();
-
- for (QIconViewItem *i = view->firstItem(); i; i = i->nextItem()) {
- if (i->isSelected() && (i->key() != "Z"))
- doFormat(i->key());
- }
-
- runRestore();
- formatRunning = false;
- switchActions();
-}
-
-void KPsionMainWindow::
-setDriveName(const char dchar, QString dname) {
- KDialogBase dialog(this, "drivenameDialog", true, i18n("Assign drive name"),
- KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok,
- true);
-
- QWidget *w = new QWidget(&dialog);
- QGridLayout *gl = new QGridLayout(w, 1, 1, KDialog::marginHint()*2,
- KDialog::spacingHint()*2);
-
- QLabel *l = new QLabel(i18n(
- "<QT>Formatting of drive %1: finished. Please assign a name for "
- "that drive.</QT>").arg(dchar), w);
- gl->addMultiCellWidget(l, 0, 0, 0, 1);
-
- l = new QLabel(i18n("New name of drive %1:").arg(dchar), w);
- gl->addWidget(l, 1, 0);
-
- KLineEdit *e = new KLineEdit(dname, w, "nameEntry");
- gl->addWidget(e, 1, 1);
-
- gl->setColStretch(1, 1);
- dialog.setMainWidget(w);
-
- int result = dialog.exec();
- QString newname = QString("%1:").arg(dchar);
- QString dstr;
- dstr = dchar;
-
- switch (result) {
- case QDialog::Accepted:
- if (!e->text().isEmpty()) {
- Enum<rfsv::errs> res;
- res = plpRfsv->setVolumeName(dchar, e->text());
- if (res == rfsv::E_PSI_GEN_NONE)
- newname = QString("%1 (%2:)").arg(e->text()).arg(dchar);
- }
- drives.replace(dchar, newname);
- for (QIconViewItem *i = view->firstItem(); i; i = i->nextItem()) {
- if (i->key() == dstr) {
- i->setText(newname);
- break;
- }
- }
- emit rearrangeIcons(true);
- break;
- default: // Huh?
- break;
- }
-}
-
-void KPsionMainWindow::
-slotToggleToolbar() {
- if (toolBar()->isVisible())
- toolBar()->hide();
- else
- toolBar()->show();
-}
-
-void KPsionMainWindow::
-slotToggleStatusbar() {
- if (statusBar()->isVisible())
- statusBar()->hide();
- else
- statusBar()->show();
-}
-
-void KPsionMainWindow::
-slotSaveOptions() {
-}
-
-void KPsionMainWindow::
-slotPreferences() {
- SetupDialog d(this, plpRfsv, plpRpcs);
- d.exec();
-}
-
-void KPsionMainWindow::
-updateProgress(unsigned long amount) {
- progressLocalCount += amount;
- int lastPercent = progressLocalPercent;
- if (progressLocal)
- progressLocalPercent = progressLocalCount * 100 / progressLocal;
- else
- progressLocalPercent = 100;
- if (progressLocalPercent != lastPercent)
- emit setProgress(progressLocalPercent);
- if (progressTotal > 0) {
- progressCount += amount;
- lastPercent = progressPercent;
- if (progressTotal)
- progressPercent = progressCount * 100 / progressTotal;
- else
- progressPercent = 100;
- if (progressPercent != lastPercent)
- statusBar()->changeItem(progressTotalText.arg(progressPercent),
- STID_CONNECTION);
- }
- kapp->processEvents();
-}
-
-void KPsionMainWindow::
-collectFiles(QString dir) {
- Enum<rfsv::errs> res;
- PlpDir files;
- QString tmp = dir;
-
- kapp->processEvents();
- tmp += "\\";
- if ((res = plpRfsv->dir(tmp.data(), files)) != rfsv::E_PSI_GEN_NONE) {
- // messagebox "Couldn't get directory ...."
- } else
- for (int i = 0; i < files.size(); i++) {
- PlpDirent e = files[i];
-
-
- long attr = e.getAttr();
- tmp = dir;
- tmp += "\\";
- tmp += e.getName();
- if (attr & rfsv::PSI_A_DIR) {
- collectFiles(tmp);
- } else {
- updateProgress(e.getSize());
- if ((attr & rfsv::PSI_A_ARCHIVE) || fullBackup) {
- backupCount++;
- backupSize += e.getSize();
- e.setName(tmp.data());
- toBackup.push_back(e);
- }
- }
- }
-}
-
-void KPsionMainWindow::
-killSave() {
- Enum<rfsv::errs> res;
- processList tmp;
-
- savedCommands.clear();
- if ((res = plpRpcs->queryPrograms(tmp)) != rfsv::E_PSI_GEN_NONE) {
- cerr << "Could not get process list, Error: " << res << endl;
- return;
- } else {
- for (processList::iterator i = tmp.begin(); i != tmp.end(); i++) {
- savedCommands += i->getArgs();
- emit setProgressText(i18n("Stopping %1").arg(i->getName()));
- kapp->processEvents();
- plpRpcs->stopProgram(i->getProcId());
- }
- }
- time_t tstart = time(0) + 5;
- while (true) {
- kapp->processEvents();
- usleep(100000);
- kapp->processEvents();
- if ((res = plpRpcs->queryPrograms(tmp)) != rfsv::E_PSI_GEN_NONE) {
- cerr << "Could not get process list, Error: " << res << endl;
- return;
- }
- if (tmp.empty())
- break;
- if (time(0) > tstart) {
- KMessageBox::error(this, i18n(
- "<QT>Could not stop all processes.<BR/>"
- "Please stop running programs manually on the Psion, "
- "then click <B>Ok</B>."));
- tstart = time(0) + 5;
- }
- }
- return;
-}
-
-void KPsionMainWindow::
-runRestore() {
- Enum<rfsv::errs> res;
-
- for (QStringList::Iterator it = savedCommands.begin(); it != savedCommands.end(); it++) {
- int firstBlank = (*it).find(' ');
- QString cmd = (*it).left(firstBlank);
- QString arg = (*it).mid(firstBlank + 1);
-
- if (!cmd.isEmpty()) {
- // Workaround for broken programs like Backlite.
- // These do not storethe full program path.
- // In that case we try running the arg1 which
- // results in starting the program via recog. facility.
- emit setProgressText(i18n("Starting %1").arg(cmd));
- kapp->processEvents();
- if ((arg.length() > 2) && (arg[1] == ':') && (arg[0] >= 'A') &&
- (arg[0] <= 'Z'))
- res = plpRpcs->execProgram(arg.data(), "");
- else
- res = plpRpcs->execProgram(cmd.data(), arg.data());
- if (res != rfsv::E_PSI_GEN_NONE) {
- // If we got an error here, that happened probably because
- // we have no path at all (e.g. Macro5) and the program is
- // not registered in the Psion's path properly. Now try
- // the ususal \System\Apps\<AppName>\<AppName>.app
- // on all drives.
- if (cmd.find('\\') == -1) {
- driveMap::Iterator it;
- for (it = drives.begin(); it != drives.end(); it++) {
- QString newcmd = QString::fromLatin1("%1:\\System\\Apps\\%2\\%3").arg(it.key()).arg(cmd).arg(cmd);
- res = plpRpcs->execProgram(newcmd.data(), "");
- if (res == rfsv::E_PSI_GEN_NONE)
- break;
- newcmd += ".app";
- res = plpRpcs->execProgram(newcmd.data(), "");
- if (res == rfsv::E_PSI_GEN_NONE)
- break;
-
- }
- }
- }
- }
- }
- return;
-}
-
-void KPsionMainWindow::
-createIndex() {
- QByteArray ba;
- QTextOStream os(ba);
- os << "#plpbackup index " <<
- (fullBackup ? "F" : "I") << endl;
- for (int i = 0; i < toBackup.size(); i++) {
- PlpDirent e = toBackup[i];
- PsiTime t = e.getPsiTime();
- long attr = e.getAttr() &
- ~rfsv::PSI_A_ARCHIVE;
-#if (QT_VERSION < 300)
- os << hex
- << setw(8) << setfill('0') <<
- t.getPsiTimeHi() << " "
- << setw(8) << setfill('0') <<
- t.getPsiTimeLo() << " "
- << setw(8) << setfill('0') <<
- e.getSize() << " "
- << setw(8) << setfill('0') <<
- attr << " "
- << setw(0) << e.getName() << endl;
-#else
- os << hex
- << qSetW(8) << qSetFill('0') <<
- t.getPsiTimeHi() << " "
- << qSetW(8) << qSetFill('0') <<
- t.getPsiTimeLo() << " "
- << qSetW(8) << qSetFill('0') <<
- e.getSize() << " "
- << qSetW(8) << qSetFill('0') <<
- attr << " "
- << qSetW(0) << e.getName() << endl;
-#endif
- kapp->processEvents();
- }
- QString idxName =
- QString::fromLatin1("KPsion%1Index").arg(fullBackup ?
- "Full" : "Incremental");
- backupTgz->writeFile(idxName, "root", "root", ba.size(), ba.data());
-}
-
-/*
- * Local variables:
- * c-basic-offset: 4
- * End:
- */