ksync Library API Documentation

ksyncview.cpp

00001 /*
00002     This file is part of ksync.
00003 
00004     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License as published by the Free Software Foundation; either
00009     version 2 of the License, or (at your option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     Library General Public License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to
00018     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019     Boston, MA 02111-1307, USA.
00020 */
00021 
00022 #include <qprinter.h>
00023 #include <qpainter.h>
00024 #include <qlayout.h>
00025 #include <qlabel.h>
00026 #include <qlistview.h>
00027 #include <qcombobox.h>
00028 #include <qpushbutton.h>
00029 #include <qcheckbox.h>
00030 
00031 #include <klocale.h>
00032 #include <kurlrequester.h>
00033 #include <kfiledialog.h>
00034 #include <kdebug.h>
00035 #include <kio/job.h>
00036 #include <kio/jobclasses.h>
00037 #include <kmessagebox.h>
00038 
00039 #include <ksyncer.h>
00040 #include <calendarsyncee.h>
00041 #include <bookmarksyncee.h>
00042 #include <addressbooksyncee.h>
00043 #include <ksyncuikde.h>
00044 
00045 #include "ksync.h"
00046 
00047 #include "ksyncview.h"
00048 #include "ksyncview.moc"
00049 
00050 class SynceeListItem : public QListViewItem {
00051   public:
00052     SynceeListItem(QListView *lv,KURL url) : QListViewItem(lv,url.url()),
00053       mUrl(url) {}
00054 
00055     void setSyncee(KSyncee *syncee) { mSyncee = syncee; }
00056     KSyncee *syncee() { return mSyncee; }
00057 
00058     KURL url() { return mUrl; }
00059 
00060   private:
00061     KSyncee *mSyncee;
00062     KURL mUrl;
00063 };
00064 
00065 KSyncView::KSyncView(QWidget *parent, const char *name) :
00066   QWidget(parent, name),
00067   mSyncer(0), mTarget(0), mLoadError(false)
00068 {
00069   mTmpFiles.setAutoDelete(true);
00070 
00071   QLabel *typeLabel = new QLabel(i18n("Data type to be synced:"),this);
00072 
00073   mTypeCombo = new QComboBox(this);
00074   mTypeCombo->insertItem(i18n("Calendar"),TypeCalendar);
00075   mTypeCombo->insertItem(i18n("Bookmarks"),TypeBookmarks);
00076   mTypeCombo->insertItem(i18n("Addressbook"),TypeAddressBook);
00077   mCurrentType = mTypeCombo->currentItem();
00078   connect(mTypeCombo,SIGNAL(activated(int)),SLOT(reloadSyncees()));
00079 
00080   QPushButton *addButton = new QPushButton(i18n("Add Source..."),this);
00081   connect(addButton,SIGNAL(clicked()),SLOT(addSource()));
00082 
00083   removeButton = new QPushButton(i18n("Remove Source"),this);
00084   connect(removeButton,SIGNAL(clicked()),SLOT(removeSource()));
00085 
00086   showButton = new QPushButton(i18n("Show Source"),this);
00087   connect(showButton,SIGNAL(clicked()),SLOT(showSource()));
00088 
00089   mSourceListView = new QListView(this);
00090   mSourceListView->addColumn(i18n("URL"));
00091 
00092   connect(mSourceListView,SIGNAL(selectionChanged ()),this,SLOT(slotSelectionChanged()));
00093   mSyncBackCheck = new QCheckBox(i18n("Write synced data back to sources."),
00094                                  this);
00095   connect(mSyncBackCheck,SIGNAL(clicked()),SLOT(checkSyncBack()));
00096 
00097   QLabel *targetLabel = new QLabel(i18n("Target: "),this);
00098   mTargetReq = new KURLRequester(this);
00099 
00100   QPushButton *syncButton = new QPushButton(i18n("Sync"),this);
00101   connect(syncButton,SIGNAL(clicked()),SLOT(doSync()));
00102 
00103   checkSyncBack();
00104 
00105   QGridLayout *topLayout = new QGridLayout(this);
00106   topLayout->setMargin(8);
00107   topLayout->setSpacing(8);
00108   topLayout->addWidget(typeLabel,0,0);
00109   topLayout->addMultiCellWidget(mTypeCombo,0,0,1,2);
00110   topLayout->addMultiCellWidget(addButton,1,1,0,0);
00111   topLayout->addMultiCellWidget(removeButton,1,1,1,1);
00112   topLayout->addMultiCellWidget(showButton,1,1,2,2);
00113   topLayout->addMultiCellWidget(mSourceListView,2,2,0,2);
00114   topLayout->addMultiCellWidget(mSyncBackCheck,3,3,0,2);
00115   topLayout->addMultiCellWidget(targetLabel,4,4,0,0);
00116   topLayout->addMultiCellWidget(mTargetReq,4,4,1,2);
00117   topLayout->addMultiCellWidget(syncButton,5,5,0,2);
00118   slotSelectionChanged();
00119 }
00120 
00121 KSyncView::~KSyncView()
00122 {
00123 }
00124 
00125 void KSyncView::print(QPrinter *pPrinter)
00126 {
00127   QPainter printpainter;
00128   printpainter.begin(pPrinter);
00129 
00130   // TODO: add your printing code here
00131 
00132   printpainter.end();
00133 }
00134 
00135 void KSyncView::addSource()
00136 {
00137   KURL url = KFileDialog::getOpenURL();
00138   if(!url.path().isEmpty())
00139     new SynceeListItem(mSourceListView,url);
00140 }
00141 
00142 void KSyncView::removeSource()
00143 {
00144   QListViewItem *item = mSourceListView->selectedItem();
00145   if (item) delete item;
00146 }
00147 
00148 void KSyncView::showSource()
00149 {
00150   QListViewItem *item = mSourceListView->selectedItem();
00151   if (!item) {
00152     kdDebug() << "No item selected" << endl;
00153     return;
00154   } else {
00155     kdDebug() << "** Source '" << item->text(0) << endl;
00156     KSyncee *syncee = createSyncee(KURL( item->text(0) ));
00157     KSyncEntry *entry = syncee->firstEntry();
00158     while(entry) {
00159       kdDebug() << "**  '" << entry->name() << "'" << endl;
00160 
00161       entry = syncee->nextEntry();
00162     }
00163     delete syncee;
00164   }
00165 }
00166 
00167 void KSyncView::slotSelectionChanged()
00168 {
00169     bool state=(mSourceListView->currentItem()!=0);
00170     showButton->setEnabled(state);
00171     removeButton->setEnabled(state);
00172 }
00173 
00174 void KSyncView::doSync()
00175 {
00176   delete mSyncer;
00177   mSyncer = new KSyncer(new KSyncUiKde(this));
00178 
00179   mLoadCount = 0;
00180   mLoadError = false;
00181 
00182   SynceeListItem *item = dynamic_cast<SynceeListItem *>(mSourceListView->firstChild());
00183   while(item) {
00184     KSyncee *syncee = createSyncee(item->url());
00185     item->setSyncee(syncee);
00186     mSyncer->addSyncee(syncee);
00187 
00188     item = (SynceeListItem *)item->nextSibling();
00189   }
00190 
00191   QString url = mTargetReq->url();
00192 
00193   kdDebug() << "target url: " << url << endl;
00194   mTarget = createSyncee(KURL(url));
00195 
00196   finishSync();
00197 }
00198 
00199 KSyncee *KSyncView::createSyncee(const KURL &url)
00200 {
00201   kdDebug() << "KSyncView::createSyncee(): " << url.url() << endl;
00202 
00203   KSyncee *syncee;
00204   switch (mTypeCombo->currentItem()) {
00205     case TypeBookmarks:
00206       syncee = new BookmarkSyncee();
00207       break;
00208     case TypeAddressBook:
00209       syncee = new AddressBookSyncee();
00210       break;
00211     case TypeCalendar:
00212     default:
00213       syncee = new CalendarSyncee();
00214       break;
00215   }
00216 
00217   SynceeLoader *loader;
00218   if (url.isLocalFile()) {
00219     loader = new SynceeLoader(this,syncee,url.path());
00220     loader->loadSyncee();
00221     ++mLoadCount;
00222     delete loader;
00223     return syncee;
00224   } else {
00225     QString tmpFile = createTempFile();
00226 
00227     loader = new SynceeLoader(this,syncee,tmpFile);
00228     KIO::FileCopyJob *j = KIO::file_copy(url,KURL( tmpFile ),-1,true);
00229     connect(j,SIGNAL(result(KIO::Job *)),
00230             loader,SLOT(loadSyncee(KIO::Job *)));
00231     return syncee;
00232   }
00233 }
00234 
00235 void KSyncView::synceeLoaded()
00236 {
00237   ++mLoadCount;
00238   finishSync();
00239 }
00240 
00241 void KSyncView::finishSync()
00242 {
00243   kdDebug() << "KSyncView::finishSync()" << endl;
00244 
00245   if (mLoadError) {
00246     kdDebug() << "KSyncView::finishSync(): load error" << endl;
00247     return;
00248   }
00249 
00250   if (mLoadCount == mSourceListView->childCount() + 1) {
00251     mLoadCount = 0;
00252     if (mSyncBackCheck->isChecked()) {
00253       mSyncer->sync();
00254       SynceeListItem *item = dynamic_cast<SynceeListItem *>(mSourceListView->firstChild());
00255       KIO::FileCopyJob *j;
00256       while(item) {
00257         KURL from(item->syncee()->filename());
00258         KURL to(item->url());
00259         if (from != to) {
00260           kdDebug() << "Copy " << from.url() << " to " << to.url() << endl;
00261           j = KIO::file_copy(from,to,-1,true);
00262           connect(j,SIGNAL(result(KIO::Job *)),SLOT(jobFinished(KIO::Job *)));
00263         } else {
00264           checkFinish();
00265         }
00266 
00267         item = (SynceeListItem *)item->nextSibling();
00268       }
00269     } else {
00270       mSyncer->syncAllToTarget(mTarget);
00271       mTarget->save();
00272     }
00273   } else {
00274     kdDebug() << "KSyncView::finishSync(): loadCount: " << mLoadCount << " childCount: "
00275               << mSourceListView->childCount() + 1 << endl;
00276   }
00277 }
00278 
00279 void KSyncView::jobFinished(KIO::Job *job)
00280 {
00281   if (job->error()) {
00282     job->showErrorDialog(this);
00283   } else {
00284     checkFinish();
00285   }
00286 }
00287 
00288 void KSyncView::checkFinish()
00289 {
00290   ++mLoadCount;
00291   if (mLoadCount == mSourceListView->childCount()) {
00292     KMessageBox::information(this,i18n("Sync finished"));
00293     mLoadCount = 0;
00294   }
00295 }
00296 
00297 void KSyncView::synceeLoadError()
00298 {
00299   kdDebug() << "KSyncView::synceeLoadError()" << endl;
00300 
00301   mLoadError = true;
00302 
00303   KMessageBox::error(this,i18n("Can't load syncee."),i18n("Load Error"));
00304 }
00305 
00306 void KSyncView::readConfig(KConfig *config)
00307 {
00308   int typeIndex = config->readNumEntry("SyncType",TypeCalendar);
00309   mTypeCombo->setCurrentItem(typeIndex);
00310   mCurrentType = typeIndex;
00311 
00312   readTypeConfig(config);
00313 }
00314 
00315 void KSyncView::readTypeConfig(KConfig *config)
00316 {
00317   QString typeString = mTypeCombo->text(mCurrentType);
00318 
00319   QStringList sources = config->readPathListEntry("Sources_" + typeString);
00320 
00321   mSourceListView->clear();
00322   QStringList::ConstIterator it = sources.begin();
00323   while(it != sources.end()) {
00324     new SynceeListItem (mSourceListView,KURL(*it));
00325     ++it;
00326   }
00327 
00328   mTargetReq->setURL(config->readPathEntry("Target_" + typeString));
00329 }
00330 
00331 void KSyncView::writeConfig(KConfig *config)
00332 {
00333   config->writeEntry("SyncType",mTypeCombo->currentItem());
00334 
00335   writeTypeConfig(config);
00336 }
00337 
00338 void KSyncView::writeTypeConfig(KConfig *config)
00339 {
00340   QStringList sources;
00341   QListViewItem *item = mSourceListView->firstChild();
00342   while(item) {
00343     sources.append(item->text(0));
00344     item = item->nextSibling();
00345   }
00346 
00347   QString typeString = mTypeCombo->text(mCurrentType);
00348 
00349   config->writePathEntry("Sources_" + typeString,sources);
00350   config->writePathEntry("Target_" + typeString,mTargetReq->url());
00351 
00352   config->sync();
00353 }
00354 
00355 void KSyncView::checkSyncBack()
00356 {
00357   if (mSyncBackCheck->isChecked()) {
00358     mTargetReq->setEnabled(false);
00359   } else {
00360     mTargetReq->setEnabled(true);
00361   }
00362 }
00363 
00364 void KSyncView::reloadSyncees()
00365 {
00366   KConfig *config = kapp->config();
00367 
00368   writeTypeConfig(config);
00369   mCurrentType = mTypeCombo->currentItem();
00370   readTypeConfig(config);
00371 }
00372 
00373 QString KSyncView::createTempFile()
00374 {
00375   KTempFile *tmpFile = new KTempFile;
00376   mTmpFiles.append(tmpFile);
00377   tmpFile->setAutoDelete(true);
00378   return tmpFile->name();
00379 }
KDE Logo
This file is part of the documentation for ksync Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:36:37 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003