bool ConfigFile::saveToStream(WriteStream &stream) { for (List<Section>::iterator i = _sections.begin(); i != _sections.end(); ++i) { // Write out the section comment, if any if (! i->comment.empty()) { stream.writeString(i->comment); } // Write out the section name stream.writeByte('['); stream.writeString(i->name); stream.writeByte(']'); stream.writeByte('\n'); // Write out the key/value pairs for (List<KeyValue>::iterator kv = i->keys.begin(); kv != i->keys.end(); ++kv) { // Write out the comment, if any if (! kv->comment.empty()) { stream.writeString(kv->comment); } // Write out the key/value pair stream.writeString(kv->key); stream.writeByte('='); stream.writeString(kv->value); stream.writeByte('\n'); } } stream.flush(); return !stream.err(); }
void ConfigManager::writeDomain(WriteStream &stream, const String &name, const Domain &domain) { if (domain.empty()) return; // Don't bother writing empty domains. // WORKAROUND: Fix for bug #1972625 "ALL: On-the-fly targets are // written to the config file": Do not save domains that came from // the command line if (domain.contains("id_came_from_command_line")) return; String comment; // Write domain comment (if any) comment = domain.getDomainComment(); if (!comment.empty()) stream.writeString(comment); // Write domain start stream.writeByte('['); stream.writeString(name); stream.writeByte(']'); #ifdef _WIN32 stream.writeByte('\r'); stream.writeByte('\n'); #else stream.writeByte('\n'); #endif // Write all key/value pairs in this domain, including comments Domain::const_iterator x; for (x = domain.begin(); x != domain.end(); ++x) { if (!x->_value.empty()) { // Write comment (if any) if (domain.hasKVComment(x->_key)) { comment = domain.getKVComment(x->_key); stream.writeString(comment); } // Write the key/value pair stream.writeString(x->_key); stream.writeByte('='); stream.writeString(x->_value); #ifdef _WIN32 stream.writeByte('\r'); stream.writeByte('\n'); #else stream.writeByte('\n'); #endif } } #ifdef _WIN32 stream.writeByte('\r'); stream.writeByte('\n'); #else stream.writeByte('\n'); #endif }
void ConfigFile::save(WriteStream &stream) const { // Write file prologue if (!_prologue.empty()) { stream.writeString(_prologue); stream.writeByte('\n'); stream.writeByte('\n'); } // Domains for (DomainList::const_iterator domain = _domainList.begin(); domain != _domainList.end(); ++domain) { // Write domain prologue if (!(*domain)->_prologue.empty()) { stream.writeString((*domain)->_prologue); stream.writeByte('\n'); } // Write domain name stream.writeByte('['); stream.writeString((*domain)->_name); stream.writeByte(']'); // Write domain comment if (!(*domain)->_comment.empty()) { stream.writeByte(' '); stream.writeString((*domain)->_comment); } stream.writeByte('\n'); // Lines for (ConfigDomain::LineList::const_iterator line = (*domain)->_lines.begin(); line != (*domain)->_lines.end(); ++line) { // Write key if (line->key != (*domain)->_keys.end()) { stream.writeString(line->key->first); stream.writeByte('='); stream.writeString(line->key->second); if (!line->comment.empty()) stream.writeByte(' '); } // Write comment if (!line->comment.empty()) stream.writeString(line->comment); stream.writeByte('\n'); } stream.writeByte('\n'); } // Write the epilogue if (!_epilogue.empty()) { stream.writeString(_epilogue); stream.writeByte('\n'); } if (!stream.flush() || stream.err()) throw Exception(kWriteError); }