BOOL MBVersion::needUpdate() { phoneHome(); unsigned int tVer,pVer; tVer = thisVersion(); logger.log("tVer:"+numToString(tVer)); pVer = publicVersion(); logger.log("pVer:"+numToString(pVer)); if (tVer < pVer) { return TRUE; } else { return FALSE; } }
/** 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
QString QgsMapLayer::loadNamedStyle( const QString &theURI, bool &theResultFlag ) { QgsDebugMsg( QString( "uri = %1 myURI = %2" ).arg( theURI ).arg( publicSource() ) ); theResultFlag = false; QDomDocument myDocument( "qgis" ); // location of problem associated with errorMsg int line, column; QString myErrorMessage; QFile myFile( theURI ); if ( myFile.open( QFile::ReadOnly ) ) { // read file theResultFlag = myDocument.setContent( &myFile, &myErrorMessage, &line, &column ); if ( !theResultFlag ) myErrorMessage = tr( "%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column ); myFile.close(); } else { QFileInfo project( QgsProject::instance()->fileName() ); QgsDebugMsg( QString( "project fileName: %1" ).arg( project.absoluteFilePath() ) ); QString qml; if ( loadNamedStyleFromDb( QDir( QgsApplication::qgisSettingsDirPath() ).absoluteFilePath( "qgis.qmldb" ), theURI, qml ) || ( project.exists() && loadNamedStyleFromDb( project.absoluteDir().absoluteFilePath( project.baseName() + ".qmldb" ), theURI, qml ) ) || loadNamedStyleFromDb( QDir( QgsApplication::pkgDataPath() ).absoluteFilePath( "resources/qgis.qmldb" ), theURI, qml ) ) { theResultFlag = myDocument.setContent( qml, &myErrorMessage, &line, &column ); if ( !theResultFlag ) { myErrorMessage = tr( "%1 at line %2 column %3" ).arg( myErrorMessage ).arg( line ).arg( column ); } } else { myErrorMessage = tr( "style not found in database" ); } } if ( !theResultFlag ) { return myErrorMessage; } // get style file version string, if any QgsProjectVersion fileVersion( myDocument.firstChildElement( "qgis" ).attribute( "version" ) ); QgsProjectVersion thisVersion( QGis::QGIS_VERSION ); if ( thisVersion > fileVersion ) { QgsLogger::warning( "Loading a style file that was saved with an older " "version of qgis (saved in " + fileVersion.text() + ", loaded in " + QGis::QGIS_VERSION + "). Problems may occur." ); QgsProjectFileTransform styleFile( myDocument, fileVersion ); // styleFile.dump(); styleFile.updateRevision( thisVersion ); // styleFile.dump(); } // now get the layer node out and pass it over to the layer // to deserialise... QDomElement myRoot = myDocument.firstChildElement( "qgis" ); if ( myRoot.isNull() ) { myErrorMessage = tr( "Error: qgis element could not be found in %1" ).arg( theURI ); theResultFlag = false; return myErrorMessage; } // use scale dependent visibility flag toggleScaleBasedVisibility( myRoot.attribute( "hasScaleBasedVisibilityFlag" ).toInt() == 1 ); setMinimumScale( myRoot.attribute( "minimumScale" ).toFloat() ); setMaximumScale( myRoot.attribute( "maximumScale" ).toFloat() ); #if 0 //read transparency level QDomNode transparencyNode = myRoot.namedItem( "transparencyLevelInt" ); if ( ! transparencyNode.isNull() ) { // set transparency level only if it's in project // (otherwise it sets the layer transparent) QDomElement myElement = transparencyNode.toElement(); setTransparency( myElement.text().toInt() ); } #endif QString errorMsg; theResultFlag = readSymbology( myRoot, errorMsg ); if ( !theResultFlag ) { myErrorMessage = tr( "Loading style file %1 failed because:\n%2" ).arg( theURI ).arg( errorMsg ); return myErrorMessage; } return ""; }
/** @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