diff --git a/athenasub/src/exception.cpp b/athenasub/src/exception.cpp index c8d81906e..216e8c8a5 100644 --- a/athenasub/src/exception.cpp +++ b/athenasub/src/exception.cpp @@ -108,5 +108,10 @@ std::string Exception::GetExceptionMessage(int code,String message,const char *f Stack stack(str); stack.Walk(2); + // Append extra message + if (!message.IsEmpty()) { + str = str + "\nExtra message: " + message; + } + return str; } diff --git a/athenasub/src/format_manager.cpp b/athenasub/src/format_manager.cpp index 1d98b1f7e..7062d35be 100644 --- a/athenasub/src/format_manager.cpp +++ b/athenasub/src/format_manager.cpp @@ -38,6 +38,7 @@ #include "reader.h" #include "text_reader.h" #include +#include using namespace Athenasub; @@ -48,8 +49,15 @@ std::vector FormatManager::formats; //////////////// // Add a format -void FormatManager::AddFormat(const Format format) +void FormatManager::AddFormat(Format format) { + // Abort if there is already a format with this name + String name = format->GetName(); + for (size_t i=0;iGetName() == name) return; + } + + // Add formats.push_back(format); } @@ -131,8 +139,22 @@ std::vector FormatManager::GetCompatibleFormatList(Reader &reader) std::vector > results; size_t len = formats.size(); for (size_t i=0;iCanReadFile(reader); + + // Compare to extension + StringArray exts = formats[i]->GetReadExtensions(); + for (size_t j=0;j 0.0f) { results.push_back(std::pair(certainty,formats[i])); } @@ -152,5 +174,8 @@ std::vector FormatManager::GetCompatibleFormatList(Reader &reader) for (size_t i=0;iFlush(); } diff --git a/athenasub/src/reader.cpp b/athenasub/src/reader.cpp index 177799fbb..3f297fcc0 100644 --- a/athenasub/src/reader.cpp +++ b/athenasub/src/reader.cpp @@ -40,7 +40,8 @@ using namespace Athenasub; -Reader::Reader(String filename,String encoding) +Reader::Reader(String fn,String encoding) +: filename(fn) { stream = shared_ptr(new wxFFileInputStream(filename.GetWxString())); text = TextReader::GetReader(*stream,encoding); @@ -51,6 +52,17 @@ shared_ptr Athenasub::Reader::GetTextReader() return text; } +Athenasub::String Athenasub::Reader::GetFileName() +{ + return filename; +} + +Athenasub::Reader::~Reader() +{ + text = shared_ptr(); + stream = shared_ptr(); +} + void Reader::Rewind() { text->Rewind(); diff --git a/athenasub/src/reader.h b/athenasub/src/reader.h index 168c8151d..0579bd57b 100644 --- a/athenasub/src/reader.h +++ b/athenasub/src/reader.h @@ -52,6 +52,7 @@ namespace Athenasub { public: Reader(String filename,String encoding=""); + ~Reader(); shared_ptr GetTextReader(); String GetFileName(); diff --git a/athenasub/src/text_file_writer.cpp b/athenasub/src/text_file_writer.cpp index 916155ac8..58d2ca6d9 100644 --- a/athenasub/src/text_file_writer.cpp +++ b/athenasub/src/text_file_writer.cpp @@ -58,8 +58,8 @@ TextFileWriter::TextFileWriter(wxOutputStream &stream,String enc) ////////////// // Destructor TextFileWriter::~TextFileWriter() { - // Flush - if (bufferPos) file.Write(&buffer[0],(std::streamsize)bufferPos); + Flush(); + file.Close(); } @@ -96,9 +96,7 @@ void TextFileWriter::WriteLineToFile(String line,bool addLineBreak) { // Resize buffer if it won't fit if (buffer.size() < bufferPos+len) { - // Flush - file.Write(&buffer[0],(std::streamsize)bufferPos); - bufferPos = 0; + Flush(); // Resize if it still doesn't fit if (buffer.size() < len) buffer.resize(len); @@ -143,3 +141,13 @@ void TextFileWriter::SetEncoding(String enc) { } } } + + +///////// +// Flush +void TextFileWriter::Flush() { + if (bufferPos) { + file.Write(&buffer[0],(std::streamsize)bufferPos); + bufferPos = 0; + } +} diff --git a/athenasub/src/text_file_writer.h b/athenasub/src/text_file_writer.h index 30d6650a0..487583ffc 100644 --- a/athenasub/src/text_file_writer.h +++ b/athenasub/src/text_file_writer.h @@ -60,5 +60,6 @@ namespace Athenasub { ~TextFileWriter(); void WriteLineToFile(Athenasub::String line,bool addLineBreak=true); + void Flush(); }; } diff --git a/athenasub/src/text_writer.h b/athenasub/src/text_writer.h index 43dac49dd..5f5a14de1 100644 --- a/athenasub/src/text_writer.h +++ b/athenasub/src/text_writer.h @@ -47,6 +47,7 @@ namespace Athenasub { virtual ~TextWriter() {} virtual void WriteLineToFile(String line,bool addLineBreak=true) = 0; + virtual void Flush() = 0; static shared_ptr GetWriter(wxOutputStream &stream,String encoding); }; diff --git a/athenasub/src/writer.cpp b/athenasub/src/writer.cpp index e3261ea8a..95dd288ff 100644 --- a/athenasub/src/writer.cpp +++ b/athenasub/src/writer.cpp @@ -47,6 +47,13 @@ Writer::Writer(String filename,String encoding) } +Writer::~Writer() +{ + text = shared_ptr(); + stream = shared_ptr(); +} + + shared_ptr Writer::GetTextWriter() { return text; diff --git a/athenasub/src/writer.h b/athenasub/src/writer.h index e54fd0eb2..15194cfd5 100644 --- a/athenasub/src/writer.h +++ b/athenasub/src/writer.h @@ -52,6 +52,7 @@ namespace Athenasub { public: Writer(String filename,String encoding=""); + ~Writer(); shared_ptr GetTextWriter(); };