mirror of https://github.com/odrling/Aegisub
Some MORE refactoring of Athenasub (-_-), which includes breaking loading of files.
Originally committed to SVN as r2472.
This commit is contained in:
parent
ad4a9daf75
commit
248dbddfdf
|
@ -328,7 +328,7 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\include\aegilib\format_manager.h"
|
RelativePath=".\src\format_manager.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<Filter
|
<Filter
|
||||||
|
@ -447,6 +447,14 @@
|
||||||
<Filter
|
<Filter
|
||||||
Name="File IO"
|
Name="File IO"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\reader.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\reader.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\src\text_file_reader.cpp"
|
RelativePath=".\src\text_file_reader.cpp"
|
||||||
>
|
>
|
||||||
|
@ -487,6 +495,14 @@
|
||||||
RelativePath=".\src\text_writer.h"
|
RelativePath=".\src\text_writer.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\writer.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\src\writer.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
|
|
|
@ -49,6 +49,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
class Range;
|
class Range;
|
||||||
|
class Reader;
|
||||||
|
class Writer;
|
||||||
class ISelection;
|
class ISelection;
|
||||||
class IController;
|
class IController;
|
||||||
class IView;
|
class IView;
|
||||||
|
@ -113,7 +115,7 @@ namespace Athenasub {
|
||||||
virtual void DispatchNotifications(Notification notification) const = 0;
|
virtual void DispatchNotifications(Notification notification) const = 0;
|
||||||
|
|
||||||
virtual void Clear() = 0;
|
virtual void Clear() = 0;
|
||||||
virtual void Load(wxInputStream &input,Format format=Format(),const String encoding="") = 0;
|
virtual void Load(Reader &input,Format format=Format()) = 0;
|
||||||
|
|
||||||
virtual Section AddSection(String name) = 0;
|
virtual Section AddSection(String name) = 0;
|
||||||
virtual Section GetMutableSection(String name) = 0;
|
virtual Section GetMutableSection(String name) = 0;
|
||||||
|
@ -125,7 +127,7 @@ namespace Athenasub {
|
||||||
virtual Controller CreateController() = 0;
|
virtual Controller CreateController() = 0;
|
||||||
virtual void AddListener(View listener) = 0;
|
virtual void AddListener(View listener) = 0;
|
||||||
|
|
||||||
virtual void Save(wxOutputStream &output,Format format=Format(),const String encoding="UTF-8") const = 0;
|
virtual void Save(Writer &output,Format format=Format()) const = 0;
|
||||||
|
|
||||||
virtual String GetUndoMessage(const String owner="") const = 0;
|
virtual String GetUndoMessage(const String owner="") const = 0;
|
||||||
virtual String GetRedoMessage(const String owner="") const = 0;
|
virtual String GetRedoMessage(const String owner="") const = 0;
|
||||||
|
@ -316,6 +318,9 @@ namespace Athenasub {
|
||||||
|
|
||||||
virtual Dialogue CreateDialogue() const = 0;
|
virtual Dialogue CreateDialogue() const = 0;
|
||||||
virtual Style CreateStyle() const = 0;
|
virtual Style CreateStyle() const = 0;
|
||||||
|
|
||||||
|
virtual bool IsBinary() const = 0;
|
||||||
|
virtual float CanReadFile(Reader &reader) const = 0; // Should return a float from 0.0f to 1.0f indicating how certain it is that it can read it
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -324,8 +329,8 @@ namespace Athenasub {
|
||||||
public:
|
public:
|
||||||
virtual ~IFormatHandler() {}
|
virtual ~IFormatHandler() {}
|
||||||
|
|
||||||
virtual void Load(IModel &model,wxInputStream &file,const String encoding) = 0;
|
virtual void Load(IModel &model,Reader &file) = 0;
|
||||||
virtual void Save(const IModel &model,wxOutputStream &file,const String encoding) const = 0;
|
virtual void Save(const IModel &model,Writer &file) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "actionlist.h"
|
#include "actionlist.h"
|
||||||
#include "format_manager.h"
|
#include "format_manager.h"
|
||||||
#include "selection.h"
|
#include "selection.h"
|
||||||
|
#include "reader.h"
|
||||||
|
#include "writer.h"
|
||||||
using namespace Athenasub;
|
using namespace Athenasub;
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,9 +63,24 @@ ActionList CController::CreateActionList(const String title,const String owner,b
|
||||||
// Load a file
|
// Load a file
|
||||||
void CController::LoadFile(const String filename,const String encoding)
|
void CController::LoadFile(const String filename,const String encoding)
|
||||||
{
|
{
|
||||||
const Format handler = FormatManager::GetFormatFromFilename(filename,true);
|
Reader reader(filename,encoding);
|
||||||
wxFFileInputStream stream(filename.GetWxString());
|
std::vector<Format> handlers = FormatManager::GetCompatibleFormatList(reader);
|
||||||
model->Load(stream,handler,encoding);
|
size_t len = handlers.size();
|
||||||
|
bool success = false;
|
||||||
|
for (size_t i=0;i<len;i++) {
|
||||||
|
try {
|
||||||
|
model->Load(reader,handlers[i]);
|
||||||
|
success = true;
|
||||||
|
break;
|
||||||
|
} catch (Athenasub::Exception &e) {
|
||||||
|
// Ignore exception
|
||||||
|
(void) e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
THROW_ATHENA_EXCEPTION_MSG(Exception::No_Format_Handler,"Could not locate a suitable format handler.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,9 +88,9 @@ void CController::LoadFile(const String filename,const String encoding)
|
||||||
// Save a file
|
// Save a file
|
||||||
void CController::SaveFile(const String filename,const String encoding)
|
void CController::SaveFile(const String filename,const String encoding)
|
||||||
{
|
{
|
||||||
const Format handler = FormatManager::GetFormatFromFilename(filename,true);
|
Format handler = FormatManager::GetFormatFromFilename(filename,true);
|
||||||
wxFFileOutputStream stream(filename.GetWxString());
|
Writer writer(filename,encoding);
|
||||||
model->Save(stream,handler,encoding);
|
model->Save(writer,handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,8 @@ namespace Athenasub {
|
||||||
public:
|
public:
|
||||||
//CFormatHandler(IModel& _model) : model(_model) {}
|
//CFormatHandler(IModel& _model) : model(_model) {}
|
||||||
|
|
||||||
virtual void Load(IModel &model,wxInputStream &file,const String encoding) = 0;
|
virtual void Load(IModel &model,Reader &file) = 0;
|
||||||
virtual void Save(const IModel &model,wxOutputStream &file,const String encoding) const = 0;
|
virtual void Save(const IModel &model,Writer &file) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
|
|
||||||
#include "format_manager.h"
|
#include "format_manager.h"
|
||||||
#include "formats/format_ass.h"
|
#include "formats/format_ass.h"
|
||||||
|
#include "reader.h"
|
||||||
|
#include "text_reader.h"
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
using namespace Athenasub;
|
using namespace Athenasub;
|
||||||
|
|
||||||
|
@ -56,9 +58,9 @@ void FormatManager::AddFormat(const Format format)
|
||||||
// Initialize all built-in formats
|
// Initialize all built-in formats
|
||||||
void FormatManager::InitializeFormats()
|
void FormatManager::InitializeFormats()
|
||||||
{
|
{
|
||||||
formats.push_back(Format(new FormatASS()));
|
AddFormat(Format(new FormatASS()));
|
||||||
formats.push_back(Format(new FormatSSA()));
|
AddFormat(Format(new FormatSSA()));
|
||||||
formats.push_back(Format(new FormatASS2()));
|
AddFormat(Format(new FormatASS2()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,7 +82,7 @@ int FormatManager::GetFormatCount()
|
||||||
|
|
||||||
////////////
|
////////////
|
||||||
// By index
|
// By index
|
||||||
const Format FormatManager::GetFormatByIndex(const int index)
|
Format FormatManager::GetFormatByIndex(const int index)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return formats.at(index);
|
return formats.at(index);
|
||||||
|
@ -93,7 +95,7 @@ const Format FormatManager::GetFormatByIndex(const int index)
|
||||||
|
|
||||||
///////////////
|
///////////////
|
||||||
// By filename
|
// By filename
|
||||||
const Format FormatManager::GetFormatFromFilename(const String &filename,bool read)
|
Format FormatManager::GetFormatFromFilename(const String &filename,bool read)
|
||||||
{
|
{
|
||||||
size_t len = formats.size();
|
size_t len = formats.size();
|
||||||
for (size_t i=0;i<len;i++) {
|
for (size_t i=0;i<len;i++) {
|
||||||
|
@ -111,7 +113,7 @@ const Format FormatManager::GetFormatFromFilename(const String &filename,bool re
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// By format name
|
// By format name
|
||||||
const Format FormatManager::GetFormatFromName(const String &name)
|
Format FormatManager::GetFormatFromName(const String &name)
|
||||||
{
|
{
|
||||||
size_t len = formats.size();
|
size_t len = formats.size();
|
||||||
for (size_t i=0;i<len;i++) {
|
for (size_t i=0;i<len;i++) {
|
||||||
|
@ -120,3 +122,35 @@ const Format FormatManager::GetFormatFromName(const String &name)
|
||||||
return Format();
|
return Format();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////
|
||||||
|
// Get a list of all formats compatible with this file
|
||||||
|
std::vector<Format> FormatManager::GetCompatibleFormatList(Reader &reader)
|
||||||
|
{
|
||||||
|
// Find all compatible formats and store them with their certainty
|
||||||
|
std::vector<std::pair<float,Format> > results;
|
||||||
|
size_t len = formats.size();
|
||||||
|
for (size_t i=0;i<len;i++) {
|
||||||
|
reader.Rewind();
|
||||||
|
float certainty = formats[i]->CanReadFile(reader);
|
||||||
|
if (certainty > 0.0f) {
|
||||||
|
results.push_back(std::pair<float,Format>(certainty,formats[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functor to sort them
|
||||||
|
struct Comp {
|
||||||
|
bool operator() (const std::pair<float,Format> &p1,const std::pair<float,Format> &p2) {
|
||||||
|
return p1.first > p2.first;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Sort results and store them
|
||||||
|
sort(results.begin(),results.end(),Comp());
|
||||||
|
len = results.size();
|
||||||
|
std::vector<Format> finalResults;
|
||||||
|
for (size_t i=0;i<len;i++) {
|
||||||
|
finalResults.push_back(results[i].second);
|
||||||
|
}
|
||||||
|
return finalResults;
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
|
|
||||||
namespace Athenasub {
|
namespace Athenasub {
|
||||||
|
|
||||||
|
class Reader;
|
||||||
|
|
||||||
// Format manager class
|
// Format manager class
|
||||||
class FormatManager {
|
class FormatManager {
|
||||||
private:
|
private:
|
||||||
|
@ -50,9 +52,10 @@ namespace Athenasub {
|
||||||
static void ClearFormats();
|
static void ClearFormats();
|
||||||
|
|
||||||
static int GetFormatCount();
|
static int GetFormatCount();
|
||||||
static const Format GetFormatByIndex(const int index);
|
static Format GetFormatByIndex(const int index);
|
||||||
static const Format GetFormatFromFilename(const String &filename,bool read);
|
static Format GetFormatFromFilename(const String &filename,bool read);
|
||||||
static const Format GetFormatFromName(const String &name);
|
static Format GetFormatFromName(const String &name);
|
||||||
|
static std::vector<Format> GetCompatibleFormatList(Reader &reader);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,9 @@
|
||||||
#include "format_ass_plain.h"
|
#include "format_ass_plain.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "../text_reader.h"
|
#include "../text_reader.h"
|
||||||
|
#include "../reader.h"
|
||||||
#include "../text_writer.h"
|
#include "../text_writer.h"
|
||||||
|
#include "../writer.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <wx/tokenzr.h>
|
#include <wx/tokenzr.h>
|
||||||
|
@ -88,6 +90,19 @@ StringArray FormatASS2::GetWriteExtensions() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////
|
||||||
|
// Check if it can read this file
|
||||||
|
float FormatASSFamily::CanReadFile(Reader &reader) const
|
||||||
|
{
|
||||||
|
shared_ptr<TextReader> file = reader.GetTextReader();
|
||||||
|
if (!file->HasMoreLines()) return 0;
|
||||||
|
String line = file->ReadLineFromFile();
|
||||||
|
if (line == "[Script Info]") return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
///////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
FormatHandlerASS::FormatHandlerASS(int version)
|
FormatHandlerASS::FormatHandlerASS(int version)
|
||||||
|
@ -105,10 +120,10 @@ FormatHandlerASS::~FormatHandlerASS()
|
||||||
|
|
||||||
///////////////
|
///////////////
|
||||||
// Load a file
|
// Load a file
|
||||||
void FormatHandlerASS::Load(IModel &model,wxInputStream &file,const String encoding)
|
void FormatHandlerASS::Load(IModel &model,Reader &file)
|
||||||
{
|
{
|
||||||
// Make text file reader
|
// Get text file reader
|
||||||
shared_ptr<TextReader> reader = TextReader::GetReader(file,encoding);
|
shared_ptr<TextReader> reader = file.GetTextReader();
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
int version = 1;
|
int version = 1;
|
||||||
|
@ -148,10 +163,10 @@ void FormatHandlerASS::Load(IModel &model,wxInputStream &file,const String encod
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
// Save file to disc
|
// Save file to disc
|
||||||
void FormatHandlerASS::Save(const IModel& model,wxOutputStream &file,const String encoding) const
|
void FormatHandlerASS::Save(const IModel& model,Writer &file) const
|
||||||
{
|
{
|
||||||
// Make text file writer
|
// Make text file writer
|
||||||
shared_ptr<TextWriter> writer = TextWriter::GetWriter(file,encoding);
|
shared_ptr<TextWriter> writer = file.GetTextWriter();
|
||||||
|
|
||||||
// Set up list of sections to write
|
// Set up list of sections to write
|
||||||
StringArray sections;
|
StringArray sections;
|
||||||
|
|
|
@ -62,8 +62,8 @@ namespace Athenasub {
|
||||||
FormatHandlerASS(int version);
|
FormatHandlerASS(int version);
|
||||||
~FormatHandlerASS();
|
~FormatHandlerASS();
|
||||||
|
|
||||||
void Load(IModel &model,wxInputStream &file,const String encoding);
|
void Load(IModel &model,Reader &file);
|
||||||
void Save(const IModel &model,wxOutputStream &file,const String encoding) const;
|
void Save(const IModel &model,Writer &file) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Advanced Substation Alpha format base class
|
// Advanced Substation Alpha format base class
|
||||||
|
@ -84,9 +84,11 @@ namespace Athenasub {
|
||||||
|
|
||||||
virtual int GetTimingPrecision() const { return 10; }
|
virtual int GetTimingPrecision() const { return 10; }
|
||||||
virtual int GetMaxTime() const { return 35999990; }
|
virtual int GetMaxTime() const { return 35999990; }
|
||||||
|
bool IsBinary() const { return false; }
|
||||||
|
|
||||||
Dialogue CreateDialogue() const { return Dialogue(new DialogueASS()); }
|
Dialogue CreateDialogue() const { return Dialogue(new DialogueASS()); }
|
||||||
Style CreateStyle() const { return Style(new StyleASS()); }
|
Style CreateStyle() const { return Style(new StyleASS()); }
|
||||||
|
float CanReadFile(Reader &reader) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Substation Alpha
|
// Substation Alpha
|
||||||
|
|
|
@ -109,7 +109,7 @@ void CModel::ProcessActionList(CActionList &_actionList,int type)
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// Load subtitles
|
// Load subtitles
|
||||||
void CModel::Load(wxInputStream &input,const Format _format,const String encoding)
|
void CModel::Load(Reader &input,const Format _format)
|
||||||
{
|
{
|
||||||
// Autodetect format
|
// Autodetect format
|
||||||
if (!_format) {
|
if (!_format) {
|
||||||
|
@ -127,7 +127,7 @@ void CModel::Load(wxInputStream &input,const Format _format,const String encodin
|
||||||
Clear();
|
Clear();
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
handler->Load(*this,input,encoding);
|
handler->Load(*this,input);
|
||||||
|
|
||||||
// Set the format
|
// Set the format
|
||||||
format = _format;
|
format = _format;
|
||||||
|
@ -136,7 +136,7 @@ void CModel::Load(wxInputStream &input,const Format _format,const String encodin
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// Save subtitles
|
// Save subtitles
|
||||||
void CModel::Save(wxOutputStream &output,const Format _format,const String encoding) const
|
void CModel::Save(Writer &output,const Format _format) const
|
||||||
{
|
{
|
||||||
// Use another format
|
// Use another format
|
||||||
if (_format && _format != format) {
|
if (_format && _format != format) {
|
||||||
|
@ -149,7 +149,7 @@ void CModel::Save(wxOutputStream &output,const Format _format,const String encod
|
||||||
if (!handler) THROW_ATHENA_EXCEPTION(Exception::No_Format_Handler);
|
if (!handler) THROW_ATHENA_EXCEPTION(Exception::No_Format_Handler);
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
handler->Save(*this,output,encoding);
|
handler->Save(*this,output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <wx/wfstream.h>
|
|
||||||
#include "athenasub.h"
|
#include "athenasub.h"
|
||||||
#include "actionlist.h"
|
#include "actionlist.h"
|
||||||
#include "section.h"
|
#include "section.h"
|
||||||
|
@ -80,7 +79,7 @@ namespace Athenasub {
|
||||||
void DispatchNotifications(Notification notification) const;
|
void DispatchNotifications(Notification notification) const;
|
||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
void Load(wxInputStream &input,Format format=Format(),const String encoding="");
|
void Load(Reader &input,Format format=Format());
|
||||||
|
|
||||||
Section AddSection(String name);
|
Section AddSection(String name);
|
||||||
Section GetMutableSection(String name);
|
Section GetMutableSection(String name);
|
||||||
|
@ -94,7 +93,7 @@ namespace Athenasub {
|
||||||
Format GetFormat() const { return format; }
|
Format GetFormat() const { return format; }
|
||||||
|
|
||||||
void AddListener(View listener);
|
void AddListener(View listener);
|
||||||
void Save(wxOutputStream &output,Format format=Format(),const String encoding="UTF-8") const;
|
void Save(Writer &output,Format format=Format()) const;
|
||||||
|
|
||||||
ConstSection GetSection(String name) const;
|
ConstSection GetSection(String name) const;
|
||||||
ConstSection GetSectionByIndex(size_t index) const;
|
ConstSection GetSectionByIndex(size_t index) const;
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright (c) 2008, Rodrigo Braz Monteiro
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
||||||
|
// may be used to endorse or promote products derived from this software
|
||||||
|
// without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// AEGISUB
|
||||||
|
//
|
||||||
|
// Website: http://aegisub.cellosoft.com
|
||||||
|
// Contact: mailto:zeratul@cellosoft.com
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "reader.h"
|
||||||
|
#include "text_reader.h"
|
||||||
|
#include <wx/wfstream.h>
|
||||||
|
using namespace Athenasub;
|
||||||
|
|
||||||
|
|
||||||
|
Reader::Reader(String filename,String encoding)
|
||||||
|
{
|
||||||
|
stream = shared_ptr<wxFFileInputStream>(new wxFFileInputStream(filename.GetWxString()));
|
||||||
|
text = TextReader::GetReader(*stream,encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
shared_ptr<TextReader> Athenasub::Reader::GetTextReader()
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reader::Rewind()
|
||||||
|
{
|
||||||
|
text->Rewind();
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright (c) 2008, Rodrigo Braz Monteiro
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
||||||
|
// may be used to endorse or promote products derived from this software
|
||||||
|
// without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// AEGISUB
|
||||||
|
//
|
||||||
|
// Website: http://aegisub.cellosoft.com
|
||||||
|
// Contact: mailto:zeratul@cellosoft.com
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
// Headers
|
||||||
|
#include "athenasub.h"
|
||||||
|
|
||||||
|
class wxFFileInputStream;
|
||||||
|
namespace Athenasub {
|
||||||
|
class TextReader;
|
||||||
|
|
||||||
|
class Reader {
|
||||||
|
private:
|
||||||
|
shared_ptr<TextReader> text;
|
||||||
|
String filename;
|
||||||
|
shared_ptr<wxFFileInputStream> stream;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Reader(String filename,String encoding="");
|
||||||
|
|
||||||
|
shared_ptr<TextReader> GetTextReader();
|
||||||
|
String GetFileName();
|
||||||
|
void Rewind();
|
||||||
|
};
|
||||||
|
}
|
|
@ -44,8 +44,7 @@ namespace Athenasub {
|
||||||
// Dialogue class
|
// Dialogue class
|
||||||
class CDialogue : public IDialogue {
|
class CDialogue : public IDialogue {
|
||||||
private:
|
private:
|
||||||
static const bool dodgeWarning = true;
|
#define ThrowUnsupported() THROW_ATHENA_EXCEPTION(Exception::Unsupported_Format_Feature)
|
||||||
void ThrowUnsupported() const { if (dodgeWarning) THROW_ATHENA_EXCEPTION(Exception::Unsupported_Format_Feature); }
|
|
||||||
static const String& EmptyString();
|
static const String& EmptyString();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -44,8 +44,7 @@ namespace Athenasub {
|
||||||
// Style class
|
// Style class
|
||||||
class CStyle : public IStyle {
|
class CStyle : public IStyle {
|
||||||
private:
|
private:
|
||||||
static const bool dodgeWarning = true;
|
#define ThrowUnsupported() THROW_ATHENA_EXCEPTION(Exception::Unsupported_Format_Feature)
|
||||||
void ThrowUnsupported() const { if (dodgeWarning) THROW_ATHENA_EXCEPTION(Exception::Unsupported_Format_Feature); }
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Destructor
|
// Destructor
|
||||||
|
|
|
@ -48,7 +48,7 @@ Athenasub::TextReaderCache::TextReaderCache(shared_ptr<TextReader> src)
|
||||||
String TextReaderCache::ReadLineFromFile()
|
String TextReaderCache::ReadLineFromFile()
|
||||||
{
|
{
|
||||||
if (bufferPos == buffer.size()) {
|
if (bufferPos == buffer.size()) {
|
||||||
LoadMore(1);
|
LoadMore(1000000);
|
||||||
}
|
}
|
||||||
if (bufferPos == buffer.size()) {
|
if (bufferPos == buffer.size()) {
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (c) 2008, Rodrigo Braz Monteiro
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
||||||
|
// may be used to endorse or promote products derived from this software
|
||||||
|
// without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// AEGISUB
|
||||||
|
//
|
||||||
|
// Website: http://aegisub.cellosoft.com
|
||||||
|
// Contact: mailto:zeratul@cellosoft.com
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "writer.h"
|
||||||
|
#include "text_writer.h"
|
||||||
|
#include <wx/wfstream.h>
|
||||||
|
using namespace Athenasub;
|
||||||
|
|
||||||
|
|
||||||
|
Writer::Writer(String filename,String encoding)
|
||||||
|
{
|
||||||
|
stream = shared_ptr<wxFFileOutputStream>(new wxFFileOutputStream(filename.GetWxString()));
|
||||||
|
text = TextWriter::GetWriter(*stream,encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
shared_ptr<TextWriter> Writer::GetTextWriter()
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright (c) 2008, Rodrigo Braz Monteiro
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
||||||
|
// may be used to endorse or promote products derived from this software
|
||||||
|
// without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// AEGISUB
|
||||||
|
//
|
||||||
|
// Website: http://aegisub.cellosoft.com
|
||||||
|
// Contact: mailto:zeratul@cellosoft.com
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
// Headers
|
||||||
|
#include "athenasub.h"
|
||||||
|
|
||||||
|
|
||||||
|
class wxFFileOutputStream;
|
||||||
|
namespace Athenasub {
|
||||||
|
class TextWriter;
|
||||||
|
|
||||||
|
class Writer {
|
||||||
|
private:
|
||||||
|
shared_ptr<TextWriter> text;
|
||||||
|
shared_ptr<wxFFileOutputStream> stream;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Writer(String filename,String encoding="");
|
||||||
|
|
||||||
|
shared_ptr<TextWriter> GetTextWriter();
|
||||||
|
};
|
||||||
|
}
|
|
@ -61,6 +61,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="../../bin/unit_test_d.exe"
|
||||||
LinkIncremental="2"
|
LinkIncremental="2"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
SubSystem="1"
|
SubSystem="1"
|
||||||
|
@ -134,6 +135,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCLinkerTool"
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="../../bin/unit_test.exe"
|
||||||
LinkIncremental="1"
|
LinkIncremental="1"
|
||||||
GenerateDebugInformation="true"
|
GenerateDebugInformation="true"
|
||||||
SubSystem="1"
|
SubSystem="1"
|
||||||
|
@ -161,6 +163,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
|
CommandLine=""
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
</Configurations>
|
</Configurations>
|
||||||
|
|
Loading…
Reference in New Issue