/** presuming that the caller has already reset the map canvas, map registry, and legend */ bool QgsProject::read() { clearError(); std::auto_ptr< QDomDocument > doc = std::auto_ptr < QDomDocument > ( new QDomDocument( "qgis" ) ); if ( !imp_->file.open( QIODevice::ReadOnly ) ) { imp_->file.close(); setError( tr( "Unable to open %1" ).arg( imp_->file.fileName() ) ); return false; } // location of problem associated with errorMsg int line, column; QString errorMsg; if ( !doc->setContent( &imp_->file, &errorMsg, &line, &column ) ) { // want to make this class as GUI independent as possible; so commented out #if 0 QMessageBox::critical( 0, tr( "Project File Read Error" ), tr( "%1 at line %2 column %3" ).arg( errorMsg ).arg( line ).arg( column ) ); #endif QString errorString = tr( "Project file read error: %1 at line %2 column %3" ) .arg( errorMsg ).arg( line ).arg( column ); QgsDebugMsg( errorString ); imp_->file.close(); setError( tr( "%1 for file %2" ).arg( errorString ).arg( imp_->file.fileName() ) ); return false; } imp_->file.close(); QgsDebugMsg( "Opened document " + imp_->file.fileName() ); QgsDebugMsg( "Project title: " + imp_->title ); // get project version string, if any QgsProjectVersion fileVersion = _getVersion( *doc ); QgsProjectVersion thisVersion( QGis::QGIS_VERSION ); if ( thisVersion > fileVersion ) { QgsLogger::warning( "Loading a file that was saved with an older " "version of qgis (saved in " + fileVersion.text() + ", loaded in " + QGis::QGIS_VERSION + "). Problems may occur." ); QgsProjectFileTransform projectFile( *doc, fileVersion ); //! Shows a warning when an old project file is read. emit oldProjectVersionWarning( fileVersion.text() ); QgsDebugMsg( "Emitting oldProjectVersionWarning(oldVersion)." ); projectFile.dump(); projectFile.updateRevision( thisVersion ); projectFile.dump(); } // before we start loading everything, let's clear out the current set of // properties first so that we don't have the properties from the previous // project still hanging around imp_->clear(); mEmbeddedLayers.clear(); // now get any properties _getProperties( *doc, imp_->properties_ ); QgsDebugMsg( QString::number( imp_->properties_.count() ) + " properties read" ); dump_( imp_->properties_ ); // restore the canvas' area of interest // now get project title _getTitle( *doc, imp_->title ); // get the map layers QPair< bool, QList<QDomNode> > getMapLayersResults = _getMapLayers( *doc ); // review the integrity of the retrieved map layers bool clean = getMapLayersResults.first; if ( !clean ) { QgsDebugMsg( "Unable to get map layers from project file." ); if ( ! getMapLayersResults.second.isEmpty() ) { QgsDebugMsg( "there are " + QString::number( getMapLayersResults.second.size() ) + " broken layers" ); } // we let a custom handler to decide what to do with missing layers // (default implementation ignores them, there's also a GUI handler that lets user choose correct path) mBadLayerHandler->handleBadLayers( getMapLayersResults.second, *doc ); } // read the project: used by map canvas and legend emit readProject( *doc ); // if all went well, we're allegedly in pristine state if ( clean ) dirty( false ); return true; } // QgsProject::read
/** @note it's presumed that the caller has already reset the map canvas, map registry, and legend */ bool QgsProject::read() { std::auto_ptr< QDomDocument > doc = std::auto_ptr < QDomDocument > ( new QDomDocument( "qgis" ) ); if ( !imp_->file.open( QIODevice::ReadOnly ) ) { imp_->file.close(); // even though we got an error, let's make // sure it's closed anyway throw QgsIOException( QObject::tr( "Unable to open " ) + imp_->file.fileName() ); } // location of problem associated with errorMsg int line, column; QString errorMsg; if ( !doc->setContent( &imp_->file, &errorMsg, &line, &column ) ) { // want to make this class as GUI independent as possible; so commented out // QMessageBox::critical( 0x0, "Project File Read Error", // errorMsg + " at line " + QString::number( line ) + // " column " + QString::number( column ) ); QString errorString = QObject::tr( "Project file read error: " ) + errorMsg + QObject::tr( " at line " ) + QString::number( line ) + QObject::tr( " column " ) + QString::number( column ); qDebug( "%s", errorString.toUtf8().constData() ); imp_->file.close(); throw QgsException( errorString + QObject::tr( " for file " ) + imp_->file.fileName() ); } imp_->file.close(); QgsDebugMsg( "Opened document " + imp_->file.fileName() ); QgsDebugMsg( "Project title: " + imp_->title ); // get project version string, if any QgsProjectVersion fileVersion = _getVersion( *doc ); QgsProjectVersion thisVersion( QGis::QGIS_VERSION ); if ( thisVersion > fileVersion ) { QgsLogger::warning( "Loading a file that was saved with an older " "version of qgis (saved in " + fileVersion.text() + ", loaded in " + QGis::QGIS_VERSION + "). Problems may occur." ); QgsProjectFileTransform projectFile( *doc, fileVersion ); //! Shows a warning when an old project file is read. emit oldProjectVersionWarning( fileVersion.text() ); QgsDebugMsg( "Emitting oldProjectVersionWarning(oldVersion)." ); projectFile.dump(); projectFile.updateRevision( thisVersion ); projectFile.dump(); } // before we start loading everything, let's clear out the current set of // properties first so that we don't have the properties from the previous // project still hanging around imp_->clear(); // now get any properties _getProperties( *doc, imp_->properties_ ); QgsDebugMsg( QString::number( imp_->properties_.count() ) + " properties read" ); dump_( imp_->properties_ ); // restore the canvas' area of interest // now get project title _getTitle( *doc, imp_->title ); // get the map layers std::pair< bool, std::list<QDomNode> > getMapLayersResults = _getMapLayers( *doc ); // review the integrity of the retrieved map layers if ( ! getMapLayersResults.first ) { QgsDebugMsg( "Unable to get map layers from project file." ); if ( ! getMapLayersResults.second.empty() ) { QgsDebugMsg( "there are " + QString::number( getMapLayersResults.second.size() ) + " broken layers" ); } // Since we could be executing this from the test harness which // doesn't *have* layers -- nor a GUI for that matter -- we'll just // leave in the whining and boldly stomp on. emit readProject( *doc ); throw QgsProjectBadLayerException( getMapLayersResults.second ); // return false; } // read the project: used by map canvas and legend emit readProject( *doc ); // can't be dirty since we're allegedly in pristine state dirty( false ); return true; } // QgsProject::read