resourcelocaldir.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <typeinfo>
00023 #include <stdlib.h>
00024
00025 #include <qdatetime.h>
00026 #include <qstring.h>
00027 #include <qptrlist.h>
00028
00029 #include <kdebug.h>
00030 #include <klocale.h>
00031 #include <kurl.h>
00032 #include <kstandarddirs.h>
00033
00034 #include "vcaldrag.h"
00035 #include "vcalformat.h"
00036 #include "icalformat.h"
00037 #include "exceptions.h"
00038 #include "incidence.h"
00039 #include "event.h"
00040 #include "todo.h"
00041 #include "journal.h"
00042 #include "filestorage.h"
00043
00044 #include <kresources/configwidget.h>
00045
00046 #include "resourcelocaldirconfig.h"
00047
00048 #include "resourcelocaldir.h"
00049
00050 using namespace KCal;
00051
00052 ResourceLocalDir::ResourceLocalDir( const KConfig* config )
00053 : ResourceCached( config ), mLock( 0 )
00054 {
00055 if ( config ) {
00056 readConfig( config );
00057 }
00058
00059 init();
00060 }
00061
00062 ResourceLocalDir::ResourceLocalDir( const QString& dirName )
00063 : ResourceCached( 0 )
00064 {
00065 mURL = KURL( dirName );
00066
00067 init();
00068 }
00069
00070
00071 void ResourceLocalDir::readConfig( const KConfig *config )
00072 {
00073 QString url = config->readPathEntry( "CalendarURL" );
00074 mURL = KURL( url );
00075 }
00076
00077 void ResourceLocalDir::writeConfig( KConfig *config )
00078 {
00079 kdDebug(5800) << "ResourceLocalDir::writeConfig()" << endl;
00080
00081 ResourceCalendar::writeConfig( config );
00082
00083 config->writePathEntry( "CalendarURL", mURL.prettyURL() );
00084 }
00085
00086 void ResourceLocalDir::init()
00087 {
00088 setType( "dir" );
00089
00090 mOpen = false;
00091
00092 connect( &mDirWatch, SIGNAL( dirty( const QString & ) ),
00093 SLOT( reload( const QString & ) ) );
00094 connect( &mDirWatch, SIGNAL( created( const QString & ) ),
00095 SLOT( reload( const QString & ) ) );
00096 connect( &mDirWatch, SIGNAL( deleted( const QString & ) ),
00097 SLOT( reload( const QString & ) ) );
00098
00099 mLock = new KABC::Lock( mURL.path() );
00100
00101 mDirWatch.addDir( mURL.path(), true );
00102 mDirWatch.startScan();
00103 }
00104
00105
00106 ResourceLocalDir::~ResourceLocalDir()
00107 {
00108 close();
00109
00110 delete mLock;
00111 }
00112
00113 bool ResourceLocalDir::doOpen()
00114 {
00115 kdDebug(5800) << "Opening resource " << resourceName() << " with URL " << mURL.prettyURL() << endl;
00116
00117 mOpen = true;
00118
00119 return true;
00120 }
00121
00122 bool ResourceLocalDir::doLoad()
00123 {
00124 kdDebug(5800) << "ResourceLocalDir::load()" << endl;
00125
00126 if ( !mOpen ) return true;
00127
00128 mCalendar.close();
00129 bool success = true;
00130
00131 QString dirName = mURL.path();
00132 if ( !( KStandardDirs::exists( dirName ) || KStandardDirs::exists( dirName + "/") ) ) {
00133 kdDebug(5800) << "ResourceLocalDir::load(): Directory doesn't exist yet. Creating it..." << endl;
00134
00135
00136
00137
00138 success = KStandardDirs::makeDir( dirName, 0775 );
00139 } else {
00140
00141 kdDebug(5800) << "ResourceLocalDir::load(): '" << dirName << "'" << endl;
00142
00143 QDir dir( dirName );
00144
00145 QStringList entries = dir.entryList( QDir::Files | QDir::Readable );
00146
00147 QStringList::ConstIterator it;
00148 for( it = entries.begin(); it != entries.end(); ++it ) {
00149 if ( (*it).endsWith( "~" ) )
00150 continue;
00151
00152 QString fileName = dirName + "/" + *it;
00153 kdDebug(5800) << " read '" << fileName << "'" << endl;
00154 CalendarLocal cal( mCalendar.timeZoneId() );
00155 cal.load( fileName );
00156 Incidence::List incidences = cal.rawIncidences();
00157 Incidence *i = incidences.first();
00158 if ( i ) mCalendar.addIncidence( i->clone() );
00159 }
00160 }
00161
00162 return success;
00163 }
00164
00165 bool ResourceLocalDir::doSave()
00166 {
00167 kdDebug(5800) << "ResourceLocalDir::save()" << endl;
00168
00169 if ( !mOpen ) return true;
00170
00171 Incidence::List incidences = mCalendar.rawIncidences();
00172
00173 Incidence::List::ConstIterator it;
00174 for( it = incidences.begin(); it != incidences.end(); ++it ) {
00175 Incidence *i = *it;
00176 QString fileName = mURL.path() + "/" + i->uid();
00177 kdDebug(5800) << "writing '" << fileName << "'" << endl;
00178
00179 CalendarLocal cal( mCalendar.timeZoneId() );
00180 cal.addIncidence( i->clone() );
00181 cal.save( fileName );
00182 }
00183
00184 return true;
00185 }
00186
00187 KABC::Lock *ResourceLocalDir::lock()
00188 {
00189 return mLock;
00190 }
00191
00192 void ResourceLocalDir::reload( const QString &file )
00193 {
00194 kdDebug(5800) << "ResourceLocalDir::reload()" << endl;
00195
00196 if ( !mOpen ) return;
00197
00198 kdDebug(5800) << " File: '" << file << "'" << endl;
00199
00200 mCalendar.close();
00201 load();
00202
00203 emit resourceChanged( this );
00204 }
00205
00206 void ResourceLocalDir::doClose()
00207 {
00208 if ( !mOpen ) return;
00209
00210 mCalendar.close();
00211 mOpen = false;
00212 }
00213
00214
00215 void ResourceLocalDir::deleteEvent(Event *event)
00216 {
00217 kdDebug(5800) << "ResourceLocalDir::deleteEvent" << endl;
00218 if ( deleteIncidenceFile(event) )
00219 mCalendar.deleteEvent( event );
00220 }
00221
00222
00223 void ResourceLocalDir::deleteTodo(Todo *todo)
00224 {
00225 if ( deleteIncidenceFile(todo) )
00226 mCalendar.deleteTodo( todo );
00227 }
00228
00229
00230 void ResourceLocalDir::dump() const
00231 {
00232 ResourceCalendar::dump();
00233 kdDebug(5800) << " Url: " << mURL.url() << endl;
00234 }
00235
00236 bool ResourceLocalDir::deleteIncidenceFile(Incidence *incidence)
00237 {
00238 QFile file( mURL.path() + "/" + incidence->uid() );
00239 if ( !file.exists() )
00240 return true;
00241
00242 mDirWatch.stopScan();
00243 bool removed = file.remove();
00244 mDirWatch.startScan();
00245 return removed;
00246 }
00247
00248 #include "resourcelocaldir.moc"
This file is part of the documentation for libkcal Library Version 3.3.2.