Commit dd7dfd81 authored by twanvl's avatar twanvl

Replace shared_ptr<InputStream> in Reader class with a regular reference, the...

Replace shared_ptr<InputStream> in Reader class with a regular reference, the thing that calls reader can take care of the lifetime of the stream.
parent 98963233
...@@ -27,17 +27,17 @@ String serialize_for_clipboard(Package& package, T& object) { ...@@ -27,17 +27,17 @@ String serialize_for_clipboard(Package& package, T& object) {
{ {
Writer writer(stream, file_version_clipboard); Writer writer(stream, file_version_clipboard);
WITH_DYNAMIC_ARG(clipboard_package, &package); WITH_DYNAMIC_ARG(clipboard_package, &package);
writer.handle(object); writer.handle(object);
} }
return stream.GetString(); return stream.GetString();
} }
template <typename T> template <typename T>
void deserialize_from_clipboard(T& object, Package& package, const String& data) { void deserialize_from_clipboard(T& object, Package& package, const String& data) {
shared_ptr<wxStringInputStream> stream( new wxStringInputStream(data) ); wxStringInputStream stream(data);
Reader reader(stream, nullptr, _("clipboard")); Reader reader(stream, nullptr, _("clipboard"));
WITH_DYNAMIC_ARG(clipboard_package, &package); WITH_DYNAMIC_ARG(clipboard_package, &package);
reader.handle_greedy(object); reader.handle_greedy(object);
} }
// ----------------------------------------------------------------------------- : CardDataObject // ----------------------------------------------------------------------------- : CardDataObject
......
...@@ -228,8 +228,11 @@ void Locale::validate(Version ver) { ...@@ -228,8 +228,11 @@ void Locale::validate(Version ver) {
Packaged::validate(ver); Packaged::validate(ver);
// load locale validator // load locale validator
LocaleValidator v; LocaleValidator v;
Reader r(load_resource_text(_("expected_locale_keys")), nullptr, _("expected_locale_keys")); {
r.handle_greedy(v); InputStreamP stream = load_resource_text(_("expected_locale_keys"));
Reader reader(*stream, nullptr, _("expected_locale_keys"));
reader.handle_greedy(v);
}
// validate // validate
String errors; String errors;
errors += translations[LOCALE_CAT_MENU ].validate(_("menu"), v.sublocales[_("menu") ]); errors += translations[LOCALE_CAT_MENU ].validate(_("menu"), v.sublocales[_("menu") ]);
......
...@@ -295,9 +295,9 @@ void Settings::read() { ...@@ -295,9 +295,9 @@ void Settings::read() {
String filename = settingsFile(); String filename = settingsFile();
if (wxFileExists(filename)) { if (wxFileExists(filename)) {
// settings file not existing is not an error // settings file not existing is not an error
shared_ptr<wxFileInputStream> file = shared(new wxFileInputStream(filename)); wxFileInputStream stream(filename);
if (!file->Ok()) return; // failure is not an error if (!stream.Ok()) return; // failure is not an error
Reader reader(file, nullptr, filename); Reader reader(stream, nullptr, filename);
reader.handle_greedy(*this); reader.handle_greedy(*this);
} }
} }
......
...@@ -82,21 +82,22 @@ bool DownloadableInstallerList::download() { ...@@ -82,21 +82,22 @@ bool DownloadableInstallerList::download() {
wxThread::ExitCode DownloadableInstallerList::Thread::Entry() { wxThread::ExitCode DownloadableInstallerList::Thread::Entry() {
// open url // open url
wxURL url(settings.installer_list_url); wxURL url(settings.installer_list_url);
wxInputStream* isP = url.GetInputStream(); InputStreamP stream( url.GetInputStream() );
if (!isP) { if (!stream) {
wxMutexLocker l(downloadable_installers.lock); wxMutexLocker l(downloadable_installers.lock);
downloadable_installers.status = DONE; downloadable_installers.status = DONE;
return 0; return 0;
} }
InputStreamP is(isP);
// Read installer list // Read installer list
Reader reader(is, nullptr, _("installers"), true); Reader reader(*stream, nullptr, _("installers"), true);
vector<DownloadableInstallerP> installers; vector<DownloadableInstallerP> installers;
reader.handle(_("installers"),installers); reader.handle(_("installers"),installers);
// done // done
wxMutexLocker l(downloadable_installers.lock); {
swap(installers, downloadable_installers.installers); wxMutexLocker l(downloadable_installers.lock);
downloadable_installers.status = DONE; swap(installers, downloadable_installers.installers);
downloadable_installers.status = DONE;
}
return 0; return 0;
} }
......
...@@ -35,7 +35,8 @@ SymbolWindow::SymbolWindow(Window* parent, const String& filename) ...@@ -35,7 +35,8 @@ SymbolWindow::SymbolWindow(Window* parent, const String& filename)
: performer(nullptr) : performer(nullptr)
{ {
// open file // open file
Reader reader(shared(new wxFileInputStream(filename)), nullptr, filename); wxFileInputStream stream(filename);
Reader reader(stream, nullptr, filename);
SymbolP symbol; SymbolP symbol;
reader.handle_greedy(symbol); reader.handle_greedy(symbol);
init(parent, symbol); init(parent, symbol);
...@@ -216,7 +217,8 @@ void SymbolWindow::onFileOpen(wxCommandEvent& ev) { ...@@ -216,7 +217,8 @@ void SymbolWindow::onFileOpen(wxCommandEvent& ev) {
String ext = n.GetExt(); String ext = n.GetExt();
SymbolP symbol; SymbolP symbol;
if (ext.Lower() == _("mse-symbol")) { if (ext.Lower() == _("mse-symbol")) {
Reader reader(shared(new wxFileInputStream(name)), nullptr, name); wxFileInputStream stream(name);
Reader reader(stream, nullptr, name);
reader.handle_greedy(symbol); reader.handle_greedy(symbol);
} else { } else {
wxBusyCursor busy; wxBusyCursor busy;
......
...@@ -107,13 +107,12 @@ class CheckUpdateThread : public wxThread { ...@@ -107,13 +107,12 @@ class CheckUpdateThread : public wxThread {
String& the_url = settings.updates_url; String& the_url = settings.updates_url;
#endif #endif
wxURL url(the_url); wxURL url(the_url);
wxInputStream* isP = url.GetInputStream(); InputStreamP stream( url.GetInputStream() );
if (!isP) return; // failed to get data if (!stream) return; // failed to get data
InputStreamP is(isP);
// Read version data // Read version data
// ignore errors for forwards compatability // ignore errors for forwards compatability
VersionDataP version_data; VersionDataP version_data;
Reader reader(is, nullptr, _("updates"), true); Reader reader(*stream, nullptr, _("updates"), true);
reader.handle(version_data); reader.handle(version_data);
// has the updates url changed? // has the updates url changed?
if (!version_data->new_updates_url.empty()) { if (!version_data->new_updates_url.empty()) {
......
...@@ -25,7 +25,8 @@ IndexMap<Key,Value>& DelayedIndexMaps<Key,Value>::get(const String& name, const ...@@ -25,7 +25,8 @@ IndexMap<Key,Value>& DelayedIndexMaps<Key,Value>::get(const String& name, const
item->read_data.init(init_with); item->read_data.init(init_with);
} else if (!item->unread_data.empty()) { // not read, read now } else if (!item->unread_data.empty()) { // not read, read now
item->read_data.init(init_with); item->read_data.init(init_with);
Reader reader(shared(new wxStringInputStream(item->unread_data)), nullptr, _("delayed data for ") + name); wxStringInputStream stream(item->unread_data);
Reader reader(stream, nullptr, _("delayed data for ") + name);
reader.handle_greedy(item->read_data); reader.handle_greedy(item->read_data);
item->unread_data.clear(); item->unread_data.clear();
} }
......
...@@ -93,7 +93,7 @@ class GetMember : private GetDefaultMember { ...@@ -93,7 +93,7 @@ class GetMember : private GetDefaultMember {
inline void handleNoScript(const Char* name, T& value) {} inline void handleNoScript(const Char* name, T& value) {}
/// Handle an object: investigate children /// Handle an object: investigate children
template <typename T> void handle(const T&); template <typename T> void handle(const T&);
/// Handle an index map: invistigate keys /// Handle an index map: investigate keys
template <typename K, typename V> void handle(const IndexMap<K,V>& m) { template <typename K, typename V> void handle(const IndexMap<K,V>& m) {
if (gdm.result()) return; if (gdm.result()) return;
for (typename IndexMap<K,V>::const_iterator it = m.begin() ; it != m.end() ; ++it) { for (typename IndexMap<K,V>::const_iterator it = m.begin() ; it != m.end() ; ++it) {
......
...@@ -539,7 +539,8 @@ void Packaged::open(const String& package, bool just_header) { ...@@ -539,7 +539,8 @@ void Packaged::open(const String& package, bool just_header) {
PROFILER(just_header ? _("open package header") : _("open package fully")); PROFILER(just_header ? _("open package header") : _("open package fully"));
if (just_header) { if (just_header) {
// Read just the header (the part common to all Packageds) // Read just the header (the part common to all Packageds)
Reader reader(openIn(typeName()), this, absoluteFilename() + _("/") + typeName(), true); InputStreamP stream = openIn(typeName());
Reader reader(*stream, this, absoluteFilename() + _("/") + typeName(), true);
try { try {
JustAsPackageProxy proxy(this); JustAsPackageProxy proxy(this);
reader.handle_greedy(proxy); reader.handle_greedy(proxy);
...@@ -553,7 +554,8 @@ void Packaged::open(const String& package, bool just_header) { ...@@ -553,7 +554,8 @@ void Packaged::open(const String& package, bool just_header) {
} }
void Packaged::loadFully() { void Packaged::loadFully() {
if (fully_loaded) return; if (fully_loaded) return;
Reader reader(openIn(typeName()), this, absoluteFilename() + _("/") + typeName()); InputStreamP stream = openIn(typeName());
Reader reader(*stream, this, absoluteFilename() + _("/") + typeName());
try { try {
reader.handle_greedy(*this); reader.handle_greedy(*this);
validate(reader.file_app_version); validate(reader.file_app_version);
......
...@@ -294,13 +294,14 @@ intrusive_ptr<T> open_package(const String& filename) { ...@@ -294,13 +294,14 @@ intrusive_ptr<T> open_package(const String& filename) {
// This is here because it uses dynamic_cast and must be to a complete type. // This is here because it uses dynamic_cast and must be to a complete type.
template <typename T> template <typename T>
inline void Package::readFile(const String& file, T& obj) inline void Package::readFile(const String& filename, T& obj)
{ {
Reader reader(openIn(file), dynamic_cast<Packaged*>(this), absoluteFilename() + _("/") + file); InputStreamP stream = openIn(filename);
Reader reader(*stream, dynamic_cast<Packaged*>(this), absoluteFilename() + _("/") + filename);
try { try {
reader.handle_greedy(obj); reader.handle_greedy(obj);
} catch (const ParseError& err) { } catch (const ParseError& err) {
throw FileParseError(err.what(), absoluteFilename() + _("/") + file); // more detailed message throw FileParseError(err.what(), absoluteFilename() + _("/") + filename); // more detailed message
} }
} }
......
...@@ -339,8 +339,8 @@ void PackageDirectory::loadDatabase() { ...@@ -339,8 +339,8 @@ void PackageDirectory::loadDatabase() {
String filename = databaseFile(); String filename = databaseFile();
if (wxFileExists(filename)) { if (wxFileExists(filename)) {
// packages file not existing is not an error // packages file not existing is not an error
shared_ptr<wxFileInputStream> file = shared(new wxFileInputStream(filename)); wxFileInputStream file(filename);
if (!file->Ok()) return; // failure is not an error if (!file.Ok()) return; // failure is not an error
Reader reader(file, nullptr, filename); Reader reader(file, nullptr, filename);
reader.handle_greedy(*this); reader.handle_greedy(*this);
sort(packages.begin(), packages.end(), compare_name); sort(packages.begin(), packages.end(), compare_name);
......
...@@ -21,7 +21,7 @@ IMPLEMENT_DYNAMIC_ARG(ReaderPragmaHandler,reader_pragma_handler,nullptr); ...@@ -21,7 +21,7 @@ IMPLEMENT_DYNAMIC_ARG(ReaderPragmaHandler,reader_pragma_handler,nullptr);
// ----------------------------------------------------------------------------- : Reader // ----------------------------------------------------------------------------- : Reader
Reader::Reader(const InputStreamP& input, Packaged* package, const String& filename, bool ignore_invalid) Reader::Reader(InputStream& input, Packaged* package, const String& filename, bool ignore_invalid)
: indent(0), expected_indent(0), state(OUTSIDE) : indent(0), expected_indent(0), state(OUTSIDE)
, ignore_invalid(ignore_invalid) , ignore_invalid(ignore_invalid)
, filename(filename), package(package), line_number(0), previous_line_number(0) , filename(filename), package(package), line_number(0), previous_line_number(0)
...@@ -31,18 +31,8 @@ Reader::Reader(const InputStreamP& input, Packaged* package, const String& filen ...@@ -31,18 +31,8 @@ Reader::Reader(const InputStreamP& input, Packaged* package, const String& filen
handleAppVersion(); handleAppVersion();
} }
Reader::Reader(Reader* parent, Packaged* pkg, const String& filename, bool ignore_invalid) InputStreamP Reader::openIncludedFile() {
: indent(0), expected_indent(0), state(OUTSIDE) return package_manager.openFileFromPackage(package, value);
, ignore_invalid(ignore_invalid)
, filename(filename), package(pkg), line_number(0), previous_line_number(0)
, input(package_manager.openFileFromPackage(package, filename))
{
moveNext();
// in an included file, use the app version of the parent if we have none
handleAppVersion();
if (file_app_version == 0) {
file_app_version = parent->file_app_version;
}
} }
void Reader::handleAppVersion() { void Reader::handleAppVersion() {
...@@ -108,11 +98,11 @@ void Reader::moveNext() { ...@@ -108,11 +98,11 @@ void Reader::moveNext() {
key.clear(); key.clear();
indent = -1; // if no line is read it never has the expected indentation indent = -1; // if no line is read it never has the expected indentation
// repeat until we have a good line // repeat until we have a good line
while (key.empty() && !input->Eof()) { while (key.empty() && !input.Eof()) {
readLine(); readLine();
} }
// did we reach the end of the file? // did we reach the end of the file?
if (key.empty() && input->Eof()) { if (key.empty() && input.Eof()) {
line_number += 1; line_number += 1;
indent = -1; indent = -1;
} }
...@@ -184,7 +174,7 @@ String read_utf8_line(wxInputStream& input, bool eat_bom, bool until_eof) { ...@@ -184,7 +174,7 @@ String read_utf8_line(wxInputStream& input, bool eat_bom, bool until_eof) {
String result = wxString::FromUTF8(buffer.get(), buffer.size()); String result = wxString::FromUTF8(buffer.get(), buffer.size());
return eat_bom ? decodeUTF8BOM(result) : result; return eat_bom ? decodeUTF8BOM(result) : result;
#else #else
// NOTE: wx doc is wrong, parameter to GetWritableChar is numer of characters, not bytes // NOTE: wx doc is wrong, parameter to GetWritableChar is number of characters, not bytes
String result; String result;
Char* result_buf = result.GetWriteBuf(size + 1); Char* result_buf = result.GetWriteBuf(size + 1);
wxConvUTF8.MB2WC(result_buf, buffer.get(), size + 1); wxConvUTF8.MB2WC(result_buf, buffer.get(), size + 1);
...@@ -226,7 +216,7 @@ void Reader::readLine(bool in_string) { ...@@ -226,7 +216,7 @@ void Reader::readLine(bool in_string) {
line_number += 1; line_number += 1;
// We have to do our own line reading, because wxTextInputStream is insane // We have to do our own line reading, because wxTextInputStream is insane
try { try {
line = read_utf8_line(*input, line_number == 1); line = read_utf8_line(input, line_number == 1);
} catch (const ParseError& e) { } catch (const ParseError& e) {
throw ParseError(e.what() + String(_(" on line ")) << line_number); throw ParseError(e.what() + String(_(" on line ")) << line_number);
} }
...@@ -294,7 +284,7 @@ const String& Reader::getValue() { ...@@ -294,7 +284,7 @@ const String& Reader::getValue() {
// read all lines that are indented enough // read all lines that are indented enough
readLine(true); readLine(true);
previous_line_number = line_number; previous_line_number = line_number;
while (indent >= expected_indent && !input->Eof()) { while (indent >= expected_indent && !input.Eof()) {
previous_value.resize(previous_value.size() + pending_newlines, _('\n')); previous_value.resize(previous_value.size() + pending_newlines, _('\n'));
pending_newlines = 0; pending_newlines = 0;
previous_value += line.substr(expected_indent); // strip expected indent previous_value += line.substr(expected_indent); // strip expected indent
...@@ -302,15 +292,15 @@ const String& Reader::getValue() { ...@@ -302,15 +292,15 @@ const String& Reader::getValue() {
readLine(true); readLine(true);
pending_newlines++; pending_newlines++;
// skip empty lines that are not indented enough // skip empty lines that are not indented enough
} while(trim(line).empty() && indent < expected_indent && !input->Eof()); } while(trim(line).empty() && indent < expected_indent && !input.Eof());
} }
// moveNext(), but without the initial readLine() // moveNext(), but without the initial readLine()
state = HANDLED; state = HANDLED;
while (key.empty() && !input->Eof()) { while (key.empty() && !input.Eof()) {
readLine(); readLine();
} }
// did we reach the end of the file? // did we reach the end of the file?
if (key.empty() && input->Eof()) { if (key.empty() && input.Eof()) {
line_number += 1; line_number += 1;
indent = -1; indent = -1;
} }
......
...@@ -32,17 +32,12 @@ typedef shared_ptr<wxInputStream> InputStreamP; ...@@ -32,17 +32,12 @@ typedef shared_ptr<wxInputStream> InputStreamP;
* object that was just read. * object that was just read.
*/ */
class Reader { class Reader {
private:
/// Construct a reader that reads a file in a package
/** Used for "include file" keys.
* package can be nullptr
*/
Reader(Reader* parent, Packaged* package, const String& filename, bool ignore_invalid = false);
public: public:
/// Construct a reader that reads from the given input stream /// Construct a reader that reads from the given input stream
/** filename is used only for error messages /** filename is used only for error messages.
* package is used for looking up included files.
*/ */
Reader(const InputStreamP& input, Packaged* package = nullptr, const String& filename = wxEmptyString, bool ignore_invalid = false); Reader(InputStream& input, Packaged* package = nullptr, const String& filename = wxEmptyString, bool ignore_invalid = false);
~Reader() { showWarnings(); } ~Reader() { showWarnings(); }
...@@ -147,7 +142,7 @@ class Reader { ...@@ -147,7 +142,7 @@ class Reader {
/// Line number of the previous_line /// Line number of the previous_line
int previous_line_number; int previous_line_number;
/// Input stream we are reading from /// Input stream we are reading from
InputStreamP input; InputStream& input;
/// Accumulated warning messages /// Accumulated warning messages
String warnings; String warnings;
...@@ -173,14 +168,21 @@ class Reader { ...@@ -173,14 +168,21 @@ class Reader {
template <typename T> template <typename T>
void unknownKey(T& v) { void unknownKey(T& v) {
if (key == _("include_file")) { if (key == _("include_file")) {
Reader reader(this, package, value, ignore_invalid); InputStreamP stream = openIncludedFile();
reader.handle_greedy(v); Reader sub_reader(*stream, package, value, ignore_invalid);
if (sub_reader.file_app_version == 0) {
// in an included file, use the app version of the parent if there is none
sub_reader.file_app_version = file_app_version;
}
sub_reader.handle_greedy(v);
moveNext(); moveNext();
} else { } else {
unknownKey(); unknownKey();
} }
} }
void unknownKey(); void unknownKey();
InputStreamP openIncludedFile();
}; };
// ----------------------------------------------------------------------------- : Container types // ----------------------------------------------------------------------------- : Container types
...@@ -255,10 +257,10 @@ void Reader::handle(IndexMap<K,V>& m) { ...@@ -255,10 +257,10 @@ void Reader::handle(IndexMap<K,V>& m) {
reader.errorIfNotDone(); \ reader.errorIfNotDone(); \
} }
/// 'Tag' to be used when reflecting enumerations for Reader /// 'Reflector' to be used when reflecting enumerations for Reader
class EnumReader { class EnumReader {
public: public:
inline EnumReader(String read) inline EnumReader(String const& read)
: read(read), first(nullptr), done(false) {} : read(read), first(nullptr), done(false) {}
/// Handle a possible value for the enum, if the name matches the name in the input /// Handle a possible value for the enum, if the name matches the name in the input
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment