TaskList Task::readTasksElement( const QDomElement& element, int databaseSchemaVersion ) { if ( element.tagName() == taskListTagName() ) { TaskList tasks; for ( QDomElement child = element.firstChildElement(); !child.isNull(); child = child.nextSiblingElement( tagName() ) ) { if ( child.tagName() != tagName() ) { throw XmlSerializationException( QObject::tr( "Task::readTasksElement: parent-child mismatch" ) ); } Task task = fromXml( child, databaseSchemaVersion ); tasks << task; } return tasks; } else { throw XmlSerializationException( QObject::tr( "Task::readTasksElement: judging by the tag name, this is not a tasks element" ) ); } }
void TaskExport::readFrom( const QString& filename ) { // load the time sheet: QFile file( filename ); if ( !file.exists() ) { throw XmlSerializationException( QObject::tr( "File does not exist." ) ); } // load the XML into a DOM tree: if (!file.open(QIODevice::ReadOnly)) { throw XmlSerializationException( QObject::tr( "Cannot open file for reading." ) ); } QDomDocument document; if (!document.setContent(&file)) { throw XmlSerializationException( QObject::tr( "Cannot read file" ) ); } // now read and check for the correct report type QDomElement rootElement = document.documentElement(); const QString tagName = rootElement.tagName(); const QString typeAttribute = rootElement.attribute( XmlSerialization::reportTypeAttribute() ); if( tagName != XmlSerialization::reportTagName() || typeAttribute != reportType() ) { throw XmlSerializationException( QObject::tr( "This file is not a Charm task definition file. Please double-check." ) ); } QDomElement metadata = XmlSerialization::metadataElement( document ); QDomElement report = XmlSerialization::reportElement( document ); // from metadata, read the export time stamp: m_exportTime = XmlSerialization::creationTime( metadata ); m_userName = XmlSerialization::userName( metadata ); // from report, read tasks: QDomElement tasksElement = report.firstChildElement( Task::taskListTagName() ); m_tasks = Task::readTasksElement( tasksElement, CHARM_DATABASE_VERSION ); qDebug() << "XmlSerialization::readFrom: loaded task definitions exported by" << m_userName << "as of" << m_exportTime; }
void TaskExport::writeTo( const QString& filename, const TaskList& tasks ) { QDomDocument document = XmlSerialization::createXmlTemplate( reportType() ); QDomElement metadata = XmlSerialization::metadataElement( document ); QDomElement report = XmlSerialization::reportElement( document ); // write tasks { QDomElement tasksElement = Task::makeTasksElement( document, tasks ); report.appendChild( tasksElement ); } // all done, write to file: QFile file( filename ); if ( file.open( QIODevice::WriteOnly ) ) { QTextStream stream( &file ); document.save( stream, 4 ); } else { throw XmlSerializationException( QObject::tr( "Cannot write to file" ) ); } }
Task Task::fromXml(const QDomElement& element, int databaseSchemaVersion) { // in case any task object creates trouble with // serialization/deserialization, add an object of it to // void XmlSerializationTests::testTaskSerialization() if ( element.tagName() != tagName() ) { throw XmlSerializationException( QObject::tr( "Task::fromXml: judging from the tag name, this is not a task tag") ); } Task task; bool ok; task.setName(element.text()); task.setId(element.attribute(TaskIdElement).toInt(&ok)); if (!ok) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid task id") ); task.setParent(element.attribute(TaskParentId).toInt(&ok)); if (!ok) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid parent task id") ); task.setSubscribed(element.attribute(TaskSubscribed).toInt(&ok) == 1); if (!ok) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid subscription setting") ); if( databaseSchemaVersion > CHARM_DATABASE_VERSION_BEFORE_TASK_EXPIRY ) { if ( element.hasAttribute( TaskValidFrom ) ) { QDateTime start = QDateTime::fromString( element.attribute( TaskValidFrom ), Qt::ISODate ); if ( !start.isValid() ) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid valid-from date" ) ); task.setValidFrom( start ); } if ( element.hasAttribute( TaskValidUntil ) ) { QDateTime end = QDateTime::fromString( element.attribute( TaskValidUntil ), Qt::ISODate ); if ( !end.isValid() ) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid valid-until date" ) ); task.setValidUntil( end ); } } if ( databaseSchemaVersion > CHARM_DATABASE_VERSION_BEFORE_TRACKABLE ) { task.setTrackable(element.attribute(TaskTrackable, QLatin1String("1")).toInt(&ok) == 1); if (!ok) throw XmlSerializationException( QObject::tr( "Task::fromXml: invalid trackable settings") ); } return task; }
Event Event::fromXml( const QDomElement& element, int databaseSchemaVersion ) { // in case any event object creates trouble with // serialization/deserialization, add an object of it to // void XmlSerializationTests::testEventSerialization() Event event; bool ok; event.setComment( element.text() ); event.setId( element.attribute( EventIdAttribute ).toInt( &ok ) ); if ( !ok ) throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid event id" ) ); event.setInstallationId( element.attribute( EventInstallationIdAttribute ).toInt( &ok ) ); if ( !ok ) throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid installation id" ) ); event.setTaskId( element.attribute( EventTaskIdAttribute ).toInt( &ok ) ); if ( !ok ) throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid task id" ) ); event.setUserId( element.attribute( EventUserIdAttribute ).toInt( &ok ) ); if ( !ok && databaseSchemaVersion > 1 ) { throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid user id" ) ); event.setUserId( 0 ); } event.setReportId( element.attribute( EventReportIdAttribute ).toInt( &ok ) ); if ( !ok && databaseSchemaVersion > 1 ) { throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid report id" ) ); event.setReportId( 0 ); } if ( element.hasAttribute( EventStartAttribute ) ) { QDateTime start = QDateTime::fromString( element.attribute( EventStartAttribute ), Qt::ISODate ); if ( !start.isValid() ) throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid start date" ) ); start.setTimeSpec( Qt::UTC ); event.setStartDateTime( start ); } if ( element.hasAttribute( EventEndAttribute ) ) { QDateTime end = QDateTime::fromString( element.attribute( EventEndAttribute ), Qt::ISODate ); if ( !end.isValid() ) throw XmlSerializationException( QObject::tr( "Event::fromXml: invalid end date" ) ); end.setTimeSpec( Qt::UTC ); event.setEndDateTime( end.toLocalTime() ); } event.setComment( element.text() ); return event; }