summaryrefslogtreecommitdiff
path: root/library/datebookdb.cpp
Side-by-side diff
Diffstat (limited to 'library/datebookdb.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/datebookdb.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/library/datebookdb.cpp b/library/datebookdb.cpp
index 2f33255..000ff71 100644
--- a/library/datebookdb.cpp
+++ b/library/datebookdb.cpp
@@ -750,193 +750,193 @@ void DateBookDB::loadFile( const QString &strFile )
int alarmTime = -1; Event::SoundTypeChoice alarmSound = Event::Silent;
// ... and for the recurrence
Event::RepeatPattern rp;
Event e;
i += 7;
while( 1 ) {
while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') )
++i;
if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') )
break;
// we have another attribute, read it.
int j = i;
while ( j < len && dt[j] != '=' )
++j;
char *attr = dt+i;
dt[j] = '\0';
i = ++j; // skip =
while ( i < len && dt[i] != '"' )
++i;
j = ++i;
bool haveAmp = FALSE;
bool haveUtf = FALSE;
while ( j < len && dt[j] != '"' ) {
if ( dt[j] == '&' )
haveAmp = TRUE;
if ( ((unsigned char)dt[j]) > 0x7f )
haveUtf = TRUE;
++j;
}
if ( i == j ) {
// leave out empty attributes
i = j + 1;
continue;
}
QString value = haveUtf ? QString::fromUtf8( dt+i, j-i )
: QString::fromLatin1( dt+i, j-i );
if ( haveAmp )
value = Qtopia::plainString( value );
i = j + 1;
//qDebug("attr='%s' value='%s'", attr.data(), value.latin1() );
int * find = dict[ attr ];
#if 1
if ( !find ) {
// custom field
e.setCustomField(attr, value);
continue;
}
switch( *find ) {
case FDescription:
e.setDescription( value );
break;
case FLocation:
e.setLocation( value );
break;
case FCategories:
e.setCategories( Qtopia::Record::idsFromString( value ) );
break;
case FUid:
e.setUid( value.toInt() );
break;
case FType:
if ( value == "AllDay" )
e.setType( Event::AllDay );
else
e.setType( Event::Normal );
break;
case FAlarm:
alarmTime = value.toInt();
break;
case FSound:
alarmSound = value == "loud" ? Event::Loud : Event::Silent;
break;
// recurrence stuff
case FRType:
if ( value == "Daily" )
rp.type = Event::Daily;
else if ( value == "Weekly" )
rp.type = Event::Weekly;
else if ( value == "MonthlyDay" )
rp.type = Event::MonthlyDay;
else if ( value == "MonthlyDate" )
rp.type = Event::MonthlyDate;
else if ( value == "Yearly" )
rp.type = Event::Yearly;
else
rp.type = Event::NoRepeat;
break;
case FRWeekdays:
// QtopiaDesktop 1.6 sometimes creates 'rweekdays="0"'
// when it goes mad. This causes datebook to crash.. (se)
- if ( value.toInt() != 0 )
+ if ( value.toInt() != 0 )
rp.days = value.toInt();
else
rp.days = 1;
break;
case FRPosition:
rp.position = value.toInt();
break;
case FRFreq:
rp.frequency = value.toInt();
break;
case FRHasEndDate:
rp.hasEndDate = value.toInt();
break;
case FREndDate: {
rp.endDateUTC = (time_t) value.toLong();
break;
}
case FRStart: {
e.setStart( (time_t) value.toLong() );
break;
}
case FREnd: {
e.setEnd( (time_t) value.toLong() );
break;
}
case FNote:
e.setNotes( value );
break;
case FCreated:
rp.createTime = value.toInt();
break;
case FAction:
currentAction = value.toInt();
break;
case FActionKey:
journalKey = value.toInt();
break;
case FJournalOrigHadRepeat:
origHadRepeat = value.toInt();
break;
default:
qDebug( "huh??? missing enum? -- attr.: %s", attr );
break;
}
#endif
}
// "post processing" (dates, times, alarm, recurrence)
// start date/time
e.setRepeat( rp.type != Event::NoRepeat, rp );
if ( alarmTime != -1 )
e.setAlarm( TRUE, alarmTime, alarmSound );
// now do our action based on the current action...
switch ( currentAction ) {
case ACTION_ADD:
addJFEvent( e );
break;
case ACTION_REMOVE:
removeJFEvent( e );
break;
case ACTION_REPLACE:
// be a little bit careful,
// in case of a messed up journal...
if ( journalKey > -1 && origHadRepeat > -1 ) {
// get the original from proper list...
if ( origHadRepeat )
removeJFEvent( *(repeatEvents.at(journalKey)) );
else
removeJFEvent( *(eventList.at(journalKey)) );
addJFEvent( e );
}
break;
default:
break;
}
}
f.close();
}
void DateBookDB::init()
{
d = new DateBookDBPrivate;
d->clean = false;
QString str = dateBookFilename();
if ( str.isNull() ) {
QMessageBox::warning( 0, QObject::tr("Out of Space"),
QObject::tr("Unable to create start up files\n"
"Please free up some space\n"
"before entering data") );
}
// continuing along, we call this datebook filename again,
// because they may fix it before continuing, though it seems
// pretty unlikely...
loadFile( dateBookFilename() );
@@ -947,190 +947,190 @@ void DateBookDB::init()
save();
}
d->clean = true;
}
bool DateBookDB::save()
{
if ( d->clean == true )
return true;
QValueListIterator<Event> it;
int total_written;
QString strFileNew = dateBookFilename() + ".new";
QFile f( strFileNew );
if ( !f.open( IO_WriteOnly|IO_Raw ) )
return FALSE;
QString buf( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
buf += "<!DOCTYPE DATEBOOK><DATEBOOK>\n";
buf += "<events>\n";
QCString str = buf.utf8();
total_written = f.writeBlock( str.data(), str.length() );
if ( total_written != int(str.length()) ) {
f.close();
QFile::remove( strFileNew );
return false;
}
for ( it = eventList.begin(); it != eventList.end(); ++it ) {
buf = "<event";
(*it).save( buf );
buf += " />\n";
str = buf.utf8();
total_written = f.writeBlock( str.data(), str.length() );
if ( total_written != int(str.length()) ) {
f.close();
QFile::remove( strFileNew );
return false;
}
}
for ( it = repeatEvents.begin(); it != repeatEvents.end(); ++it ) {
buf = "<event";
(*it).save( buf );
buf += " />\n";
str = buf.utf8();
total_written = f.writeBlock( str.data(), str.length() );
if ( total_written != int(str.length()) ) {
f.close();
QFile::remove( strFileNew );
return false;
}
}
buf = "</events>\n</DATEBOOK>\n";
str = buf.utf8();
total_written = f.writeBlock( str.data(), str.length() );
if ( total_written != int(str.length()) ) {
f.close();
QFile::remove( strFileNew );
return false;
}
f.close();
// now rename... I like to use the systemcall
if ( ::rename( strFileNew, dateBookFilename() ) < 0 ) {
qWarning( "problem renaming file %s to %s errno %d",
strFileNew.latin1(), dateBookFilename().latin1(), errno );
// remove the file, otherwise it will just stick around...
QFile::remove( strFileNew );
}
// may as well remove the journal file...
QFile::remove( dateBookJournalFile() );
d->clean = true;
return true;
}
void DateBookDB::reload()
{
QValueList<Event>::Iterator it = eventList.begin();
for ( ; it != eventList.end(); ++it ) {
if ( (*it).hasAlarm() )
delEventAlarm( *it );
if ( (*it).hasRepeat() )
removeRepeat( *it );
}
eventList.clear();
repeatEvents.clear(); // should be a NOP
init();
}
bool DateBookDB::removeRepeat( const Event &ev )
{
time_t removeMe = ev.repeatPattern().createTime;
QValueListIterator<Event> it;
for ( it = repeatEvents.begin(); it != repeatEvents.end(); ++it ) {
if ( removeMe == (*it).repeatPattern().createTime ) {
- repeatEvents.remove( *it );
+ (void)repeatEvents.remove( it );
// best break, or we are going into undefined territory!
return TRUE;
}
}
return FALSE;
}
bool DateBookDB::origRepeat( const Event &ev, Event &orig ) const
{
time_t removeMe = ev.repeatPattern().createTime;
QValueListConstIterator<Event> it;
for ( it = repeatEvents.begin(); it != repeatEvents.end(); ++it ) {
if ( removeMe == (*it).repeatPattern().createTime ) {
orig = (*it);
return TRUE;
}
}
return FALSE;
}
void DateBookDB::saveJournalEntry( const Event &ev, journal_action action )
{
saveJournalEntry( ev, action, -1, false );
}
bool DateBookDB::saveJournalEntry( const Event &evOld, journal_action action,
int key, bool origHadRepeat )
{
bool status = false;
Event ev = evOld;
// write our log based on the action
QFile f( dateBookJournalFile() );
if ( !f.open( IO_WriteOnly|IO_Append ) )
return false;
QString buf = "<event";
ev.save( buf );
buf += " action=";
buf += "\"" + QString::number(action) + "\"";
buf += " actionkey=\"" + QString::number(key) + "\"";
buf += " actionorig=\"" + QString::number(origHadRepeat) +"\"";
buf += " />\n";
QString str = buf.utf8();
status = ( f.writeBlock( str.data(), str.length() ) == int(str.length()) );
f.close();
return status;
}
QValueList<Event> DateBookDB::getRawRepeats() const
{
return repeatEvents;
}
QValueList<Event> DateBookDB::getNonRepeatingEvents( const QDate &from,
const QDate &to ) const
{
QValueListConstIterator<Event> it;
QDateTime dtTmp, dtEnd;
QValueList<Event> tmpList;
for (it = eventList.begin(); it != eventList.end(); ++it ) {
dtTmp = (*it).start(TRUE);
dtEnd = (*it).end(TRUE);
if ( dtTmp.date() >= from && dtTmp.date() <= to ) {
Event e = *it;
if ( dtTmp.date() != dtEnd.date() )
e.setEnd( QDateTime(dtTmp.date(), QTime(23, 59, 0)) );
tmpList.append( e );
}
// we must also check for end date information...
if ( dtEnd.date() != dtTmp.date() && dtEnd.date() >= from ) {
QDateTime dt = dtTmp.addDays( 1 );
dt.setTime( QTime(0, 0, 0) );
QDateTime dtStop;
if ( dtEnd > to ) {
dtStop = to;
} else
dtStop = dtEnd;
while ( dt <= dtStop ) {
Event ev = *it;
if ( dt >= from ) {
ev.setStart( QDateTime(dt.date(), QTime(0, 0, 0)) );
if ( dt.date() == dtEnd.date() )
ev.setEnd( QDateTime(dt.date(), dtEnd.time()) );
else
ev.setEnd( QDateTime(dt.date(), QTime(23, 59, 0)) );
tmpList.append( ev );
}
dt = dt.addDays( 1 );
}
}
}
return tmpList;
}