bool CMake::writeProjects() { for(Map<String, Project>::Node* i = projects.getFirst(); i; i = i->getNext()) if(!writeProject(i->key, i->data)) return false; return true; }
bool VCProject::write() const { // Write the template m_template->write(m_urlSchemes); return writeProject() && writeFilters(); }
bool QgsProject::write() { clearError(); // if we have problems creating or otherwise writing to the project file, // let's find out up front before we go through all the hand-waving // necessary to create all the Dom objects if ( !imp_->file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) ) { imp_->file.close(); // even though we got an error, let's make // sure it's closed anyway setError( tr( "Unable to save to file %1" ).arg( imp_->file.fileName() ) ); return false; } QFileInfo myFileInfo( imp_->file ); if ( !myFileInfo.isWritable() ) { // even though we got an error, let's make // sure it's closed anyway imp_->file.close(); setError( tr( "%1 is not writable. Please adjust permissions (if possible) and try again." ) .arg( imp_->file.fileName() ) ); return false; } QDomImplementation DomImplementation; QDomDocumentType documentType = DomImplementation.createDocumentType( "qgis", "http://mrcc.com/qgis.dtd", "SYSTEM" ); std::auto_ptr < QDomDocument > doc = std::auto_ptr < QDomDocument > ( new QDomDocument( documentType ) ); QDomElement qgisNode = doc->createElement( "qgis" ); qgisNode.setAttribute( "projectname", title() ); qgisNode.setAttribute( "version", QString( "%1" ).arg( QGis::QGIS_VERSION ) ); doc->appendChild( qgisNode ); // title QDomElement titleNode = doc->createElement( "title" ); qgisNode.appendChild( titleNode ); QDomText titleText = doc->createTextNode( title() ); // XXX why have title TWICE? titleNode.appendChild( titleText ); // let map canvas and legend write their information emit writeProject( *doc ); // within top level node save list of layers QMap<QString, QgsMapLayer*> & layers = QgsMapLayerRegistry::instance()->mapLayers(); // Iterate over layers in zOrder // Call writeXML() on each QDomElement projectLayersNode = doc->createElement( "projectlayers" ); projectLayersNode.setAttribute( "layercount", qulonglong( layers.size() ) ); QMap<QString, QgsMapLayer*>::iterator li = layers.begin(); while ( li != layers.end() ) { //QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer(*li); QgsMapLayer* ml = li.value(); if ( ml ) { QString externalProjectFile = layerIsEmbedded( ml->id() ); QHash< QString, QPair< QString, bool> >::const_iterator emIt = mEmbeddedLayers.find( ml->id() ); if ( emIt == mEmbeddedLayers.constEnd() ) { ml->writeXML( projectLayersNode, *doc ); } else //layer defined in an external project file { //only save embedded layer if not managed by a legend group if ( emIt.value().second ) { QDomElement mapLayerElem = doc->createElement( "maplayer" ); mapLayerElem.setAttribute( "embedded", 1 ); mapLayerElem.setAttribute( "project", writePath( emIt.value().first ) ); mapLayerElem.setAttribute( "id", ml->id() ); projectLayersNode.appendChild( mapLayerElem ); } } } li++; } qgisNode.appendChild( projectLayersNode ); // now add the optional extra properties dump_( imp_->properties_ ); QgsDebugMsg( QString( "there are %1 property scopes" ).arg( static_cast<int>( imp_->properties_.count() ) ) ); if ( !imp_->properties_.isEmpty() ) // only worry about properties if we // actually have any properties { imp_->properties_.writeXML( "properties", qgisNode, *doc ); } // now wrap it up and ship it to the project file doc->normalize(); // XXX I'm not entirely sure what this does //QString xml = doc->toString(4); // write to string with indentation of four characters // (yes, four is arbitrary) // const char * xmlString = xml; // debugger probe point // qDebug( "project file output:\n\n" + xml ); QTextStream projectFileStream( &imp_->file ); //projectFileStream << xml << endl; doc->save( projectFileStream, 4 ); // save as utf-8 imp_->file.close(); // check if the text stream had no error - if it does // the user will get a message so they can try to resolve the // situation e.g. by saving project to a volume with more space // if ( projectFileStream.pos() == -1 || imp_->file.error() != QFile::NoError ) { setError( tr( "Unable to save to file %1. Your project " "may be corrupted on disk. Try clearing some space on the volume and " "check file permissions before pressing save again." ) .arg( imp_->file.fileName() ) ); return false; } dirty( false ); // reset to pristine state emit projectSaved(); return true; } // QgsProject::write