summaryrefslogtreecommitdiff
authoreilers <eilers>2003-03-24 17:24:44 (UTC)
committer eilers <eilers>2003-03-24 17:24:44 (UTC)
commit84372ba20c0b1b09c1606212ec66c9d04588b90e (patch) (side-by-side diff)
tree36c4d861596c80b537c765af3f0c16495a763cc6
parent38d8d91e11c191f89429f4a3da8c1ada84b2a885 (diff)
downloadopie-84372ba20c0b1b09c1606212ec66c9d04588b90e.zip
opie-84372ba20c0b1b09c1606212ec66c9d04588b90e.tar.gz
opie-84372ba20c0b1b09c1606212ec66c9d04588b90e.tar.bz2
Small anti-crash fix: Sync with QtopiaDesktop caused a big mess. But this
mess should't crash datebook. Therefore this fix prevents datebook to hang if rweekdays=="0"
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/datebookdb.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/library/datebookdb.cpp b/library/datebookdb.cpp
index a26fe8f..0fedfa8 100644
--- a/library/datebookdb.cpp
+++ b/library/datebookdb.cpp
@@ -748,193 +748,198 @@ void DateBookDB::loadFile( const QString &strFile )
// ... for the alarm settings ...
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:
- rp.days = value.toInt();
+ // QtopiaDesktop 1.6 sometimes creates 'rweekdays="0"'
+ // when it goes mad. This causes datebook to crash.. (se)
+ 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() );
if ( QFile::exists( dateBookJournalFile() ) ) {
// merge the journal
loadFile( dateBookJournalFile() );