kpilot Library API Documentation

conduitSetup.cc

00001 /* conduitSetup.cc          KPilot
00002 **
00003 ** Copyright (C) 1998-2001 by Dan Pilone
00004 **
00005 ** This file defines the setup dialog used by KPilot to 
00006 ** install and activate conduits.
00007 */
00008 
00009 // THIS FILE IS TOTALLY DEPRECATED. IT IS NOT USED
00010 // IN THE MAIN PART OF KPILOT'S CODE.
00011 
00012 /*
00013 ** This program is free software; you can redistribute it and/or modify
00014 ** it under the terms of the GNU General Public License as published by
00015 ** the Free Software Foundation; either version 2 of the License, or
00016 ** (at your option) any later version.
00017 **
00018 ** This program is distributed in the hope that it will be useful,
00019 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
00020 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00021 ** GNU General Public License for more details.
00022 **
00023 ** You should have received a copy of the GNU General Public License
00024 ** along with this program in a file called COPYING; if not, write to
00025 ** the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
00026 ** MA 02111-1307, USA.
00027 */
00028 
00029 /*
00030 ** Bug reports and questions can be sent to kde-pim@kde.org
00031 */
00032 
00033 #include "options.h"
00034 
00035 
00036 #include <stdio.h>
00037 #include <unistd.h>
00038 
00039 #ifndef QDIR_H
00040 #include <qdir.h>
00041 #endif
00042 #ifndef QHBOX_H
00043 #include <qhbox.h>
00044 #endif
00045 #include <qwhatsthis.h>
00046 #include <qheader.h>
00047 
00048 #ifndef _KSIMPLECONFIG_H
00049 #include <ksimpleconfig.h>
00050 #endif
00051 #ifndef _KAPP_H
00052 #include <kapplication.h>
00053 #endif
00054 #ifndef _KPROCESS_H
00055 #include <kprocess.h>
00056 #endif
00057 #ifndef _KMESSAGEBOX_H
00058 #include <kmessagebox.h>
00059 #endif
00060 #ifndef _KSTDDIRS_H
00061 #include <kstddirs.h>
00062 #endif
00063 #ifndef _KDEBUG_H
00064 #include <kdebug.h>
00065 #endif
00066 #ifndef _KUSERPROFILE_H
00067 #include <kuserprofile.h>
00068 #endif
00069 #ifndef _KSERVICE_H
00070 #include <kservice.h>
00071 #endif
00072 #ifndef _KSERVICETYPE_H
00073 #include <kservicetype.h>
00074 #endif
00075 
00076 #ifndef _KPILOT_KPILOTCONFIG_H
00077 #include "kpilotConfig.h"
00078 #endif
00079 
00080 #include "conduitSetup.moc"
00081 
00082 
00083 static const char *conduitsetup_id =
00084     "$Id: conduitSetup.cc,v 1.42 2003/07/11 19:18:19 kainhofe Exp $";
00085 
00086 //#include "listCat.h"
00087 
00088 
00089 // We're going to hide all kinds of information in the
00090 // QListViewItems we're manipulating. These constants
00091 // define which information goes in which text().
00092 //
00093 // This order must be respected in the constructors
00094 // for QListViewItems in fillLists().
00095 //
00096 //
00097 #define CONDUIT_NAME    (0)
00098 #define CONDUIT_COMMENT (1)
00099 #define CONDUIT_DESKTOP (2)
00100 #define CONDUIT_EXEC    (3)
00101 
00102 CConduitSetup::CConduitSetup(QWidget * parent,
00103     const char *name) :
00104     KDialogBase(parent, name, true,
00105         i18n("External Conduit Setup"), 
00106         User1 | User2 | User3 | Ok | Cancel, Cancel,
00107         true,
00108         i18n("Activate"),
00109         i18n("Deactivate"),
00110         i18n("Configure")), 
00111     conduitSetup(0L)
00112 {
00113     FUNCTIONSETUP;
00114 
00115     QHBox *top = makeHBoxMainWidget();
00116 
00117     categories = new ListCategorizer(top, "conduits");
00118     categories->setStartOpen(true);
00119 
00120     active = categories->addCategory(i18n("Active"),
00121         i18n("Conduits that will run when a HotSync is done"));
00122     available = categories->addCategory(i18n("Available"),
00123         i18n("Conduits installed on your system but not active"));
00124 
00125     categories->adjustSize();
00126     categories->setColumnWidthMode(CONDUIT_COMMENT,QListView::Manual);
00127     categories->header()->setResizeEnabled(false,CONDUIT_COMMENT);
00128 
00129     connect(categories, SIGNAL(selectionChanged(QListViewItem *)),
00130         this, SLOT(conduitSelected(QListViewItem *)));
00131 
00132     QWhatsThis::add(categories,
00133         i18n("You can drag and drop conduits between the\n"
00134             "active and available groups. Only the conduits\n"
00135             "in the active group will run when you do a HotSync."));
00136 
00137 
00138     fillLists();
00139     adjustSize();
00140     conduitSelected(0L);
00141 
00142     conduitPaths = KGlobal::dirs()->resourceDirs("conduits");
00143 }
00144 
00145 /* virtual */ CConduitSetup::~CConduitSetup()
00146 {
00147     FUNCTIONSETUP;
00148 }
00149 
00150 /* slot */ void CConduitSetup::slotUser1()
00151 {
00152     FUNCTIONSETUP;
00153 
00154     QListViewItem *p = categories->selectedItem();
00155 
00156     if (!p)
00157     {
00158 #ifdef DEBUG
00159         DEBUGKPILOT << fname
00160             << ": No item selected, but activate clicked?"
00161             << endl;
00162 #endif
00163         return;
00164     }
00165 
00166     if (p->parent() != available)
00167     {
00168 #ifdef DEBUG
00169         DEBUGKPILOT << fname
00170             << ": Active conduit selected, but activate clicked?"
00171             << endl;
00172 #endif
00173         return;
00174     }
00175 
00176     categories->moveItem(p,active,0L);
00177     categories->setSelected(p,true);
00178     categories->ensureItemVisible(p);
00179 
00180     conduitSelected(p);
00181 }
00182 
00183 /* slot */ void CConduitSetup::slotUser2()
00184 {
00185     FUNCTIONSETUP;
00186 
00187     QListViewItem *p = categories->selectedItem();
00188 
00189     if (!p)
00190     {
00191 #ifdef DEBUG
00192         DEBUGKPILOT << fname
00193             << ": No item selected, but activate clicked?"
00194             << endl;
00195 #endif
00196         return;
00197     }
00198 
00199     if (p->parent() != active)
00200     {
00201 #ifdef DEBUG
00202         DEBUGKPILOT << fname
00203             << ": InActive conduit selected, but deactivate clicked?"
00204             << endl;
00205 #endif
00206         return;
00207     }
00208 
00209     categories->moveItem(p,available,0L);
00210     categories->setSelected(p,true);
00211     categories->ensureItemVisible(p);
00212 
00213     conduitSelected(p);
00214 }
00215 
00216 /* slot */ void CConduitSetup::slotUser3()
00217 {
00218     FUNCTIONSETUP;
00219 
00220     QListViewItem *p = categories->selectedItem();
00221 
00222     if (!p)
00223     {
00224 #ifdef DEBUG
00225         DEBUGKPILOT << fname
00226             << ": No item selected, but configure clicked?"
00227             << endl;
00228 #endif
00229         return;
00230     }
00231 
00232     if (p->parent() != active)
00233     {
00234 #ifdef DEBUG
00235         DEBUGKPILOT << fname
00236             << ": Inactive conduti selected, but configure clicked?"
00237             << endl;
00238 #endif
00239         return;
00240     }
00241 
00242     conduitExecuted(p);
00243 }
00244 
00245 void CConduitSetup::conduitExecuted(QListViewItem * p)
00246 {
00247     FUNCTIONSETUP;
00248     if (!p)
00249     {
00250 #ifdef DEBUG
00251         DEBUGKPILOT << fname << ": Executed NULL conduit?" << endl;
00252 #endif
00253         return;
00254     }
00255 
00256     if (!p->parent())
00257     {
00258 #ifdef DEBUG
00259         DEBUGKPILOT << fname << ": Executed a category?" << endl;
00260 #endif
00261         return;
00262     }
00263 
00264 #ifdef DEBUG
00265     DEBUGKPILOT << fname << ": Executing conduit " << p->text(0) << endl;
00266 #endif
00267 
00268     QString execPath = findExecPath(p);
00269 
00270 #ifdef DEBUG
00271     DEBUGKPILOT << fname << ": Exec path=" << execPath << endl;
00272 #endif
00273 
00274     if (execPath.isNull())
00275     {
00276         warnNoExec(p);
00277         return;
00278     }
00279 
00280     if (conduitSetup)
00281     {
00282         warnSetupRunning();
00283         return;
00284     }
00285 
00286     conduitSetup = new KProcess;
00287     *conduitSetup << execPath << "--setup";
00288     *conduitSetup << "-geometry"
00289         << CSL1("+%1+%2").arg(x() + 20).arg(y() + 20);
00290 #ifdef DEBUG
00291     if (debug_level)
00292     {
00293         *conduitSetup << "--debug" << QString::number(debug_level);
00294     }
00295 #endif
00296 
00297     connect(conduitSetup,
00298         SIGNAL(processExited(KProcess *)),
00299         this, SLOT(setupDone(KProcess *)));
00300     if (!conduitSetup->start(KProcess::NotifyOnExit))
00301     {
00302         kdWarning() << k_funcinfo
00303             << ": Could not start process for conduit setup!"
00304             << endl;
00305         warnNoExec(p);
00306         delete conduitSetup;
00307 
00308         conduitSetup = 0L;
00309     }
00310 }
00311 
00312 /* slot */ void CConduitSetup::setupDone(KProcess * p)
00313 {
00314     FUNCTIONSETUP;
00315 
00316     if (p != conduitSetup)
00317     {
00318 #ifdef DEBUG
00319         DEBUGKPILOT << fname << ": Process other than setup exited?"
00320             << endl;
00321 #endif
00322         return;
00323     }
00324 
00325     delete p;
00326 
00327     conduitSetup = 0L;
00328 }
00329 
00330 void CConduitSetup::slotOk()
00331 {
00332     FUNCTIONSETUP;
00333     writeInstalledConduits();
00334     KDialogBase::slotOk();
00335 }
00336 
00337 void CConduitSetup::fillLists()
00338 {
00339     FUNCTIONSETUP;
00340 
00341     QStringList potentiallyInstalled =
00342         KPilotConfig::getConfig().setConduitGroup().
00343         getInstalledConduits();
00344     KServiceTypeProfile::OfferList offers =
00345         KServiceTypeProfile::offers(CSL1("KPilotConduit"));
00346 
00347 #ifdef DEBUG
00348     {
00349         QStringList::Iterator i = potentiallyInstalled.begin();
00350 
00351 
00352         DEBUGKPILOT << fname
00353             << ": Currently active conduits are:" << endl;
00354 
00355         while (i != potentiallyInstalled.end())
00356         {
00357             DEBUGKPILOT << fname << ": " << (*i) << endl;
00358             ++i;
00359         }
00360 
00361         DEBUGKPILOT << fname
00362             << ": Currently installed conduits are:" << endl;
00363     }
00364 #endif
00365 
00366     // Now actually fill the two list boxes, just make 
00367     // sure that nothing gets listed in both.
00368     //
00369     //
00370     QValueListIterator < KServiceOffer > availList(offers.begin());
00371     while (availList != offers.end())
00372     {
00373         KSharedPtr < KService > o = (*availList).service();
00374 
00375 #ifdef DEBUG
00376         DEBUGKPILOT << fname << ": "
00377             << o->desktopEntryName()
00378             << " = " << o->name() << endl;
00379 #endif
00380 
00381         RichListViewItem *p = 0L;
00382 
00383         if (potentiallyInstalled.contains(o->desktopEntryName()) == 0)
00384         {
00385             p=new RichListViewItem(available,o->name(),6);
00386         }
00387         else
00388         {
00389             p=new RichListViewItem(active,o->name(),6);
00390         }
00391         if (p)
00392         {
00393             p->setText(CONDUIT_COMMENT,o->comment());
00394             p->setText(CONDUIT_DESKTOP,o->desktopEntryName());
00395             p->setText(CONDUIT_EXEC,o->exec());
00396 
00397             p->setRich(CONDUIT_COMMENT,true);
00398         }
00399 
00400         ++availList;
00401     }
00402 }
00403 
00404 
00405 QString CConduitSetup::findExecPath(const QListViewItem * p) const
00406 {
00407     FUNCTIONSETUP;
00408 
00409     QString currentConduit(QString::null);
00410 
00411     if (conduitPaths.isEmpty())
00412     {
00413         currentConduit = KGlobal::dirs()->findResource("exe",
00414             p->text(CONDUIT_EXEC));
00415         if (currentConduit.isNull())
00416         {
00417             currentConduit = p->text(CONDUIT_EXEC);
00418         }
00419     }
00420     else
00421     {
00422         // Look in all the resource dirs for conduits
00423         // for this particular conduit.
00424         //
00425         //
00426         QStringList::ConstIterator i;
00427 
00428         currentConduit = QString::null;
00429         for (i = conduitPaths.begin(); i != conduitPaths.end(); ++i)
00430         {
00431             if (QFile::exists((*i) + '/' + p->text(CONDUIT_EXEC)))
00432             {
00433                 currentConduit =
00434                     (*i) + '/' + p->text(CONDUIT_EXEC);
00435                 break;
00436             }
00437         }
00438     }
00439 
00440     return currentConduit;
00441 }
00442 
00443 
00444 void CConduitSetup::writeInstalledConduits()
00445 {
00446     FUNCTIONSETUP;
00447 
00448     char dbName[255];
00449     int len = 0;
00450 
00451     KPilotConfigSettings & config = KPilotConfig::getConfig();
00452 
00453     config.setConduitGroup().setInstalledConduits(
00454         categories->listSiblings(active->firstChild(), CONDUIT_DESKTOP));
00455     config.setDatabaseGroup();
00456 
00457     const QListViewItem *p = active->firstChild();
00458 
00459     while (p)
00460     {
00461         FILE *conduitpipe;
00462 
00463 #ifdef DEBUG
00464         DEBUGKPILOT << fname
00465             << ": Current conduit = "
00466             << p->text(CONDUIT_NAME) << endl;
00467         DEBUGKPILOT << fname
00468             << ": Current conduit service from "
00469             << p->text(CONDUIT_DESKTOP)
00470             << " says exec=" << p->text(CONDUIT_EXEC) << endl;
00471 #endif
00472 
00473         QString currentConduit = findExecPath(p);
00474 
00475         if (currentConduit.isNull())
00476         {
00477             warnNoExec(p);
00478             goto nextConduit;
00479         }
00480 
00481 
00482 
00483         currentConduit += CSL1(" --info");
00484 #ifdef DEBUG
00485         if (debug_level)
00486         {
00487             currentConduit += CSL1(" --debug ");
00488             currentConduit += QString().setNum(debug_level);
00489         }
00490 
00491         DEBUGKPILOT << fname
00492             << ": Conduit startup command line is: "
00493             << currentConduit << endl;
00494 #endif
00495 
00496         len = 0;
00497         conduitpipe = popen(currentConduit.local8Bit(), "r");
00498         if (conduitpipe)
00499         {
00500             len = fread(dbName, 1, 255, conduitpipe);
00501             pclose(conduitpipe);
00502         }
00503         conduitpipe = 0;
00504         dbName[len] = 0L;
00505         if (len == 0)
00506         {
00507             QString tmpMessage =
00508                 i18n("The conduit %1 did not identify "
00509                 "what database it supports. "
00510                 "\nPlease check with the conduits "
00511                 "author to correct it.").arg(p->
00512                 text(CONDUIT_NAME));
00513 
00514             // Might not be correct in a caption,
00515             // but this file is deprecated anyway.
00516             KMessageBox::error(this, tmpMessage,
00517                 i18n("Conduit Error"));
00518         }
00519         else if (strcmp(dbName, "<none>") == 0)
00520         {
00521 #ifdef DEBUG
00522             DEBUGKPILOT << fname
00523                 << ": Conduit "
00524                 << p->text(0)
00525                 << " supports no databases." << endl;
00526 #endif
00527         }
00528         else
00529         {
00530             QStringList l = QStringList::split(QChar(','),
00531                 QString(QString::fromLatin1(dbName)));
00532 
00533             QStringList::Iterator i;
00534             const QString & m = p->text(CONDUIT_DESKTOP);
00535 
00536             for (i = l.begin(); i != l.end(); ++i)
00537             {
00538                 config.setDatabaseConduit((*i).
00539                     stripWhiteSpace(), m);
00540             }
00541         }
00542 nextConduit:
00543         p = p->nextSibling();
00544     }
00545     config.sync();
00546 }
00547 
00548 void CConduitSetup::conduitSelected(QListViewItem *p)
00549 {
00550     FUNCTIONSETUP;
00551 
00552     if (!p)
00553     {
00554         enableButton(User1,false);
00555         enableButton(User2,false);
00556         enableButton(User3,false);
00557         return;
00558     }
00559 
00560     if (!p->parent())
00561     {
00562 #ifdef DEBUG
00563         DEBUGKPILOT << fname
00564             << ": Selected a category?"
00565             << endl;
00566 #endif
00567         return;
00568     }
00569 
00570 
00571     if (p->parent() == active)
00572     {
00573         enableButton(User1,false);
00574         enableButton(User2,true);
00575         enableButton(User3,true);
00576     }
00577     else
00578     {
00579         enableButton(User1,true);
00580         enableButton(User2,false);
00581         enableButton(User3,false);
00582     }
00583 }
00584 
00585 
00586 
00587 void CConduitSetup::warnNoExec(const QListViewItem * p)
00588 {
00589     FUNCTIONSETUP;
00590 
00591     QString msg = i18n("No executable could be "
00592         "found for the conduit %1.").arg(p->text(CONDUIT_NAME));
00593 
00594 #ifdef DEBUG
00595     DEBUGKPILOT << fname << ": " << msg << endl;
00596 #endif
00597 
00598     KMessageBox::error(this, msg, i18n("Conduit Error"));
00599 }
00600 
00601 void CConduitSetup::warnSetupRunning()
00602 {
00603     FUNCTIONSETUP;
00604 
00605     QString msg = i18n("A conduit is already being set up. "
00606         "Please complete that action before setting "
00607         "up another conduit.");
00608 
00609 #ifdef DEBUG
00610     DEBUGKPILOT << fname << ": " << msg << endl;
00611 #endif
00612 
00613     KMessageBox::error(this, msg, i18n("Conduit Setup Error"));
00614 
00615     /* NOTREACHED */
00616     (void) conduitsetup_id;
00617 }
00618 
00619 
KDE Logo
This file is part of the documentation for kpilot Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:36:46 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003