kabc Library API Documentation

testlock.cpp

00001 /*
00002     This file is part of libkabc.
00003 
00004     Copyright (c) 2003 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 "testlock.h"
00023 
00024 #include "stdaddressbook.h"
00025 
00026 #include <kaboutdata.h>
00027 #include <kapplication.h>
00028 #include <kdebug.h>
00029 #include <klocale.h>
00030 #include <kcmdlineargs.h>
00031 #include <kdirwatch.h>
00032 
00033 #include <kmessagebox.h>
00034 #include <kdialog.h>
00035 
00036 #include <qwidget.h>
00037 #include <qlabel.h>
00038 #include <qlayout.h>
00039 #include <qpushbutton.h>
00040 #include <qlistview.h>
00041 #include <qdir.h>
00042 
00043 #include <iostream>
00044 
00045 #include <sys/types.h>
00046 #include <unistd.h>
00047 
00048 using namespace KABC;
00049 
00050 LockWidget::LockWidget( const QString &identifier )
00051 {
00052   QVBoxLayout *topLayout = new QVBoxLayout( this );
00053   topLayout->setMargin( KDialog::marginHint() );
00054   topLayout->setSpacing( KDialog::spacingHint() );
00055 
00056   if ( identifier.isEmpty() ) {
00057     mLock = 0;
00058   } else {
00059     mLock = new Lock( identifier );
00060 
00061     int pid = getpid();
00062 
00063     QLabel *pidLabel = new QLabel( "Process ID: " + QString::number( pid ),
00064                                    this );
00065     topLayout->addWidget( pidLabel );
00066 
00067     QHBoxLayout *identifierLayout = new QHBoxLayout( topLayout );
00068 
00069     QLabel *resourceLabel = new QLabel( "Identifier:", this );
00070     identifierLayout->addWidget( resourceLabel );
00071 
00072     QLabel *resourceIdentifier = new QLabel( identifier, this );
00073     identifierLayout->addWidget( resourceIdentifier );
00074 
00075     mStatus = new QLabel( "Status: Unlocked", this );
00076     topLayout->addWidget( mStatus );
00077 
00078     QPushButton *button = new QPushButton( "Lock", this );
00079     topLayout->addWidget( button );
00080     connect( button, SIGNAL( clicked() ), SLOT( lock() ) );
00081 
00082     button = new QPushButton( "Unlock", this );
00083     topLayout->addWidget( button );
00084     connect( button, SIGNAL( clicked() ), SLOT( unlock() ) );
00085   }
00086 
00087   mLockView = new QListView( this );
00088   topLayout->addWidget( mLockView );
00089   mLockView->addColumn( "Lock File" );
00090   mLockView->addColumn( "PID" );
00091   mLockView->addColumn( "Locking App" );
00092 
00093   updateLockView();
00094 
00095   QPushButton *quitButton = new QPushButton( "Quit", this );
00096   topLayout->addWidget( quitButton );
00097   connect( quitButton, SIGNAL( clicked() ), SLOT( close() ) );
00098   
00099   KDirWatch *watch = KDirWatch::self();
00100   connect( watch, SIGNAL( dirty( const QString & ) ),
00101            SLOT( updateLockView() ) );
00102   connect( watch, SIGNAL( created( const QString & ) ),
00103            SLOT( updateLockView() ) );
00104   connect( watch, SIGNAL( deleted( const QString & ) ),
00105            SLOT( updateLockView() ) );
00106   watch->addDir( Lock::locksDir() );
00107   watch->startScan();
00108 }
00109 
00110 LockWidget::~LockWidget()
00111 {
00112   delete mLock;
00113 }
00114 
00115 void LockWidget::updateLockView()
00116 {
00117   mLockView->clear();
00118   
00119   QDir dir( Lock::locksDir() );
00120   
00121   QStringList files = dir.entryList( "*.lock" );
00122   
00123   QStringList::ConstIterator it;
00124   for( it = files.begin(); it != files.end(); ++it ) {
00125     if ( *it == "." || *it == ".." ) continue;
00126     
00127     QString app;
00128     int pid;
00129     if ( !Lock::readLockFile( dir.filePath( *it ), pid, app ) ) {
00130       kdWarning() << "Unable to open lock file '" << *it << "'" << endl; 
00131     } else {
00132       new QListViewItem( mLockView, *it, QString::number( pid ), app );
00133     }
00134   }
00135 }
00136 
00137 void LockWidget::lock()
00138 {
00139   if ( !mLock->lock() ) {
00140     KMessageBox::sorry( this, mLock->error() );
00141   } else {
00142     mStatus->setText( "Status: Locked" );
00143   }
00144 }
00145 
00146 void LockWidget::unlock()
00147 {
00148   if ( !mLock->unlock() ) {
00149     KMessageBox::sorry( this, mLock->error() );
00150   } else {
00151     mStatus->setText( "Status: Unlocked" );
00152   }
00153 }
00154 
00155 
00156 static const KCmdLineOptions options[] =
00157 {
00158   { "a", 0, 0 },
00159   { "addressbook", "Standard address book", 0 },
00160   { "d", 0, 0 },
00161   { "diraddressbook", "Standard address book directory resource", 0 },
00162   { "+identifier", "Identifier of resource to be locked, e.g. filename", 0 },
00163   KCmdLineLastOption
00164 };
00165 
00166 int main(int argc,char **argv)
00167 {
00168   KAboutData aboutData("testlock",I18N_NOOP("Test libkabc Lock"),"0.1");
00169   KCmdLineArgs::init(argc,argv,&aboutData);
00170   KCmdLineArgs::addCmdLineOptions( options );
00171 
00172   KApplication app;
00173 
00174   QString identifier;
00175 
00176   KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
00177   if ( args->count() == 1 ) {
00178     identifier = args->arg( 0 );
00179   } else if ( args->count() != 0 ) {
00180     std::cerr << "Usage: testlock <identifier>" << std::endl;
00181     return 1;
00182   }
00183 
00184   if ( args->isSet( "addressbook" ) ) {
00185     if ( args->count() == 1 ) {
00186       std::cerr << "Ignoring resource identifier" << std::endl;
00187     }
00188     identifier = StdAddressBook::fileName(); 
00189   }
00190 
00191   if ( args->isSet( "diraddressbook" ) ) {
00192     if ( args->count() == 1 ) {
00193       std::cerr << "Ignoring resource identifier" << std::endl;
00194     }
00195     identifier = StdAddressBook::directoryName(); 
00196   }
00197 
00198   LockWidget mainWidget( identifier );
00199 
00200   kapp->setMainWidget( &mainWidget );
00201   mainWidget.show();
00202 
00203   return app.exec();  
00204 }
00205 
00206 #include "testlock.moc"
KDE Logo
This file is part of the documentation for kabc Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed May 5 07:18:01 2004 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003