Error ConfigFile::save(const String &p_path) { Error err; FileAccess *file = FileAccess::open(p_path, FileAccess::WRITE, &err); if (err) { if (file) memdelete(file); return err; } for (OrderedHashMap<String, OrderedHashMap<String, Variant> >::Element E = values.front(); E; E = E.next()) { if (E != values.front()) file->store_string("\n"); file->store_string("[" + E.key() + "]\n\n"); for (OrderedHashMap<String, Variant>::Element F = E.get().front(); F; F = F.next()) { String vstr; VariantWriter::write_to_string(F.get(), vstr); file->store_string(F.key() + "=" + vstr + "\n"); } } memdelete(file); return OK; }
static void mono_log_callback(const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data) { FileAccess *f = GDMonoLog::get_singleton()->get_log_file(); if (GDMonoLog::get_singleton()->get_log_level_id() >= log_level_get_id(log_level)) { String text(message); text += " (in domain "; text += log_domain; if (log_level) { text += ", "; text += log_level; } text += ")\n"; f->seek_end(); f->store_string(text); } if (fatal) { ERR_PRINTS("Mono: FATAL ERROR, ABORTING! Logfile: " + GDMonoLog::get_singleton()->get_log_file_path() + "\n"); // If we were to abort without flushing, the log wouldn't get written. f->flush(); abort(); } }
void FindInFilesPanel::apply_replaces_in_file(String fpath, const Vector<Result> &locations, String new_text) { // If the file is already open, I assume the editor will reload it. // If there are unsaved changes, the user will be asked on focus, // however that means either losing changes or losing replaces. FileAccess *f = FileAccess::open(fpath, FileAccess::READ); ERR_FAIL_COND(f == NULL); String buffer; int current_line = 1; ConservativeGetLine conservative; String line = conservative.get_line(f); String search_text = _finder->get_search_text(); int offset = 0; for (int i = 0; i < locations.size(); ++i) { int repl_line_number = locations[i].line_number; while (current_line < repl_line_number) { buffer += line; line = conservative.get_line(f); ++current_line; offset = 0; } int repl_begin = locations[i].begin + offset; int repl_end = locations[i].end + offset; int _; if (!find_next(line, search_text, repl_begin, _finder->is_match_case(), _finder->is_whole_words(), _, _)) { // Make sure the replace is still valid in case the file was tampered with. print_verbose(String("Occurrence no longer matches, replace will be ignored in {0}: line {1}, col {2}").format(varray(fpath, repl_line_number, repl_begin))); continue; } line = line.left(repl_begin) + new_text + line.right(repl_end); // keep an offset in case there are successive replaces in the same line offset += new_text.length() - (repl_end - repl_begin); } buffer += line; while (!f->eof_reached()) { buffer += conservative.get_line(f); } // Now the modified contents are in the buffer, rewrite the file with our changes Error err = f->reopen(fpath, FileAccess::WRITE); ERR_FAIL_COND(err != OK); f->store_string(buffer); f->close(); }
Error ResourceFormatSaverShader::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { Ref<Shader> shader = p_resource; ERR_FAIL_COND_V(shader.is_null(), ERR_INVALID_PARAMETER); String source = shader->get_code(); Error err; FileAccess *file = FileAccess::open(p_path, FileAccess::WRITE, &err); if (err) { ERR_FAIL_COND_V(err, err); } file->store_string(source); if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) { memdelete(file); return ERR_CANT_CREATE; } file->close(); memdelete(file); return OK; }
Error ResourceSaverPNG::save(const String &p_path,const RES& p_resource,uint32_t p_flags) { Ref<ImageTexture> texture=p_resource; ERR_FAIL_COND_V(!texture.is_valid(),ERR_INVALID_PARAMETER); ERR_EXPLAIN("Can't save empty texture as PNG"); ERR_FAIL_COND_V(!texture->get_width() || !texture->get_height(),ERR_INVALID_PARAMETER); Image img = texture->get_data(); Error err = save_image(p_path, img); if (err == OK) { bool global_filter = Globals::get_singleton()->get("image_loader/filter"); bool global_mipmaps = Globals::get_singleton()->get("image_loader/gen_mipmaps"); bool global_repeat = Globals::get_singleton()->get("image_loader/repeat"); String text; if (global_filter!=bool(texture->get_flags()&Texture::FLAG_FILTER)) { text+=bool(texture->get_flags()&Texture::FLAG_FILTER)?"filter=true\n":"filter=false\n"; } if (global_mipmaps!=bool(texture->get_flags()&Texture::FLAG_MIPMAPS)) { text+=bool(texture->get_flags()&Texture::FLAG_MIPMAPS)?"gen_mipmaps=true\n":"gen_mipmaps=false\n"; } if (global_repeat!=bool(texture->get_flags()&Texture::FLAG_REPEAT)) { text+=bool(texture->get_flags()&Texture::FLAG_REPEAT)?"repeat=true\n":"repeat=false\n"; } if (bool(texture->get_flags()&Texture::FLAG_ANISOTROPIC_FILTER)) { text+="anisotropic=true\n"; } if (bool(texture->get_flags()&Texture::FLAG_CONVERT_TO_LINEAR)) { text+="tolinear=true\n"; } if (bool(texture->get_flags()&Texture::FLAG_MIRRORED_REPEAT)) { text+="mirroredrepeat=true\n"; } if (text!="" || FileAccess::exists(p_path+".flags")) { FileAccess* f = FileAccess::open(p_path+".flags",FileAccess::WRITE); if (f) { f->store_string(text); memdelete(f); } } } return err; };
void FindInFilesPanel::apply_replaces_in_file(String fpath, PoolIntArray locations, String text) { ERR_FAIL_COND(locations.size() % 3 != 0); //print_line(String("Replacing {0} occurrences in {1}").format(varray(fpath, locations.size() / 3))); // If the file is already open, I assume the editor will reload it. // If there are unsaved changes, the user will be asked on focus, // however that means either loosing changes or loosing replaces. FileAccess *f = FileAccess::open(fpath, FileAccess::READ); ERR_FAIL_COND(f == NULL); String buffer; int current_line = 1; ConservativeGetLine conservative; String line = conservative.get_line(f); PoolIntArray::Read locations_read = locations.read(); for (int i = 0; i < locations.size(); i += 3) { int repl_line_number = locations_read[i]; int repl_begin = locations_read[i + 1]; int repl_end = locations_read[i + 2]; while (current_line < repl_line_number) { buffer += line; line = conservative.get_line(f); ++current_line; } line = line.left(repl_begin) + text + line.right(repl_end); } buffer += line; while (!f->eof_reached()) { buffer += conservative.get_line(f); } // Now the modified contents are in the buffer, rewrite the file with our changes Error err = f->reopen(fpath, FileAccess::WRITE); ERR_FAIL_COND(err != OK); f->store_string(buffer); f->close(); }
Error DotNetSolution::save() { bool dir_exists = DirAccess::exists(path); ERR_EXPLAIN("The directory does not exist."); ERR_FAIL_COND_V(!dir_exists, ERR_FILE_NOT_FOUND); String projs_decl; String sln_platform_cfg; String proj_platform_cfg; for (Map<String, ProjectInfo>::Element *E = projects.front(); E; E = E->next()) { const String &name = E->key(); const ProjectInfo &proj_info = E->value(); bool is_front = E == projects.front(); if (!is_front) projs_decl += "\n"; projs_decl += sformat(PROJECT_DECLARATION, name, proj_info.relpath.replace("/", "\\"), proj_info.guid); for (int i = 0; i < proj_info.configs.size(); i++) { const String &config = proj_info.configs[i]; if (i != 0 || !is_front) { sln_platform_cfg += "\n"; proj_platform_cfg += "\n"; } sln_platform_cfg += sformat(SOLUTION_PLATFORMS_CONFIG, config); proj_platform_cfg += sformat(PROJECT_PLATFORMS_CONFIG, proj_info.guid, config); } } String content = sformat(SOLUTION_TEMPLATE, projs_decl, sln_platform_cfg, proj_platform_cfg); FileAccess *file = FileAccess::open(path_join(path, name + ".sln"), FileAccess::WRITE); ERR_FAIL_NULL_V(file, ERR_FILE_CANT_WRITE); file->store_string(content); file->close(); memdelete(file); return OK; }