diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-02-16 20:17:18 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-02-16 20:17:18 +0000 |
commit | cb7eddb91455a69cf66fcd717e91a51ca5e2cfef (patch) | |
tree | cf5546e4d7c44370fbe9ca2be937bd254f30ebaa /lib/syncAction.cc | |
download | kpilot-cb7eddb91455a69cf66fcd717e91a51ca5e2cfef.tar.gz kpilot-cb7eddb91455a69cf66fcd717e91a51ca5e2cfef.zip |
Moved kpilot from kdepim to applications, as the core Trinity libraries should not contain hardware-dependent software
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kpilot@1221127 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'lib/syncAction.cc')
-rw-r--r-- | lib/syncAction.cc | 512 |
1 files changed, 512 insertions, 0 deletions
diff --git a/lib/syncAction.cc b/lib/syncAction.cc new file mode 100644 index 0000000..3e29ad3 --- /dev/null +++ b/lib/syncAction.cc @@ -0,0 +1,512 @@ +/* KPilot +** +** Copyright (C) 1998-2001 by Dan Pilone +** Copyright (C) 2003-2004 Reinhold Kainhofer <[email protected]> +** Copyright (C) 2001 by Waldo Bastian (code in questionYesNo) +** +*/ + +/* +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this program in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to [email protected] +*/ + +#include "options.h" + +#include <time.h> + +#include <pi-socket.h> +#include <pi-dlp.h> + +#include <tqtimer.h> +#include <tqvbox.h> +#include <tqlayout.h> +#include <tqcheckbox.h> +#include <tqlabel.h> +#include <tqmessagebox.h> +#include <tqdir.h> +#include <tqfile.h> +#include <tqfileinfo.h> +#include <tqtl.h> +#include <tqstyle.h> + +#include <kdialogbase.h> +#include <kglobal.h> +#include <kstandarddirs.h> +#include <kconfig.h> +#include <kmessagebox.h> + +#include "syncAction.moc" +#include "kpilotlibSettings.h" + +SyncAction::SyncAction(KPilotLink *p, + const char *name) : + TQObject(p, name), + fHandle(p), + fParent(0L) +{ + FUNCTIONSETUP; +} + +SyncAction::SyncAction(KPilotLink *p, + TQWidget * visibleparent, + const char *name) : + TQObject(p, name), + fHandle(p), + fParent(visibleparent) +{ + FUNCTIONSETUP; +} + +SyncAction::~SyncAction() +{ +} + +/* virtual */ TQString SyncAction::statusString() const +{ + FUNCTIONSETUP; + TQString s = CSL1("status="); + + s.append(TQString::number(status())); + return s; +} + +/* slot */ void SyncAction::execConduit() +{ + FUNCTIONSETUP; + + DEBUGKPILOT << fname << ": Exec " << name() << endl; + + bool r = this->exec(); + + DEBUGKPILOT << fname << ": Exec " << name() + << (r ? " is running" : " failed to start") << endl; + + if (!r) + { + emit logError(i18n("The conduit %1 could not be executed.") + .arg(TQString::tqfromLatin1(name()))); + delayDone(); + } +} + +/* slot */ void SyncAction::delayedDoneSlot() +{ + emit syncDone(this); +} + +bool SyncAction::delayDone() +{ + TQTimer::singleShot(0,this,TQT_SLOT(delayedDoneSlot())); + return true; +} + +static struct +{ + SyncAction::SyncMode::Mode mode; + const char *name; +} maps[] = +{ + { SyncAction::SyncMode::eHotSync, "--hotsync" }, + { SyncAction::SyncMode::eFullSync, "--full" }, + { SyncAction::SyncMode::eCopyPCToHH, "--copyPCToHH" }, + { SyncAction::SyncMode::eCopyHHToPC, "--copyHHToPC" }, + { SyncAction::SyncMode::eBackup, "--backup" }, + { SyncAction::SyncMode::eRestore, "--restore" }, + { SyncAction::SyncMode::eFullSync, "--fullsync" }, + { SyncAction::SyncMode::eHotSync, (const char *)0 } +} +; + +SyncAction::SyncMode::SyncMode(const TQStringList &args) : + fMode(eHotSync), + fTest(args.tqcontains("--test")), + fLocal(args.tqcontains("--local")) +{ + int i = 0; + while(maps[i].name) + { + if (args.tqcontains(TQString::tqfromLatin1(maps[i].name))) + { + fMode = maps[i].mode; + break; + } + i++; + } + + if (!maps[i].name) + { + WARNINGKPILOT << "No mode set by arguments (" + << args.join(",") << ") defaulting to HotSync." << endl; + } +} + +SyncAction::SyncMode::SyncMode(Mode m, bool test, bool local) : + fMode(m), + fTest(test), + fLocal(local) +{ + if ( ((int)m<(int)eHotSync) || ((int)m>(int)eRestore) ) + { + WARNINGKPILOT << "Mode value " << (int)m << " is illegal" + ", defaulting to HotSync." << endl; + fMode = eHotSync; + } +} + +TQStringList SyncAction::SyncMode::list() const +{ + FUNCTIONSETUPL(3); + + TQStringList l; + int i=0; + + while(maps[i].name) + { + if ( fMode == maps[i].mode ) + { + l.append(TQString::tqfromLatin1(maps[i].name)); + break; + } + i++; + } + if ( !maps[i].name ) + { + WARNINGKPILOT << "Mode " << fMode << " does not have a name." << endl; + l.append(TQString::tqfromLatin1(maps[0].name)); + } + + if (isTest()) l.append(CSL1("--test")); + if (isLocal()) l.append(CSL1("--local")); + return l; +} + +/* static */ TQString SyncAction::SyncMode::name(SyncAction::SyncMode::Mode e) +{ + switch(e) + { + case eHotSync : return i18n("HotSync"); + case eFullSync : return i18n("Full Synchronization"); + case eCopyPCToHH : return i18n("Copy PC to Handheld"); + case eCopyHHToPC : return i18n("Copy Handheld to PC"); + case eBackup : return i18n("Backup"); + case eRestore : return i18n("Restore From Backup"); + } + return CSL1("<unknown>"); +} + +TQString SyncAction::SyncMode::name() const +{ + TQString s = name(fMode); + if (isTest()) + { + + s.append(CSL1(" [%1]").arg(i18n("Test Sync"))); + } + if (isLocal()) + { + s.append(CSL1(" [%1]").arg(i18n("Local Sync"))); + } + return s; +} + +bool SyncAction::SyncMode::setMode(int mode) +{ + // Resets test and local flags too + fTest = fLocal = false; + + if ( (mode>0) && (mode<=eRestore) ) + { + fMode = (SyncAction::SyncMode::Mode) mode; + return true; + } + else + { + WARNINGKPILOT << "Bad sync mode " << mode << " requested." << endl ; + fMode = eHotSync; + return false; + } +} + +bool SyncAction::SyncMode::setMode(SyncAction::SyncMode::Mode m) +{ + int i=0; + while ( maps[i].name ) + { + if ( maps[i].mode == m ) + { + fMode = m; + return true; + } + i++; + } + + WARNINGKPILOT << "Bad sync mode " << m << " requested." << endl ; + fMode = eHotSync; + return false; +} + +void SyncAction::startTickle(unsigned timeout) +{ + FUNCTIONSETUP; + + if (!deviceLink()) + { + WARNINGKPILOT << "Trying to tickle without a device." << endl; + } + else + { + connect(deviceLink(),TQT_SIGNAL(timeout()),this,TQT_SIGNAL(timeout())); + deviceLink()->startTickle(timeout); + } +} + +void SyncAction::stopTickle() +{ + FUNCTIONSETUP; + if (!deviceLink()) + { + WARNINGKPILOT << "Trying to tickle without a device." << endl; + } + else + { + disconnect(deviceLink(),TQT_SIGNAL(timeout()),this,TQT_SIGNAL(timeout())); + deviceLink()->stopTickle(); + } +} + + +int SyncAction::questionYesNo(const TQString & text, + const TQString & caption, + const TQString & key, + unsigned timeout, + const TQString & yes, + const TQString &no ) +{ + FUNCTIONSETUP; + + bool checkboxReturn = false; + int r; + KMessageBox::ButtonCode result; + if (!key.isEmpty()) + { + if (!KMessageBox::shouldBeShownYesNo(key,result)) + { + return result; + } + } + + KDialogBase *dialog = + new KDialogBase(caption.isNull()? i18n("Question") : caption, + KDialogBase::Yes | KDialogBase::No, + KDialogBase::Yes, KDialogBase::No, + fParent, "questionYesNo", true, true, + yes.isEmpty() ? KStdGuiItem::yes() : yes, + no.isEmpty() ? KStdGuiItem::no() : no); + + if ( (timeout > 0) && ( deviceLink() ) ) + { + TQObject::connect(deviceLink(), TQT_SIGNAL(timeout()), + dialog, TQT_SLOT(slotCancel())); + startTickle(timeout); + } + +#if KDE_IS_VERSION(3,3,0) + r = (KMessageBox::ButtonCode) KMessageBox::createKMessageBox(dialog, + TQMessageBox::Question, + text, + TQStringList(), + (key.isEmpty() ? TQString::null : i18n("&Do not ask again")), + &checkboxReturn, + 0); + +#else + // The following code is taken from KDialogBase.cc, + // part of the KDE 2.2 libraries. Copyright 2001 + // by Waldo Bastian. + // + // + TQVBox *topcontents = new TQVBox(dialog); + + topcontents->setSpacing(KDialog::spacingHint() * 2); + topcontents->setMargin(KDialog::marginHint() * 2); + + TQWidget *contents = new TQWidget(topcontents); + TQHBoxLayout *lay = new TQHBoxLayout(contents); + + lay->setSpacing(KDialog::spacingHint() * 2); + + lay->addStretch(1); + TQLabel *label1 = new TQLabel( contents); + label1->setPixmap(TQMessageBox::standardIcon(TQMessageBox::Information)); + lay->add( label1 ); + TQLabel *label2 = new TQLabel( text, contents); + label2->setMinimumSize(label2->tqsizeHint()); + lay->add(label2); + lay->addStretch(1); + + TQSize extraSize = TQSize(50, 30); + + TQCheckBox *checkbox = 0L; + if (!key.isEmpty()) + { + checkbox = new TQCheckBox(i18n("Do not ask again"),topcontents); + extraSize = TQSize(50,0); + } + + dialog->setMainWidget(topcontents); + dialog->enableButtonSeparator(false); + dialog->incInitialSize(extraSize); + + r = dialog->exec(); + if (checkbox) + { + checkboxReturn = checkbox->isChecked(); + } +#endif + + switch(r) + { + case KDialogBase::Yes : result=KMessageBox::Yes ; break; + case KDialogBase::No : result=KMessageBox::No; break; + case KDialogBase::Cancel : result=KMessageBox::Cancel; break; + default : break; + } + + stopTickle(); + + if (!key.isEmpty() && checkboxReturn) + { + KMessageBox::saveDontShowAgainYesNo(key,result); + } + + return result; +} + + +int SyncAction::questionYesNoCancel(const TQString & text, + const TQString & caption, + const TQString & key, + unsigned timeout, + const TQString &yes, + const TQString &no) +{ + FUNCTIONSETUP; + + bool checkboxReturn = false; + int r; + KMessageBox::ButtonCode result; + + if (!key.isEmpty()) + { + if (!KMessageBox::shouldBeShownYesNo(key,result)) + { + if (result != KMessageBox::Cancel) + { + return result; + } + } + } + + KDialogBase *dialog = + new KDialogBase(caption.isNull()? i18n("Question") : caption, + KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel, + KDialogBase::Yes, KDialogBase::Cancel, + fParent, "questionYesNoCancel", true, true, + (yes.isEmpty() ? KStdGuiItem::yes() : yes), + (no.isEmpty() ? KStdGuiItem::no() : no), + KStdGuiItem::cancel()); + + if ( (timeout > 0) && (deviceLink()) ) + { + TQObject::connect(deviceLink(), TQT_SIGNAL(timeout()), + dialog, TQT_SLOT(slotCancel())); + startTickle(timeout); + } + +#if KDE_IS_VERSION(3,3,0) + r = KMessageBox::createKMessageBox(dialog, + TQMessageBox::Question, + text, + TQStringList(), + (key.isEmpty() ? TQString::null : i18n("&Do not ask again")), + &checkboxReturn, + 0); +#else + // The following code is taken from KDialogBase.cc, + // part of the KDE 2.2 libraries. Copyright 2001 + // by Waldo Bastian. + // + // + TQVBox *topcontents = new TQVBox(dialog); + + topcontents->setSpacing(KDialog::spacingHint() * 2); + topcontents->setMargin(KDialog::marginHint() * 2); + + TQWidget *contents = new TQWidget(topcontents); + TQHBoxLayout *lay = new TQHBoxLayout(contents); + + lay->setSpacing(KDialog::spacingHint() * 2); + + lay->addStretch(1); + TQLabel *label1 = new TQLabel( contents); + label1->setPixmap(TQMessageBox::standardIcon(TQMessageBox::Information)); + lay->add( label1 ); + TQLabel *label2 = new TQLabel( text, contents); + label2->setMinimumSize(label2->tqsizeHint()); + lay->add(label2); + lay->addStretch(1); + + TQSize extraSize = TQSize(50, 30); + + TQCheckBox *checkbox = 0L; + if (!key.isEmpty()) + { + checkbox = new TQCheckBox(i18n("Do not ask again"),topcontents); + extraSize = TQSize(50,0); + } + + dialog->setMainWidget(topcontents); + dialog->enableButtonSeparator(false); + dialog->incInitialSize(extraSize); + + r = dialog->exec(); + if (checkbox) + { + checkboxReturn = checkbox->isChecked(); + } +#endif + + switch(r) + { + case KDialogBase::Yes : result=KMessageBox::Yes ; break; + case KDialogBase::No : result=KMessageBox::No; break; + case KDialogBase::Cancel : result=KMessageBox::Cancel; break; + default : break; + } + stopTickle(); + + if (!key.isEmpty() && checkboxReturn) + { + KMessageBox::saveDontShowAgainYesNo(key,result); + } + + return result; +} + |