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) {
{
Writer writer(stream, file_version_clipboard);
WITH_DYNAMIC_ARG(clipboard_package, &package);
writer.handle(object);
writer.handle(object);
}
return stream.GetString();
}
template <typename T>
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"));
WITH_DYNAMIC_ARG(clipboard_package, &package);
reader.handle_greedy(object);
reader.handle_greedy(object);
}
// ----------------------------------------------------------------------------- : CardDataObject
......
......@@ -228,8 +228,11 @@ void Locale::validate(Version ver) {
Packaged::validate(ver);
// load locale validator
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
String errors;
errors += translations[LOCALE_CAT_MENU ].validate(_("menu"), v.sublocales[_("menu") ]);
......
......@@ -295,9 +295,9 @@ void Settings::read() {
String filename = settingsFile();
if (wxFileExists(filename)) {
// settings file not existing is not an error
shared_ptr<wxFileInputStream> file = shared(new wxFileInputStream(filename));
if (!file->Ok()) return; // failure is not an error
Reader reader(file, nullptr, filename);
wxFileInputStream stream(filename);
if (!stream.Ok()) return; // failure is not an error
Reader reader(stream, nullptr, filename);
reader.handle_greedy(*this);
}
}
......
......@@ -82,21 +82,22 @@ bool DownloadableInstallerList::download() {
wxThread::ExitCode DownloadableInstallerList::Thread::Entry() {
// open url
wxURL url(settings.installer_list_url);
wxInputStream* isP = url.GetInputStream();
if (!isP) {
InputStreamP stream( url.GetInputStream() );
if (!stream) {
wxMutexLocker l(downloadable_installers.lock);
downloadable_installers.status = DONE;
return 0;
}
InputStreamP is(isP);
// Read installer list
Reader reader(is, nullptr, _("installers"), true);
Reader reader(*stream, nullptr, _("installers"), true);
vector<DownloadableInstallerP> installers;
reader.handle(_("installers"),installers);
// done
wxMutexLocker l(downloadable_installers.lock);
swap(installers, downloadable_installers.installers);
downloadable_installers.status = DONE;
{
wxMutexLocker l(downloadable_installers.lock);
swap(installers, downloadable_installers.installers);
downloadable_installers.status = DONE;
}
return 0;
}
......
......@@ -35,7 +35,8 @@ SymbolWindow::SymbolWindow(Window* parent, const String& filename)
: performer(nullptr)
{
// open file
Reader reader(shared(new wxFileInputStream(filename)), nullptr, filename);
wxFileInputStream stream(filename);
Reader reader(stream, nullptr, filename);
SymbolP symbol;
reader.handle_greedy(symbol);
init(parent, symbol);
......@@ -216,7 +217,8 @@ void SymbolWindow::onFileOpen(wxCommandEvent& ev) {
String ext = n.GetExt();
SymbolP 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);
} else {
wxBusyCursor busy;
......
......@@ -107,13 +107,12 @@ class CheckUpdateThread : public wxThread {
String& the_url = settings.updates_url;
#endif
wxURL url(the_url);
wxInputStream* isP = url.GetInputStream();
if (!isP) return; // failed to get data
InputStreamP is(isP);
InputStreamP stream( url.GetInputStream() );
if (!stream) return; // failed to get data
// Read version data
// ignore errors for forwards compatability
VersionDataP version_data;
Reader reader(is, nullptr, _("updates"), true);
Reader reader(*stream, nullptr, _("updates"), true);
reader.handle(version_data);
// has the updates url changed?
if (!version_data->new_updates_url.empty()) {
......
......@@ -25,7 +25,8 @@ IndexMap<Key,Value>& DelayedIndexMaps<Key,Value>::get(const String& name, const
item->read_data.init(init_with);
} else if (!item->unread_data.empty()) { // not read, read now
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);
item->unread_data.clear();
}
......
......@@ -93,7 +93,7 @@ class GetMember : private GetDefaultMember {
inline void handleNoScript(const Char* name, T& value) {}
/// Handle an object: investigate children
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) {
if (gdm.result()) return;
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) {
PROFILER(just_header ? _("open package header") : _("open package fully"));
if (just_header) {
// 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 {
JustAsPackageProxy proxy(this);
reader.handle_greedy(proxy);
......@@ -553,7 +554,8 @@ void Packaged::open(const String& package, bool just_header) {
}
void Packaged::loadFully() {
if (fully_loaded) return;
Reader reader(openIn(typeName()), this, absoluteFilename() + _("/") + typeName());
InputStreamP stream = openIn(typeName());
Reader reader(*stream, this, absoluteFilename() + _("/") + typeName());
try {
reader.handle_greedy(*this);
validate(reader.file_app_version);
......
......@@ -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.
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 {
reader.handle_greedy(obj);
} 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() {
String filename = databaseFile();
if (wxFileExists(filename)) {
// packages file not existing is not an error
shared_ptr<wxFileInputStream> file = shared(new wxFileInputStream(filename));
if (!file->Ok()) return; // failure is not an error
wxFileInputStream file(filename);
if (!file.Ok()) return; // failure is not an error
Reader reader(file, nullptr, filename);
reader.handle_greedy(*this);
sort(packages.begin(), packages.end(), compare_name);
......
......@@ -21,7 +21,7 @@ IMPLEMENT_DYNAMIC_ARG(ReaderPragmaHandler,reader_pragma_handler,nullptr);
// ----------------------------------------------------------------------------- : 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)
, ignore_invalid(ignore_invalid)
, 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
handleAppVersion();
}
Reader::Reader(Reader* parent, Packaged* pkg, const String& filename, bool ignore_invalid)
: indent(0), expected_indent(0), state(OUTSIDE)
, 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;
}
InputStreamP Reader::openIncludedFile() {
return package_manager.openFileFromPackage(package, value);
}
void Reader::handleAppVersion() {
......@@ -108,11 +98,11 @@ void Reader::moveNext() {
key.clear();
indent = -1; // if no line is read it never has the expected indentation
// repeat until we have a good line
while (key.empty() && !input->Eof()) {
while (key.empty() && !input.Eof()) {
readLine();
}
// did we reach the end of the file?
if (key.empty() && input->Eof()) {
if (key.empty() && input.Eof()) {
line_number += 1;
indent = -1;
}
......@@ -184,7 +174,7 @@ String read_utf8_line(wxInputStream& input, bool eat_bom, bool until_eof) {
String result = wxString::FromUTF8(buffer.get(), buffer.size());
return eat_bom ? decodeUTF8BOM(result) : result;
#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;
Char* result_buf = result.GetWriteBuf(size + 1);
wxConvUTF8.MB2WC(result_buf, buffer.get(), size + 1);
......@@ -226,7 +216,7 @@ void Reader::readLine(bool in_string) {
line_number += 1;
// We have to do our own line reading, because wxTextInputStream is insane
try {
line = read_utf8_line(*input, line_number == 1);
line = read_utf8_line(input, line_number == 1);
} catch (const ParseError& e) {
throw ParseError(e.what() + String(_(" on line ")) << line_number);
}
......@@ -294,7 +284,7 @@ const String& Reader::getValue() {
// read all lines that are indented enough
readLine(true);
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'));
pending_newlines = 0;
previous_value += line.substr(expected_indent); // strip expected indent
......@@ -302,15 +292,15 @@ const String& Reader::getValue() {
readLine(true);
pending_newlines++;
// 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()
state = HANDLED;
while (key.empty() && !input->Eof()) {
while (key.empty() && !input.Eof()) {
readLine();
}
// did we reach the end of the file?
if (key.empty() && input->Eof()) {
if (key.empty() && input.Eof()) {
line_number += 1;
indent = -1;
}
......
......@@ -32,17 +32,12 @@ typedef shared_ptr<wxInputStream> InputStreamP;
* object that was just read.
*/
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:
/// 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(); }
......@@ -147,7 +142,7 @@ class Reader {
/// Line number of the previous_line
int previous_line_number;
/// Input stream we are reading from
InputStreamP input;
InputStream& input;
/// Accumulated warning messages
String warnings;
......@@ -173,14 +168,21 @@ class Reader {
template <typename T>
void unknownKey(T& v) {
if (key == _("include_file")) {
Reader reader(this, package, value, ignore_invalid);
reader.handle_greedy(v);
InputStreamP stream = openIncludedFile();
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();
} else {
unknownKey();
}
}
void unknownKey();
InputStreamP openIncludedFile();
};
// ----------------------------------------------------------------------------- : Container types
......@@ -255,10 +257,10 @@ void Reader::handle(IndexMap<K,V>& m) {
reader.errorIfNotDone(); \
}
/// 'Tag' to be used when reflecting enumerations for Reader
/// 'Reflector' to be used when reflecting enumerations for Reader
class EnumReader {
public:
inline EnumReader(String read)
inline EnumReader(String const& read)
: read(read), first(nullptr), done(false) {}
/// 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