/* KPilot ** ** Copyright (C) 1998-2001 by Dan Pilone ** Copyright (C) 2003-2004 Reinhold Kainhofer ** 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 kde-pim@kde.org */ #include "options.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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(""); } 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; }