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 ) ) {
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"