bool ProjectFileWriter::SaveToFile(const gd::Project & project, const gd::String & filename, bool forceSingleFile) { //Serialize the whole project gd::SerializerElement rootElement; project.SerializeTo(rootElement); #if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI) if (project.IsFolderProject() && !forceSingleFile) //Optionally split the project { wxString projectPath = wxFileName::FileName(filename).GetPath(); gd::Splitter splitter; auto splitElements = splitter.Split(rootElement, { "/layouts/layout", "/externalEvents/externalEvents", "/externalLayouts/externalLayout", }); for (auto & element : splitElements) { //Create a partial XML document TiXmlDocument doc; doc.LinkEndChild(new TiXmlDeclaration("1.0", "UTF-8", "")); TiXmlElement * root = new TiXmlElement("projectPartial"); doc.LinkEndChild(root); gd::Serializer::ToXML(element.element, root); //And write the element in it gd::String filename = projectPath + element.path + "-" + MakeFileNameSafe(element.name); gd::RecursiveMkDir::MkDir(wxFileName::FileName(filename).GetPath()); if (!doc.SaveFile(filename.ToLocale().c_str())) { gd::LogError( _( "Unable to save file ") + filename + _("!\nCheck that the drive has enough free space, is not write-protected and that you have read/write permissions." ) ); return false; } } } #endif //Create the main XML document TiXmlDocument doc; doc.LinkEndChild(new TiXmlDeclaration( "1.0", "UTF-8", "" )); TiXmlElement * root = new TiXmlElement( "project" ); doc.LinkEndChild(root); gd::Serializer::ToXML(rootElement, root); //Write XML to file if ( !doc.SaveFile( filename.ToLocale().c_str() ) ) { gd::LogError( _( "Unable to save file ") + filename + _("!\nCheck that the drive has enough free space, is not write-protected and that you have read/write permissions." ) ); return false; } return true; }
bool ProjectFileWriter::SaveToJSONFile(const gd::Project & project, const gd::String & filename) { //Serialize the whole project gd::SerializerElement rootElement; project.SerializeTo(rootElement); //Write JSON to file gd::String str = gd::Serializer::ToJSON(rootElement); std::ofstream ofs(filename.ToLocale().c_str()); if (!ofs.is_open()) { gd::LogError( _( "Unable to save file ")+ filename + _("!\nCheck that the drive has enough free space, is not write-protected and that you have read/write permissions." ) ); return false; } ofs << str; ofs.close(); return true; }