⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datebookdb.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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; // No tr		break;		// recurrence stuff	    case FRType:		if ( value == "Daily" ) // No tr		    rp.type = Event::Daily;		else if ( value == "Weekly" ) // No tr		    rp.type = Event::Weekly;		else if ( value == "MonthlyDay" )		    rp.type = Event::MonthlyDay;		else if ( value == "MonthlyDate" )		    rp.type = Event::MonthlyDate;		else if ( value == "Yearly" ) // No tr		    rp.type = Event::Yearly;		else		    rp.type = Event::NoRepeat;		break;	    case FRWeekdays:		rp.days = value.toInt();		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, qApp->translate( "DateBookDB", "Out of Space"),			      qApp->translate( "DateBookDB", 					       "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() );	// save in our changes and remove the journal...	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"; // No tr        (*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"; // No tr        (*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    QDir dir;#ifdef Q_OS_WIN32    QFile::remove( dateBookFilename() );#endif    if ( dir.rename( strFileNew, dateBookFilename() ) == FALSE ) {	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 );	    // 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"; // No tr    ev.save( buf );    buf += " action="; // No tr    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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -