/* KPilot ** ** Copyright (C) 1998-2001 by Dan Pilone ** Copyright (C) 2003-2004 Reinhold Kainhofer ** ** This is the main program in KPilot. ** */ /* ** 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 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 #include #include #include #include #include #include #include #include "kpilotConfigDialog.h" #include "kpilotConfig.h" #include "kpilotConfigWizard.h" #include "pilotComponent.h" #include "pilotDatabase.h" #include "addressWidget.h" #include "memoWidget.h" #include "fileInstallWidget.h" #include "logWidget.h" #include "dbviewerWidget.h" #include "datebookWidget.h" #include "todoWidget.h" #include "conduitConfigDialog.h" #include "pilotDaemonDCOP.h" #include "pilotDaemonDCOP_stub.h" #include "kpilot.moc" class KPilotInstaller::KPilotPrivate { public: typedef TQPtrList ComponentList; private: ComponentList fPilotComponentList; public: ComponentList &list() { return fPilotComponentList; } ; } ; KPilotInstaller::KPilotInstaller() : DCOPObject("KPilotIface"), KMainWindow(0), fDaemonStub(new PilotDaemonDCOP_stub("kpilotDaemon", "KPilotDaemonIface")), fP(new KPilotPrivate), fQuitAfterCopyComplete(false), fManagingWidget(0L), fDaemonWasRunning(true), fApptqStatus(Startup), fFileInstallWidget(0L), fLogWidget(0L) { FUNCTIONSETUP; readConfig(); setupWidget(); PilotRecord::allocationInfo(); fConfigureKPilotDialogInUse = false; } KPilotInstaller::~KPilotInstaller() { FUNCTIONSETUP; killDaemonIfNeeded(); delete fDaemonStub; PilotRecord::allocationInfo(); (void) PilotDatabase::instanceCount(); } void KPilotInstaller::killDaemonIfNeeded() { FUNCTIONSETUP; if (KPilotSettings::killDaemonAtExit()) { if (!fDaemonWasRunning) { DEBUGKPILOT << fname << ": Killing daemon." << endl; getDaemon().quitNow(); } } } void KPilotInstaller::startDaemonIfNeeded() { FUNCTIONSETUP; fApptqStatus=WaitingForDaemon; TQString daemonError; TQCString daemonDCOP; int daemonPID; TQString s = getDaemon().statusString(); DEBUGKPILOT << fname << ": Daemon status is " << ( s.isEmpty() ? CSL1("") : s ) << endl; if ((s.isEmpty()) || (!getDaemon().ok())) { DEBUGKPILOT << fname << ": Daemon not responding, trying to start it." << endl; fLogWidget->addMessage(i18n("Starting the KPilot daemon ...")); fDaemonWasRunning = false; } else { fDaemonWasRunning = true; } if (!fDaemonWasRunning && KApplication::startServiceByDesktopName( CSL1("kpilotdaemon"), TQString(), &daemonError, &daemonDCOP, &daemonPID , "0" /* no notify */ )) { WARNINGKPILOT << ": Can't start daemon : " << daemonError << endl; if (fLogWidget) { fLogWidget->addMessage(i18n("Could not start the " "KPilot daemon. The system error message " "was: "%1"").tqarg(daemonError)); } fApptqStatus=Error; } else { DEBUGKPILOT << fname << ": Daemon status is " << s << endl; if (fLogWidget) { int wordoffset; s.remove(0,12); wordoffset=s.find(';'); if (wordoffset>0) s.truncate(wordoffset); fLogWidget->addMessage( i18n("Daemon status is `%1'") .tqarg(s.isEmpty() ? i18n("not running") : s )); } fApptqStatus=Normal; } } void KPilotInstaller::readConfig() { FUNCTIONSETUP; KPilotSettings::self()->readConfig(); (void) Pilot::setupPilotCodec(KPilotSettings::encoding()); (void) Pilot::setupPilotCodec(KPilotSettings::encoding()); if (fLogWidget) { fLogWidget->addMessage(i18n("Using character set %1 on " "the handheld.") .tqarg(Pilot::codecName())); } } void KPilotInstaller::setupWidget() { FUNCTIONSETUP; setCaption(CSL1("KPilot")); setMinimumSize(500, 405); fManagingWidget = new KJanusWidget(this,"mainWidget", KJanusWidget::IconList); fManagingWidget->setMinimumSize(fManagingWidget->tqsizeHint()); fManagingWidget->show(); setCentralWidget(fManagingWidget); connect( fManagingWidget, TQT_SIGNAL( aboutToShowPage ( TQWidget* ) ), TQT_TQOBJECT(this), TQT_SLOT( slotAboutToShowComponent( TQWidget* ) ) ); initIcons(); initMenu(); initComponents(); setMinimumSize(tqsizeHint() + TQSize(10,60)); createGUI(CSL1("kpilotui.rc"), false); setAutoSaveSettings(); } void KPilotInstaller::initComponents() { FUNCTIONSETUP; TQString defaultDBPath = KPilotConfig::getDefaultDBPath(); TQPixmap pixmap; TQString pixfile; TQWidget *w; #define ADDICONPAGE(a,b) \ pixmap = KGlobal::iconLoader()->loadIcon(b, KIcon::Desktop, 64); \ w = getManagingWidget()->addVBoxPage(a,TQString(), pixmap) ; ADDICONPAGE(i18n("HotSync"),CSL1("kpilotbhotsync")); fLogWidget = new LogWidget(w); addComponentPage(fLogWidget, i18n("HotSync")); fLogWidget->setShowTime(true); ADDICONPAGE(i18n("To-do Viewer"),CSL1("kpilottodo")); addComponentPage(new TodoWidget(w,defaultDBPath), i18n("To-do Viewer")); ADDICONPAGE(i18n("Address Viewer"),CSL1("kpilotaddress")); addComponentPage(new AddressWidget(w,defaultDBPath), i18n("Address Viewer")); ADDICONPAGE(i18n("Memo Viewer"),CSL1("kpilotknotes")); addComponentPage(new MemoWidget(w, defaultDBPath), i18n("Memo Viewer")); ADDICONPAGE(i18n("File Installer"),CSL1("kpilotfileinstaller")); fFileInstallWidget = new FileInstallWidget( w,defaultDBPath); addComponentPage(fFileInstallWidget, i18n("File Installer")); ADDICONPAGE(i18n("Generic DB Viewer"),CSL1("kpilotdb")); addComponentPage(new GenericDBWidget(w,defaultDBPath), i18n("Generic DB Viewer")); #undef ADDICONPAGE TQTimer::singleShot(500,this,TQT_SLOT(initializeComponents())); } void KPilotInstaller::initIcons() { FUNCTIONSETUP; } void KPilotInstaller::slotAboutToShowComponent( TQWidget *c ) { FUNCTIONSETUP; int ix = fManagingWidget->pageIndex( c ); PilotComponent*compToShow = fP->list().at(ix); for ( PilotComponent *comp = fP->list().first(); comp; comp = fP->list().next() ) { // Load/Unload the data needed comp->showKPilotComponent( comp == compToShow ); } } void KPilotInstaller::slotSelectComponent(PilotComponent *c) { FUNCTIONSETUP; if (!c) { WARNINGKPILOT << "Not a widget." << endl; return; } TQObject *o = c->parent(); if (!o) { WARNINGKPILOT << "Widget has no parent." << endl; return; } TQWidget *parent = dynamic_cast(o); if (!parent) { WARNINGKPILOT << "Widget's parent is not a widget." << endl; return; } int index = fManagingWidget->pageIndex(parent); if (index < 0) { WARNINGKPILOT << "Bogus index " << index << endl; return; } for ( PilotComponent *comp = fP->list().first(); comp; comp = fP->list().next() ) { // Load/Unload the data needed comp->showKPilotComponent( comp == c ); } fManagingWidget->showPage(index); } void KPilotInstaller::slotBackupRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eBackup, i18n("Next sync will be a backup. ") + i18n("Please press the HotSync button.")); } void KPilotInstaller::slotRestoreRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eRestore, i18n("Next sync will restore the Pilot from backup. ") + i18n("Please press the HotSync button.")); } void KPilotInstaller::slotHotSyncRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eHotSync, i18n("Next sync will be a regular HotSync. ") + i18n("Please press the HotSync button.")); } void KPilotInstaller::slotFullSyncRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eFullSync, i18n("Next sync will be a Full Sync. ") + i18n("Please press the HotSync button.")); } void KPilotInstaller::slotHHtoPCRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eCopyHHToPC, i18n("Next sync will copy Handheld data to PC. ") + i18n("Please press the HotSync button.")); } void KPilotInstaller::slotPCtoHHRequested() { FUNCTIONSETUP; setupSync(SyncAction::SyncMode::eCopyPCToHH, i18n("Next sync will copy PC data to Handheld. ") + i18n("Please press the HotSync button.")); } /* virtual DCOP */ ASYNC KPilotInstaller::daemontqStatus(int i) { FUNCTIONSETUP; DEBUGKPILOT << fname << ": Received daemon message " << i << endl; switch(i) { case KPilotDCOP::StartOfHotSync : if (fApptqStatus==Normal) { fApptqStatus=WaitingForDaemon; componentPreSync(); } break; case KPilotDCOP::EndOfHotSync : if (fApptqStatus==WaitingForDaemon) { componentPostSync(); fApptqStatus=Normal; } break; case KPilotDCOP::DaemonQuit : if (fLogWidget) { fLogWidget->logMessage(i18n("The daemon has exited.")); fLogWidget->logMessage(i18n("No further HotSyncs are possible.")); fLogWidget->logMessage(i18n("Restart the daemon to HotSync again.")); } fApptqStatus=WaitingForDaemon; break; case KPilotDCOP::None : WARNINGKPILOT << "Unhandled status message " << i << endl; break; } } /* virtual DCOP*/ int KPilotInstaller::kpilotqStatus() { return status(); } bool KPilotInstaller::componentPreSync() { FUNCTIONSETUP; TQString reason; TQString rprefix(i18n("Cannot start a Sync now. %1")); for (fP->list().first(); fP->list().current(); fP->list().next()) { if (!fP->list().current()->preHotSync(reason)) break; } if (!reason.isNull()) { KMessageBox::sorry(this, rprefix.tqarg(reason), i18n("Cannot start Sync")); return false; } return true; } void KPilotInstaller::componentPostSync() { FUNCTIONSETUP; for (fP->list().first(); fP->list().current(); fP->list().next()) { fP->list().current()->postHotSync(); } } void KPilotInstaller::setupSync(int kind, const TQString & message) { FUNCTIONSETUP; if (!componentPreSync()) { return; } if (!message.isEmpty()) { TQString m(message); if (fLogWidget) { fLogWidget->logMessage(m); } } getDaemon().requestSync(kind); } void KPilotInstaller::closeEvent(TQCloseEvent * e) { FUNCTIONSETUP; quit(); e->accept(); } void KPilotInstaller::initMenu() { FUNCTIONSETUP; KAction *a; KActionMenu *syncPopup; syncPopup = new KActionMenu(i18n("HotSync"), CSL1("kpilot"), actionCollection(), "popup_hotsync"); syncPopup->setToolTip(i18n("Select the kind of HotSync to perform next.")); syncPopup->setWhatsThis(i18n("Select the kind of HotSync to perform next. " "This applies only to the next HotSync; to change the default, use " "the configuration dialog.")); connect(syncPopup, TQT_SIGNAL(activated()), TQT_TQOBJECT(this), TQT_SLOT(slotHotSyncRequested())); // File actions, keep this list synced with kpilotui.rc and pilotDaemon.cc a = new KAction(i18n("&HotSync"), CSL1("hotsync"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotHotSyncRequested()), actionCollection(), "file_hotsync"); a->setToolTip(i18n("Next HotSync will be normal HotSync.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should be a normal HotSync.")); syncPopup->insert(a); a = new KAction(i18n("Full&Sync"), CSL1("fullsync"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotFullSyncRequested()), actionCollection(), "file_fullsync"); a->setToolTip(i18n("Next HotSync will be a FullSync.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should be a FullSync (check data on both sides).")); syncPopup->insert(a); a = new KAction(i18n("&Backup"), CSL1("backup"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotBackupRequested()), actionCollection(), "file_backup"); a->setToolTip(i18n("Next HotSync will be backup.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should back up the Handheld to the PC.")); syncPopup->insert(a); a = new KAction(i18n("&Restore"), CSL1("restore"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotRestoreRequested()), actionCollection(), "file_restore"); a->setToolTip(i18n("Next HotSync will be restore.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should restore the Handheld from data on the PC.")); syncPopup->insert(a); a = new KAction(i18n("Copy Handheld to PC"), TQString(), 0, TQT_TQOBJECT(this), TQT_SLOT(slotHHtoPCRequested()), actionCollection(), "file_HHtoPC"); a->setToolTip(i18n("Next HotSync will be backup.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should copy all data from the Handheld to the PC, " "overwriting entries on the PC.")); syncPopup->insert(a); a = new KAction(i18n("Copy PC to Handheld"), TQString(), 0, TQT_TQOBJECT(this), TQT_SLOT(slotPCtoHHRequested()), actionCollection(), "file_PCtoHH"); a->setToolTip(i18n("Next HotSync will copy PC to Handheld.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should copy all data from the PC to the Handheld, " "overwriting entries on the Handheld.")); syncPopup->insert(a); #if 0 a = new KAction(i18n("&List Only"),CSL1("listsync"),0, this,TQT_SLOT(slotTestSyncRequested()), actionCollection(), "file_list"); a->setToolTip(i18n("Next HotSync will list databases.")); a->setWhatsThis(i18n("Tell the daemon that the next HotSync " "should just list the files on the Handheld and do nothing " "else.")); syncPopup->insert(a); #endif a = new KAction(i18n("Rese&t Link"),CSL1("reload"), 0, TQT_TQOBJECT(this), TQT_SLOT(slotResetLink()), actionCollection(),"file_reload"); a->setToolTip(i18n("Reset the device connection.")); a->setWhatsThis(i18n("Try to reset the daemon and its connection " "to the Handheld.")); a = KStdAction::quit(TQT_TQOBJECT(this), TQT_SLOT(quit()), actionCollection()); a->setWhatsThis(i18n("Quit KPilot, (and stop the daemon " "if configured that way).")); // View actions // Options actions createStandardStatusBarAction(); setStandardToolBarMenuEnabled(true); (void) KStdAction::keyBindings(TQT_TQOBJECT(this), TQT_SLOT(optionsConfigureKeys()), actionCollection()); (void) KStdAction::configureToolbars(TQT_TQOBJECT(this), TQT_SLOT(optionsConfigureToolbars()), actionCollection()); (void) KStdAction::preferences(TQT_TQOBJECT(this), TQT_SLOT(configure()), actionCollection()); a = new KAction(i18n("Configuration &Wizard..."), CSL1("wizard"), 0, TQT_TQOBJECT(this), TQT_SLOT(configureWizard()), actionCollection(), "options_configure_wizard"); a->setWhatsThis(i18n("Configure KPilot using the configuration wizard.")); } void KPilotInstaller::fileInstalled(int) { FUNCTIONSETUP; } void KPilotInstaller::quit() { FUNCTIONSETUP; for (fP->list().first(); fP->list().current(); fP->list().next()) { TQString reason; if (!fP->list().current()->preHotSync(reason)) { WARNINGKPILOT << "Couldn't save " << fP->list().current()->name() << endl; } } killDaemonIfNeeded(); kapp->quit(); } void KPilotInstaller::addComponentPage(PilotComponent * p, const TQString & name) { FUNCTIONSETUP; if (!p) { WARNINGKPILOT << "Adding NULL component?" << endl; return; } fP->list().append(p); // The first component added gets id 1, while the title // screen -- added elsewhere -- has id 0. // // fManagingWidget->addWidget(p, fP->list().count()); const char *componentname = p->name("(none)"); char *actionname = 0L; int actionnameLength = 0; if (strncmp(componentname, "component_", 10) == 0) { actionnameLength = strlen(componentname) - 10 + 8; actionname = new char[actionnameLength]; strlcpy(actionname, "view_", actionnameLength); strlcat(actionname, componentname + 10, actionnameLength); } else { actionnameLength = strlen(componentname) + 8; actionname = new char[actionnameLength]; strlcpy(actionname, "view_", actionnameLength); strlcat(actionname, componentname, actionnameLength); } KToggleAction *pt = new KToggleAction(name, /* "kpilot" -- component icon, */ 0, TQT_TQOBJECT(p), TQT_SLOT(slotShowComponent()), actionCollection(), actionname); pt->setExclusiveGroup(CSL1("view_menu")); connect(TQT_TQOBJECT(p), TQT_SIGNAL(showComponent(PilotComponent *)), TQT_TQOBJECT(this), TQT_SLOT(slotSelectComponent(PilotComponent *))); } /* slot */ void KPilotInstaller::initializeComponents() { FUNCTIONSETUP; /* for (PilotComponent *p = fP->list().first(); p ; p = fP->list().next()) { p->initialize(); }*/ } void KPilotInstaller::optionsConfigureKeys() { FUNCTIONSETUP; KKeyDialog::configure( actionCollection() ); } void KPilotInstaller::optionsConfigureToolbars() { FUNCTIONSETUP; // use the standard toolbar editor // This was added in KDE 3.1 saveMainWindowSettings( KGlobal::config(), autoSaveGroup() ); KEditToolbar dlg(actionCollection()); connect(&dlg, TQT_SIGNAL(newToolbarConfig()), TQT_TQOBJECT(this), TQT_SLOT(slotNewToolbarConfig())); dlg.exec(); } void KPilotInstaller::slotNewToolbarConfig() { FUNCTIONSETUP; // recreate our GUI createGUI(); applyMainWindowSettings( KGlobal::config(), autoSaveGroup() ); } void KPilotInstaller::slotResetLink() { FUNCTIONSETUP; getDaemon().reloadSettings(); } /* ** Can't be a member function because it needs to be called even with no KPilotInstaller. */ static bool runConfigure(PilotDaemonDCOP_stub &daemon,TQWidget *parent) { FUNCTIONSETUP; bool ret = false; // Display the (modal) options page. // // int rememberedSync = daemon.nextSyncType(); daemon.requestSync(0); KPilotSettings::self()->readConfig(); KCMultiDialog *options = new KCMultiDialog( KDialogBase::Plain, i18n("Configuration"), parent, "KPilotPreferences", true ); options->addModule( CSL1("kpilot_config.desktop") ); if (!options) { WARNINGKPILOT << "Can't allocate KPilotOptions object" << endl; daemon.requestSync(rememberedSync); return false; } int r = options->exec(); if ( r && options->result() ) { DEBUGKPILOT << fname << ": Updating settings." << endl; // The settings are changed in the external module!!! KPilotSettings::self()->config()->sync(); KPilotSettings::self()->readConfig(); // Update the daemon to reflect new settings. // @TODO: This should also be done when pressing apply without // closing the dialog. // daemon.reloadSettings(); ret = true; } KPILOT_DELETE(options); daemon.requestSync(rememberedSync); KPilotConfig::sync(); return ret; } /* * Run the config wizard -- this takes a little library magic, and * it might fail entirely; returns false if no wizard could be run, * or true if the wizard runs (says nothing about it being OK'ed or * canceled, though). */ typedef enum { Failed, OK, Cancel } WizardResult; static WizardResult runWizard(PilotDaemonDCOP_stub &daemon,TQWidget *parent) { FUNCTIONSETUP; WizardResult ret = Failed ; int rememberedSync = daemon.nextSyncType(); daemon.requestSync(0); KPilotSettings::self()->readConfig(); // Declarations at top because of goto's in this function ConfigWizard *(* f) (TQWidget *, int) = 0L ; ConfigWizard *w = 0L; KLibrary *l = KLibLoader::self()->library("kcm_kpilot"); if (!l) { WARNINGKPILOT << "Couldn't load library!" << endl; goto sorry; } if (l->hasSymbol("create_wizard")) { f = ( ConfigWizard * (*) (TQWidget *, int) ) (l->symbol("create_wizard")) ; } if (!f) { WARNINGKPILOT << "No create_wizard() in library." << endl; goto sorry; } w = f(parent,ConfigWizard::Standalone); if (!w) { WARNINGKPILOT << "Can't create wizard." << endl; goto sorry; } if (w->exec()) { KPilotSettings::self()->readConfig(); ret = OK; } else { ret = Cancel; } KPILOT_DELETE(w); sorry: if (Failed == ret) { KMessageBox::sorry(parent, i18n("The library containing the configuration wizard for KPilot " "could not be loaded, and the wizard is not available. " "Please try to use the regular configuration dialog."), i18n("Wizard Not Available")); } if (OK == ret) { KPilotConfig::updateConfigVersion(); KPilotSettings::writeConfig(); KPilotConfig::sync(); } daemon.requestSync(rememberedSync); return ret; } void KPilotInstaller::componentUpdate() { FUNCTIONSETUP; TQString defaultDBPath = KPilotConfig::getDefaultDBPath(); bool dbPathChanged = false; for (fP->list().first(); fP->list().current(); fP->list().next()) { // TODO_RK: update the current component to use the new settings // fP->list().current()->initialize(); PilotComponent *p = fP->list().current(); if (p && (p->dbPath() != defaultDBPath)) { dbPathChanged = true; p->setDBPath(defaultDBPath); } } if (!dbPathChanged) // done if the username didn't change { return; } // Otherwise, need to re-load the databases // if (fLogWidget) { fLogWidget->logMessage(i18n("Changed username to `%1'.") .tqarg(KPilotSettings::userName())); fManagingWidget->showPage(0); slotAboutToShowComponent(fLogWidget); } else { int ix = fManagingWidget->activePageIndex(); PilotComponent *component = 0L; if (ix>=0) { component = fP->list().at(ix); } if (component) { component->hideComponent(); // Throw away current data component->showComponent(); // Reload } } } /* virtual DCOP */ ASYNC KPilotInstaller::configureWizard() { FUNCTIONSETUP; if ( fApptqStatus!=Normal || fConfigureKPilotDialogInUse ) { if (fLogWidget) { fLogWidget->addMessage(i18n("Cannot run KPilot's configuration wizard right now (KPilot's UI is already busy).")); } return; } fApptqStatus=UIBusy; fConfigureKPilotDialogInUse = true; if (runWizard(getDaemon(),this) == OK) { componentUpdate(); } fConfigureKPilotDialogInUse = false; fApptqStatus=Normal; } /* virtual DCOP */ ASYNC KPilotInstaller::configure() { FUNCTIONSETUP; if ( fApptqStatus!=Normal || fConfigureKPilotDialogInUse ) { if (fLogWidget) { fLogWidget->addMessage(i18n("Cannot configure KPilot right now (KPilot's UI is already busy).")); } return; } fApptqStatus=UIBusy; fConfigureKPilotDialogInUse = true; if (runConfigure(getDaemon(),this)) { componentUpdate(); } fConfigureKPilotDialogInUse = false; fApptqStatus=Normal; } /* static */ const char *KPilotInstaller::version(int kind) { FUNCTIONSETUP; // I don't think the program title needs to be translated. (ADE) // // if (kind) { return "kpilot.cc"; } else { return "KPilot v" KPILOT_VERSION; } } // Command line options descriptions. // // // // static KCmdLineOptions kpilotoptions[] = { {"s", 0, 0}, {"setup", I18N_NOOP("Setup the Pilot device, conduits and other parameters"), 0L}, {"debug ", I18N_NOOP("Set debugging level"), "0"}, KCmdLineLastOption }; // "Regular" mode == 0 // setup mode == 's' // // This is only changed by the --setup flag -- // kpilot still does a setup the first time it is run. // // KPilotConfig::RunMode run_mode = KPilotConfig::Normal; int main(int argc, char **argv) { FUNCTIONSETUP; KAboutData about("kpilot", I18N_NOOP("KPilot"), KPILOT_VERSION, "KPilot - HotSync software for KDE\n\n", KAboutData::License_GPL, "(c) 1998-2000,2001, Dan Pilone (c) 2000-2006, Adriaan de Groot", 0L, "http://www.kpilot.org/" ); about.addAuthor("Dan Pilone", I18N_NOOP("Project Leader"), "pilone@slac.com" ); about.addAuthor("Adriaan de Groot", I18N_NOOP("Maintainer"), "groot@kde.org", "http://www.kpilot.org/"); about.addAuthor("Reinhold Kainhofer", I18N_NOOP("Core and conduits developer"), "reinhold@kainhofer.com", "http://reinhold.kainhofer.com/Linux/"); about.addAuthor("Jason 'vanRijn' Kasper", I18N_NOOP("Core and conduits developer"), "vR@movingparts.net", "http://movingparts.net/"); about.addCredit("Preston Brown", I18N_NOOP("VCal conduit")); about.addCredit("Greg Stern", I18N_NOOP("Abbrowser conduit")); about.addCredit("Chris Molnar", I18N_NOOP("Expenses conduit")); about.addCredit("Jörn Ahrens", I18N_NOOP("Notepad conduit, Bugfixer")); about.addCredit("Heiko Purnhagen", I18N_NOOP("Bugfixer")); about.addCredit("Jörg Habenicht", I18N_NOOP("Bugfixer")); about.addCredit("Martin Junius", I18N_NOOP("XML GUI"), "mj@m-j-s.net", "http://www.m-j-s.net/kde/"); about.addCredit("David Bishop", I18N_NOOP(".ui files")); about.addCredit("Aaron J. Seigo", I18N_NOOP("Bugfixer, coolness")); about.addCredit("Bertjan Broeksema", I18N_NOOP("VCalconduit state machine, CMake")); KCmdLineArgs::init(argc, argv, &about); KCmdLineArgs::addCmdLineOptions(kpilotoptions, "kpilot"); KUniqueApplication::addCmdLineOptions(); KCmdLineArgs *p = KCmdLineArgs::parsedArgs(); #ifdef DEBUG KPilotConfig::getDebugLevel(p); #endif if (!KUniqueApplication::start()) { return 0; } KUniqueApplication a(true, true); if (p->isSet("setup")) { run_mode = KPilotConfig::ConfigureKPilot; } else if (KPilotSettings::configVersion() < KPilotConfig::ConfigurationVersion) { WARNINGKPILOT << "KPilot configuration version " << KPilotConfig::ConfigurationVersion << " newer than stored version " << KPilotSettings::configVersion() << endl; // Only force a reconfigure and continue if the // user is expecting normal startup. Otherwise, // do the configuration they're explicitly asking for. run_mode = KPilotConfig::interactiveUpdate(); if (run_mode == KPilotConfig::Cancel) return 1; } if ( (run_mode == KPilotConfig::ConfigureKPilot) || (run_mode == KPilotConfig::ConfigureAndContinue) || (run_mode == KPilotConfig::WizardAndContinue) ) { DEBUGKPILOT << fname << ": Running setup first." << " (mode " << run_mode << ")" << endl; PilotDaemonDCOP_stub *daemon = new PilotDaemonDCOP_stub("kpilotDaemon","KPilotDaemonIface"); bool r = false; if (run_mode == KPilotConfig::WizardAndContinue) { r = ( runWizard(*daemon,0L) == OK ); } else { r = runConfigure(*daemon,0L); } delete daemon; if (!r) return 1; // User expected configure only. if (run_mode == KPilotConfig::ConfigureKPilot) { return 0; } } if (KPilotSettings::configVersion() < KPilotConfig::ConfigurationVersion) { WARNINGKPILOT << "Still not configured for use." << endl; KPilotConfig::sorryVersionOutdated( KPilotSettings::configVersion()); return 1; } KPilotInstaller *tp = new KPilotInstaller(); if (tp->status() == KPilotInstaller::Error) { KPILOT_DELETE(tp); return 1; } TQTimer::singleShot(0,tp,TQT_SLOT(startDaemonIfNeeded())); KGlobal::dirs()->addResourceType("pilotdbs", CSL1("share/apps/kpilot/DBBackup")); tp->show(); a.setMainWidget(tp); return a.exec(); }